diff options
Diffstat (limited to 'data/extensions/spyblock@gnu.org')
471 files changed, 11919 insertions, 6319 deletions
diff --git a/data/extensions/spyblock@gnu.org/bootstrap.js b/data/extensions/spyblock@gnu.org/bootstrap.js index 29c1b77..09aa4fe 100644 --- a/data/extensions/spyblock@gnu.org/bootstrap.js +++ b/data/extensions/spyblock@gnu.org/bootstrap.js @@ -7,8 +7,10 @@ const Ci = Components.interfaces; const Cr = Components.results; const Cu = Components.utils; -let {Services, atob, btoa, File, TextDecoder, TextEncoder} = Cu.import("resource://gre/modules/Services.jsm", null); -let XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1", "nsIXMLHttpRequest"); +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + +Cu.importGlobalProperties(["atob", "btoa", "File", "URL", + "TextDecoder", "TextEncoder", "XMLHttpRequest"]); let addonData = null; @@ -16,7 +18,18 @@ function startup(params, reason) { addonData = params; Services.obs.addObserver(RequireObserver, "adblockplus-require", true); - onShutdown.add(function() Services.obs.removeObserver(RequireObserver, "adblockplus-require")); + onShutdown.add(function() + { + Services.obs.removeObserver(RequireObserver, "adblockplus-require"); + }); + let port = params.webExtension.startup().then(({browser}) => + { + return new Promise((resolve, reject) => + { + browser.runtime.onConnect.addListener(resolve); + }); + }); + require.scopes.webextension = {exports: port}; require("main"); } @@ -100,7 +113,7 @@ function require(module) { if (module == "info") { - let applications = {"{a23983c0-fd0e-11dc-95ff-0800200c9a66}": "fennec", "toolkit@mozilla.org": "toolkit", "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "firefox", "dlm@emusic.com": "emusic", "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}": "seamonkey", "{aa3c5121-dab2-40e2-81ca-7ea25febc110}": "fennec2", "{a79fe89b-6662-4ff4-8e88-09950ad4dfde}": "conkeror", "{aa5ca914-c309-495d-91cf-3141bbb04115}": "midbrowser", "songbird@songbirdnest.com": "songbird", "prism@developer.mozilla.org": "prism", "{3550f703-e582-4d05-9a08-453d09bdfdc6}": "thunderbird"}; + let applications = {"{a23983c0-fd0e-11dc-95ff-0800200c9a66}": "fennec", "toolkit@mozilla.org": "toolkit", "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "firefox", "dlm@emusic.com": "emusic", "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}": "seamonkey", "{aa3c5121-dab2-40e2-81ca-7ea25febc110}": "fennec2", "{a79fe89b-6662-4ff4-8e88-09950ad4dfde}": "conkeror", "{aa5ca914-c309-495d-91cf-3141bbb04115}": "midbrowser", "songbird@songbirdnest.com": "songbird", "{55aba3ac-94d3-41a8-9e25-5c21fe874539}": "adblockbrowser", "prism@developer.mozilla.org": "prism", "{3550f703-e582-4d05-9a08-453d09bdfdc6}": "thunderbird"}; let appInfo = Services.appinfo; scopes[module] = {}; @@ -120,18 +133,10 @@ function require(module) { let url = addonData.resourceURI.spec + "lib/" + module + ".js"; scopes[module] = { - Cc: Cc, - Ci: Ci, - Cr: Cr, - Cu: Cu, - atob: atob, - btoa: btoa, - File: File, - require: require, - - onShutdown: onShutdown, + Cc, Ci, Cr, Cu, atob, btoa, File, URL, TextDecoder, TextEncoder, + XMLHttpRequest, require, - XMLHttpRequest: XMLHttpRequest, + onShutdown, exports: {}}; Services.scriptloader.loadSubScript(url, scopes[module]); @@ -139,7 +144,8 @@ function require(module) } return scopes[module].exports; } -require.scopes = {__proto__: null}; +require.scopes = Object.create(null); +require.scopes["prefs.json"] = {exports: {"defaults": {"subscriptions_fallbackerrors": 5, "subscriptions_fallbackurl": "https://adblockplus.org/getSubscription?version=%VERSION%&url=%SUBSCRIPTION%&downloadURL=%URL%&error=%ERROR%&channelStatus=%CHANNELSTATUS%&responseStatus=%RESPONSESTATUS%", "subscriptions_autoupdate": true, "clearStatsOnHistoryPurge": true, "previewimages": true, "defaultstatusbaraction": 0, "notificationurl": "https://notification.adblockplus.org/notification.json", "notifications_showui": false, "report_submiturl": "https://reports.adblockplus.org/submitReport?version=1&guid=%GUID%&lang=%LANG%", "showinstatusbar": false, "patternsbackupinterval": 24, "sendReport_key": "", "enable_key": "", "currentVersion": "0.0", "detachsidebar": false, "blockableItemsSize": {"width": 200, "height": 200}, "savestats": false, "sidebar_key": "Accel Shift V, Accel Shift U", "notifications_ignoredcategories": [], "filters_key": "Accel Shift E, Accel Shift F, Accel Shift O", "frameobjects": true, "whitelistschemes": "about chrome file irc moz-extension moz-safe-about news resource snews x-jsd addbook cid imap mailbox nntp pop data javascript moz-icon", "fastcollapse": false, "subscriptions_exceptionsurl": "https://easylist-downloads.adblockplus.org/exceptionrules.txt", "subscriptions_antiadblockurl": "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt", "hideContributeButton": false, "flash_scrolltoitem": true, "subscriptions_exceptionscheckbox": true, "recentReports": [], "suppress_first_run_page": false, "enabled": true, "notificationdata": {}, "subscriptions_listurl": "https://adblockplus.org/subscriptions2.xml", "patternsbackups": 5, "composer_default": 2, "documentation_link": "https://adblockplus.org/redirect?link=%LINK%&lang=%LANG%", "defaulttoolbaraction": 0}, "preconfigurable": ["suppress_first_run_page"]}}; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); let RequireObserver = diff --git a/data/extensions/spyblock@gnu.org/chrome.manifest b/data/extensions/spyblock@gnu.org/chrome.manifest index 0b1b0e7..5ac3f07 100644 --- a/data/extensions/spyblock@gnu.org/chrome.manifest +++ b/data/extensions/spyblock@gnu.org/chrome.manifest @@ -2,7 +2,9 @@ content adblockplus chrome/content/ skin adblockplus classic/1.0 chrome/skin/ locale adblockplus en-US chrome/locale/en-US/ locale adblockplus ar chrome/locale/ar/ +locale adblockplus az chrome/locale/az/ locale adblockplus bg chrome/locale/bg/ +locale adblockplus bn-BD chrome/locale/bn-BD/ locale adblockplus ca chrome/locale/ca/ locale adblockplus cs chrome/locale/cs/ locale adblockplus cy chrome/locale/cy/ @@ -11,8 +13,10 @@ locale adblockplus de chrome/locale/de/ locale adblockplus dsb chrome/locale/dsb/ locale adblockplus el chrome/locale/el/ locale adblockplus en-GB chrome/locale/en-GB/ +locale adblockplus en-ZA chrome/locale/en-ZA/ locale adblockplus eo chrome/locale/eo/ locale adblockplus es-AR chrome/locale/es-AR/ +locale adblockplus es-CL chrome/locale/es-CL/ locale adblockplus es-ES chrome/locale/es-ES/ locale adblockplus es-MX chrome/locale/es-MX/ locale adblockplus et chrome/locale/et/ @@ -56,4 +60,4 @@ locale adblockplus zh-CN chrome/locale/zh-CN/ locale adblockplus zh-TW chrome/locale/zh-TW/ # fennec settings -override chrome://adblockplus/content/ui/settings.xul chrome://adblockplus/content/ui/fennecSettings.xul application={a23983c0-fd0e-11dc-95ff-0800200c9a66} application={aa3c5121-dab2-40e2-81ca-7ea25febc110} +override chrome://adblockplus/content/ui/settings.xul chrome://adblockplus/content/ui/fennecSettings.xul application={a23983c0-fd0e-11dc-95ff-0800200c9a66} application={aa3c5121-dab2-40e2-81ca-7ea25febc110} application={55aba3ac-94d3-41a8-9e25-5c21fe874539} diff --git a/data/extensions/spyblock@gnu.org/chrome/content/elemHideEmulation.js b/data/extensions/spyblock@gnu.org/chrome/content/elemHideEmulation.js new file mode 100644 index 0000000..ff824ae --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/content/elemHideEmulation.js @@ -0,0 +1,167 @@ +// We are currently limited to ECMAScript 5 in this file, because it is being +// used in the browser tests. See https://issues.adblockplus.org/ticket/4796 + +var propertySelectorRegExp = /\[\-abp\-properties=(["'])([^"']+)\1\]/; + +function splitSelector(selector) +{ + if (selector.indexOf(",") == -1) + return [selector]; + + var selectors = []; + var start = 0; + var level = 0; + var sep = ""; + + for (var i = 0; i < selector.length; i++) + { + var chr = selector[i]; + + if (chr == "\\") // ignore escaped characters + i++; + else if (chr == sep) // don't split within quoted text + sep = ""; // e.g. [attr=","] + else if (sep == "") + { + if (chr == '"' || chr == "'") + sep = chr; + else if (chr == "(") // don't split between parentheses + level++; // e.g. :matches(div,span) + else if (chr == ")") + level = Math.max(0, level - 1); + else if (chr == "," && level == 0) + { + selectors.push(selector.substring(start, i)); + start = i + 1; + } + } + } + + selectors.push(selector.substring(start)); + return selectors; +} + +function ElemHideEmulation(window, getFiltersFunc, addSelectorsFunc) +{ + this.window = window; + this.getFiltersFunc = getFiltersFunc; + this.addSelectorsFunc = addSelectorsFunc; +} + +ElemHideEmulation.prototype = { + stringifyStyle: function(style) + { + var styles = []; + for (var i = 0; i < style.length; i++) + { + var property = style.item(i); + var value = style.getPropertyValue(property); + var priority = style.getPropertyPriority(property); + styles.push(property + ": " + value + (priority ? " !" + priority : "") + ";"); + } + styles.sort(); + return styles.join(" "); + }, + + isSameOrigin: function(stylesheet) + { + try + { + return new URL(stylesheet.href).origin == this.window.location.origin; + } + catch (e) + { + // Invalid URL, assume that it is first-party. + return true; + } + }, + + findSelectors: function(stylesheet, selectors, filters) + { + // Explicitly ignore third-party stylesheets to ensure consistent behavior + // between Firefox and Chrome. + if (!this.isSameOrigin(stylesheet)) + return; + + var rules = stylesheet.cssRules; + if (!rules) + return; + + for (var i = 0; i < rules.length; i++) + { + var rule = rules[i]; + if (rule.type != rule.STYLE_RULE) + continue; + + var style = this.stringifyStyle(rule.style); + for (var j = 0; j < this.patterns.length; j++) + { + var pattern = this.patterns[j]; + if (pattern.regexp.test(style)) + { + var subSelectors = splitSelector(rule.selectorText); + for (var k = 0; k < subSelectors.length; k++) + { + var subSelector = subSelectors[k]; + selectors.push(pattern.prefix + subSelector + pattern.suffix); + filters.push(pattern.text); + } + } + } + } + }, + + addSelectors: function(stylesheets) + { + var selectors = []; + var filters = []; + for (var i = 0; i < stylesheets.length; i++) + this.findSelectors(stylesheets[i], selectors, filters); + this.addSelectorsFunc(selectors, filters); + }, + + onLoad: function(event) + { + var stylesheet = event.target.sheet; + if (stylesheet) + this.addSelectors([stylesheet]); + }, + + apply: function() + { + this.getFiltersFunc(function(patterns) + { + this.patterns = []; + for (var i = 0; i < patterns.length; i++) + { + var pattern = patterns[i]; + var match = propertySelectorRegExp.exec(pattern.selector); + if (!match) + continue; + + var propertyExpression = match[2]; + var regexpString; + if (propertyExpression.length >= 2 && propertyExpression[0] == "/" && + propertyExpression[propertyExpression.length - 1] == "/") + regexpString = propertyExpression.slice(1, -1) + .replace("\\x7B ", "{").replace("\\x7D ", "}"); + else + regexpString = filterToRegExp(propertyExpression); + + this.patterns.push({ + text: pattern.text, + regexp: new RegExp(regexpString, "i"), + prefix: pattern.selector.substr(0, match.index), + suffix: pattern.selector.substr(match.index + match[0].length) + }); + } + + if (this.patterns.length > 0) + { + var document = this.window.document; + this.addSelectors(document.styleSheets); + document.addEventListener("load", this.onLoad.bind(this), true); + } + }.bind(this)); + } +}; diff --git a/data/extensions/spyblock@gnu.org/chrome/content/errors.html b/data/extensions/spyblock@gnu.org/chrome/content/errors.html deleted file mode 100644 index 24e05a5..0000000 --- a/data/extensions/spyblock@gnu.org/chrome/content/errors.html +++ /dev/null @@ -1,111 +0,0 @@ -<!DOCTYPE html> - -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Adblock Plus Errors</title> - <style type="text/css"> - .warning, .error - { - border: 1px dashed black; - margin: 5px; - padding: 2px; - white-space: pre-wrap; - } - - .error - { - background-color: #fff0f0; - } - - .warning - { - background-color: #ffffe0; - } - - button - { - float: right; - } - </style> -</head> -<body> - <button onclick="window.location.reload();">Refresh</button> - <button onclick="clearErrors();">Clear errors</button> - - <script type="application/x-javascript;version=1.7"> - let id = null; - try { - let {addonVersion, addonID} = require("info"); - - let text = "You are running Adblock Plus " + addonVersion; - text += "."; - document.write("<p>" + text + "</p>"); - - id = addonID.replace(/[\{\}]/g, ""); - } catch (e) {} - - // See https://bugzilla.mozilla.org/show_bug.cgi?id=664695 - starting with - // Gecko 19 this function returns the result, before that it wrote to a - // parameter. - let outparam = {}; - let messages = Components.classes["@mozilla.org/consoleservice;1"] - .getService(Components.interfaces.nsIConsoleService) - .getMessageArray(outparam, {}); - messages = messages || outparam.value || []; - messages = messages.filter(function(message) - { - return (message instanceof Components.interfaces.nsIScriptError && - !/^https?:/i.test(message.sourceName) && - (/adblock/i.test(message.errorMessage) || /adblock/i.test(message.sourceName) || - id && (message.errorMessage.indexOf(id) >= 0 || message.sourceName && message.sourceName.indexOf(id) >= 0))); - }); - - if (messages.length) - { - document.write("<p>Errors related to Adblock Plus:</p>"); - - for (let message of messages) - { - let type = (message.flags & Components.interfaces.nsIScriptError.warningFlag ? "warning" : "error"); - let html = "<b>" + (type == "warning" ? "Warning:" : "Error:") + "</b><br>"; - html += encodeHTML(message.errorMessage) + "<br><br>"; - if (message.sourceLine) - html += "Source line: " + encodeHTML(message.sourceLine) + "<br>"; - if (message.sourceName) - html += "Location: " + encodeHTML(message.sourceName) + " line " + message.lineNumber + "<br>"; - html = html.replace(/(<br>)+$/, ""); - document.write("<div class='" + type + "'>" + - html + - "</div>"); - } - } - else - { - document.write("<p>No errors found.</p>"); - } - - function require(module) - { - let {Services} = Components.utils.import("resource://gre/modules/Services.jsm"); - let result = {}; - result.wrappedJSObject = result; - Services.obs.notifyObservers(result, "adblockplus-require", module); - return result.exports; - } - - function encodeHTML(string) - { - return string.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); - } - - function clearErrors() - { - Components.classes["@mozilla.org/consoleservice;1"] - .getService(Components.interfaces.nsIConsoleService) - .reset(); - window.location.reload(); - } - </script> -</body> -</html> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/objtabs.css b/data/extensions/spyblock@gnu.org/chrome/content/objtabs.css index d61f702..62ad04b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/objtabs.css +++ b/data/extensions/spyblock@gnu.org/chrome/content/objtabs.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/common.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/common.js new file mode 100644 index 0000000..ec20ede --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/common.js @@ -0,0 +1,154 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/* globals Components */ + +"use strict"; + +function E(id) +{ + return document.getElementById(id); +} + +function getDocLink(link, callback) +{ + ext.backgroundPage.sendMessage({ + type: "app.get", + what: "doclink", + link + }, callback); +} + +function checkShareResource(url, callback) +{ + ext.backgroundPage.sendMessage({ + type: "filters.blocked", + url, + requestType: "SCRIPT", + docDomain: "adblockplus.org", + thirdParty: true + }, callback); +} + +function openSharePopup(url) +{ + let glassPane = E("glass-pane"); + if (!glassPane) + { + glassPane = document.createElement("div"); + glassPane.setAttribute("id", "glass-pane"); + document.body.appendChild(glassPane); + } + + let iframe = E("share-popup"); + if (!iframe) + { + iframe = document.createElement("iframe"); + iframe.setAttribute("id", "share-popup"); + iframe.setAttribute("scrolling", "no"); + glassPane.appendChild(iframe); + } + + // Firefox 38+ no longer allows messaging using postMessage so we need + // to have a fake top level frame to avoid problems with scripts that try to + // communicate with the first-run page + let isGecko = ("Components" in window); + if (isGecko) + { + try + { + let Ci = Components.interfaces; + let docShell = iframe.contentWindow + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDocShell); + + if (typeof docShell.frameType != "undefined") + { + // Gecko 47+ + docShell.frameType = docShell.FRAME_TYPE_BROWSER; + } + else + { + // Legacy branch + docShell.setIsBrowserInsideApp( + Ci.nsIScriptSecurityManager.UNKNOWN_APP_ID + ); + } + } + catch (ex) + { + console.error(ex); + } + } + + let popupMessageReceived = false; + function resizePopup(width, height) + { + iframe.width = width; + iframe.height = height; + iframe.style.marginTop = -height / 2 + "px"; + iframe.style.marginLeft = -width / 2 + "px"; + popupMessageReceived = true; + window.removeEventListener("message", popupMessageListener); + } + + let popupMessageListener = function(event) + { + if (!/[./]adblockplus\.org$/.test(event.origin) || + !("width" in event.data) || !("height" in event.data)) + return; + + resizePopup(event.data.width, event.data.height); + }; + // Firefox requires last parameter to be true to be triggered by + // unprivileged pages + window.addEventListener("message", popupMessageListener, false, true); + + let popupLoadListener = function() + { + if (!popupMessageReceived && isGecko) + { + let rootElement = iframe.contentDocument.documentElement; + let {width, height} = rootElement.dataset; + if (width && height) + resizePopup(width, height); + } + + if (popupMessageReceived) + { + iframe.className = "visible"; + + let popupCloseListener = function() + { + iframe.className = glassPane.className = ""; + document.removeEventListener("click", popupCloseListener); + }; + document.addEventListener("click", popupCloseListener, false); + } + else + { + glassPane.className = ""; + window.removeEventListener("message", popupMessageListener); + } + + iframe.removeEventListener("load", popupLoadListener); + }; + iframe.addEventListener("load", popupLoadListener, false); + + iframe.src = url; + glassPane.className = "visible"; +} diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.js index 98a38aa..8170cee 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,13 +15,14 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ -let nodes = null; -let item = null; -let advancedMode = false; +var nodesID = null; +var item = null; +var advancedMode = false; function init() { - [nodes, item] = window.arguments; + [nodesID, item] = window.arguments; + window.addEventListener("unload", () => Policy.deleteNodes(nodesID)); E("filterType").value = (!item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter ? "filterlist" : "whitelist"); E("customPattern").value = item.location; @@ -118,19 +119,8 @@ function init() else E("patternGroup").focus(); - let types = []; - for (let type in Policy.localizedDescr) - { - types.push(parseInt(type)); - } - types.sort(function(a, b) { - if (a < b) - return -1; - else if (a > b) - return 1; - else - return 0; - }); + let types = Array.from(new Set(Policy.contentTypes.values())); + types.sort(); let docDomain = item.docDomain; let thirdParty = item.thirdParty; @@ -145,24 +135,24 @@ function init() let typeGroup = E("typeGroup"); let defaultTypes = RegExpFilter.prototype.contentType & ~RegExpFilter.typeMap.DOCUMENT; - let isDefaultType = (RegExpFilter.typeMap[item.typeDescr] & defaultTypes) != 0; + let isDefaultType = (RegExpFilter.typeMap[item.type] & defaultTypes) != 0; for (let type of types) { - if (type == Policy.type.ELEMHIDE) + if (type == "ELEMHIDE" || type == "GENERICBLOCK" || type == "GENERICHIDE") continue; let typeNode = document.createElement("checkbox"); - typeNode.setAttribute("value", Policy.typeDescr[type].toLowerCase().replace(/\_/g, "-")); - typeNode.setAttribute("label", Policy.localizedDescr[type].toLowerCase()); + typeNode.setAttribute("value", type.toLowerCase().replace(/\_/g, "-")); + typeNode.setAttribute("label", Utils.getString("type_label_" + type.toLowerCase())); - let typeMask = RegExpFilter.typeMap[Policy.typeDescr[type]]; + let typeMask = RegExpFilter.typeMap[type]; typeNode._defaultType = (typeMask & defaultTypes) != 0; if ((isDefaultType && typeNode._defaultType) || (!isDefaultType && item.type == type)) typeNode.setAttribute("checked", "true"); if (item.type == type) typeNode.setAttribute("disabled", "true"); - typeNode.addEventListener("command", function() checkboxUpdated(this), false); + typeNode.addEventListener("command", () => checkboxUpdated(typeNode), false); typeGroup.appendChild(typeNode); } @@ -255,16 +245,16 @@ function updateFilter() if (options.length) { - options.sort(function(a, b) a[0] - b[0]); - filter += "$" + options.map(function(o) o[1]).join(","); + options.sort((a, b) => a[0] - b[0]); + filter += "$" + options.map(o => o[1]).join(","); } } else { let defaultTypes = RegExpFilter.prototype.contentType & ~RegExpFilter.typeMap.DOCUMENT; - let isDefaultType = (RegExpFilter.typeMap[item.typeDescr] & defaultTypes) != 0; + let isDefaultType = (RegExpFilter.typeMap[item.type] & defaultTypes) != 0; if (!isDefaultType) - filter += "$" + item.typeDescr.toLowerCase().replace(/\_/g, "-"); + filter += "$" + item.type.toLowerCase().replace(/\_/g, "-"); } filter = Filter.normalize(filter); @@ -279,7 +269,7 @@ function updateFilter() } E("shortpatternWarning").hidden = !isSlow; - E("matchWarning").hidden = compiledFilter instanceof RegExpFilter && compiledFilter.matches(item.location, item.typeDescr, item.docDomain, item.thirdParty); + E("matchWarning").hidden = compiledFilter instanceof RegExpFilter && compiledFilter.matches(item.location, RegExpFilter.typeMap[item.type], item.docDomain, item.thirdParty); E("filter").value = filter; } @@ -318,7 +308,7 @@ function updatePatternSelection() function testFilter(/**String*/ filter) /**Boolean*/ { - return RegExpFilter.fromText(filter + "$" + item.typeDescr).matches(item.location, item.typeDescr, item.docDomain, item.thirdParty); + return RegExpFilter.fromText(filter + "$" + item.type).matches(item.location, RegExpFilter.typeMap[item.type], item.docDomain, item.thirdParty); } let anchorStartCheckbox = E("anchorStart"); @@ -352,8 +342,8 @@ function addFilter() { FilterStorage.addFilter(filter); - if (nodes) - Policy.refilterNodes(nodes, item); + if (nodesID) + Policy.refilterNodes(nodesID, item); return true; } diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.xul index 66e64ef..2cf1502 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/composer.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js index 129f232..296c00f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/common.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -17,140 +17,105 @@ (function(global) { - const Ci = Components.interfaces; + const Cu = Components.utils; + + let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); if (!global.ext) global.ext = {}; - var holder = { - get Page() - { - delete this.Page; - this.Page = (typeof require == "function" ? - require("ext_background").Page : - function() {}); - return this.Page; - } - }; + var wrapperSymbol = Symbol("ext-wrapper"); - var getSender = global.ext._getSender = function(origin) + function wrapFrames(frames) { - if (origin instanceof Ci.nsIDOMXULElement) - return origin.messageManager; - else if (origin instanceof Ci.nsIMessageSender) - return origin; - else + if (!frames.length) return null; - }; - var MessageProxy = global.ext._MessageProxy = function(messageManager, messageTarget) - { - this._messageManager = messageManager; - this._messageTarget = messageTarget; - this._callbacks = new Map(); - this._responseCallbackCounter = 0; + // We have frames as an array, non-Firefox code expects url and parent + // properties however. + Object.defineProperty(frames, "url", { + enumerable: true, + get: () => new URL(frames[0].location) + }); - this._handleRequest = this._handleRequest.bind(this); - this._handleResponse = this._handleResponse.bind(this); - this._messageManager.addMessageListener("AdblockPlus:Message", this._handleRequest); - this._messageManager.addMessageListener("AdblockPlus:Response", this._handleResponse); - }; - MessageProxy.prototype = { - _disconnect: function() - { - this._messageManager.removeMessageListener("AdblockPlus:Message", this._handleRequest); - this._messageManager.removeMessageListener("AdblockPlus:Response", this._handleResponse); - }, + Object.defineProperty(frames, "parent", { + enumerable: true, + get: () => wrapFrames(frames.slice(1)) + }); - _sendResponse: function(sender, callbackId, message) - { - var response = { - callbackId: callbackId - }; - if (typeof response != "undefined") - response.payload = message; - sender.sendAsyncMessage("AdblockPlus:Response", response); - }, + return frames; + } - _handleRequest: function(message) + var EventTarget = global.ext._EventTarget = function(port, windowID) + { + this._port = port; + this._windowID = windowID; + this.addListener((payload, sender, resolve) => { - var sender = getSender(message.target); - var request = message.data; - - var sent = false; - var sendResponse; - if (sender && "callbackId" in request) + if (payload.type) { - sendResponse = function(message) - { - this._sendResponse(sender, request.callbackId, message); - sent = true; - }.bind(this); + let result = this._port._dispatch(payload.type, payload, sender); + if (typeof result != "undefined") + resolve(result); } - else - sendResponse = function() {}; - - var results = this._messageTarget._dispatch(request.payload, { - page: new holder.Page(sender) - }, sendResponse); - if (!sent && results.indexOf(true) == -1) - sendResponse(undefined); - }, - - _handleResponse: function(message) + }); + }; + EventTarget.prototype = { + addListener: function(listener) { - var response = message.data; - var callback = this._callbacks.get(response.callbackId); - if (callback) + var wrapper = (message, sender) => { - this._callbacks.delete(response.callbackId); - if ("payload" in response) - callback(response.payload); - } - }, + if (this._windowID && this._windowID != message.targetID) + return undefined; - sendMessage: function(message, responseCallback) - { - if (!(this._messageManager instanceof Ci.nsIMessageSender)) - throw new Error("Not implemented"); - - var request = { - payload: message + return new Promise((resolve, reject) => + { + var sender = {}; + if (message.senderID) + { + // We will only get here on the background side so we can access + // the Page object. + const Page = require("ext_background").Page; + sender.page = new Page(message.senderID); + } + if (message.frames) + sender.frame = wrapFrames(message.frames); + if (!listener(message.payload, sender, resolve)) + resolve(undefined); + }); }; - if (responseCallback) - { - request.callbackId = ++this._responseCallbackCounter; - this._callbacks.set(request.callbackId, responseCallback); - } + listener[wrapperSymbol] = wrapper; + this._port.on("ext_message", wrapper); + }, - this._messageManager.sendAsyncMessage("AdblockPlus:Message", request); + removeListener: function(listener) + { + if (listener[wrapperSymbol]) + this._port.off("ext_message", listener[wrapperSymbol]); } }; - var EventTarget = global.ext._EventTarget = function() - { - this._listeners = []; - }; - EventTarget.prototype = { - addListener: function(listener) - { - if (this._listeners.indexOf(listener) == -1) - this._listeners.push(listener); - }, - removeListener: function(listener) - { - var idx = this._listeners.indexOf(listener); - if (idx != -1) - this._listeners.splice(idx, 1); - }, - _dispatch: function() - { - var results = []; + let pageName = "global"; + if (typeof location !== "undefined") + pageName = location.pathname.replace(/.*\//, "").replace(/\..*?$/, ""); - for (var i = 0; i < this._listeners.length; i++) - results.push(this._listeners[i].apply(null, arguments)); + let stringBundle = Services.strings.createBundle( + "chrome://adblockplus/locale/" + pageName + ".properties?" + Math.random()); - return results; + global.ext.i18n = { + getMessage(key, args) + { + try { + return stringBundle.GetStringFromName(key); + } + catch(e) + { + // Don't report errors for special strings, these are expected to be + // missing. + if (key[0] != "@") + Cu.reportError(e); + return ""; + } } }; diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js index db2d7e1..366325a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/ext/content.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -17,86 +17,66 @@ (function(global) { + const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; - if (!global.ext) - global.ext = {}; - - /* Message passing */ - global.ext.onMessage = new global.ext._EventTarget(); + var Services = Cu.import("resource://gre/modules/Services.jsm", {}).Services; - global.ext.backgroundPage = new global.ext._MessageProxy( - window.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDocShell) - .QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIContentFrameMessageManager), - global.ext.onMessage); - window.addEventListener("unload", function() + function require(/**String*/ module) { - global.ext.backgroundPage._disconnect(); - }, false); + var result = {}; + result.wrappedJSObject = result; + Services.obs.notifyObservers(result, "adblockplus-require", module); + return result.exports; + } - /* i18n */ - global.ext.i18n = (function() + function getOuterWindowID() { - var Services = Cu.import("resource://gre/modules/Services.jsm", null).Services; - var pageName = location.pathname.replace(/.*\//, "").replace(/\..*?$/, ""); - - // Randomize URI to work around bug 719376 - var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/" + pageName + - ".properties?" + Math.random()); - - function getI18nMessage(key) + if (!getOuterWindowID.result) { - return { - "message": stringBundle.GetStringFromName(key) - }; + getOuterWindowID.result = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .outerWindowID; } + return getOuterWindowID.result; + } - function getText(message, args) - { - var text = message.message; - var placeholders = message.placeholders; - - if (!args || !placeholders) - return text; - - for (var key in placeholders) - { - var content = placeholders[key].content; - if (!content) - continue; + const Port = require("messaging").Port; - var index = parseInt(content.slice(1), 10); - if (isNaN(index)) - continue; + if (!global.ext) + global.ext = {}; - var replacement = args[index - 1]; - if (typeof replacement === "undefined") - continue; + /* Message passing */ + var port = new Port(Cc["@mozilla.org/childprocessmessagemanager;1"] + .getService(Ci.nsIMessageSender)); + window.addEventListener("unload", function() + { + try + { + port.emit("ext_disconnect", getOuterWindowID()); + } + catch (e) + { + // This is expected to fail if Adblock Plus was disabled/uninstalled with + // the page still open. + } + port.disconnect(); + }, false); - text = text.split("$" + key + "$").join(replacement); - } - return text; + global.ext.onMessage = new global.ext._EventTarget(port, getOuterWindowID()); + global.ext.backgroundPage = { + sendMessage: function(payload, responseCallback) + { + var message = { + senderID: getOuterWindowID(), + payload + }; + if (typeof responseCallback == "function") + port.emitWithResponse("ext_message", message).then(responseCallback); + else + port.emit("ext_message", message); } + }; - return { - getMessage: function(key, args) - { - try{ - var message = getI18nMessage(key); - return getText(message, args); - } - catch(e) - { - // Don't report errors for special strings, these are expected to be - // missing. - if (key[0] != "@") - Cu.reportError(e); - return ""; - } - } - }; - })(); })(this); diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/fennecSettings.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/fennecSettings.xul index c0f38f6..6e7675f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/fennecSettings.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/fennecSettings.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -29,6 +29,8 @@ <setting type="control" title="&subscriptions.tab.label;"> <menulist id="adblockplus-subscription-list"/> </setting> + <setting id="adblockplus-acceptableAds" type="bool" title="&acceptableAds2.label;" + oncommand="/**See bug 762015*/ if (event.type == 'oncommand') {event = document.createEvent('Events'); event.initEvent('command', false, false); this.dispatchEvent(event);}"/> <setting id="adblockplus-sync" type="bool" title="&sync.label;" oncommand="/**See bug 762015*/ if (event.type == 'oncommand') {event = document.createEvent('Events'); event.initEvent('command', false, false); this.dispatchEvent(event);}"/> </vbox> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-backup.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-backup.js index 9232b5f..b3f8b94 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-backup.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-backup.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -97,20 +97,22 @@ var Backup = while (this.restoreInsertionPoint.nextSibling && !this.restoreInsertionPoint.nextSibling.id) this.restoreInsertionPoint.parentNode.removeChild(this.restoreInsertionPoint.nextSibling); - let files = FilterStorage.getBackupFiles().reverse(); - for (let i = 0; i < files.length; i++) + FilterStorage.getBackupFiles().then(backups => { - let file = files[i]; - let item = this.restoreTemplate.cloneNode(true); - let label = item.getAttribute("label"); - label = label.replace(/\?1\?/, Utils.formatTime(file.lastModifiedTime)); - item.setAttribute("label", label); - item.addEventListener("command", function() + backups.reverse(); + for (let backup of backups) { - Backup.restoreAllData(file); - }, false); - this.restoreInsertionPoint.parentNode.insertBefore(item, this.restoreInsertionPoint.nextSibling); - } + let item = this.restoreTemplate.cloneNode(true); + let label = item.getAttribute("label"); + label = label.replace(/\?1\?/, Utils.formatTime(backup.lastModified)); + item.setAttribute("label", label); + item.addEventListener("command", function() + { + FilterStorage.restoreBackup(backup.index); + }, false); + this.restoreInsertionPoint.parentNode.insertBefore(item, this.restoreInsertionPoint.nextSibling); + } + }); }, /** @@ -139,34 +141,40 @@ var Backup = */ restoreAllData: function(/**nsIFile*/ file) { - let stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); - stream.init(file, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0); - stream.QueryInterface(Ci.nsILineInputStream); - + let sink = FilterStorage.importData(); let lines = []; - let line = {value: null}; - if (stream.readLine(line)) - lines.push(line.value); - if (stream.readLine(line)) - lines.push(line.value); - stream.close(); - - let match; - if (lines.length < 2 || lines[0] != "# Adblock Plus preferences" || !(match = /version=(\d+)/.exec(lines[1]))) - { - Utils.alert(window, E("backupButton").getAttribute("_restoreError"), E("backupButton").getAttribute("_restoreDialogTitle")); - return; - } + IO.readFromFile(file, { + process(line) + { + if (line === null) + { + let match; + if (lines.length < 2 || lines[0] != "# Adblock Plus preferences" || !(match = /version=(\d+)/.exec(lines[1]))) + { + Utils.alert(window, E("backupButton").getAttribute("_restoreError"), E("backupButton").getAttribute("_restoreDialogTitle")); + return; + } - let warning = E("backupButton").getAttribute("_restoreCompleteWarning"); - let minVersion = parseInt(match[1], 10); - if (minVersion > FilterStorage.formatVersion) - warning += "\n\n" + E("backupButton").getAttribute("_restoreVersionWarning"); + let warning = E("backupButton").getAttribute("_restoreCompleteWarning"); + let minVersion = parseInt(match[1], 10); + if (minVersion > FilterStorage.formatVersion) + warning += "\n\n" + E("backupButton").getAttribute("_restoreVersionWarning"); - if (!Utils.confirm(window, warning, E("backupButton").getAttribute("_restoreDialogTitle"))) - return; + if (!Utils.confirm(window, warning, E("backupButton").getAttribute("_restoreDialogTitle"))) + return; + } + else if (lines.length < 2) + lines.push(line); - FilterStorage.loadFromDisk(file); + sink(line); + } + }, error => + { + if (error) + alert(error); + else + FilterStorage.saveToDisk(); + }); }, /** @@ -193,7 +201,7 @@ var Backup = if (Utils.confirm(window, warning, E("backupButton").getAttribute("_restoreDialogTitle"))) { - let subscriptions = FilterStorage.subscriptions.filter(function(s) s instanceof SpecialSubscription); + let subscriptions = FilterStorage.subscriptions.filter(s => s instanceof SpecialSubscription); for (let i = 0; i < subscriptions.length; i++) FilterStorage.removeSubscription(subscriptions[i]); @@ -282,7 +290,11 @@ var Backup = */ backupAllData: function(/**nsIFile*/ file) { - FilterStorage.saveToDisk(file); + IO.writeToFile(file, FilterStorage.exportData(), error => + { + if (error) + alert(error); + }); }, /** @@ -290,7 +302,7 @@ var Backup = */ backupCustomFilters: function(/**nsIFile*/ file) { - let subscriptions = FilterStorage.subscriptions.filter(function(s) s instanceof SpecialSubscription); + let subscriptions = FilterStorage.subscriptions.filter(s => s instanceof SpecialSubscription); let minVersion = "2.0" let list = []; for (let i = 0; i < subscriptions.length; i++) @@ -299,7 +311,7 @@ var Backup = let typeAddition = ""; if (subscription.defaults) typeAddition = "/" + subscription.defaults.join("/"); - list.push("! [" + subscription.title + "]" + typeAddition); + list.push("! [" + getSubscriptionTitle(subscription) + "]" + typeAddition); for (let j = 0; j < subscription.filters.length; j++) { let filter = subscription.filters[j]; @@ -313,6 +325,19 @@ var Backup = if (filter instanceof ElemHideException && Services.vc.compare(minVersion, "2.1") < 0) minVersion = "2.1"; + + if (filter instanceof RegExpFilter && filter.contentType & (RegExpFilter.typeMap.GENERICHIDE | RegExpFilter.typeMap.GENERICBLOCK) && Services.vc.compare(minVersion, "2.6.12") < 0) + minVersion = "2.6.12"; + + if (filter instanceof ElemHideEmulationFilter && Services.vc.compare(minVersion, "2.7.3") < 0) + minVersion = "2.7.3"; + + if (filter instanceof RegExpFilter && + (filter.contentType & RegExpFilter.typeMap.WEBSOCKET) && + Services.vc.compare(minVersion, "2.8")) + { + minVersion = "2.8"; + } } } list.unshift("[Adblock Plus " + minVersion + "]"); @@ -325,13 +350,7 @@ var Backup = if (checksum) list.splice(1, 0, "! Checksum: " + checksum); - function generator() - { - for (let i = 0; i < list.length; i++) - yield list[i]; - } - - IO.writeToFile(file, generator(), function(e) + IO.writeToFile(file, list, function(e) { if (e) { diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filteractions.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filteractions.js index 2a78e56..ad128b8 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filteractions.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filteractions.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -101,9 +101,9 @@ var FilterActions = fillActionsPopup: function() { let editable = FilterView.editable; - let items = FilterView.selectedItems.filter(function(i) !i.filter.dummy); - items.sort(function(entry1, entry2) entry1.index - entry2.index); - let activeItems = items.filter(function(i) i.filter instanceof ActiveFilter); + let items = FilterView.selectedItems.filter(i => !i.filter.dummy); + items.sort((entry1, entry2) => entry1.index - entry2.index); + let activeItems = items.filter(i => i.filter instanceof ActiveFilter); E("filters-edit-command").setAttribute("disabled", !editable || !items.length); E("filters-delete-command").setAttribute("disabled", !editable || !items.length); @@ -142,7 +142,7 @@ var FilterActions = if (this.treeElement.editingColumn) return; - let items = FilterView.selectedItems.filter(function(i) i.filter instanceof ActiveFilter); + let items = FilterView.selectedItems.filter(i => i.filter instanceof ActiveFilter); if (items.length) { FilterView.boxObject.beginUpdateBatch(); @@ -205,7 +205,7 @@ var FilterActions = deleteItems: function(/**Array*/ items) { let oldIndex = FilterView.selection.currentIndex; - items.sort(function(entry1, entry2) entry2.index - entry1.index); + items.sort((entry1, entry2) => entry2.index - entry1.index); for (let i = 0; i < items.length; i++) FilterStorage.removeFilter(items[i].filter, FilterView._subscription, items[i].index); @@ -236,9 +236,9 @@ var FilterActions = if (this.treeElement.editingColumn) return; - let items = FilterView.selectedItems.filter(function(i) i.filter instanceof ActiveFilter); + let items = FilterView.selectedItems.filter(i => i.filter instanceof ActiveFilter); if (items.length) - FilterStorage.resetHitCounts(items.map(function(i) i.filter)); + FilterStorage.resetHitCounts(items.map(i => i.filter)); }, /** @@ -253,7 +253,7 @@ var FilterActions = if (offset < 0) { - items.sort(function(entry1, entry2) entry1.index - entry2.index); + items.sort((entry1, entry2) => entry1.index - entry2.index); let position = items[0].index + offset; if (position < 0) return; @@ -264,7 +264,7 @@ var FilterActions = } else if (offset > 0) { - items.sort(function(entry1, entry2) entry2.index - entry1.index); + items.sort((entry1, entry2) => entry2.index - entry1.index); let position = items[0].index + offset; if (position >= FilterView.rowCount) return; @@ -339,10 +339,17 @@ var FilterActions = while (box.firstChild) box.removeChild(box.firstChild); - for (var i = 0; i < text.length; i += 80) + let lines = text.match(/.{1,80}/g); + if (lines.length > 7) { - var description = document.createElement("description"); - description.setAttribute("value", text.substr(i, 80)); + // Text is too long to display in full so we cut out the middle part + lines = lines.slice(0,3).concat("\u2026", lines.slice(-3)); + } + + for (let line of lines) + { + let description = document.createElement("description"); + description.setAttribute("value", line); box.appendChild(description); } } @@ -359,7 +366,7 @@ var FilterActions = E("tooltip-additional").hidden = false; if (item.filter instanceof InvalidFilter && item.filter.reason) - E("tooltip-additional").textContent = item.filter.reason; + E("tooltip-additional").textContent = Utils.getString(item.filter.reason); else if (item.filter instanceof RegExpFilter && defaultMatcher.isSlowFilter(item.filter)) E("tooltip-additional").textContent = Utils.getString("filter_regexp_tooltip"); else @@ -408,8 +415,8 @@ var FilterActions = if (!items.length) return; - items.sort(function(entry1, entry2) entry1.index - entry2.index); - let text = items.map(function(i) i.filter.text).join(IO.lineBreak); + items.sort((entry1, entry2) => entry1.index - entry2.index); + let text = items.map(i => i.filter.text).join(IO.lineBreak); Utils.clipboardHelper.copyString(text); if (!keep && FilterView.editable && !this.treeElement.editingColumn) @@ -465,8 +472,8 @@ var FilterActions = if (!items.length) return; - items.sort(function(entry1, entry2) entry1.index - entry2.index); - event.dataTransfer.setData("text/plain", items.map(function(i) i.filter.text).join(IO.lineBreak)); + items.sort((entry1, entry2) => entry1.index - entry2.index); + event.dataTransfer.setData("text/plain", items.map(i => i.filter.text).join(IO.lineBreak)); this.dragItems = items; event.stopPropagation(); }, diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filterview.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filterview.js index 524356f..b1d701d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filterview.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-filterview.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -462,14 +462,22 @@ var FilterView = /** * Selects a row in the tree and makes sure it is visible. + * @param {number} row + * row index + * @param {boolean} [scrollToTop] + * if true, the selected row should become the top row of the list if + * possible, otherwise the list is only scrolled if the row isn't visible. */ - selectRow: function(row) + selectRow: function(row, scrollToTop) { if (this.selection) { row = Math.min(Math.max(row, 0), this.data.length - 1); this.selection.select(row); - this.boxObject.ensureRowIsVisible(row); + if (scrollToTop) + this.boxObject.scrollToRow(row); + else + this.boxObject.ensureRowIsVisible(row); } }, @@ -489,7 +497,7 @@ var FilterView = } if (index >= 0) { - this.selectRow(index); + this.selectRow(index, true); this.treeElement.focus(); } }, @@ -502,7 +510,7 @@ var FilterView = let oldCount = this.rowCount; if (this._subscription && this._subscription.filters.length) { - this.data = this._subscription.filters.map(function(f, i) ({index: i, filter: f})); + this.data = this._subscription.filters.map((f, i) => ({index: i, filter: f})); if (this.sortProc) { // Hide comments in the list, they should be sorted like the filter following them @@ -633,35 +641,41 @@ var FilterView = setTree: function(boxObject) { + if (!boxObject) + return; + this.init(); this.boxObject = boxObject; - if (this.boxObject) - { - this.noGroupDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noGroupText"), dummy: true}}; - this.noFiltersDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noFiltersText"), dummy: true}}; - this.editDummy = {filter: {text: ""}}; + this.noGroupDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noGroupText"), dummy: true}}; + this.noFiltersDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noFiltersText"), dummy: true}}; + this.editDummy = {filter: {text: ""}}; - let atomService = Cc["@mozilla.org/atom-service;1"].getService(Ci.nsIAtomService); - let stringAtoms = ["col-filter", "col-enabled", "col-hitcount", "col-lasthit", "type-comment", "type-filterlist", "type-whitelist", "type-elemhide", "type-elemhideexception", "type-invalid"]; - let boolAtoms = ["selected", "dummy", "slow", "disabled"]; + let atomService = Cc["@mozilla.org/atom-service;1"].getService(Ci.nsIAtomService); + let stringAtoms = ["col-filter", "col-enabled", "col-hitcount", "col-lasthit", "type-invalid", "type-comment", "type-blocking", "type-whitelist", "type-elemhide", "type-elemhideexception", "type-elemhideemulation"]; + let boolAtoms = ["selected", "dummy", "slow", "disabled"]; - this.atoms = {}; - for (let atom of stringAtoms) - this.atoms[atom] = atomService.getAtom(atom); - for (let atom of boolAtoms) - { - this.atoms[atom + "-true"] = atomService.getAtom(atom + "-true"); - this.atoms[atom + "-false"] = atomService.getAtom(atom + "-false"); - } + this.atoms = {}; + for (let atom of stringAtoms) + this.atoms[atom] = atomService.getAtom(atom); + for (let atom of boolAtoms) + { + this.atoms[atom + "-true"] = atomService.getAtom(atom + "-true"); + this.atoms[atom + "-false"] = atomService.getAtom(atom + "-false"); + } - let columns = this.boxObject.columns; - for (let i = 0; i < columns.length; i++) - if (columns[i].element.hasAttribute("sortDirection")) - this.sortBy(columns[i].id, columns[i].element.getAttribute("sortDirection")); + let columns = this.boxObject.columns; + for (let i = 0; i < columns.length; i++) + if (columns[i].element.hasAttribute("sortDirection")) + this.sortBy(columns[i].id, columns[i].element.getAttribute("sortDirection")); - this.refresh(true); - } + this.refresh(true); + + // Stop propagation of keypress events so that these aren't intercepted by + // the findbar. + this.treeElement.inputField.addEventListener("keypress", event => { + event.stopPropagation(); + }, false); }, selection: null, @@ -728,19 +742,7 @@ var FilterView = if (filter instanceof ActiveFilter) list.push("disabled-" + filter.disabled); list.push("dummy-" + ("dummy" in filter)); - - if (filter instanceof CommentFilter) - list.push("type-comment"); - else if (filter instanceof BlockingFilter) - list.push("type-filterlist"); - else if (filter instanceof WhitelistFilter) - list.push("type-whitelist"); - else if (filter instanceof ElemHideFilter) - list.push("type-elemhide"); - else if (filter instanceof ElemHideException) - list.push("type-elemhideexception"); - else if (filter instanceof InvalidFilter) - list.push("type-invalid"); + list.push("type-" + filter.type); return this.generateProperties(list, properties); }, @@ -830,20 +832,20 @@ var FilterView = filter.disabled = !filter.disabled; }, - isContainer: function(row) false, - isContainerOpen: function(row) false, - isContainerEmpty: function(row) true, - getLevel: function(row) 0, - getParentIndex: function(row) -1, - hasNextSibling: function(row, afterRow) false, - toggleOpenState: function(row) {}, - getProgressMode: function() null, - getImageSrc: function() null, - isSeparator: function() false, - performAction: function() {}, - performActionOnRow: function() {}, - performActionOnCell: function() {}, - getCellValue: function() null, - setCellValue: function() {}, - selectionChanged: function() {}, + isContainer: row => false, + isContainerOpen: row => false, + isContainerEmpty: row => true, + getLevel: row => 0, + getParentIndex: row => -1, + hasNextSibling: (row, afterRow) => false, + toggleOpenState: row => {}, + getProgressMode: () => null, + getImageSrc: () => null, + isSeparator: () => false, + performAction: () => {}, + performActionOnRow: () => {}, + performActionOnCell: () => {}, + getCellValue: () => null, + setCellValue: () => {}, + selectionChanged: () => {} }; diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-search.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-search.js index 2d0c0cf..23bb4b5 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-search.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-search.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -21,50 +21,84 @@ */ var FilterSearch = { + lastSearchString: null, + /** - * Initializes findbar widget. + * Handles keypress events on the findbar widget. */ - init: function() + keyPress: function(/**Event*/ event) { - let filters = E("filtersTree"); - for (let prop in FilterSearch.fakeBrowser) - filters[prop] = FilterSearch.fakeBrowser[prop]; - Object.defineProperty(filters, "_lastSearchString", { - get: function() - { - return this.finder.searchString; - }, - enumerable: true, - configurable: true - }); - - let findbar = E("findbar"); - findbar.browser = filters; - - findbar.addEventListener("keypress", function(event) + if (event.keyCode == KeyEvent.DOM_VK_RETURN) + event.preventDefault(); + else if (event.keyCode == KeyEvent.DOM_VK_ESCAPE) + { + event.preventDefault(); + this.close(); + } + else if (event.keyCode == KeyEvent.DOM_VK_UP) + { + event.preventDefault(); + this.search(-1); + } + else if (event.keyCode == KeyEvent.DOM_VK_DOWN) + { + event.preventDefault(); + this.search(1); + } + else if (event.keyCode == KeyEvent.DOM_VK_PAGE_UP) { - // Work-around for bug 490047 - if (event.keyCode == KeyEvent.DOM_VK_RETURN) - event.preventDefault(); - }, false); + event.preventDefault(); + E("filtersTree").treeBoxObject.scrollByPages(-1); + } + else if (event.keyCode == KeyEvent.DOM_VK_PAGE_DOWN) + { + event.preventDefault(); + E("filtersTree").treeBoxObject.scrollByPages(1); + } + }, - // Hack to prevent "highlight all" from getting enabled - findbar.toggleHighlight = function() {}; + /** + * Makes the find bar visible and focuses it. + */ + open: function() + { + E("findbar").hidden = false; + E("findbar-textbox").focus(); + }, + + /** + * Closes the find bar. + */ + close: function() + { + E("findbar").hidden = true; }, /** - * Performs a text search. - * @param {String} text text to be searched - * @param {Integer} direction search direction: -1 (backwards), 0 (forwards - * starting with current), 1 (forwards starting with next) - * @param {Boolean} caseSensitive if true, a case-sensitive search is performed - * @result {Integer} one of the nsITypeAheadFind constants + * Performs a filter search. + * @param {Integer} [direction] + * See @link{FilterSearch#search} + * @return {String} + * result status, one of "" (success), "notFound", "wrappedEnd", + * "wrappedStart" */ - search: function(text, direction, caseSensitive) + _search: function(direction) { - function normalizeString(string) caseSensitive ? string : string.toLowerCase(); + let text = E("findbar-textbox").value.trim(); + if (!text) + return ""; + + let caseSensitive = E("findbar-case-sensitive").checked; + + if (typeof direction == "undefined") + direction = (text == this.lastSearchString ? 1 : 0); + this.lastSearchString = text; + + let normalizeString = (caseSensitive ? + string => string : + string => string.toLowerCase()); - function findText(text, direction, startIndex) + function findText(startIndex) { let list = E("filtersTree"); let col = list.columns.getNamedColumn("col-filter"); @@ -74,7 +108,7 @@ var FilterSearch = let filter = normalizeString(list.view.getCellText(i, col)); if (filter.indexOf(text) >= 0) { - FilterView.selectRow(i); + FilterView.selectRow(i, true); return true; } } @@ -84,13 +118,13 @@ var FilterSearch = text = normalizeString(text); // First try to find the entry in the current list - if (findText(text, direction, E("filtersTree").currentIndex)) - return Ci.nsITypeAheadFind.FIND_FOUND; + if (findText(E("filtersTree").currentIndex)) + return ""; // Now go through the other subscriptions - let result = Ci.nsITypeAheadFind.FIND_FOUND; + let result = ""; let subscriptions = FilterStorage.subscriptions.slice(); - subscriptions.sort(function(s1, s2) (s1 instanceof SpecialSubscription) - (s2 instanceof SpecialSubscription)); + subscriptions.sort((s1, s2) => (s1 instanceof SpecialSubscription) - (s2 instanceof SpecialSubscription)); let current = subscriptions.indexOf(FilterView.subscription); direction = direction || 1; for (let i = current + direction; ; i+= direction) @@ -98,12 +132,12 @@ var FilterSearch = if (i < 0) { i = subscriptions.length - 1; - result = Ci.nsITypeAheadFind.FIND_WRAPPED; + result = "wrappedStart"; } else if (i >= subscriptions.length) { i = 0; - result = Ci.nsITypeAheadFind.FIND_WRAPPED; + result = "wrappedEnd"; } if (i == current) break; @@ -127,113 +161,31 @@ var FilterSearch = if (oldFocus) { oldFocus.focus(); - Utils.runAsync(oldFocus.focus, oldFocus); + Utils.runAsync(() => oldFocus.focus()); } - Utils.runAsync(findText, null, text, direction, direction == 1 ? -1 : subscription.filters.length); + Utils.runAsync(() => findText(direction == 1 ? -1 : subscription.filters.length)); return result; } } } - return Ci.nsITypeAheadFind.FIND_NOTFOUND; - } -}; - -/** - * Fake browser implementation to make findbar widget happy - searches in - * the filter list. - */ -FilterSearch.fakeBrowser = -{ - finder: - { - _resultListeners: [], - searchString: null, - caseSensitive: false, - lastResult: null, - - _notifyResultListeners: function(result, findBackwards) - { - this.lastResult = result; - for (let listener of this._resultListeners) - { - // See https://bugzilla.mozilla.org/show_bug.cgi?id=958101, starting - // with Gecko 29 only one parameter is expected. - try - { - if (listener.onFindResult.length == 1) - { - listener.onFindResult({searchString: this.searchString, - result: result, findBackwards: findBackwards}); - } - else - listener.onFindResult(result, findBackwards); - } - catch (e) - { - Cu.reportError(e); - } - } - }, - - fastFind: function(searchString, linksOnly, drawOutline) - { - this.searchString = searchString; - let result = FilterSearch.search(this.searchString, 0, - this.caseSensitive); - this._notifyResultListeners(result, false); - }, - - findAgain: function(findBackwards, linksOnly, drawOutline) - { - let result = FilterSearch.search(this.searchString, - findBackwards ? -1 : 1, - this.caseSensitive); - this._notifyResultListeners(result, findBackwards); - }, - - addResultListener: function(listener) - { - if (this._resultListeners.indexOf(listener) === -1) - this._resultListeners.push(listener); - }, - - removeResultListener: function(listener) - { - let index = this._resultListeners.indexOf(listener); - if (index !== -1) - this._resultListeners.splice(index, 1); - }, - - // Irrelevant for us - requestMatchesCount: function(searchString, matchLimit, linksOnly) {}, - highlight: function(highlight, word) {}, - enableSelection: function() {}, - removeSelection: function() {}, - focusContent: function() {}, - keyPress: function() {} + return "notFound"; }, - currentURI: Utils.makeURI("http://example.com/"), - contentWindow: + /** + * Performs a filter search and displays the resulting search status. + * @param {Integer} [direction] + * search direction: -1 (backwards), 0 (forwards starting with current), + * 1 (forwards starting with next) + */ + search: function(direction) { - focus: function() - { - E("filtersTree").focus(); - }, - scrollByLines: function(num) - { - E("filtersTree").boxObject.scrollByLines(num); - }, - scrollByPages: function(num) - { - E("filtersTree").boxObject.scrollByPages(num); - }, + E("findbar").setAttribute("data-status", this._search(direction)); } }; -window.addEventListener("load", function() +window.addEventListener("load", event => { - FilterSearch.init(); -}, false); + E("findbar").setAttribute("data-os", Services.appinfo.OS.toLowerCase()); +}); diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionactions.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionactions.js index 091a9f3..ed875f9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionactions.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionactions.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -49,7 +49,7 @@ var SubscriptionActions = let node = null; let tabIndex = -1; let subscriptions = filter.subscriptions.slice(); - subscriptions.sort(function(s1, s2) s1.disabled - s2.disabled); + subscriptions.sort((s1, s2) => s1.disabled - s2.disabled); for (let i = 0; i < subscriptions.length; i++) { let subscription = subscriptions[i]; @@ -68,7 +68,7 @@ var SubscriptionActions = node.parentNode.selectItem(node); if (!FilterActions.visible) E("subscription-showHideFilters-command").doCommand(); - Utils.runAsync(FilterView.selectFilter, FilterView, filter); + Utils.runAsync(() => FilterView.selectFilter(filter)); }); } }, @@ -295,7 +295,7 @@ var SubscriptionActions = event.dataTransfer.addElement(node); event.dataTransfer.setData("text/x-moz-url", data.subscription.url); - event.dataTransfer.setData("text/plain", data.subscription.title); + event.dataTransfer.setData("text/plain", getSubscriptionTitle(data.subscription)); this.dragSubscription = data.subscription; event.stopPropagation(); }, @@ -422,7 +422,7 @@ var TitleEditor = subscriptionNode.getElementsByClassName("titleBox")[0].selectedIndex = 1; let editor = subscriptionNode.getElementsByClassName("titleEditor")[0]; - editor.value = subscription.title; + editor.value = getSubscriptionTitle(subscription); editor.setSelectionRange(0, editor.value.length); this.subscriptionEdited = subscriptionNode; editor.focus(); @@ -538,7 +538,7 @@ var SelectSubscription = // Show panel and focus list let position = (Utils.versionComparator.compare(Utils.platformVersion, "2.0") < 0 ? "after_end" : "bottomcenter topleft"); panel.openPopup(E("selectSubscriptionButton"), position, 0, 0, false, false, event); - Utils.runAsync(list.focus, list); + Utils.runAsync(() => list.focus()); }; request.send(); }, diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionview.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionview.js index 8fc26e5..7b2bc1b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionview.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters-subscriptionview.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -91,10 +91,7 @@ ListManager.prototype = this.addSubscription(subscription, null); // Make sure first list item is selected after list initialization - Utils.runAsync(function() - { - this._list.selectItem(this._list.getItemAtIndex(this._list.getIndexOfFirstVisibleRow())); - }, this); + Utils.runAsync(() => this._list.selectItem(this._list.getItemAtIndex(this._list.getIndexOfFirstVisibleRow()))); } this._deck.selectedIndex = (subscriptions.length ? 1 : 0); @@ -116,7 +113,8 @@ ListManager.prototype = subscription: subscription, isExternal: subscription instanceof ExternalSubscription, downloading: Synchronizer.isExecuting(subscription.url), - disabledFilters: disabledFilters + disabledFilters: disabledFilters, + upgradeRequired: ListManager.isUpgradeRequired(subscription) }); if (insertBefore) this._list.insertBefore(node, insertBefore); @@ -170,14 +168,14 @@ ListManager.prototype = _onChange: function(action, item, param1, param2) { if ((action == "subscription.added" || action == "subscription.removed") && item.url == Prefs.subscriptions_exceptionsurl) - E("acceptableAds").checked = FilterStorage.subscriptions.some(function(s) s.url == Prefs.subscriptions_exceptionsurl); + E("acceptableAds").checked = FilterStorage.subscriptions.some(s => s.url == Prefs.subscriptions_exceptionsurl); if (action == "filter.disabled") { if (this._scheduledUpdateDisabled == null) { this._scheduledUpdateDisabled = Object.create(null); - Utils.runAsync(this.updateDisabled, this); + Utils.runAsync(() => this.updateDisabled()); } for (let i = 0; i < item.subscriptions.length; i++) this._scheduledUpdateDisabled[item.subscriptions[i].url] = true; @@ -251,11 +249,14 @@ ListManager.prototype = case "subscription.homepage": case "subscription.lastDownload": case "subscription.downloadStatus": + case "subscription.downloading": { let subscriptionNode = Templater.getNodeForData(this._list, "subscription", item); if (subscriptionNode) { - Templater.getDataForNode(subscriptionNode).downloading = Synchronizer.isExecuting(item.url); + let data = Templater.getDataForNode(subscriptionNode); + data.downloading = Synchronizer.isExecuting(item.url); + data.upgradeRequired = ListManager.isUpgradeRequired(item); Templater.update(this._template, subscriptionNode); if (!document.commandDispatcher.focusedElement) @@ -274,7 +275,7 @@ ListManager.prototype = if (this._scheduledUpdateDisabled == null) { this._scheduledUpdateDisabled = Object.create(null); - Utils.runAsync(this.updateDisabled, this); + Utils.runAsync(() => this.updateDisabled()); } this._scheduledUpdateDisabled[item.url] = true; break; @@ -290,13 +291,13 @@ ListManager.init = function() { new ListManager(E("subscriptions"), E("subscriptionTemplate"), - function(s) s instanceof RegularSubscription && !(ListManager.acceptableAdsCheckbox && s.url == Prefs.subscriptions_exceptionsurl), + s => s instanceof RegularSubscription && !(ListManager.acceptableAdsCheckbox && s.url == Prefs.subscriptions_exceptionsurl), SubscriptionActions.updateCommands); new ListManager(E("groups"), E("groupTemplate"), - function(s) s instanceof SpecialSubscription, + s => s instanceof SpecialSubscription, SubscriptionActions.updateCommands); - E("acceptableAds").checked = FilterStorage.subscriptions.some(function(s) s.url == Prefs.subscriptions_exceptionsurl); + E("acceptableAds").checked = FilterStorage.subscriptions.some(s => s.url == Prefs.subscriptions_exceptionsurl); E("acceptableAds").parentNode.hidden = !ListManager.acceptableAdsCheckbox; }; @@ -327,4 +328,19 @@ ListManager.allowAcceptableAds = function(/**Boolean*/ allow) FilterStorage.removeSubscription(subscription); }; +/** + * Checks whether Adblock Plus needs to be upgraded in order to support filters + * in a particular subscription. + */ +ListManager.isUpgradeRequired = function(/**Subscription*/ subscription) +{ + if (subscription instanceof DownloadableSubscription && subscription.requiredVersion) + { + let {addonVersion} = require("info"); + if (Services.vc.compare(subscription.requiredVersion, addonVersion) > 0) + return true; + } + return false; +}; + window.addEventListener("load", ListManager.init, false); diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.js index 29a2e31..3c75c6b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -24,7 +24,7 @@ function init() { let filter = window.arguments[0].wrappedJSObject; if (filter instanceof Filter) - Utils.runAsync(SubscriptionActions.selectFilter, SubscriptionActions, filter); + Utils.runAsync(() => SubscriptionActions.selectFilter(filter)); } } @@ -117,6 +117,7 @@ var Templater = for (let key in data) sandbox[key] = data[key]; sandbox.formatTime = Utils.formatTime; + sandbox.getSubscriptionTitle = getSubscriptionTitle; // Clone template but remove id/hidden attributes from it let result = template.cloneNode(true); diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.xul index 2341cdc..dac1b65 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/filters.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -86,9 +86,9 @@ <command id="filters-copy-command" oncommand="FilterActions.copySelected(true);"/> <command id="filters-cut-command" oncommand="FilterActions.copySelected(false);"/> <command id="filters-paste-command" oncommand="FilterActions.paste();"/> - <command id="find-command" oncommand="E('findbar').startFind(E('findbar').FIND_NORMAL)"/> - <command id="find-again-command" oncommand="E('findbar').onFindAgainCommand(false)"/> - <command id="find-previous-command" oncommand="E('findbar').onFindAgainCommand(true)"/> + <command id="find-command" oncommand="FilterSearch.open();"/> + <command id="find-again-command" oncommand="FilterSearch.search(1);"/> + <command id="find-previous-command" oncommand="FilterSearch.search(-1);"/> </commandset> <popupset id="filtersPopupset"> @@ -187,7 +187,7 @@ <hbox align="center"> <deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();"> <description ondblclick="if (event.button == 0) TitleEditor.start(this, true);"> - <description class="title" value="{subscription.title}" flex="1" crop="end"/> + <description class="title" value="{getSubscriptionTitle(subscription)}" flex="1" crop="end"/> (<if condition="{isExternal}"> <description value="&subscription.external.label;"/> <else/> @@ -246,7 +246,7 @@ </button> </hbox> - <description class="warning" hidden="{!subscription.upgradeRequired}">&subscription.minVersion.warning;</description> + <description class="warning" hidden="{!upgradeRequired}">&subscription.minVersion.warning;</description> <description class="warning" hidden="{!disabledFilters}"> &subscription.disabledFilters.warning; <description class="link" value="&subscription.disabledFilters.enable;" onclick="SubscriptionActions.enableFilters(this);"/> @@ -282,7 +282,7 @@ checked="{subscription.disabled ? 'false' : 'true'}" oncommand="SubscriptionActions.setDisabled(this, !this.checked);"/> <hbox align="center" flex="1"> <deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();"> - <description class="title" value="{subscription.title}" crop="end" ondblclick="if (event.button == 0) TitleEditor.start(this, true);"/> + <description class="title" value="{getSubscriptionTitle(subscription)}" crop="end" ondblclick="if (event.button == 0) TitleEditor.start(this, true);"/> <textbox oncontextmenu="event.stopPropagation();" class="titleEditor" onkeypress="TitleEditor.keyPress(event);" onblur="TitleEditor.end(true);"/> </deck> </hbox> @@ -338,6 +338,19 @@ </button> <button id="addFilterButton" label="&addFilter.label;" command="filters-add-command"/> </hbox> + + <hbox id="findbar" hidden="true" align="center" onkeypress="FilterSearch.keyPress(event);"> + <toolbarbutton id="findbar-closebutton" tooltiptext="&findbar.close;" oncommand="FilterSearch.close();"/> + <textbox id="findbar-textbox" type="search" placeholder="&findbar.placeholder;" flex="1" oncommand="FilterSearch.search();"/> + <spinbuttons id="findbar-findAgain" onup="FilterSearch.search(-1);" ondown="FilterSearch.search(1);"/> + <button id="findbar-case-sensitive" type="checkbox" label="&findbar.caseSensitive;" oncommand="FilterSearch.search(0);"/> + <stack> + <label id="findbar-status-wrappedStart" class="findbar-status" value="&findbar.statusWrappedStart;"/> + <label id="findbar-status-wrappedEnd" class="findbar-status" value="&findbar.statusWrappedEnd;"/> + <label id="findbar-status-notFound" class="findbar-status" value="&findbar.statusNotFound;"/> + </stack> + </hbox> + <tree id="filtersTree" flex="1" editable="true" @@ -368,8 +381,6 @@ </vbox> </hbox> -<findbar id="findbar"/> - <hbox id="buttons"> <button id="backupButton" type="menu" label="&backupButton.label;" @@ -378,7 +389,7 @@ _backupError="&backup.error;" _restoreError="&restore.error;" _restoreCompleteWarning="&restore.complete.warning;" _restoreCustomWarning="&restore.custom.warning;" _restoreVersionWarning="&restore.minVersion.warning;" - oncommand="if (event.target == this) Utils.runAsync(function() this.open = true, this);"> + oncommand="if (event.target == this) Utils.runAsync(() => this.open = true);"> <menupopup onpopupshowing="Backup.fillRestorePopup();"> <menuitem id="backup" key="backup-key" label="&backup.label;…" oncommand="Backup.backupToFile();"/> <menuseparator/> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.html b/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.html index cb2ec25..958c4f6 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.html +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -19,10 +19,13 @@ <html> <head> <title class="i18n_firstRun_title"></title> - <meta charset="utf-8"> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link type="text/css" href="skin/common.css" rel="stylesheet" /> <link type="text/css" href="skin/firstRun.css" rel="stylesheet"/> <script type="text/javascript" src="ext/common.js"></script> <script type="text/javascript" src="ext/content.js"></script> + <script type="text/javascript" src="common.js"></script> <script type="text/javascript" src="i18n.js"></script> <script type="text/javascript" src="firstRun.js"></script> </head> @@ -34,26 +37,38 @@ <h1 id="title-main" class="i18n_firstRun_title"></h1> </header> - <section id="legacySafariWarning" class="i18n_firstRun_legacySafariWarning warning" hidden="true"></section> <section id="filterlistsReinitializedWarning" class="i18n_firstRun_filterlistsReinitializedWarning warning" hidden="true"></section> - <section id="dataCorruptionWarning" class="i18n_firstRun_dataCorruptionWarning warning" hidden="true"></section> <div id="content"> - <section id="acceptable-ads"> - <h2 class="i18n_firstRun_acceptableAdsHeadline"></h2> - <p id="acceptableAdsExplanation" class="i18n_firstRun_acceptableAdsExplanation"></p> + <section id="general"> + <div id="acceptable-ads-block" class="block"> + <h2 class="i18n_firstRun_acceptableAdsHeadline"></h2> + <p id="acceptable-ads-explanation" class="i18n_firstRun_acceptableAdsExplanation"></p> + </div> + <div id="abb-promotion-block" class="block"> + <h2 class="i18n_firstRun_abbPromotionHeadline"></h2> + <a href="https://adblockbrowser.org/?ref=frp"> + <div> + <img src="skin/abb-logo.png" alt="Adblock Browser logo" /> + </div> + <div> + <div class="i18n_firstRun_abbButtonTitle title"></div> + <div class="i18n_firstRun_abbButtonSubtitle subtitle"></div> + </div> + </a> + </div> </section> <section id="share"> <h2 id="share-headline" class="i18n_firstRun_share_headline"></h2> - <div id="donate-block"> + <div class="block"> <a id="donate" class="i18n_firstRun_donate" target="_blank"></a> <span id="donate-label" class="i18n_firstRun_donate_label"></span> </div> - <div id="share-block"> + <div class="block"> <div id="share-general" class="share-buttons"> <a id="share-facebook" href="https://www.facebook.com/adblockplus" target="_blank" data-script="https://facebook.com/plugins/like.php?"> </a> @@ -74,70 +89,10 @@ </div> </section> - - <section id="can-do-more"> - <h2 class="i18n_firstRun_features"></h2> - - <div id="can-do-more-content"> - <ul id="features"> - <li id="feature-malware" class="feature"> - <div class="feature-image feature-malware-image"></div> - <div class="feature-description"> - <div class="feature-description-textblock"> - <h3 class="i18n_firstRun_feature_malware feature-title"></h3> - <span class="i18n_firstRun_feature_malware_description"></span> - </div> - <div id="toggle-malware" class="toggle"> - <div class="i18n_firstRun_toggle_on toggle-on"></div> - <div class="toggle-blob"></div> - <div class="i18n_firstRun_toggle_off toggle-off"></div> - </div> - </div> - - </li> - <li id="feature-social" class="feature"> - <div class="feature-image feature-social-image"></div> - <div class="feature-description"> - <div class="feature-description-textblock"> - <h3 class="i18n_firstRun_feature_social feature-title"></h3> - <span class="i18n_firstRun_feature_social_description"></span> - </div> - <div id="toggle-social" class="toggle"> - <div class="i18n_firstRun_toggle_on toggle-on"></div> - <div class="toggle-blob"></div> - <div class="i18n_firstRun_toggle_off toggle-off"></div> - </div> - </div> - </li> - - <li id="feature-tracking" class="feature"> - <div class="feature-image feature-tracking-image"></div> - <div class="feature-description"> - <div class="feature-description-textblock"> - <h3 class="i18n_firstRun_feature_tracking feature-title"></h3> - <span class="i18n_firstRun_feature_tracking_description"></span> - </div> - <div id="toggle-tracking" class="toggle"> - <div class="i18n_firstRun_toggle_on toggle-on"></div> - <div class="toggle-blob"></div> - <div class="i18n_firstRun_toggle_off toggle-off"></div> - </div> - </div> - </li> - - </ul> - - </div> - </section> </div> <footer> <a id="contributors" class="i18n_firstRun_contributor_credits"></a> </footer> - - - <div id="glass-pane"> - <iframe id="share-popup" scrolling="no"></iframe> - </div> </body> </html> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.js index 3a11a2e..14d3db2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/firstRun.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,52 +15,18 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +/* globals checkShareResource, getDocLink, openSharePopup, E */ + "use strict"; (function() { - function E(id) - { - return document.getElementById(id); - } - - // Load subscriptions for features - var featureSubscriptions = [ - { - feature: "malware", - homepage: "http://malwaredomains.com/", - title: "Malware Domains", - url: "https://easylist-downloads.adblockplus.org/malwaredomains_full.txt" - }, - { - feature: "social", - homepage: "https://www.fanboy.co.nz/", - title: "Fanboy's Social Blocking List", - url: "https://easylist-downloads.adblockplus.org/fanboy-social.txt" - }, - { - feature: "tracking", - homepage: "https://easylist.adblockplus.org/", - title: "EasyPrivacy", - url: "https://easylist-downloads.adblockplus.org/easyprivacy.txt" - } - ]; - - function getDocLink(link, callback) - { - ext.backgroundPage.sendMessage({ - type: "app.get", - what: "doclink", - link: link - }, callback); - } - function onDOMLoaded() { // Set up logo image - var logo = E("logo"); + let logo = E("logo"); logo.src = "skin/abp-128.png"; - var errorCallback = function() + let errorCallback = function() { logo.removeEventListener("error", errorCallback, false); // We are probably in Chrome/Opera/Safari, the image has a different path. @@ -69,22 +35,22 @@ logo.addEventListener("error", errorCallback, false); // Set up URLs - getDocLink("donate", function(link) + getDocLink("donate", (link) => { E("donate").href = link; }); - getDocLink("contributors", function(link) + getDocLink("contributors", (link) => { E("contributors").href = link; }); - getDocLink("acceptable_ads_criteria", function(link) + getDocLink("acceptable_ads_criteria", (link) => { - setLinks("acceptableAdsExplanation", link, openFilters); + setLinks("acceptable-ads-explanation", link, openFilters); }); - getDocLink("contribute", function(link) + getDocLink("contribute", (link) => { setLinks("share-headline", link); }); @@ -92,39 +58,22 @@ ext.backgroundPage.sendMessage({ type: "app.get", what: "issues" - }, function(issues) + }, (issues) => { - // Show warning if data corruption was detected - if (issues.seenDataCorruption) - { - E("dataCorruptionWarning").removeAttribute("hidden"); - getDocLink("knownIssuesChrome_filterstorage", function(link) - { - setLinks("dataCorruptionWarning", link); - }); - } - // Show warning if filterlists settings were reinitialized if (issues.filterlistsReinitialized) { E("filterlistsReinitializedWarning").removeAttribute("hidden"); setLinks("filterlistsReinitializedWarning", openFilters); } - - if (issues.legacySafariVersion) - E("legacySafariWarning").removeAttribute("hidden"); }); - // Set up feature buttons linked to subscriptions - featureSubscriptions.forEach(initToggleSubscriptionButton); - updateToggleButtons(); updateSocialLinks(); - ext.onMessage.addListener(function(message) + ext.onMessage.addListener((message) => { - if (message.type == "subscriptions.listen") + if (message.type == "subscriptions.respond") { - updateToggleButtons(); updateSocialLinks(); } }); @@ -134,127 +83,56 @@ }); } - function initToggleSubscriptionButton(featureSubscription) - { - var feature = featureSubscription.feature; - - var element = E("toggle-" + feature); - element.addEventListener("click", function(event) - { - ext.backgroundPage.sendMessage({ - type: "subscriptions.toggle", - url: featureSubscription.url, - title: featureSubscription.title, - homepage: featureSubscription.homepage - }); - }, false); - } - - function openSharePopup(url) - { - var iframe = E("share-popup"); - var glassPane = E("glass-pane"); - var popupMessageReceived = false; - - var popupMessageListener = function(event) - { - if (!/[.\/]adblockplus\.org$/.test(event.origin)) - return; - - var width = event.data.width; - var height = event.data.height; - iframe.width = width; - iframe.height = height; - iframe.style.marginTop = -height/2 + "px"; - iframe.style.marginLeft = -width/2 + "px"; - popupMessageReceived = true; - window.removeEventListener("message", popupMessageListener); - }; - // Firefox requires last parameter to be true to be triggered by unprivileged pages - window.addEventListener("message", popupMessageListener, false, true); - - var popupLoadListener = function() - { - if (popupMessageReceived) - { - iframe.className = "visible"; - - var popupCloseListener = function() - { - iframe.className = glassPane.className = ""; - document.removeEventListener("click", popupCloseListener); - }; - document.addEventListener("click", popupCloseListener, false); - } - else - { - glassPane.className = ""; - window.removeEventListener("message", popupMessageListener); - } - - iframe.removeEventListener("load", popupLoadListener); - }; - iframe.addEventListener("load", popupLoadListener, false); - - iframe.src = url; - glassPane.className = "visible"; - } - function updateSocialLinks() { - var networks = ["twitter", "facebook", "gplus"]; - networks.forEach(function(network) + for (let network of ["twitter", "facebook", "gplus"]) { - var link = E("share-" + network); - var message = { - type: "filters.blocked", - url: link.getAttribute("data-script"), - requestType: "SCRIPT", - docDomain: "adblockplus.org", - thirdParty: true - }; - ext.backgroundPage.sendMessage(message, function(blocked) + let link = E("share-" + network); + checkShareResource(link.getAttribute("data-script"), (isBlocked) => { // Don't open the share page if the sharing script would be blocked - if (blocked) + if (isBlocked) link.removeEventListener("click", onSocialLinkClick, false); else link.addEventListener("click", onSocialLinkClick, false); }); - }); + } } function onSocialLinkClick(event) { + if (window.matchMedia("(max-width: 970px)").matches) + return; + event.preventDefault(); - getDocLink(event.target.id, function(link) + getDocLink(event.target.id, (link) => { openSharePopup(link); }); } - function setLinks(id) + function setLinks(id, ...args) { - var element = E(id); + let element = E(id); if (!element) { return; } - var links = element.getElementsByTagName("a"); + let links = element.getElementsByTagName("a"); - for (var i = 0; i < links.length; i++) + for (let i = 0; i < links.length; i++) { - if (typeof arguments[i + 1] == "string") + if (typeof args[i] == "string") { - links[i].href = arguments[i + 1]; + links[i].href = args[i]; links[i].setAttribute("target", "_blank"); } - else if (typeof arguments[i + 1] == "function") + else if (typeof args[i] == "function") { links[i].href = "javascript:void(0);"; - links[i].addEventListener("click", arguments[i + 1], false); + links[i].addEventListener("click", args[i], false); } } } @@ -264,33 +142,5 @@ ext.backgroundPage.sendMessage({type: "app.open", what: "options"}); } - function updateToggleButtons() - { - ext.backgroundPage.sendMessage({ - type: "subscriptions.get", - downloadable: true, - ignoreDisabled: true - }, function(subscriptions) - { - var known = Object.create(null); - for (var i = 0; i < subscriptions.length; i++) - known[subscriptions[i].url] = true; - for (var i = 0; i < featureSubscriptions.length; i++) - { - var featureSubscription = featureSubscriptions[i]; - updateToggleButton(featureSubscription.feature, featureSubscription.url in known); - } - }); - } - - function updateToggleButton(feature, isEnabled) - { - var button = E("toggle-" + feature); - if (isEnabled) - button.classList.remove("off"); - else - button.classList.add("off"); - } - document.addEventListener("DOMContentLoaded", onDOMLoaded, false); -})(); +}()); diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/flasher.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/flasher.js deleted file mode 100644 index 69f4c9e..0000000 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/flasher.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH - * - * Adblock Plus is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * Adblock Plus is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. - */ - -/** - * Draws a blinking border for a list of matching nodes. - */ - -var flasher = { - nodes: null, - count: 0, - timer: null, - - flash: function(nodes) - { - this.stop(); - if (nodes) - nodes = nodes.filter(function(node) node.nodeType == Node.ELEMENT_NODE); - if (!nodes || !nodes.length) - return; - - if (Prefs.flash_scrolltoitem && nodes[0].ownerDocument) - { - // Ensure that at least one node is visible when flashing - let wnd = nodes[0].ownerDocument.defaultView; - try - { - let topWnd = Utils.getChromeWindow(wnd); - let {getBrowser} = require("appSupport"); - let browser = (getBrowser ? getBrowser(topWnd) : null); - if (browser) - browser.markupDocumentViewer.scrollToNode(nodes[0]); - } - catch(e) - { - Cu.reportError(e); - } - } - - this.nodes = nodes; - this.count = 0; - - this.doFlash(); - }, - - doFlash: function() { - if (this.count >= 12) { - this.stop(); - return; - } - - if (this.count % 2) - this.switchOff(); - else - this.switchOn(); - - this.count++; - - this.timer = window.setTimeout(function() {flasher.doFlash()}, 300); - }, - - stop: function() { - if (this.timer) { - window.clearTimeout(this.timer); - this.timer = null; - } - - if (this.nodes) { - this.switchOff(); - this.nodes = null; - } - }, - - setOutline: function(outline, offset) - { - for (var i = 0; i < this.nodes.length; i++) - { - if ("style" in this.nodes[i]) - { - this.nodes[i].style.outline = outline; - this.nodes[i].style.outlineOffset = offset; - } - } - }, - - switchOn: function() - { - this.setOutline("#CC0000 dotted 2px", "-2px"); - }, - - switchOff: function() - { - this.setOutline("", ""); - } -}; diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js index 9d380b7..a21fa24 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,9 +15,11 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + // This variable should no longer be necessary once options.js in Chrome // accesses ext.i18n directly. -var i18n = ext.i18n; +let {i18n} = ext; // Getting UI locale cannot be done synchronously on Firefox, // requires messaging the background page. For Chrome and Safari, @@ -28,71 +30,92 @@ ext.backgroundPage.sendMessage( type: "app.get", what: "localeInfo" }, - function(localeInfo) + (localeInfo) => { document.documentElement.lang = localeInfo.locale; document.documentElement.dir = localeInfo.bidiDir; } ); -// Inserts i18n strings into matching elements. Any inner HTML already in the element is -// parsed as JSON and used as parameters to substitute into placeholders in the i18n -// message. -ext.i18n.setElementText = function(element, stringName, arguments) +// Inserts i18n strings into matching elements. Any inner HTML already +// in the element is parsed as JSON and used as parameters to +// substitute into placeholders in the i18n message. +ext.i18n.setElementText = function(element, stringName, args) { - function processString(str, element) + function processString(str, currentElement) { - var match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str); + let match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str); if (match) { - processString(match[1], element); + processString(match[1], currentElement); - var e = document.createElement(match[2]); + let e = document.createElement(match[2]); processString(match[3], e); - element.appendChild(e); + currentElement.appendChild(e); - processString(match[4], element); + processString(match[4], currentElement); } else - element.appendChild(document.createTextNode(str)); + currentElement.appendChild(document.createTextNode(str)); } while (element.lastChild) element.removeChild(element.lastChild); - processString(ext.i18n.getMessage(stringName, arguments), element); -} + processString(ext.i18n.getMessage(stringName, args), element); +}; // Loads i18n strings function loadI18nStrings() { - var nodes = document.querySelectorAll("[class^='i18n_']"); - for(var i = 0; i < nodes.length; i++) + function addI18nStringsToElements(containerElement) { - var node = nodes[i]; - var arguments = JSON.parse("[" + node.textContent + "]"); - if (arguments.length == 0) - arguments = null; + let elements = containerElement.querySelectorAll("[class^='i18n_']"); + for (let node of elements) + { + let args = JSON.parse("[" + node.textContent + "]"); + if (args.length == 0) + args = null; - var className = node.className; - if (className instanceof SVGAnimatedString) - className = className.animVal; - var stringName = className.split(/\s/)[0].substring(5); + let {className} = node; + if (className instanceof SVGAnimatedString) + className = className.animVal; + let stringName = className.split(/\s/)[0].substring(5); - ext.i18n.setElementText(node, stringName, arguments); + ext.i18n.setElementText(node, stringName, args); + } } + addI18nStringsToElements(document); + // Content of Template is not rendered on runtime so we need to add + // translation strings for each Template documentFragment content + // individually. + for (let template of document.querySelectorAll("template")) + addI18nStringsToElements(template.content); } // Provides a more readable string of the current date and time -function i18n_timeDateStrings(when) +function i18nTimeDateStrings(when) { - var d = new Date(when); - var timeString = d.toLocaleTimeString(); + let d = new Date(when); + let timeString = d.toLocaleTimeString(); - var now = new Date(); + let now = new Date(); if (d.toDateString() == now.toDateString()) return [timeString]; - else - return [timeString, d.toLocaleDateString()]; + return [timeString, d.toLocaleDateString()]; +} + +// Formats date string to ["YYYY-MM-DD", "mm:ss"] format +function i18nFormatDateTime(when) +{ + let date = new Date(when); + let dateParts = [date.getFullYear(), date.getMonth() + 1, date.getDate(), + date.getHours(), date.getMinutes()]; + + dateParts = dateParts.map( + (datePart) => datePart < 10 ? "0" + datePart : datePart + ); + + return [dateParts.splice(0, 3).join("-"), dateParts.join(":")]; } // Fill in the strings as soon as possible diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/overlay.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/overlay.xul index 62c57e6..d1de4c0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/overlay.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/overlay.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -60,6 +60,7 @@ <menuitem id="abp-status-frameobjects" label="&objecttabs.label;" type="checkbox" command="abp-command-toggleobjtabs"/> <menuitem id="abp-status-savestats" label="&counthits.label;" type="checkbox" command="abp-command-togglesavestats"/> <menuitem id="abp-status-sync" label="&sync.label;" type="checkbox" command="abp-command-togglesync"/> + <menuitem id="abp-status-shownotifications" label="&shownotifications.label;" type="checkbox" command="abp-command-toggleshownotifications"/> <menuseparator id="abp-status-iconSettingsSeparator"/> <menuitem id="abp-status-showintoolbar" label="&showintoolbar.label;" type="checkbox" command="abp-command-toggleshowintoolbar"/> <menuitem id="abp-status-showinstatusbar" label="&showinstatusbar.label;" type="checkbox" command="abp-command-toggleshowinstatusbar"/> @@ -85,6 +86,7 @@ <command id="abp-command-enable" oncommand="//"/> <command id="abp-command-contribute"/> <command id="abp-command-contribute-hide"/> + <command id="abp-command-toggleshownotifications"/> </commandset> <statusbarpanel id="abp-status" class="statusbarpanel-iconic" @@ -113,12 +115,20 @@ <!-- Notification panel --> <panel id="abp-notification" type="arrow" orient="vertical" xmlns:html="http://www.w3.org/1999/xhtml"> - <label id="abp-notification-title" class="header"/> - <html:p id="abp-notification-message"/> - <hbox id="abp-notification-question"> - <button id="abp-notification-yes" label="¬ification.button.yes;"/> - <button id="abp-notification-no" label="¬ification.button.no;"/> - <toolbarbutton id="abp-notification-close" label="¬ification.button.close;"></toolbarbutton> - </hbox> + <vbox id="abp-notification-content"> + <toolbar align="start"> + <label id="abp-notification-title" class="header" flex="1" crop="end"/> + <toolbarbutton id="abp-notification-close" tooltiptext="¬ification.button.close;"/> + </toolbar> + <html:p id="abp-notification-message"/> + <hbox id="abp-notification-question"> + <button id="abp-notification-yes" label="¬ification.button.yes;"/> + <button id="abp-notification-no" label="¬ification.button.no;"/> + </hbox> + </vbox> + <vbox id="abp-notification-close-content"> + <toolbarbutton id="abp-notification-hide" label="¬ification.closing.button.hide;"/> + <toolbarbutton id="abp-notification-optout" label="¬ification.closing.button.optout;"/> + </vbox> </panel> </overlay> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.js index a449c2c..fadad52 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.xul index 3098d12..0e85303 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/progressBar.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.js index c61dbbb..ee9e7f5 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -19,16 +19,20 @@ // Report data template, more data will be added during data collection // -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/FileUtils.jsm"); +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); +let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", {}); const MILLISECONDS_IN_SECOND = 1000; const SECONDS_IN_MINUTE = 60; const SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE; const SECONDS_IN_DAY = 24 * SECONDS_IN_HOUR; -let contentWindow = window.arguments[0]; -let windowURI = (window.arguments[1] instanceof Ci.nsIURI ? window.arguments[1] : null); +let outerWindowID = window.arguments[0]; +let windowURI = window.arguments[1]; +if (typeof windowURI == "string") + windowURI = Services.newURI(windowURI, null, null); +let browser = window.arguments[2]; +let isPrivate = false; let reportData = new DOMParser().parseFromString("<report></report>", "text/xml"); @@ -70,31 +74,30 @@ function serializeReportData() return result; } -let (element = reportElement("adblock-plus")) { + let element = reportElement("adblock-plus"); let {addonVersion} = require("info"); element.setAttribute("version", addonVersion); element.setAttribute("locale", Utils.appLocale); -}; -let (element = reportElement("application")) +} { + let element = reportElement("application"); element.setAttribute("name", Services.appinfo.name); element.setAttribute("vendor", Services.appinfo.vendor); element.setAttribute("version", Services.appinfo.version); element.setAttribute("userAgent", window.navigator.userAgent); -}; -let (element = reportElement("platform")) +} { + let element = reportElement("platform"); element.setAttribute("name", "Gecko"); element.setAttribute("version", Services.appinfo.platformVersion); element.setAttribute("build", Services.appinfo.platformBuildID); }; -let (element = reportElement("options")) { + let element = reportElement("options"); appendElement(element, "option", {id: "enabled"}, Prefs.enabled); appendElement(element, "option", {id: "objecttabs"}, Prefs.frameobjects); appendElement(element, "option", {id: "collapse"}, !Prefs.fastcollapse); - appendElement(element, "option", {id: "privateBrowsing"}, PrivateBrowsing.enabledForWindow(contentWindow) || PrivateBrowsing.enabled); appendElement(element, "option", {id: "subscriptionsAutoUpdate"}, Prefs.subscriptions_autoupdate); appendElement(element, "option", {id: "javascript"}, Services.prefs.getBoolPref("javascript.enabled")); appendElement(element, "option", {id: "cookieBehavior"}, Services.prefs.getIntPref("network.cookie.cookieBehavior")); @@ -104,11 +107,11 @@ let (element = reportElement("options")) // Data collectors // -let reportsListDataSource = +var reportsListDataSource = { list: [], - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { let data = Prefs.recentReports; if (data && "length" in data) @@ -183,7 +186,7 @@ let reportsListDataSource = } }; -let requestsDataSource = +var requestsDataSource = { requests: reportElement("requests"), origRequests: [], @@ -191,17 +194,17 @@ let requestsDataSource = callback: null, nodeByKey: Object.create(null), - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { this.callback = callback; - this.requestNotifier = new RequestNotifier(wnd, this.onRequestFound, this); + this.requestNotifier = new RequestNotifier(outerWindowID, this.onRequestFound, this); }, - onRequestFound: function(frame, node, entry, scanComplete) + onRequestFound: function(entry, scanComplete) { if (entry) { - let key = entry.location + " " + entry.typeDescr + " " + entry.docDomain; + let key = entry.location + " " + entry.type + " " + entry.docDomain; let requestXML; if (key in this.nodeByKey) { @@ -212,29 +215,20 @@ let requestsDataSource = { requestXML = this.nodeByKey[key] = appendElement(this.requests, "request", { location: censorURL(entry.location), - type: entry.typeDescr, + type: entry.type, docDomain: entry.docDomain, thirdParty: entry.thirdParty, count: 1 }); - } - // Location is meaningless for element hiding hits - if (entry.filter && entry.filter instanceof ElemHideBase) - requestXML.removeAttribute("location"); + // Location is meaningless for element hiding hits + if (requestXML.getAttribute("location")[0] == "#") + requestXML.removeAttribute("location"); + } if (entry.filter) - requestXML.setAttribute("filter", entry.filter.text); - - if (node instanceof Element) - { - requestXML.setAttribute("node", (node.namespaceURI ? node.namespaceURI + "#" : "") + node.localName); + requestXML.setAttribute("filter", entry.filter); - try - { - requestXML.setAttribute("size", node.offsetWidth + "x" + node.offsetHeight); - } catch(e) {} - } this.origRequests.push(entry); } @@ -247,33 +241,35 @@ let requestsDataSource = } }; -let filtersDataSource = +var filtersDataSource = { origFilters: [], - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { - let wndStats = RequestNotifier.getWindowStatistics(wnd); - if (wndStats) + RequestNotifier.getWindowStatistics(outerWindowID, (wndStats) => { - let filters = reportElement("filters"); - for (let f in wndStats.filters) + if (wndStats) { - let filter = Filter.fromText(f) - let hitCount = wndStats.filters[f]; - appendElement(filters, "filter", { - text: filter.text, - subscriptions: filter.subscriptions.filter(subscriptionsDataSource.subscriptionFilter).map(function(s) s.url).join(" "), - hitCount: hitCount - }); - this.origFilters.push(filter); + let filters = reportElement("filters"); + for (let f in wndStats.filters) + { + let filter = Filter.fromText(f) + let hitCount = wndStats.filters[f]; + appendElement(filters, "filter", { + text: filter.text, + subscriptions: filter.subscriptions.filter(subscriptionsDataSource.subscriptionFilter).map(s => s.url).join(" "), + hitCount: hitCount + }); + this.origFilters.push(filter); + } } - } - callback(); + callback(); + }); } }; -let subscriptionsDataSource = +var subscriptionsDataSource = { subscriptionFilter: function(s) { @@ -284,7 +280,7 @@ let subscriptionsDataSource = return true; }, - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { let subscriptions = reportElement("subscriptions"); let now = Math.round(Date.now() / 1000); @@ -296,7 +292,7 @@ let subscriptionsDataSource = let subscriptionXML = appendElement(subscriptions, "subscription", { id: subscription.url, - disabledFilters: subscription.filters.filter(function(filter) filter instanceof ActiveFilter && filter.disabled).length + disabledFilters: subscription.filters.filter(filter => filter instanceof ActiveFilter && filter.disabled).length }); if (subscription.version) subscriptionXML.setAttribute("version", subscription.version); @@ -317,16 +313,31 @@ let subscriptionsDataSource = } }; -let screenshotDataSource = +var remoteDataSource = { - imageOffset: 10, + collectData: function(outerWindowID, windowURI, browser, callback) + { + let {port} = require("messaging"); + let screenshotWidth = screenshotDataSource.getWidth(); + port.emitWithResponse("collectData", {outerWindowID, screenshotWidth}) + .then(data => + { + screenshotDataSource.setData(data && data.screenshot); + framesDataSource.setData(windowURI, data && data.opener, data && data.referrer, data && data.frames); + + if (data && data.isPrivate) + isPrivate = true; + let element = reportElement("options"); + appendElement(element, "option", {id: "privateBrowsing"}, isPrivate); + + callback(); + }); + } +} - // Fields used for color reduction - _mapping: [0x00, 0x55, 0xAA, 0xFF], - _i: null, - _max: null, - _pixelData: null, - _callback: null, +var screenshotDataSource = +{ + imageOffset: 10, // Fields used for user interaction _enabled: true, @@ -336,76 +347,42 @@ let screenshotDataSource = _currentData: null, _undoQueue: [], - collectData: function(wnd, windowURI, callback) + getWidth: function() { - this._callback = callback; - this._canvas = E("screenshotCanvas"); - this._canvas.width = this._canvas.offsetWidth; - - // Do not resize canvas any more (no idea why Gecko requires both to be set) - this._canvas.parentNode.style.MozBoxAlign = "center"; - this._canvas.parentNode.align = "center"; - - this._context = this._canvas.getContext("2d"); - let wndWidth = wnd.document.documentElement.scrollWidth; - let wndHeight = wnd.document.documentElement.scrollHeight; + let canvas = E("screenshotCanvas"); + return canvas.offsetWidth - this.imageOffset * 2; + }, - // Copy scaled screenshot of the webpage. We scale the webpage by width - // but leave 10px on each side for easier selecting. + setData: function(screenshot) + { + let canvas = E("screenshotCanvas"); - // Gecko doesn't like sizes more than 64k, restrict to 30k to be on the safe side. - // Also, make sure height is at most five times the width to keep image size down. - let copyWidth = Math.min(wndWidth, 30000); - let copyHeight = Math.min(wndHeight, 30000, copyWidth * 5); - let copyX = Math.max(Math.min(wnd.scrollX - copyWidth / 2, wndWidth - copyWidth), 0); - let copyY = Math.max(Math.min(wnd.scrollY - copyHeight / 2, wndHeight - copyHeight), 0); + // Do not resize canvas any more (no idea why Gecko requires both to be set) + canvas.parentNode.style.MozBoxAlign = "center"; + canvas.parentNode.align = "center"; - let scalingFactor = (this._canvas.width - this.imageOffset * 2) / copyWidth; - this._canvas.height = copyHeight * scalingFactor + this.imageOffset * 2; + let context = canvas.getContext("2d"); + this._canvas = canvas; + this._context = context; - this._context.save(); - this._context.translate(this.imageOffset, this.imageOffset); - this._context.scale(scalingFactor, scalingFactor); - this._context.drawWindow(wnd, copyX, copyY, copyWidth, copyHeight, "rgb(255,255,255)"); - this._context.restore(); + if (screenshot) + { + canvas.width = screenshot.width + this.imageOffset * 2; + canvas.height = screenshot.height + this.imageOffset * 2; + context.putImageData(screenshot, this.imageOffset, this.imageOffset); + } // Init canvas settings - this._context.fillStyle = "rgb(0, 0, 0)"; - this._context.strokeStyle = "rgba(255, 0, 0, 0.7)"; - this._context.lineWidth = 3; - this._context.lineJoin = "round"; - - // Reduce colors asynchronously - this._pixelData = this._context.getImageData(this.imageOffset, this.imageOffset, - this._canvas.width - this.imageOffset * 2, - this._canvas.height - this.imageOffset * 2); - this._max = this._pixelData.width * this._pixelData.height * 4; - this._i = 0; - Utils.runAsync(this.run.bind(this)); + context.fillStyle = "rgb(0, 0, 0)"; + context.strokeStyle = "rgba(255, 0, 0, 0.7)"; + context.lineWidth = 3; + context.lineJoin = "round"; }, - run: function() + get enabled() { - // Process only 5000 bytes at a time to prevent browser hangs - let endIndex = Math.min(this._i + 5000, this._max); - let i = this._i; - for (; i < endIndex; i++) - this._pixelData.data[i] = this._mapping[this._pixelData.data[i] >> 6]; - - if (i >= this._max) - { - // Save data back and we are done - this._context.putImageData(this._pixelData, this.imageOffset, this.imageOffset); - this._callback(); - } - else - { - this._i = i; - Utils.runAsync(this.run.bind(this)); - } + return this._enabled; }, - - get enabled() this._enabled, set enabled(enabled) { if (this._enabled == enabled) @@ -418,7 +395,10 @@ let screenshotDataSource = E("screenshotUndoButton").disabled = !this._enabled || !this._undoQueue.length; }, - get selectionType() this._selectionType, + get selectionType() + { + return this._selectionType; + }, set selectionType(type) { if (this._selectionType == type) @@ -563,11 +543,11 @@ let screenshotDataSource = } }; -let framesDataSource = +var framesDataSource = { site: null, - collectData: function(wnd, windowURI, callback) + setData: function(windowURI, opener, referrer, frames) { try { @@ -581,40 +561,29 @@ let framesDataSource = } let window = reportElement("window"); - window.setAttribute("url", censorURL(windowURI ? windowURI.spec : wnd.location.href)); - if (wnd.opener && wnd.opener.location.href) - window.setAttribute("opener", censorURL(wnd.opener.location.href)); - if (wnd.document.referrer) - window.setAttribute("referrer", censorURL(wnd.document.referrer)); - this.scanFrames(wnd, window); - - callback(); + window.setAttribute("url", censorURL(windowURI.spec)); + if (opener) + window.setAttribute("opener", censorURL(opener)); + if (referrer) + window.setAttribute("referrer", censorURL(referrer)); + this.addFrames(frames || [], window); }, - scanFrames: function(wnd, xmlList) + addFrames: function(frames, xmlList) { - try + for (let frame of frames) { - for (let i = 0; i < wnd.frames.length; i++) - { - let frame = wnd.frames[i]; - let frameXML = appendElement(xmlList, "frame", { - url: censorURL(frame.location.href) - }); - this.scanFrames(frame, frameXML); - } - } - catch (e) - { - // Don't break if something goes wrong - Cu.reportError(e); + let frameXML = appendElement(xmlList, "frame", { + url: censorURL(frame.url) + }); + this.addFrames(frame.frames, frameXML); } } }; -let errorsDataSource = +var errorsDataSource = { - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { let {addonID} = require("info"); addonID = addonID.replace(/[\{\}]/g, ""); @@ -650,6 +619,11 @@ let errorsDataSource = } catch(e) {} } + function str2regexp(str, flags) + { + return new RegExp(str.replace(/\W/g, "\\$&"), flags); + } + let errors = reportElement("errors"); for (let i = 0; i < messages.length; i++) { @@ -657,13 +631,13 @@ let errorsDataSource = let text = message.errorMessage; for (let path in censored) - text = text.replace(path, censored[path], "gi"); + text = text.replace(str2regexp(path, "gi"), censored[path]); if (text.length > 256) text = text.substr(0, 256) + "..."; let file = message.sourceName; for (let path in censored) - file = file.replace(path, censored[path], "gi"); + file = file.replace(str2regexp(path, "gi"), censored[path]); if (file.length > 256) file = file.substr(0, 256) + "..."; @@ -685,11 +659,11 @@ let errorsDataSource = } }; -let extensionsDataSource = +var extensionsDataSource = { data: reportData.createElement("extensions"), - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { try { @@ -727,13 +701,13 @@ let extensionsDataSource = } }; -let subscriptionUpdateDataSource = +var subscriptionUpdateDataSource = { - contentWnd: null, + browser: null, type: null, outdated: null, needUpdate: null, - + subscriptionFilter: function(s) { if (s instanceof DownloadableSubscription) @@ -742,9 +716,9 @@ let subscriptionUpdateDataSource = return false; }, - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { - this.contentWnd = wnd; + this.browser = browser; let now = Date.now() / MILLISECONDS_IN_SECOND; let outdatedThreshold = now - 14 * SECONDS_IN_DAY; let needUpdateThreshold = now - 1 * SECONDS_IN_HOUR; @@ -785,7 +759,7 @@ let subscriptionUpdateDataSource = entry.removeAttribute("hidden"); entry.setAttribute("_url", subscription.url); entry.setAttribute("tooltiptext", subscription.url); - entry.textContent = subscription.title; + entry.textContent = getSubscriptionTitle(subscription); list.appendChild(entry); } } @@ -818,8 +792,14 @@ let subscriptionUpdateDataSource = let filtersRemoved = false; let requests = requestsDataSource.origRequests; for (let i = 0; i < requests.length; i++) - if (requests[i].filter && !requests[i].filter.subscriptions.filter(function(s) !s.disabled).length) + { + if (!requests[i].filter) + continue; + + let filter = Filter.fromText(requests[i].filter); + if (!filter.subscriptions.some(s => !s.disabled)) filtersRemoved = true; + } if (filtersRemoved) { @@ -829,17 +809,17 @@ let subscriptionUpdateDataSource = let nextButton = document.documentElement.getButton("next"); [nextButton.label, nextButton.accessKey] = Utils.splitLabel(E("updatePage").getAttribute("reloadButtonLabel")); - document.documentElement.addEventListener("wizardnext", function(event) + document.documentElement.addEventListener("wizardnext", event => { event.preventDefault(); event.stopPropagation(); window.close(); - this.contentWnd.location.reload(); - }.bind(this), true); + this.browser.reload(); + }, true); } else { - this.collectData(null, null, function() {}); + this.collectData(null, null, null, function() {}); this.needUpdate = []; if (this.outdated.length) { @@ -879,9 +859,9 @@ let subscriptionUpdateDataSource = } } -let issuesDataSource = +var issuesDataSource = { - contentWnd: null, + browser: null, isEnabled: Prefs.enabled, whitelistFilter: null, disabledFilters: [], @@ -902,10 +882,10 @@ let issuesDataSource = return false; }, - collectData: function(wnd, windowURI, callback) + collectData: function(outerWindowID, windowURI, browser, callback) { - this.contentWnd = wnd; - this.whitelistFilter = Policy.isWindowWhitelisted(wnd); + this.browser = browser; + this.whitelistFilter = Policy.isWhitelisted(windowURI.spec); if (!this.whitelistFilter && this.isEnabled) { @@ -927,7 +907,7 @@ let issuesDataSource = if (request.filter) continue; - let filter = disabledMatcher.matchesAny(request.location, request.typeDescr, request.docDomain, request.thirdParty); + let filter = disabledMatcher.matchesAny(request.location, RegExpFilter.typeMap[request.type], request.docDomain, request.thirdParty); if (filter && !(filter.text in seenFilters)) { this.disabledFilters.push(filter); @@ -952,7 +932,7 @@ let issuesDataSource = if (request.filter) continue; - let filter = disabledMatcher.matchesAny(request.location, request.typeDescr, request.docDomain, request.thirdParty); + let filter = disabledMatcher.matchesAny(request.location, RegExpFilter.typeMap[request.type], request.docDomain, request.thirdParty); if (filter && !(subscription.url in seenSubscriptions)) { this.disabledSubscriptions.push(subscription); @@ -970,7 +950,7 @@ let issuesDataSource = continue; this.numAppliedFilters++; - if (filter.subscriptions.some(function(subscription) subscription instanceof SpecialSubscription)) + if (filter.subscriptions.some(subscription => subscription instanceof SpecialSubscription)) this.ownFilters.push(filter); } } @@ -1018,8 +998,8 @@ let issuesDataSource = let element = template.cloneNode(true); element.removeAttribute("id"); element.removeAttribute("hidden"); - element.firstChild.setAttribute("value", subscription.title); - element.setAttribute("tooltiptext", subscription instanceof DownloadableSubscription ? subscription.url : subscription.title); + element.firstChild.setAttribute("value", getSubscriptionTitle(subscription)); + element.setAttribute("tooltiptext", subscription instanceof DownloadableSubscription ? subscription.url : getSubscriptionTitle(subscription)); element.abpSubscription = subscription; disabledSubscriptionsBox.appendChild(element); } @@ -1081,15 +1061,14 @@ let issuesDataSource = document.documentElement.canRewind = false; document.documentElement.canAdvance = true; - let contentWnd = this.contentWnd; let nextButton = document.documentElement.getButton("next"); [nextButton.label, nextButton.accessKey] = Utils.splitLabel(E("updatePage").getAttribute("reloadButtonLabel")); - document.documentElement.addEventListener("wizardnext", function(event) + document.documentElement.addEventListener("wizardnext", event => { event.preventDefault(); event.stopPropagation(); window.close(); - contentWnd.location.reload(); + this.browser.reload(); }, true); }, @@ -1177,7 +1156,7 @@ let issuesDataSource = }; let dataCollectors = [reportsListDataSource, requestsDataSource, filtersDataSource, subscriptionsDataSource, - screenshotDataSource, framesDataSource, errorsDataSource, extensionsDataSource, + remoteDataSource, errorsDataSource, extensionsDataSource, subscriptionUpdateDataSource, issuesDataSource]; // @@ -1261,7 +1240,7 @@ function initDataCollectorPage() let dataSource = dataCollectors.shift(); Utils.runAsync(function() { - dataSource.collectData(contentWindow, windowURI, initNextDataSource); + dataSource.collectData(outerWindowID, windowURI, browser, initNextDataSource); }); }; @@ -1544,7 +1523,7 @@ function reportSent(event) button.setAttribute("url", link); button.removeAttribute("disabled"); - if (!PrivateBrowsing.enabledForWindow(contentWindow) && !PrivateBrowsing.enabled) + if (!isPrivate) reportsListDataSource.addReport(framesDataSource.site, link); } catch (e) {} E("copyLinkBox").hidden = false; @@ -1557,6 +1536,9 @@ function reportSent(event) function processLinkClick(event) { + if (event.button != 0) + return; + event.preventDefault(); let link = event.target; diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.xul index 491e3b6..403513d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/sendReport.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -215,8 +215,11 @@ <label id="emailLabel" control="email" value="&email.label;"/> <textbox id="email" type="email" persist="value" flex="1" maxlength="200" oninput="updateEmail();"/> </hbox> - <checkbox id="anonymousCheckbox" label="&anonymous.label;" oncommand="updateEmail();"/> - <description id="anonymityWarning" visible="false">&anonymity.warning;</description> + <hbox align="center"> + <checkbox id="anonymousCheckbox" label="&anonymous.label;" oncommand="updateEmail();"/> + <spacer flex="1"/> + <description id="anonymityWarning" visible="false">&anonymity.warning;</description> + </hbox> <description class="topLabel">&commentPage.description;</description> <label class="topLabel" control="comment" value="&comment.label;"/> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/settings.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/settings.xul index 0dc8317..379cbc3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/settings.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/settings.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -31,7 +31,7 @@ <setting pref="extensions.adblockplus.frameobjects" type="bool" title="&objecttabs.label;"/> <setting id="adblockplus-savestats" type="bool" title="&counthits.label;"/> <setting id="adblockplus-sync" type="bool" title="&sync.label;"/> + <setting id="adblockplus-shownotifications" type="bool" title="&shownotifications.label;"/> <setting id="adblockplus-showintoolbar" type="bool" title="&showintoolbar.label;"/> <setting id="adblockplus-showinstatusbar" pref="extensions.adblockplus.showinstatusbar" type="bool" title="&showinstatusbar.label;"/> - <setting id="adblockplus-autoupdate" pref="extensions.adblockplus.subscriptions_autoupdate" type="bool" title="&subscription.update.label;"/> </window> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js index 0b49068..688c248 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -20,11 +20,13 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); // Main browser window var mainWin = parent; +// Location of the content window that the list refers to +var contentLocation = null; + // The window handler currently in use var requestNotifier = null; var cacheStorage = null; -var noFlash = false; // Matcher for disabled filters var disabledMatcher = new CombinedMatcher(); @@ -33,6 +35,9 @@ var disabledMatcher = new CombinedMatcher(); var docDomainThirdParty = null; var docDomainFirstParty = null; +// Localized type names +var localizedTypes = new Map(); + function init() { docDomainThirdParty = document.documentElement.getAttribute("docDomainThirdParty"); docDomainFirstParty = document.documentElement.getAttribute("docDomainFirstParty"); @@ -84,12 +89,18 @@ function init() { wnd.setAttribute(attr, defaults[attr]); } - let {getBrowser, addBrowserLocationListener} = require("appSupport"); - Object.defineProperty(window, "content", { get: () => getBrowser(mainWin).contentWindow }); + let {addBrowserLocationListener} = require("appSupport"); + updateContentLocation(); // Initialize matcher for disabled filters reloadDisabledFilters(); - FilterNotifier.addListener(reloadDisabledFilters); + FilterNotifier.on("subscription.added", reloadDisabledFilters); + FilterNotifier.on("subscription.removed", reloadDisabledFilters); + FilterNotifier.on("subscription.disabled", reloadDisabledFilters); + FilterNotifier.on("subscription.updated", reloadDisabledFilters); + FilterNotifier.on("filter.added", reloadDisabledFilters); + FilterNotifier.on("filter.removed", reloadDisabledFilters); + FilterNotifier.on("filter.disabled", reloadDisabledFilters); Prefs.addListener(onPrefChange); // Activate flasher @@ -101,6 +112,9 @@ function init() { // Install a progress listener to catch location changes if (addBrowserLocationListener) addBrowserLocationListener(mainWin, handleLocationChange, true); + + for (let type of Policy.contentTypes.values()) + localizedTypes.set(type, Utils.getString("type_label_" + type.toLowerCase())); } // To be called for a detached window when the main window has been closed @@ -108,11 +122,42 @@ function mainUnload() { parent.close(); } +function updateContentLocation() +{ + let {getCurrentLocation} = require("appSupport"); + let location = getCurrentLocation(mainWin); + if (location instanceof Ci.nsIURI) + location = location.spec; + contentLocation = location; +} + +function getOuterWindowID() +{ + let {getBrowser} = require("appSupport"); + let browser = getBrowser(mainWin); + if ("selectedBrowser" in browser) + browser = browser.selectedBrowser; + return browser.outerWindowID; +} + +function getFilter(item) +{ + if ("filter" in item && item.filter) + return Filter.fromText(item.filter); + else + return null; +} + // To be called on unload function cleanUp() { - flasher.stop(); requestNotifier.shutdown(); - FilterNotifier.removeListener(reloadDisabledFilters); + FilterNotifier.off("subscription.added", reloadDisabledFilters); + FilterNotifier.off("subscription.removed", reloadDisabledFilters); + FilterNotifier.off("subscription.disabled", reloadDisabledFilters); + FilterNotifier.off("subscription.updated", reloadDisabledFilters); + FilterNotifier.off("filter.added", reloadDisabledFilters); + FilterNotifier.off("filter.removed", reloadDisabledFilters); + FilterNotifier.off("filter.disabled", reloadDisabledFilters); Prefs.removeListener(onPrefChange); E("list").view = null; @@ -177,15 +222,15 @@ function onSelectionChange() { else E("copy-command").setAttribute("disabled", "true"); - if (item && window.content) + if (item) { let key = item.location + " " + item.type + " " + item.docDomain; - RequestNotifier.storeSelection(window.content, key); + RequestNotifier.storeWindowData(getOuterWindowID(), key); treeView.itemToSelect = null; } - if (!noFlash) - flasher.flash(item ? item.nodes : null); + if (requestNotifier) + requestNotifier.flashNodes(item ? item.ids : null, Prefs.flash_scrolltoitem); } function handleLocationChange() @@ -193,12 +238,18 @@ function handleLocationChange() if (requestNotifier) requestNotifier.shutdown(); + updateContentLocation(); treeView.clearData(); - treeView.itemToSelect = RequestNotifier.getSelection(window.content); - requestNotifier = new RequestNotifier(window.content, function(wnd, node, item, scanComplete) + + let outerWindowID = getOuterWindowID(); + RequestNotifier.retrieveWindowData(outerWindowID, key => + { + treeView.itemToSelect = key; + }); + requestNotifier = new RequestNotifier(outerWindowID, (item, scanComplete) => { if (item) - treeView.addItem(node, item, scanComplete); + treeView.addItem(item, scanComplete); }); cacheStorage = null; } @@ -210,10 +261,17 @@ function setMultilineContent(box, text, noRemove) while (box.firstChild) box.removeChild(box.firstChild); - for (var i = 0; i < text.length; i += 80) + let lines = text.match(/.{1,80}/g); + if (lines.length > 7) { - var description = document.createElement("description"); - description.setAttribute("value", text.substr(i, 80)); + // Text is too long to display in full so we cut out the middle part + lines = lines.slice(0,3).concat("\u2026", lines.slice(-3)); + } + + for (let line of lines) + { + let description = document.createElement("description"); + description.setAttribute("value", line); box.appendChild(description); } } @@ -239,14 +297,12 @@ function fillInTooltip(e) { return; } - let filter = ("filter" in item && item.filter ? item.filter : null); - let size = ("tooltip" in item ? null : getItemSize(item)); + let filter = getFilter(item); let subscriptions = (filter ? filter.subscriptions.filter(function(subscription) { return !subscription.disabled; }) : []); E("tooltipDummy").hidden = !("tooltip" in item); E("tooltipAddressRow").hidden = ("tooltip" in item); E("tooltipTypeRow").hidden = ("tooltip" in item); - E("tooltipSizeRow").hidden = !size; E("tooltipDocDomainRow").hidden = ("tooltip" in item || !item.docDomain); E("tooltipFilterRow").hidden = !filter; E("tooltipFilterSourceRow").hidden = !subscriptions.length; @@ -255,19 +311,16 @@ function fillInTooltip(e) { E("tooltipDummy").setAttribute("value", item.tooltip); else { - E("tooltipAddress").parentNode.hidden = (item.typeDescr == "ELEMHIDE"); + E("tooltipAddress").parentNode.hidden = (item.type == "ELEMHIDE"); setMultilineContent(E("tooltipAddress"), item.location); - var type = item.localizedDescr; + var type = localizedTypes.get(item.type); if (filter && filter instanceof WhitelistFilter) type += " " + E("tooltipType").getAttribute("whitelisted"); - else if (filter && item.typeDescr != "ELEMHIDE") + else if (filter && item.type != "ELEMHIDE") type += " " + E("tooltipType").getAttribute("filtered"); E("tooltipType").setAttribute("value", type); - if (size) - E("tooltipSize").setAttribute("value", size.join(" x ")); - E("tooltipDocDomain").setAttribute("value", item.docDomain + " " + (item.thirdParty ? docDomainThirdParty : docDomainFirstParty)); } @@ -289,32 +342,36 @@ function fillInTooltip(e) { while (sourceElement.firstChild) sourceElement.removeChild(sourceElement.firstChild); for (let i = 0; i < subscriptions.length; i++) - setMultilineContent(sourceElement, subscriptions[i].title, true); + setMultilineContent(sourceElement, getSubscriptionTitle(subscriptions[i]), true); } } + E("tooltipSizeRow").hidden = true; + if (!("tooltip" in item)) + { + getItemSize(item, (size) => + { + if (size) + { + E("tooltipSizeRow").hidden = false; + E("tooltipSize").setAttribute("value", size.join(" x ")); + } + }); + } + var showPreview = Prefs.previewimages && !("tooltip" in item); - showPreview = showPreview && item.typeDescr == "IMAGE"; - showPreview = showPreview && (!item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter); + showPreview = showPreview && item.type == "IMAGE"; + showPreview = showPreview && (!filter || filter.disabled || filter instanceof WhitelistFilter); E("tooltipPreviewBox").hidden = true; if (showPreview) { if (!cacheStorage) { let {Services} = Cu.import("resource://gre/modules/Services.jsm", null); - // Cache v2 API is enabled by default starting with Gecko 32 - if (Services.vc.compare(Utils.platformVersion, "32.0a1") >= 0) - { - let {LoadContextInfo} = Cu.import("resource://gre/modules/LoadContextInfo.jsm", null); - let loadContext = content.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIWebNavigation) - .QueryInterface(Ci.nsILoadContext); - cacheStorage = Services.cache2.diskCacheStorage(LoadContextInfo.fromLoadContext(loadContext, false), false); - } - else - cacheStorage = Services.cache.createSession("HTTP", Ci.nsICache.STORE_ANYWHERE, true); + let {LoadContextInfo} = Cu.import("resource://gre/modules/LoadContextInfo.jsm", null); + cacheStorage = Services.cache2.diskCacheStorage(LoadContextInfo.default, false); } - + let showTooltipPreview = function () { E("tooltipPreview").setAttribute("src", item.location); @@ -322,35 +379,17 @@ function fillInTooltip(e) { }; try { - if (Ci.nsICacheStorage && cacheStorage instanceof Ci.nsICacheStorage) - { - cacheStorage.asyncOpenURI(Utils.makeURI(item.location), "", Ci.nsICacheStorage.OPEN_READONLY, { - onCacheEntryCheck: function (entry, appCache) - { - return Ci.nsICacheEntryOpenCallback.ENTRY_WANTED; - }, - onCacheEntryAvailable: function (entry, isNew, appCache, status) - { - if (!isNew) - showTooltipPreview(); - } - }); - } - else - { - cacheStorage.asyncOpenCacheEntry(item.location, Ci.nsICache.ACCESS_READ, { - onCacheEntryAvailable: function(descriptor, accessGranted, status) - { - if (!descriptor) - return; - descriptor.close(); + cacheStorage.asyncOpenURI(Utils.makeURI(item.location), "", Ci.nsICacheStorage.OPEN_READONLY, { + onCacheEntryCheck: function (entry, appCache) + { + return Ci.nsICacheEntryOpenCallback.ENTRY_WANTED; + }, + onCacheEntryAvailable: function (entry, isNew, appCache, status) + { + if (Components.isSuccessCode(status) && !isNew) showTooltipPreview(); - }, - onCacheEntryDoomed: function(status) - { - } - }); - } + } + }); } catch (e) { @@ -388,14 +427,14 @@ function fillInContext(/**Event*/ e) E("contextDisableFilter").hidden = true; E("contextEnableFilter").hidden = true; E("contextDisableOnSite").hidden = true; - if ("filter" in item && item.filter) + let filter = getFilter(item); + if (filter) { - let filter = item.filter; let menuItem = E(filter.disabled ? "contextEnableFilter" : "contextDisableFilter"); menuItem.setAttribute("label", menuItem.getAttribute("labeltempl").replace(/\?1\?/, filter.text)); menuItem.hidden = false; - if (filter instanceof ActiveFilter && !filter.disabled && filter.subscriptions.length && !filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription))) + if (filter instanceof ActiveFilter && !filter.disabled && filter.subscriptions.length && !filter.subscriptions.some(subscription => !(subscription instanceof SpecialSubscription))) { let domain = null; try { @@ -411,34 +450,18 @@ function fillInContext(/**Event*/ e) } } - E("contextWhitelist").hidden = ("tooltip" in item || !item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter || item.typeDescr == "ELEMHIDE"); + E("contextWhitelist").hidden = ("tooltip" in item || !filter || filter.disabled || filter instanceof WhitelistFilter || item.type == "ELEMHIDE"); E("contextBlock").hidden = !E("contextWhitelist").hidden; - E("contextBlock").setAttribute("disabled", "filter" in item && item.filter && !item.filter.disabled); - E("contextEditFilter").setAttribute("disabled", !("filter" in item && item.filter)); - E("contextOpen").setAttribute("disabled", "tooltip" in item || item.typeDescr == "ELEMHIDE"); - E("contextFlash").setAttribute("disabled", "tooltip" in item || !(item.typeDescr in visual) || (item.filter && !item.filter.disabled && !(item.filter instanceof WhitelistFilter))); - E("contextCopyFilter").setAttribute("disabled", !allItems.some(function(item) {return "filter" in item && item.filter})); + E("contextBlock").setAttribute("disabled", filter && !filter.disabled); + E("contextEditFilter").setAttribute("disabled", !filter); + E("contextOpen").setAttribute("disabled", "tooltip" in item || item.type == "ELEMHIDE"); + E("contextFlash").setAttribute("disabled", "tooltip" in item || !(item.type in visual) || (filter && !filter.disabled && !(filter instanceof WhitelistFilter))); + E("contextCopyFilter").setAttribute("disabled", !allItems.some(getFilter)); return true; } /** - * Resets context menu data once the context menu is closed. - */ -function clearContextMenu(/**Event*/ event) -{ - if (event.eventPhase != event.AT_TARGET) - return; - - { - let menuItem = E("contextDisableOnSite"); - menuItem.item = item; - menuItem.filter = filter; - menuItem.domain = domain; - } -} - -/** * Processed mouse clicks on the item list. * @param {Event} event */ @@ -447,8 +470,9 @@ function handleClick(event) let item = treeView.getItemAt(event.clientX, event.clientY); if (event.button == 0 && treeView.getColumnAt(event.clientX, event.clientY) == "state") { - if (item.filter) - enableFilter(item.filter, item.filter.disabled); + let filter = getFilter(item); + if (filter) + enableFilter(filter, filter.disabled); event.preventDefault(); } else if (event.button == 1) @@ -478,24 +502,27 @@ function openInTab(item, /**Event*/ event) let items = (item ? [item] : treeView.getAllSelectedItems()); for (let item of items) { - if (item && item.typeDescr != "ELEMHIDE") + if (item && item.type != "ELEMHIDE") UI.loadInBrowser(item.location, mainWin, event); } } function doBlock() { var item = treeView.getSelectedItem(); - if (!item || item.typeDescr == "ELEMHIDE") + if (!item || item.type == "ELEMHIDE") return; - var filter = null; - if (item.filter && !item.filter.disabled) - filter = item.filter; - - if (filter && filter instanceof WhitelistFilter) + var filter = getFilter(item); + if (filter && !filter.disabled && filter instanceof WhitelistFilter) return; - openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", "chrome,centerscreen,resizable,dialog=no,dependent", item.nodes, item.orig); + if (requestNotifier) + { + requestNotifier.storeNodesForEntries(item.ids, (nodesID) => + { + UI.blockItem(window, nodesID, item.orig); + }); + } } function editFilter() @@ -504,13 +531,11 @@ function editFilter() if (treeView.data && !treeView.data.length) item = treeView.getDummyTooltip(); - if (!("filter" in item) || !item.filter) + let filter = getFilter(item); + if (!filter) return; - if (!("location") in item) - item.location = undefined - - UI.openFiltersDialog(item.filter); + UI.openFiltersDialog(filter); } function enableFilter(filter, enable) { @@ -525,8 +550,8 @@ function enableFilter(filter, enable) { function disableOnSite() { let item = treeView.getSelectedItem(); - let filter = item.filter; - if (!(filter instanceof ActiveFilter) || filter.disabled || !filter.subscriptions.length || filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription))) + let filter = getFilter(item); + if (!(filter instanceof ActiveFilter) || filter.disabled || !filter.subscriptions.length || filter.subscriptions.some(subscription => !(subscription instanceof SpecialSubscription))) return; let domain; @@ -552,7 +577,7 @@ function disableOnSite() let match = /^DOMAIN=(.*)/.exec(options[i]); if (match) { - let domains = match[1].split("|").filter(function(d) d != domain && d != "~" + domain && (d.length <= domain.length || d.lastIndexOf("." + domain) != d.length - domain.length - 1)); + let domains = match[1].split("|").filter(d => d != domain && d != "~" + domain && (d.length <= domain.length || d.lastIndexOf("." + domain) != d.length - domain.length - 1)); domains.push("~" + domain); options[i] = "DOMAIN=" + domains.join("|"); found = true; @@ -573,7 +598,7 @@ function disableOnSite() if (match) { let selector = match[2]; - let domains = match[1].toUpperCase().split(",").filter(function(d) d != domain && (d.length <= domain.length || d != "~" + domain && d.lastIndexOf("." + domain) != d.length - domain.length - 1)); + let domains = match[1].toUpperCase().split(",").filter(d => d != domain && (d.length <= domain.length || d != "~" + domain && d.lastIndexOf("." + domain) != d.length - domain.length - 1)); domains.push("~" + domain); text = domains.join(",").toLowerCase() + selector; } @@ -591,7 +616,7 @@ function disableOnSite() else if (!newFilter.subscriptions.length) { newFilter.disabled = false; - let subscription = filter.subscriptions.filter(function(s) s instanceof SpecialSubscription)[0]; + let subscription = filter.subscriptions.filter(s => s instanceof SpecialSubscription)[0]; if (subscription) FilterStorage.addFilter(newFilter, subscription, subscription.filters.indexOf(filter)); } @@ -599,7 +624,7 @@ function disableOnSite() // Update display for (let i = 0; i < treeView.allData.length; i++) - if (treeView.allData[i].filter == filter) + if (getFilter(treeView.allData[i]) == filter) treeView.allData[i].filter = null; treeView.boxObject.invalidate(); } @@ -613,14 +638,14 @@ function copyToClipboard() { } function copyFilter() { - var items = treeView.getAllSelectedItems().filter(function(item) {return item.filter}); + var items = treeView.getAllSelectedItems().filter(getFilter); if (treeView.data && !treeView.data.length) items = [treeView.getDummyTooltip()]; if (!items.length) return; - Utils.clipboardHelper.copyString(items.map(function(item) {return item.filter.text}).join(IO.lineBreak)); + Utils.clipboardHelper.copyString(items.map(function(item) {return item.filter}).join(IO.lineBreak)); } function selectAll() { @@ -666,20 +691,35 @@ function detach(doDetach) myMainWin.document.getElementById("abp-command-sidebar").doCommand(); } -// Returns items size in the document if available -function getItemSize(item) +// Returns item's size if already known, otherwise undefined +function getCachedItemSize(item) { - if (item.filter && !item.filter.disabled && item.filter instanceof BlockingFilter) + if ("size" in item) + return item.size; + + let filter = getFilter(item); + if (filter && !filter.disabled && filter instanceof BlockingFilter) return null; - for (let node of item.nodes) + return undefined; +} + +// Retrieves item's size in the document if available +function getItemSize(item, callback) +{ + let size = getCachedItemSize(item); + if (typeof size != "undefined" || !requestNotifier) { - if (node instanceof HTMLImageElement && (node.naturalWidth || node.naturalHeight)) - return [node.naturalWidth, node.naturalHeight]; - else if (node instanceof HTMLElement && (node.offsetWidth || node.offsetHeight)) - return [node.offsetWidth, node.offsetHeight]; + callback(size); + return; } - return null; + + requestNotifier.retrieveNodeSize(item.ids, function(size) + { + if (size) + item.size = size; + callback(size); + }); } // Sort functions for the item list @@ -697,9 +737,11 @@ function sortByAddressDesc(item1, item2) { } function compareType(item1, item2) { - if (item1.localizedDescr < item2.localizedDescr) + let type1 = localizedTypes.get(item1.type); + let type2 = localizedTypes.get(item2.type); + if (type1 < type2) return -1; - else if (item1.localizedDescr > item2.localizedDescr) + else if (type1 > type2) return 1; else return 0; @@ -710,25 +752,29 @@ function compareFilter(item1, item2) { var hasFilter2 = (item2.filter ? 1 : 0); if (hasFilter1 != hasFilter2) return hasFilter1 - hasFilter2; - else if (hasFilter1 && item1.filter.text < item2.filter.text) + else if (hasFilter1 && item1.filter < item2.filter) return -1; - else if (hasFilter1 && item1.filter.text > item2.filter.text) + else if (hasFilter1 && item1.filter > item2.filter) return 1; else return 0; } -function compareState(item1, item2) { - var state1 = (!item1.filter ? 0 : (item1.filter.disabled ? 1 : (item1.filter instanceof WhitelistFilter ? 2 : 3))); - var state2 = (!item2.filter ? 0 : (item2.filter.disabled ? 1 : (item2.filter instanceof WhitelistFilter ? 2 : 3))); +function compareState(item1, item2) +{ + let filter1 = getFilter(item1); + let filter2 = getFilter(item2); + let state1 = (!filter1 ? 0 : (filter1.disabled ? 1 : (filter1 instanceof WhitelistFilter ? 2 : 3))); + let state2 = (!filter2 ? 0 : (filter2.disabled ? 1 : (filter2 instanceof WhitelistFilter ? 2 : 3))); return state1 - state2; } -function compareSize(item1, item2) { - var size1 = getItemSize(item1); - size1 = size1 ? size1[0] * size1[1] : 0; +function compareSize(item1, item2) +{ + let size1 = getCachedItemSize(item1); + let size2 = getCachedItemSize(item2); - var size2 = getItemSize(item2); + size1 = size1 ? size1[0] * size1[1] : 0; size2 = size2 ? size2[0] * size2[1] : 0; return size1 - size2; } @@ -749,8 +795,10 @@ function compareDocDomain(item1, item2) function compareFilterSource(item1, item2) { - let subs1 = item1.filter ? item1.filter.subscriptions.map(function(s) s.title).join(", ") : ""; - let subs2 = item2.filter ? item2.filter.subscriptions.map(function(s) s.title).join(", ") : ""; + let filter1 = getFilter(item1); + let filter2 = getFilter(item2); + let subs1 = filter1 ? filter1.subscriptions.map(s => getSubscriptionTitle(s)).join(", ") : ""; + let subs2 = filter2 ? filter2.subscriptions.map(s => getSubscriptionTitle(s)).join(", ") : ""; if (subs1 < subs2) return -1; else if (subs1 > subs2) @@ -865,22 +913,31 @@ var treeView = { if (row >= this.data.length) return ""; if (col == "type") - return this.data[row].localizedDescr; + return localizedTypes.get(this.data[row].type); else if (col == "filter") - return (this.data[row].filter ? this.data[row].filter.text : ""); + return (this.data[row].filter || ""); else if (col == "size") { - let size = getItemSize(this.data[row]); + let size = getCachedItemSize(this.data[row]); + if (typeof size == "undefined") + { + getItemSize(this.data[row], (size) => + { + if (size) + this.boxObject.invalidateRow(row) + }); + } return (size ? size.join(" x ") : ""); } else if (col == "docDomain") return this.data[row].docDomain + " " + (this.data[row].thirdParty ? docDomainThirdParty : docDomainFirstParty); else if (col == "filterSource") { - if (!this.data[row].filter) + let filter = getFilter(this.data[row]) + if (!filter) return ""; - return this.data[row].filter.subscriptions.filter(function(s) !s.disabled).map(function(s) s.title).join(", "); + return filter.subscriptions.filter(s => !s.disabled).map(s => getSubscriptionTitle(s)).join(", "); } else return this.data[row].location; @@ -890,11 +947,11 @@ var treeView = { if (row > 0 || (col != "address" && col != "filter")) return ""; if (col == "filter") { - var filter = Policy.isWindowWhitelisted(window.content); + var filter = Policy.isWhitelisted(contentLocation); return filter ? filter.text : ""; } - return (Policy.isWindowWhitelisted(window.content) ? this.whitelistDummy : this.itemsDummy); + return (Policy.isWhitelisted(contentLocation) ? this.whitelistDummy : this.itemsDummy); } }, @@ -933,7 +990,7 @@ var treeView = { if (this.data && this.data.length) { list.push("dummy-false"); - let filter = this.data[row].filter; + let filter = getFilter(this.data[row]); if (filter) list.push("filter-disabled-" + filter.disabled); @@ -944,7 +1001,7 @@ var treeView = { state = "state-whitelisted"; else if (filter instanceof BlockingFilter) state = "state-filtered"; - else if (filter instanceof ElemHideFilter) + else if (filter instanceof ElemHideFilter || filter instanceof ElemHideEmulationFilter) state = "state-hidden"; else if (filter instanceof ElemHideException) state = "state-hiddenexception"; @@ -954,7 +1011,7 @@ var treeView = { list.push("dummy-true"); state = "state-filtered"; - if (this.data && Policy.isWindowWhitelisted(window.content)) + if (this.data && Policy.isWhitelisted(contentLocation)) state = "state-whitelisted"; } list.push(state); @@ -1070,7 +1127,7 @@ var treeView = { this.boxObject.rowCountChanged(0, this.rowCount); }, - addItem: function(/**Node*/ node, /**RequestEntry*/ item, /**Boolean*/ scanComplete) + addItem: function(/**RequestEntry*/ item, /**Boolean*/ scanComplete) { // Merge duplicate entries let key = item.location + " " + item.type + " " + item.docDomain; @@ -1080,21 +1137,25 @@ var treeView = { let existing = this.dataMap[key]; if (item.filter) existing.filter = item.filter; + existing.ids.push(item.id); - existing.nodes.push(node); this.invalidateItem(existing); return; } // Add new item to the list // Store original item in orig property - reading out prototype is messed up in Gecko 1.9.2 - item = {__proto__: item, orig: item, nodes: [node]}; + item = {__proto__: item, orig: item, ids: [item.id]}; this.allData.push(item); this.dataMap[key] = item; // Show disabled filters if no other filter applies if (!item.filter) - item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty); + { + let disabledMatch = disabledMatcher.matchesAny(item.location, RegExpFilter.typeMap[item.type], item.docDomain, item.thirdParty); + if (disabledMatch) + item.filter = disabledMatch.text; + } if (!this.matchesFilter(item)) return; @@ -1146,10 +1207,15 @@ var treeView = { { for (let item of this.allData) { - if (item.filter instanceof RegExpFilter && item.filter.disabled) + let filter = getFilter(item); + if (filter instanceof RegExpFilter && filter.disabled) delete item.filter; - if (!item.filter) - item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty); + if (!filter) + { + let disabledMatch = disabledMatcher.matchesAny(item.location, RegExpFilter.typeMap[item.type], item.docDomain, item.thirdParty); + if (disabledMatch) + item.filter = disabledMatch.text; + } } this.refilter(); }, @@ -1178,9 +1244,9 @@ var treeView = { return true; return (item.location.toLowerCase().indexOf(this.filter) >= 0 || - (item.filter && item.filter.text.toLowerCase().indexOf(this.filter) >= 0) || - item.typeDescr.toLowerCase().indexOf(this.filter.replace(/-/g, "_")) >= 0 || - item.localizedDescr.toLowerCase().indexOf(this.filter) >= 0 || + (item.filter && item.filter.toLowerCase().indexOf(this.filter) >= 0) || + item.type.toLowerCase().indexOf(this.filter.replace(/-/g, "_")) >= 0 || + localizedTypes.get(item.type).toLowerCase().indexOf(this.filter) >= 0 || (item.docDomain && item.docDomain.toLowerCase().indexOf(this.filter) >= 0) || (item.docDomain && item.thirdParty && docDomainThirdParty.toLowerCase().indexOf(this.filter) >= 0) || (item.docDomain && !item.thirdParty && docDomainFirstParty.toLowerCase().indexOf(this.filter) >= 0)); @@ -1255,9 +1321,9 @@ var treeView = { if (!this.data || this.data.length) return null; - var filter = Policy.isWindowWhitelisted(window.content); + var filter = Policy.isWhitelisted(contentLocation); if (filter) - return {tooltip: this.whitelistDummyTooltip, filter: filter}; + return {tooltip: this.whitelistDummyTooltip, filter: filter.text}; else return {tooltip: this.itemsDummyTooltip}; }, diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.xul index 208389d..d77cefb 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -32,7 +32,6 @@ <script type="application/x-javascript;version=1.7" src="utils.js"/> <script type="application/x-javascript;version=1.7" src="sidebar.js"/> - <script type="application/x-javascript;version=1.7" src="flasher.js"/> <keyset id="sidebarKeys"> <key id="block-key" keycode="VK_ENTER"/> @@ -89,8 +88,8 @@ <menuitem id="contextBlock" label="&context.block.label;…" oncommand="doBlock()" key="block-key"/> <menuitem id="contextWhitelist" label="&context.whitelist.label;…" oncommand="doBlock()" key="block-key"/> <menuitem id="contextEditFilter" label="&context.editfilter.label;…" oncommand="editFilter()"/> - <menuitem id="contextDisableFilter" labeltempl="&context.disablefilter.label;" oncommand="enableFilter(treeView.getSelectedItem().filter, false)"/> - <menuitem id="contextEnableFilter" labeltempl="&context.enablefilter.label;" oncommand="enableFilter(treeView.getSelectedItem().filter, true)"/> + <menuitem id="contextDisableFilter" labeltempl="&context.disablefilter.label;" oncommand="enableFilter(getFilter(treeView.getSelectedItem()), false)"/> + <menuitem id="contextEnableFilter" labeltempl="&context.enablefilter.label;" oncommand="enableFilter(getFilter(treeView.getSelectedItem()), true)"/> <menuitem id="contextDisableOnSite" labeltempl="&context.disablefilteronsite.label;" oncommand="disableOnSite()"/> <menuseparator id="contextOpenSep"/> <menuitem id="contextOpen" label="&context.open.label;" oncommand="openInTab(null, event)"/> diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebarDetached.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebarDetached.xul index 6738177..19fdd64 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebarDetached.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebarDetached.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/abb-logo.png b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/abb-logo.png Binary files differnew file mode 100644 index 0000000..ce4701f --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/abb-logo.png diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/abp-128.png b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/abp-128.png Binary files differindex f1485e4..1caffd0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/abp-128.png +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/abp-128.png diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/common.css b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/common.css new file mode 100644 index 0000000..4871e66 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/common.css @@ -0,0 +1,59 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +#glass-pane, #share-popup +{ + visibility: hidden; + opacity: 0; + -webkit-transition-property: opacity; + transition-property: opacity; +} + +#glass-pane +{ + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(0, 0, 0, 0.5) url(ajax-loader.gif) no-repeat 50% 50%; + z-index: 101; + -webkit-transition-duration: 0.2s; + transition-duration: 0.2s; +} + +#share-popup +{ + position: absolute; + top: 50%; + left: 50%; + border: none; + -webkit-transition-delay: 0.1s; + transition-delay: 0.1s; +} + +#glass-pane.visible, #share-popup.visible +{ + visibility: visible; + opacity: 1; +} + +#share-popup.visible +{ + -webkit-transition-duration: 0.15s; + transition-duration: 0.15s; +} diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/malware.png b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/malware.png Binary files differdeleted file mode 100644 index 9b51b63..0000000 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/malware.png +++ /dev/null diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/social.png b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/social.png Binary files differdeleted file mode 100644 index a2af1ea..0000000 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/social.png +++ /dev/null diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/tracking.png b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/tracking.png Binary files differdeleted file mode 100644 index a8727a9..0000000 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/features/tracking.png +++ /dev/null diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/firstRun.css b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/firstRun.css index a3c57d8..fffc91c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/firstRun.css +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/skin/firstRun.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -16,21 +16,21 @@ */ @font-face { - font-family: 'CreteRound'; + font-family: "CreteRound"; font-style: normal; src: url(fonts/CreteRound-Regular.otf); - src: local ('Ø'), - /*local ('Ø') forces using no local font called CreteRound*/ - url(fonts/CreteRound-Regular.otf) format('otf'); + src: local ("Ø"), + /*local ("Ø") forces using no local font called CreteRound*/ + url(fonts/CreteRound-Regular.otf) format("otf"); } @font-face { - font-family: 'CreteRound'; + font-family: "CreteRound"; font-style: italic; src: url(fonts/CreteRound-Italic.otf); - src: local ('Ø'), - /*local ('Ø') forces using no local font called CreteRound*/ - url(fonts/CreteRound-Italic.otf) format('otf'); + src: local ("Ø"), + /*local ("Ø") forces using no local font called CreteRound*/ + url(fonts/CreteRound-Italic.otf) format("otf"); } body @@ -79,7 +79,7 @@ header background-image: url(background.png); background-repeat: repeat-x; width: 100%; - padding: 25px 0 0 0; + padding-top: 25px; } header h1 @@ -89,7 +89,7 @@ header h1 color: #57ab5b; text-align: center; margin: 21px auto; - padding: 16px 0 14px 0; + padding: 16px 0px; border: 1px #57ab5b; border-style: dashed none; /* border parallel fix - 957px is the value @@ -99,7 +99,9 @@ header h1 max-width: 957px; } -h1,h2,h3 +h1, +h2, +h3 { font-family: CreteRound, Helvetica, Arial, sans-serif; } @@ -120,7 +122,8 @@ h3 font-size: 22px; color: #7F776B; font-weight: normal; - margin: 0 0 10px 0; + margin-top: 0px; + margin-bottom: 10px; padding: 0; line-height: 24px; } @@ -139,125 +142,125 @@ section { margin: 0 auto; margin-bottom: 30px; - max-width: 760px; + max-width: 960px; background-image: url(background.png); padding: 40px 100px; + box-sizing: border-box; } -section > p +#general { - margin: 15px 0 0 0; + display: table; + padding-left: 0px; + padding-right: 0px; } -#logo +#general > .block { - margin: 0 auto; - height: 128px; - width: 128px; - display: block; + display: table-cell; + width: 50%; + vertical-align: top; + padding: 0px 50px; + border: dashed 0 #969085; + -webkit-border-start-width: 1px; + -moz-border-start-width: 1px; + border-inline-start-width: 1px; } -#can-do-more +#general > .block:first-child { - max-width: 960px; - padding: 40px 0px 0px 0px; - border-bottom: 4px solid #968D81; + border: none; } -#can-do-more > h2 +#acceptable-ads-block h2 { - margin: 0 100px; + margin-bottom: 34px; } -.feature-malware-image +#abb-promotion-block:lang(fr) { - background-image: url(features/malware.png); - background-repeat: no-repeat; + display: none; } -.feature-social-image +#abb-promotion-block { - background-image: url(features/social.png); - background-repeat: no-repeat; + text-align: center; } -.feature-tracking-image +#abb-promotion-block h2 { - background-image: url(features/tracking.png); - background-repeat: no-repeat; + color: #7795b6; + margin-bottom: 40px; } -#can-do-more-content +#abb-promotion-block a { - margin: 30px 100px 20px 100px; + border: solid 1px #446a96; + border-radius: 5px; + display: inline-block; + padding: 6px 16px; + background: -webkit-linear-gradient(bottom, #294e76, #6b92be); + background: linear-gradient(to top, #294e76, #6b92be); + text-decoration: none; + text-align: start; } -#can-do-more #features +#abb-promotion-block a > div { - border-spacing: 10px; - margin: 0px; - padding: 0px; + display: table-cell; + vertical-align: middle; + padding: 6px; } -#can-do-more .feature:not([hidden]) +#abb-promotion-block .title { - display: block; - list-style-type: none; - padding: 30px 0; - padding-bottom: 20px; - border-top: 1px dashed #c0bebb; + font-size: 21px; + color: #ffffff; + font-weight: bold; } -#can-do-more .feature-image, #can-do-more .feature-description +#abb-promotion-block .subtitle { - display: inline-block; - *display: inline; /* IE6 inline-block fix */ - *zoom: 1; - vertical-align: top; + font-size: 12px; + color: #9ab7d6; } -#can-do-more .feature-description +#abb-promotion-block a:hover { - margin: 0px 0px 0 20px; - width: 625px; - max-width: 85%; + box-shadow: 0px 0px 5px #5D5D5D; } -#can-do-more .feature-description-textblock +#abb-promotion-block a:active { - width: 480px; - max-width: 100%; - margin: 0 40px 0 0; - display: inline-block; + box-shadow: 0px 0px 5px 1px #5D5D5D; } -#can-do-more .feature-description-textblock > span +section > p { - margin: 15px 0 0 0; + margin-top: 15px; } -#can-do-more .feature-image +#logo { - width: 59px; - height: 59px; - margin: 8px 0 10px 20px; + margin: 0 auto; + height: 128px; + width: 128px; + display: block; } #share { background-image: url(background-share.png); - padding: 50px 100px 40px 100px; - max-width: 760px; text-align: center; font-family: CreteRound, Helvetica, Arial, sans-serif; } #share h2 { - color: #fff; - margin: 0 0 30px 0; + margin-bottom: 30px; } +#share h2, #share h2 > a { color: #fff; @@ -283,38 +286,30 @@ section > p border-radius: 30px; } -#donate-block span, #share-block span -{ - margin: 10px 20px 0px 20px; -} - -#donate-block, #share-block +#share > .block { - min-width: 250px; display: inline-block; vertical-align: top; - padding: 5px 0 5px 0; + width: 49%; + padding: 5px 0px; border: 1px dashed #37506d; border-style: none dashed; } -#donate-block +#share > .block:last-child { - width: 50%; + -webkit-border-start-style: none; + -moz-border-start-style: none; } -#share-block +#share > .block > span { - width: 49%; - - -webkit-border-start-style: none; - -moz-border-start-style: none; + margin: 10px 20px; } .share-buttons { - margin: 6px 0 0 0; - cursor: pointer; + margin-top: 6px; vertical-align: top; /* because inline block creates * space if not captured with @@ -435,49 +430,6 @@ section > p height: 82px; } -#glass-pane, #share-popup -{ - visibility: hidden; - opacity: 0; - -webkit-transition-property: opacity; - transition-property: opacity; -} - -#glass-pane -{ - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: rgba(0, 0, 0, 0.5) url(ajax-loader.gif) no-repeat 50% 50%; - z-index: 101; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; -} - -#share-popup -{ - position: absolute; - top: 50%; - left: 50%; - border: none; - -webkit-transition-delay: 0.1s; - transition-delay: 0.1s; -} - -#glass-pane.visible, #share-popup.visible -{ - visibility: visible; - opacity: 1; -} - -#share-popup.visible -{ - -webkit-transition-duration: 0.15s; - transition-duration: 0.15s; -} - /* Change order of the blocks for French */ #content:lang(fr) { @@ -491,94 +443,12 @@ section > p display: table-caption; } -.toggle -{ - cursor: pointer; - position: relative; - display: inline-block; - vertical-align: top; - height: 22px; - margin: 32px 0px 7px 0px; - border-radius: 9999px; - border: 1px solid #999; - overflow: hidden; - -moz-user-select: none; - -webkit-user-select: none; - user-select: none; -} - -.toggle:hover -{ - box-shadow: 0px 0px 3px 0px #968d81; -} - -.toggle:active -{ - cursor: wait; -} - -.toggle-on, .toggle-off -{ - min-width: 42px; - height: 100%; - font-size: 11px; - font-weight: 500; - text-align: center; - line-height: 23px; - border-radius: 9999px; -} - -.toggle-on -{ - padding: 0px 30px 0px 10px; - color: rgba(255,255,255, 0.8); - text-shadow: 1px 1px rgba(0,0,0,0.2); - box-shadow: inset 2px 2px 6px rgba(0,0,0,0.2); - background: rgb(69,163,31); -} - -.toggle-off -{ - padding: 0px 10px 0px 30px; - color: rgba(0,0,0,0.6); - text-shadow: 1px 1px rgba(255,255,255,0.2); - background: #cfcfcf; - background: -moz-linear-gradient(top, #cfcfcf 0%, #f5f5f5 100%); - background: -webkit-linear-gradient(top, #cfcfcf 0%,#f5f5f5 100%); - background: linear-gradient(to bottom, #cfcfcf 0%,#f5f5f5 100%); -} - -.toggle-blob -{ - position: absolute; - top: 0px; - right: 0px; - height: 100%; - width: 22px; - border-radius: 50px; - background: #cfcfcf; - background: -moz-linear-gradient(bottom, #cfcfcf 0%, #f5f5f5 100%); - background: -webkit-linear-gradient(bottom, #cfcfcf 0%,#f5f5f5 100%); - background: linear-gradient(to top, #cfcfcf 0%,#f5f5f5 100%); - box-shadow: 1px 1px 2px #888; -} - -.off .toggle-on -{ - margin-top: -22px; -} - -.off .toggle-blob -{ - left: 0px; - right: auto; -} - #donate { height: 21px; display: inline-block; - margin: 15px 0px 2px 0px; + margin-top: 15px; + margin-bottom: 2px; font-size: 16px; color: #003366; cursor: pointer; @@ -599,3 +469,51 @@ footer max-width: 960px; text-align: center; } + +@media (max-width: 970px) +{ + header + { + background-size: 100px 57px; + } + + #logo + { + width: 64px; + height: 64px; + } + + section + { + padding: 40px 20px; + } + + #general, + #general > .block, + #share > .block + { + display: block; + } + + #general > .block + { + width: auto; + margin-left: 20px; + margin-right: 20px; + padding: 10px 0px; + border-width: 1px 0px 0px; + } + + #share > .block + { + width: auto; + padding: 20px 0px; + border-style: dashed none none; + } + + #donate, + .share-buttons + { + margin-top: 10px; + } +} diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.js index b9129ea..261b710 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -217,7 +217,7 @@ function setCustomSubscription(title, url, mainSubscriptionTitle, mainSubscripti let link = document.createElement("label"); link.className = "text-link"; link.setAttribute("tooltiptext", mainSubscriptionURL); - link.addEventListener("click", function() UI.loadInBrowser(mainSubscriptionURL), false); + link.addEventListener("click", () => UI.loadInBrowser(mainSubscriptionURL), false); link.textContent = mainSubscriptionTitle; messageElement.appendChild(link); messageElement.appendChild(document.createTextNode(afterLink)); @@ -304,5 +304,5 @@ function doAddSubscription(/**String*/ url, /**String*/ title) function hasSubscription(url) { - return FilterStorage.subscriptions.some(function(subscription) subscription instanceof DownloadableSubscription && subscription.url == url); + return FilterStorage.subscriptions.some(subscription => subscription instanceof DownloadableSubscription && subscription.url == url); } diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.xul b/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.xul index f2e1e44..c2383c6 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.xul +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptionSelection.xul @@ -2,7 +2,7 @@ <!-- - This file is part of Adblock Plus <https://adblockplus.org/>, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptions.xml b/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptions.xml index f6727b2..953f16d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptions.xml +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/subscriptions.xml @@ -2,7 +2,7 @@ <!-- - This file is part of the Adblock Plus web scripts, - - Copyright (C) 2006-2015 Eyeo GmbH + - Copyright (C) 2006-2017 eyeo GmbH - - Adblock Plus is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License version 3 as @@ -23,89 +23,104 @@ url="https://easylist-downloads.adblockplus.org/easylist.txt" homepage="https://easylist.adblockplus.org/" prefixes="en" - author="fanboy, MonztA, Famlam, Khrin"/> + author="fanboy, MonztA, Famlam, Khrin" + type="ads"/> <subscription title="ABPindo+EasyList" specialization="Bahasa Indonesia" url="https://easylist-downloads.adblockplus.org/abpindo+easylist.txt" homepage="http://abpindo.blogspot.com/" prefixes="id" - author="heradhis"/> + author="heradhis" + type="ads"/> <subscription title="Bulgarian list+EasyList" specialization="българÑки" url="https://easylist-downloads.adblockplus.org/bulgarian_list+easylist.txt" homepage="http://stanev.org/abp/" prefixes="bg" - author="ÐлекÑандър Станев"/> + author="ÐлекÑандър Станев" + type="ads"/> <subscription title="EasyList China+EasyList" specialization="䏿–‡" url="https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt" homepage="http://abpchina.org/forum/" prefixes="zh" - author="John, Li, Jiefei"/> + author="John, Li" + type="ads"/> <subscription title="EasyList Czech and Slovak+EasyList" specialization="ÄeÅ¡tina, slovenÄina" url="https://easylist-downloads.adblockplus.org/easylistczechslovak+easylist.txt" homepage="http://adblock.sk/" prefixes="cs,sk" - author="tomasko126"/> + author="tomasko126" + type="ads"/> <subscription title="EasyList Dutch+EasyList" specialization="Nederlands" url="https://easylist-downloads.adblockplus.org/easylistdutch+easylist.txt" homepage="https://easylist.adblockplus.org/" prefixes="nl" - author="Famlam"/> + author="Famlam" + type="ads"/> <subscription title="EasyList Germany+EasyList" specialization="Deutsch" url="https://easylist-downloads.adblockplus.org/easylistgermany+easylist.txt" homepage="https://easylist.adblockplus.org/" prefixes="de" - author="MonztA, Famlam"/> + author="MonztA, Famlam" + type="ads"/> <subscription title="EasyList Hebrew+EasyList" specialization="עברית" url="https://easylist-downloads.adblockplus.org/israellist+easylist.txt" - homepage="https://github.com/AdBlockPlusIsrael/EasyListHebrew" + homepage="https://github.com/ABPIsrael/EasyListHebrew" prefixes="he" - author="BsT"/> + author="BsT" + type="ads"/> <subscription title="EasyList Italy+EasyList" specialization="italiano" url="https://easylist-downloads.adblockplus.org/easylistitaly+easylist.txt" homepage="https://easylist.adblockplus.org/" prefixes="it" - author="Khrin"/> + author="Khrin" + type="ads"/> <subscription title="EasyList Lithuania+EasyList" specialization="lietuvių kalba" url="https://easylist-downloads.adblockplus.org/easylistlithuania+easylist.txt" homepage="http://margevicius.lt/" prefixes="lt" - author="Algimantas MargeviÄius"/> + author="Algimantas MargeviÄius" + type="ads"/> <subscription title="Latvian List+EasyList" specialization="latvieÅ¡u valoda" url="https://easylist-downloads.adblockplus.org/latvianlist+easylist.txt" - homepage="http://latvian-list.site11.com/" + homepage="https://notabug.org/latvian-list/adblock-latvian" prefixes="lv" - author="anonymous74100"/> + author="anonymous74100" + type="ads"/> <subscription title="Liste AR+Liste FR+EasyList" specialization="العربية" url="https://easylist-downloads.adblockplus.org/liste_ar+liste_fr+easylist.txt" homepage="https://code.google.com/p/liste-ar-adblock/" prefixes="ar" - author="smed79"/> + author="smed79" + type="ads"/> <subscription title="Liste FR+EasyList" specialization="français" url="https://easylist-downloads.adblockplus.org/liste_fr+easylist.txt" homepage="http://adblock-listefr.com/" prefixes="fr" - author="Lian, Crits, smed79"/> + author="Lian, Crits, smed79" + type="ads"/> <subscription title="ROList+EasyList" specialization="românesc" url="https://easylist-downloads.adblockplus.org/rolist+easylist.txt" homepage="http://www.zoso.ro/rolist" prefixes="ro" - author="MenetZ, Zoso"/> + author="MenetZ, Zoso" + type="ads"/> <subscription title="RuAdList+EasyList" specialization="руÑÑкий, українÑька" url="https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt" - homepage="https://code.google.com/p/ruadlist/" + homepage="https://forums.lanik.us/viewforum.php?f=102" prefixes="ru,uk" - author="Lain_13"/> + author="Lain_13" + type="ads"/> </subscriptions>
\ No newline at end of file diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/utils.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/utils.js index 171fd60..5f8d515 100644 --- a/data/extensions/spyblock@gnu.org/chrome/content/ui/utils.js +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/utils.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -35,10 +35,11 @@ function require(/**String*/ module) var {Policy} = require("contentPolicy"); var {Filter, InvalidFilter, CommentFilter, ActiveFilter, RegExpFilter, - BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideException} = require("filterClasses"); + BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, + ElemHideException, ElemHideEmulationFilter} = require("filterClasses"); var {FilterNotifier} = require("filterNotifier"); -var {FilterStorage, PrivateBrowsing} = require("filterStorage"); -var {IO} = require("io"); +var {FilterStorage} = require("filterStorage"); +var {IO} = require("legacyIO"); var {defaultMatcher, Matcher, CombinedMatcher} = require("matcher"); var {Prefs} = require("prefs"); var {RequestNotifier} = require("requestNotifier"); @@ -57,6 +58,25 @@ function E(id) } /** + * Determines subscription's title as it should be displayed in the UI. + * @return {String} + * subscription's title or an appropriate default title if none present + */ +function getSubscriptionTitle(/**Subscription*/ subscription) +{ + if (subscription.title) + return subscription.title; + + if (subscription instanceof DownloadableSubscription) + return subscription.url; + + if (subscription instanceof SpecialSubscription && subscription.defaults) + return Utils.getString(subscription.defaults + "Group_title"); + + return Utils.getString("newGroup_title"); +} + +/** * Split up all labels into the label and access key portions. */ document.addEventListener("DOMContentLoaded", function splitAllLabelsHandler() diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ar/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ar/composer.dtd index 56122c8..c0d9853 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/composer.dtd @@ -1,9 +1,9 @@ <!ENTITY anchor.end.label "ÙÙŠ &نهاية العنوان"> <!ENTITY domainRestriction.label "ت&قييد النطاق:"> <!ENTITY collapse.default.no.label "استخدام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ (لا)"> -<!ENTITY firstParty.label "الطر٠&Ù†ÙØ³Ù‡ Ùقط"> +<!ENTITY firstParty.label "&الطر٠الأول Ùقط"> <!ENTITY preferences.label "&إعرض الÙلاتر Ø§Ù„Ù…ØªÙˆÙØ±Ø©..."> -<!ENTITY pattern.label "Ø¥Ø¨ØØ« عن نموذج"> +<!ENTITY pattern.label "Ø§Ø¨ØØ« عن نموذج"> <!ENTITY thirdParty.label "أطرا٠أ&خرى Ùقط"> <!ENTITY filter.label "&Ùلتر جديد :"> <!ENTITY collapse.label "طوي Ø§Ù„Ù…ØØ¬ÙˆØ¨:"> @@ -13,21 +13,21 @@ <!ENTITY custom.pattern.label "مخ&صص:"> <!ENTITY unselectAllTypes.label "بدون أي اختيار"> <!ENTITY type.whitelist.label "قاعدة است&ثناء"> -<!ENTITY regexp.warning "النموذج الذي أدخلته سيتم تعبيره على أنه تعبير العادي، الكثير من التعابير العادية قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ. إن لم تكن تنوي استخدام التعابير العادية، قم Ø¨Ø¥Ø¶Ø§ÙØ© الرمز "*" إلى نهاية النموذج"> -<!ENTITY dialog.title "أض٠قاعدة تصÙية لآدبلوك بلس"> +<!ENTITY regexp.warning "النموذج الذي أدخلته سيتم Ùهمه على أنه "تعبير منطقي"ØŒ الكثير من التعابير المنطقية قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ. إن لم تكن تنوي استخدام التعابير المنطقية، قم Ø¨Ø¥Ø¶Ø§ÙØ© الرمز (*) إلى نهاية النموذج."> +<!ENTITY dialog.title "Ø¥Ø¶Ø§ÙØ© قاعدة Ùلاتر لآدبلوك بلس"> <!ENTITY basic.label "العرض الأساسي"> -<!ENTITY type.filter.label "&Ùلاتر ØØ¬Ø¨"> +<!ENTITY type.filter.label "&Ùلتر Ø§Ù„ØØ¬Ø¨"> <!ENTITY types.label "التطبيق على الأنواع:"> -<!ENTITY shortpattern.warning "النموذج الذي أدخلته قصير جداً ليتم ØªØØ³ÙŠÙ†Ù‡ وقد يبطئ ØªØµÙØÙƒ. ÙŠÙ†ØµØ Ø¨Ø§Ø®ØªÙŠØ§Ø± قيمة أطول لهذا الÙلتر لكي يقوم آدبلوك بلس بÙلترته بطريقة Ø¨ÙƒÙØ§Ø¡Ø©."> +<!ENTITY shortpattern.warning "النموذج الذي أدخلته قصير جداً ليتم ØªØØ³ÙŠÙ†Ù‡ وقد يبطئ ØªØµÙØÙƒ. ÙŠÙ†ØµØ Ø¨Ø§Ø®ØªÙŠØ§Ø± قيمة أطول لهذا الÙلتر لكي يقوم آدبلوك بلس بÙلترته بأكثر ÙƒÙØ§Ø¡Ø©."> <!ENTITY collapse.yes.label "نعم"> <!ENTITY anchors.label "قبول النموذج Ùقط:"> <!ENTITY collapse.default.yes.label "استخدام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ (نعم)"> <!ENTITY domainRestriction.help "استعمل هذا الخيار Ù„ØªØØ¯ÙŠØ¯ نطاق ÙˆØ§ØØ¯ أو أكثر Ù…ÙØµÙˆÙ„ بالرمز "|"ØŒ سيطبق هذا الÙلتر على هذه النطاقات Ùقط. وضع الرمز "~" قبل اسم نطاق يعني أن الÙلتر يجب ألا يطبق على ذلك النطاق"> <!ENTITY accept.label "Ø¥Ø¶Ø§ÙØ© Ùلتر"> -<!ENTITY options.label "إعدادات"> +<!ENTITY options.label "خيارات"> <!ENTITY disabled.warning "آدبلوك بلس معطل ØØ§Ù„ياً. ما زال يمكنك Ø¥Ø¶Ø§ÙØ© الÙلاتر Ùˆ لكن لن يتم تطبيقهم إلا إذا قمت ب[link]Ø¨ØªÙØ¹ÙŠÙ„ آدبلوك بلس[/link]."> <!ENTITY anchor.start.flexible.label "ÙÙŠ ب&داية اسم النطاق"> <!ENTITY collapse.no.label "لا"> <!ENTITY selectAllTypes.label "اختيار الكل"> <!ENTITY advanced.label "عرض متقدم"> -<!ENTITY pattern.explanation "هذا النمط يمكن أن يكون أي جزء من عنوان، الرمز (*) يستعمل كاختصار. سيتم تطبيق Ø§Ù„Ù…ØµÙØ§Ø© على العناوين المطابقة للنمط Ø§Ù„Ù…ØØ¯Ø¯ Ùقط."> +<!ENTITY pattern.explanation "النموذج يمكن أن يكون أي جزء من عنوان، الرمز (*) يستعمل كإختصار. سيتم تطبيق الÙلتر على العناوين المطابقة للنموذج Ø§Ù„Ù…ØØ¯Ø¯ Ùقط."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ar/filters.dtd index e7691f6..d2e4843 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/filters.dtd @@ -1,74 +1,80 @@ -<!ENTITY restore.custom.warning "سيتم استبدال ÙƒØ§ÙØ© عوامل التصÙية المخصصة الخاصة بك Ø¨Ù…ØØªÙˆÙŠØ§Øª Ø§Ù„Ù…Ù„Ù Ø§Ù„Ù…ØØ¯Ø¯.هل تريد المتابعه؟"> -<!ENTITY slow.column "&عرض الÙلاتر"> -<!ENTITY enabled.column "مش&غل"> -<!ENTITY subscription.lastDownload.checksumMismatch "ÙØ´Ù„ ØŒ عدم تطابق المجموع الاختباري"> -<!ENTITY noFiltersInGroup.text "المجموعة المختارة ÙØ§Ø±ØºØ©"> +<!ENTITY restore.custom.warning "سيتم إستبدال ÙƒØ§ÙØ© الÙلتراتك المخصصة Ø¨Ù…ØØªÙˆÙ‰ Ø§Ù„Ù…Ù„Ù Ø§Ù„Ù…ØØ¯Ø¯. هل تريد المتابعه؟"> +<!ENTITY slow.column "Ùلاتر &بطيئة"> +<!ENTITY enabled.column "Ù…Ù&عل"> +<!ENTITY subscription.lastDownload.checksumMismatch "ÙØ´Ù„ الأمر، عدم تطابق المجموع الإختباري"> +<!ENTITY noFiltersInGroup.text "المجموعة المختارة ÙØ§Ø±ØºØ©."> <!ENTITY subscription.actions.label "الإجراءات"> -<!ENTITY filter.selectAll.label "اختيار الكل"> -<!ENTITY backupButton.label "ال&نسخ Ø§Ù„Ø§ØØªÙŠØ§Ø·ÙŠØ© والاسترجاع"> -<!ENTITY restore.minVersion.warning "تنبيه : المل٠تم إنشاؤه بواسطة نسخة ØØ¯ÙŠØ«Ø© لأد بلوك بلس . يجب عليك ØªØØ¯ÙŠØ« أد بلوك بلس قبل عمليةالاستعادة من هذا الملÙ. "> -<!ENTITY restore.error "لا يمكن معالجة بينات المل٠، من Ø§Ù„Ù…ØØªÙ…Ù„ أن هذاالمل٠ليس النسخة Ø§Ù„Ø§ØØªÙŠØ§Ø·ÙŠØ© لآد بلوك بلس ØŸ"> +<!ENTITY filter.selectAll.label "إختيار الكل"> +<!ENTITY backupButton.label "ال&نسخ Ø§Ù„Ø¥ØØªÙŠØ§Ø·ÙŠ ÙˆØ§Ù„Ø¥Ø³ØªØ±Ø¬Ø§Ø¹"> +<!ENTITY restore.minVersion.warning "تنبيه: المل٠تم إنشاؤه بواسطة نسخة ØØ¯ÙŠØ«Ø© لأد بلوك بلس. يجب عليك ØªØØ¯ÙŠØ« آد بلوك بلس قبل عمليةالإسترجاع من هذا الملÙ."> +<!ENTITY restore.error "لا يمكن معالجة بينات Ø§Ù„Ù…Ù„ÙØŒ من Ø§Ù„Ù…ØØªÙ…Ù„ أن هذاالمل٠ليس نسخة Ø¥ØØªÙŠØ§Ø·ÙŠØ© لآد بلوك بلس؟"> <!ENTITY sort.ascending.label "ترتيب أبجدي (A > Z) (&ص)"> <!ENTITY sort.label "ترتي&ب ØØ³Ø¨"> <!ENTITY subscription.source.label "قائمة الÙلاتر"> -<!ENTITY hitcount.column "ال&ضغطات"> -<!ENTITY noFilters.text "لا توجد لديك Ùلاتر مخصصة بعد"> +<!ENTITY hitcount.column "Ø¥&ØØµØ§Ø¡Ø§Øª"> +<!ENTITY noFilters.text "لا توجد لديك Ùلاتر مخصصة بعد."> <!ENTITY backup.custom.title "الÙلاتر المخصصة Ùقط"> <!ENTITY subscription.external.label "تم Ø§Ù„ØªØØ¯ÙŠØ« من Ø§Ø¶Ø§ÙØ© اخرى"> <!ENTITY subscription.delete.label "ازالة"> -<!ENTITY noGroupSelected.text "ج"> +<!ENTITY noGroupSelected.text "ØªØØªØ§Ø¬ إلى ØªØØ¯ÙŠØ¯ مجموعة Ùلتر قبل أن يمكن عرض مجموعة الÙلاتر هته."> <!ENTITY filter.cut.label "قص"> -<!ENTITY restore.default.label "الاسترجاع من النسخة Ø§Ù„Ø§ØØªÙŠØ§Ø·ÙŠØ© ?1?"> -<!ENTITY subscription.lastDownload.inProgress "جاري التØÙ…يل"> -<!ENTITY subscriptions.tab.label "اشتراكات الÙلتر"> +<!ENTITY restore.default.label "الإسترجاع من النسخة Ø§Ù„Ø¥ØØªÙŠØ§Ø·ÙŠØ© ?1?"> +<!ENTITY subscription.lastDownload.inProgress "جاري التØÙ…يل…"> +<!ENTITY subscriptions.tab.label "إشتراكات الÙلاتر"> <!ENTITY sort.descending.label "ت&رتيب أبجدي (Z > A)"> -<!ENTITY filters.remove.warning "Ø£ØÙ‚اً تريد ازالة الÙلاتر المختارة؟"> +<!ENTITY filters.remove.warning "هل تريد ØÙ‚اً إزالة الÙلاتر المختارة؟"> <!ENTITY filter.delete.label "ØØ°Ù"> <!ENTITY addSubscriptionAdd.label "Ø§Ø¶Ø§ÙØ©"> <!ENTITY viewMenu.label "عرض"> <!ENTITY subscription.lastDownload.unknown "غير متاØ"> -<!ENTITY addSubscriptionCancel.label "الغاء"> +<!ENTITY addSubscriptionCancel.label "إلغاء"> <!ENTITY subscription.enabled.label "Ù…ÙØ¹Ù‘Ù„"> -<!ENTITY noSubscriptions.text "لم تض٠أي Ùلتر اشتراك ØØªÙ‰ الان. لن يصد آد بلÙÙƒ بلَس -أي شيء بدون هذه الÙلاتر, الرجاء اختيار اشتراكات الÙلاتر -Ù„Ø§Ø¶Ø§ÙØ© Ø£ØØ¯Ù‡Ø§"> +<!ENTITY noSubscriptions.text "لم تض٠أي إشتراك Ùلاتر ØØªÙ‰ الان. آد بلÙÙƒ بلَس لا ÙŠØØ¬Ø¨ +أي شيء بدون هذه الÙلاتر, الرجاء إختيار "إشتراكات الÙلاتر" +Ù„Ø¥Ø¶Ø§ÙØ© Ø£ØØ¯Ù‡Ø§."> <!ENTITY subscription.update.label "ØªØØ¯Ø¨Ø« الÙلاتر"> -<!ENTITY dialog.title "ØªÙØ¶ÙŠÙ„ات التصÙية لآد بلÙÙƒ بلَس"> +<!ENTITY dialog.title "ØªÙØ¶ÙŠÙ„ات الÙلترات لآدبلوك بلس"> <!ENTITY addFilter.label "Ø¥&Ø¶Ø§ÙØ© Ùلتر"> -<!ENTITY subscription.minVersion.warning "يتطلب هذا الاشتراك للتصÙية Ø£ØØ¯Ø« إصدار آد بلÙÙƒ بلَس ØŒ يجب Ø§Ù„ØªØØ¯ÙŠØ« إلى الإصدار Ø§Ù„Ø£ØØ¯Ø«"> -<!ENTITY subscription.lastDownload.invalidURL "ÙØ´Ù„ الأمر، ليس عنوان صØÙŠØ"> -<!ENTITY backup.error "ØØµÙ„ هناك خطأ ÙÙŠ Ø¥Ø¶Ø§ÙØ© الÙلاتر إلى المل٠. تأكد من أن المل٠قابل للتعديل Ùˆ لا يتم استخدامه ÙÙŠ برنامج آخر."> -<!ENTITY filter.moveUp.label "الى الاعلى"> -<!ENTITY addGroup.label "Ø£Ø¶Ø§ÙØ© &مجموعة تصÙية"> +<!ENTITY subscription.minVersion.warning "إشتراك الÙلاتر هذا يتطلب إصدار آد بلÙÙƒ بلَس ØØ¯ÙŠØ«ØŒ يجب عليك Ø§Ù„ØªØØ¯ÙŠØ« إلى Ø£ØØ¯Ø« إصدار."> +<!ENTITY subscription.lastDownload.invalidURL "ÙØ´Ù„ الأمر، العنوان ليس صØÙŠØ"> +<!ENTITY backup.error "ØØµÙ„ هناك خطأ ÙÙŠ كتابة الÙلاتر إلى الملÙ. تأكد من أن المل٠قابل للتعديل Ùˆ لا يتم إستخدامه من قبل برنامج آخر."> +<!ENTITY filter.moveUp.label "إلى الأعلى"> +<!ENTITY addGroup.label "Ø¥Ø¶Ø§ÙØ© &مجموعة Ùلاتر"> <!ENTITY filter.edit.label "ØªØØ±ÙŠØ±"> -<!ENTITY subscription.showHideFilters.label "اظهار / Ø§Ø®ÙØ§Ø¡ الÙلاتر"> +<!ENTITY subscription.showHideFilters.label "إظهار / Ø¥Ø®ÙØ§Ø¡ الÙلاتر"> <!ENTITY acceptableAds2.label "Ø§Ù„Ø³Ù…Ø§Ø Ù„Ø¨&عض الإعلانات الغير متطÙّلة"> <!ENTITY addSubscriptionOther.label "Ø¥Ø¶Ø§ÙØ© اشتراك آخر"> -<!ENTITY close.label "اغلاق"> +<!ENTITY close.label "إغلاق"> +<!ENTITY findbar.caseSensitive "طابق ØØ§Ù„Ø© Ø§Ù„Ø£ØØ±Ù"> <!ENTITY sort.none.label "غي&ر مرتب"> -<!ENTITY filter.actions.label "Ø£ÙØ¹Ø§Ù„ الÙلاتر"> +<!ENTITY filter.actions.label "التطبيقات على الÙلتر"> <!ENTITY filter.copy.label "نسخ"> -<!ENTITY filter.moveDown.label "الى الاسÙÙ„"> -<!ENTITY filter.resetHitCounts.label "استرجاع Ø§ØØµØ§Ø¦ÙŠØ§Øª الاصابات الصØÙŠØØ©"> +<!ENTITY filter.moveDown.label "إلى الأسÙÙ„"> +<!ENTITY filter.resetHitCounts.label "إعادة Ø§Ù„Ø¥ØØµØ§Ø¦ÙŠØ§Øª الوضع الأصلي"> <!ENTITY readMore.label "قراءة المزيد"> -<!ENTITY subscription.moveUp.label "الى الاعلى"> -<!ENTITY addSubscription.label "إضا&ÙØ© اشتراك إلى Ùلتر"> +<!ENTITY subscription.moveUp.label "إلى الأعلى"> +<!ENTITY addSubscription.label "Ø¥Ø¶Ø§ÙØ© إشتراك Ùلاتر"> <!ENTITY subscription.homepage.label "ØµÙØØ© البداية"> -<!ENTITY backup.complete.title "كل الاشتراكات والÙلاتر"> -<!ENTITY restore.own.label "الاسترجاع من النسخة Ø§Ù„Ø§ØØªÙŠØ§Ø·ÙŠØ© الذاتية"> -<!ENTITY restore.complete.warning "سيتم استبدال ÙƒØ§ÙØ© Ø§Ù„ØªÙØ¶ÙŠÙ„ات الخاصة بك ÙÙŠ تصÙية Ù…ØØªÙˆÙŠØ§Øª Ø§Ù„Ù…Ù„Ù Ø§Ù„Ù…ØØ¯Ø¯. هل تريد المتابعه؟"> +<!ENTITY backup.complete.title "كل الإشتراكات والÙلاتر"> +<!ENTITY restore.own.label "الإسترجاع من النسخة Ø§Ù„Ø¥ØØªÙŠØ§Ø·ÙŠØ© الخاصة"> +<!ENTITY restore.complete.warning "سيتم إستبدال ÙƒØ§ÙØ© ØªÙØ¶ÙŠÙ„ات Ùلتراتك Ø¨Ù…ØØªÙˆÙŠØ§Øª Ø§Ù„Ù…Ù„Ù Ø§Ù„Ù…ØØ¯Ø¯. هل تريد المتابعه؟"> <!ENTITY filters.tab.label "الÙلاتر المخصصة"> -<!ENTITY backup.label "اعمل نسخة Ø§ØØªÙŠØ§Ø·ÙŠØ© جديدة"> +<!ENTITY backup.label "إنشاء نسخة Ø¥ØØªÙŠØ§Ø·ÙŠØ© جديدة"> <!ENTITY find.label "Ø¨ØØ« (&ج)"> -<!ENTITY subscription.moveDown.label "الى الاسÙÙ„"> -<!ENTITY subscription.lastDownload.connectionError "ÙØ´Ù„ الأمر بسبب ÙØ´Ù„ التØÙ…يل"> +<!ENTITY subscription.moveDown.label "إلى الأسÙÙ„"> +<!ENTITY subscription.lastDownload.connectionError "ÙØ´Ù„ الأمر، بسبب ÙØ´Ù„ التØÙ…يل"> +<!ENTITY findbar.statusWrappedStart "وصلت إلى الأعلى، الإستمرار من أسÙÙ„"> <!ENTITY subscription.lastDownload.success "نجاØ"> -<!ENTITY subscription.lastDownload.invalidData "ÙØ´Ù„ الأمر، ليست قائمة Ùلاتر صØÙŠØØ©"> +<!ENTITY findbar.placeholder "إيجاد Ùلتر"> +<!ENTITY subscription.lastDownload.invalidData "ÙØ´Ù„ الأمر، قائمة Ùلاتر ليست صØÙŠØØ©"> +<!ENTITY findbar.close "إغلاق شريط Ø§Ù„Ø¨ØØ«"> <!ENTITY filter.paste.label "لصق"> <!ENTITY subscription.disabledFilters.enable "ØªÙØ¹ÙŠÙ„ الÙلاتر المعطّلة"> -<!ENTITY lasthit.column "&آخر ضغطة"> -<!ENTITY subscription.editTitle.label "ØªØØ±ÙŠØ± العنوان"> -<!ENTITY subscription.disabledFilters.warning "بعض الÙلاتر ÙÙŠ هذا الاشتراك معطّلة"> -<!ENTITY filter.column "قانون ال&Ùلتر"> +<!ENTITY lasthit.column "&آخر Ø¥ØØµØ§Ø¡"> +<!ENTITY findbar.statusWrappedEnd "وصلت إلى الأسÙÙ„ØŒ الإستمرار من أعلى"> +<!ENTITY subscription.editTitle.label "تعديل العنوان"> +<!ENTITY findbar.statusNotFound "لم يتم العثور على العبارة"> +<!ENTITY subscription.disabledFilters.warning "بعض الÙلاتر ÙÙŠ هذا الإشتراك معطّلة."> +<!ENTITY filter.column "قاعدة ال&Ùلتر"> <!ENTITY subscription.lastDownload.label "آخر تØÙ…يل"> -<!ENTITY viewList.label "اظهار القائمة"> +<!ENTITY viewList.label "إظهار القائمة"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ar/firstRun.properties index aa5bf90..6f41aed 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Ù…ØªÙˆÙØ± لنظامي Android Ùˆ iOS +firstRun_abbButtonTitle=Ø§ØØµÙ„ على Adblock Browser هنا +firstRun_abbPromotionHeadline=لديك هات٠ذكي أو كمبيوتر لوØÙŠØŸ firstRun_acceptableAdsExplanation=نود تشجيع مواقع ويب باستخدام الإعلانات ÙˆØ§Ø¶ØØ© وغير مزعجة. ولهذا السبب وضعنا <a>مبادئ توجيهية صارمة</a> Ù„ØªØØ¯ÙŠØ¯ الإعلانات المقبولة، والتي تظهر ضمن الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©. إذا كنت تريد أن تمنع كل الإعلانات يمكنك <a>تعطيل</a> هذا ÙÙŠ بضع ثوان. firstRun_acceptableAdsHeadline=سيتم الآن ØØ¬Ø¨ الإعلانات المزعجة firstRun_contributor_credits=شكر للمساهمين diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ar/global.properties index d626eb5..e0249ef 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/global.properties @@ -1,41 +1,48 @@ -no_blocking_suggestions=لا توجد عناصر Ù„Ù„ØØ¬Ø¨ ÙÙŠ هذه Ø§Ù„ØµÙØØ© +no_blocking_suggestions=لا توجد عناصر Ù„Ù„ØØ¬Ø¨ على هذه Ø§Ù„ØµÙØØ© action3_tooltip=اضغط لتشغيل/تعطيل آدبلوك بلس notification_antiadblock_title=Ø¥Ø®ÙØ§Ø¡ الرسائل Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©ØŸ type_label_script=سكريبت -filter_elemhide_nocriteria=لم يتم ØªØØ¯ÙŠØ¯ صيغة للتعر٠على العنصر Ù„Ø¥Ø®ÙØ§Ø¤Ù‡ -blockingGroup_title=قواعد ØØ¬Ø¨ الدعاية -whitelisted_tooltip=آدبلوك بلس ÙØ¹Ø§Ù„ الآن، Ùˆ لكنه معطل بالنسبة لهذه Ø§Ù„ØµÙØØ© +filter_elemhide_nocriteria=لم يتم ØªØØ¯ÙŠØ¯ صيغة للتعر٠على العنصر Ù„Ø¥Ø®ÙØ§Ø¦Ù‡ +blockingGroup_title=قواعد ØØ¬Ø¨ الإعلانات +whitelisted_tooltip=آدبلوك بلس معطل على لهذه Ø§Ù„ØµÙØØ©. +type_label_ping=بينغ type_label_stylesheet=جدول الأنماط blocked_count_tooltip=?1? خارج عن ?2? type_label_font=الخط type_label_popup=Ù†Ø§ÙØ°Ø© منبثقة -filter_regexp_tooltip=هذا الÙلتر إما "تعبير منطقي" أو أقصر من أن يتم ØªØØ³ÙŠÙ†Ù‡. الكثير من هذه الÙلاتر قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ +filter_regexp_tooltip=هذا الÙلتر إما "تعبير نمطي" أو أقصر من أن يتم ØªØØ³ÙŠÙ†Ù‡. الكثير من هذه الÙلاتر قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ. action0_tooltip=اضغط لتظهر القائمة المراÙقة، اضغط بالزر الأوسط للتشغيل/التعطيل -whitelisted_page=تم تعطيل آدبلوك بلس ÙÙŠ Ø§Ù„ØµÙØØ© Ø§Ù„ØØ§Ù„ية +whitelisted_page=تم تعطيل آدبلوك بلس على Ø§Ù„ØµÙØØ© Ø§Ù„ØØ§Ù„ية remove_group_warning=هل تريد ØÙ‚اً إزالة هذه المجموعة؟ action1_tooltip=اضغط Ù„ÙØªØ/إغلاق العناصر Ø§Ù„Ù…ØØ¬ÙˆØ¨Ø©ØŒ اضغط بالزر الأوسط للتشغيل/ التعطيل type_label_xmlhttprequest=طلب XML -active_tooltip=إن آدبلوك بلس Ù…ÙØ¹Ù„. هناك ?1? اشتراك Ùلتر Ùˆ ?2? Ùلاتر مخصصة قيد الاستعمال +filter_invalid_regexp=تعبير منطقي غير صØÙŠØ +active_tooltip=آدبلوك بلس Ù…ÙØ¹Ù„ØŒ هناك ?1? إشتراك Ùلتر Ùˆ ?2? Ùلاتر مخصصة قيد الإستعمال. type_label_document=مستند type_label_object_subrequest=طلب ÙØ±Ø¹ÙŠ Ù„Ù„Ø¹Ù†ØµØ± -whitelistGroup_title=قواعد الاستثتاء -disabled_tooltip=آدبلوك بلس معطل الآن +whitelistGroup_title=قواعد الإستثتاء +disabled_tooltip=آدبلوك بلس معطل filter_elemhide_duplicate_id=ØªØ¹Ø±ÙŠÙ ÙˆØ§ØØ¯ Ùقط للعنصر الذي سيتم Ø¥Ø®ÙØ§Ø¤Ù‡ يمكن أن ÙŠØØ¯Ø¯ type_label_object=عنصر action2_tooltip=اضغط Ù„ÙØªØ الخيارات، اضغط بالزر الأوسط للتشغيل/التعطيل type_label_subdocument=إطار -clearStats_warning=هذا سيصÙّر كل Ø§ØØµØ§Ø¡Ø§Øª الÙلاتر ويعطّل تعداد اصابات الÙلاتر. هل تريد التقدم؟ -notification_antiadblock_message=لقد عر٠هذا الموقع بإظهاره رسائل موجهة إلى المستخدمين. هل تريد أن يخÙÙŠ Adblock Plus الرسائل Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©ØŸ +clearStats_warning=هذا سيصÙّر كل Ø¥ØØµØ§Ø¡Ø§Øª الÙلاتر Ùˆ يعطّل عداد الÙلاتر. هل تريد التقدم؟ +filter_unknown_option=خيار Ùلتر غير معرو٠+type_label_genericblock=ØØ¬Ø¨ عام +notification_antiadblock_message=يعر٠هذا الموقع بإظهاره رسائل موجهة إلى المستخدمي آدبلوك بلس. هل تريد أن يخÙÙŠ آدبلوك بلس هذه الرسائل Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©ØŸ blocked_count_addendum=Ø§Ù„Ù…Ø³Ù…ÙˆØ Ø¨Ù‡ ?1? والمخÙÙŠ ?2? -subscription_invalid_location=موقع قائمة الÙلتر ليس صØÙŠØ كعنوان ويب Ùˆ لا كأسم مل٠+subscription_invalid_location=موقع قائمة الÙلاتر ليس صØÙŠØ كعنوان ويب Ùˆ لا كإسم ملÙ. +type_label_websocket=websocket type_label_image=صورة -remove_subscription_warning=هل أنت ØÙ‚اً راغب بإزالة هذا الاشتراك؟ +remove_subscription_warning=هل أنت ØÙ‚اً راغب بإزالة هذا الإشتراك؟ +type_label_generichide=Ø¥Ø®ÙØ§Ø¡ عام type_label_other=أخرى mobile_menu_enable=آدبلوك بلس: ØªÙØ¹ÙŠÙ„ type_label_media=صوت/Ùيديو mobile_menu_disable_site=آدبلوك بلس: تعطيل على ?1? -elemhideGroup_title=قواعد Ø§Ø®ÙØ§Ø¡ العناصر +elemhideGroup_title=قواعد Ø¥Ø®ÙØ§Ø¡ العناصر mobile_menu_enable_site=آدبلوك بلس: ØªÙØ¹ÙŠÙ„ على ?1? type_label_elemhide=مخÙÙŠ newGroup_title=مجموعة Ùلترة جديدة default_dialog_title=آدبلوك بلس +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ar/overlay.dtd index f15d26f..603b1a9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/overlay.dtd @@ -1,31 +1,33 @@ <!ENTITY notification.button.no "&لا"> <!ENTITY sync.label "Ù…&زامنة إعدادات آدبلوك بلس"> -<!ENTITY whitelist.site.label "تعطيل ÙÙŠ ?1?"> -<!ENTITY filters.label "ت&ÙØ¶ÙŠÙ„ات الÙلتر"> -<!ENTITY disable.label "تعطيل ÙÙŠ جميع الأماكن"> +<!ENTITY whitelist.site.label "تعطيل على ?1?"> +<!ENTITY notification.closing.button.hide "إغلاق Ù‡&ذا التنبيه"> +<!ENTITY filters.label "&ØªÙØ¶ÙŠÙ„ات الÙلتر"> +<!ENTITY disable.label "تعطيل ÙÙŠ كل مكان"> <!ENTITY objecttab.title "Ø£ØØ¬Ø¨"> <!ENTITY objecttab.tooltip "اضغط هنا Ù„ØØ¬Ø¨ هذا العنصر بـ آدبلوك بلاس"> -<!ENTITY menuitem.label "ØªÙØ¶ÙŠÙ„ات آدبلوك بلس"> +<!ENTITY menuitem.label "ØªÙØ¶ÙŠÙ„ات آد&بلوك بلس"> <!ENTITY objecttabs.label "عرض &تبويبات Ù„Ùلاش Ùˆ Ø¬Ø§ÙØ§"> -<!ENTITY sendReport.label "ال&تبليغ عن خطأ ÙÙŠ هذه Ø§Ù„ØµÙØØ©"> +<!ENTITY sendReport.label "&التبليغ عن مشكل ÙÙŠ هذه Ø§Ù„ØµÙØØ©"> <!ENTITY whitelist.page.label "تعطيل ÙÙŠ هذه Ø§Ù„ØµÙØØ© Ùقط"> <!ENTITY context.image.label "آدبلوك بلس : ØØ¬Ø¨ صورة"> <!ENTITY notification.button.yes "&نعم"> -<!ENTITY opensidebar.label "ÙØªØ العناصر المØ&جوبة"> +<!ENTITY opensidebar.label "ÙØªØ &العناصر الممكن ØØ¬Ø¨Ù‡Ø§"> <!ENTITY notification.button.close "&اغلاق"> -<!ENTITY contribute.label "شارك ÙÙŠ آد بلÙÙƒ بلَس"> +<!ENTITY shownotifications.label "إظهار التنبيهات &الهامة"> +<!ENTITY contribute.label "ساهم ÙÙŠ آدبلوك بلس"> <!ENTITY toolbarbutton.label "آدبلوك بلس"> -<!ENTITY context.frame.label "آدبلوك بلس : ØØ¬Ø¨ إطار"> -<!ENTITY blocked.tooltip "العناصر Ø§Ù„Ù…ØØ¬ÙˆØ¨Ø© ÙÙŠ هذه Ø§Ù„ØµÙØØ©"> -<!ENTITY counthits.label "تعداد اصابات الÙلترة (&Ø¥)"> +<!ENTITY context.frame.label "آدبلوك بلس: ØØ¬Ø¨ إطار"> +<!ENTITY blocked.tooltip "العناصر Ø§Ù„Ù…ØØ¬ÙˆØ¨Ø© ÙÙŠ هذه Ø§Ù„ØµÙØØ©:"> +<!ENTITY notification.closing.button.optout "&إيقا٠عرض التنبيهات"> +<!ENTITY counthits.label "ØØ³Ø§Ø¨ نتائج ال&Ùلترة"> <!ENTITY showinstatusbar.label "عرض ÙÙŠ شريط ال&ØØ§Ù„Ø©"> -<!ENTITY sidebar.title "العناصر Ø§Ù„Ù…ØØ¬ÙˆØ¨Ø© ÙÙŠ Ø§Ù„ØµÙØØ© Ø§Ù„ØØ§Ù„ية"> +<!ENTITY sidebar.title "العناصر الممكن ØØ¬Ø¨Ù‡Ø§ ÙÙŠ Ø§Ù„ØµÙØØ© Ø§Ù„ØØ§Ù„ية"> <!ENTITY options.label "&خيارات"> <!ENTITY context.object.label "آدبلوك بلس : ØØ¬Ø¨ عنصر"> -<!ENTITY context.removeWhitelist.label "آدبلوك بلس : إعادة Ø§Ù„ØªÙØ¹ÙŠÙ„ ÙÙŠ هذه Ø§Ù„ØµÙØØ©"> -<!ENTITY filters.tooltip "المصاÙÙŠ الأكثر نشاط:"> -<!ENTITY closesidebar.label "إغلاق العناصر المØ&جوبة"> +<!ENTITY context.removeWhitelist.label "آدبلوك بلس: إعادة Ø§Ù„ØªÙØ¹ÙŠÙ„ ÙÙŠ هذه Ø§Ù„ØµÙØØ©"> +<!ENTITY filters.tooltip "الÙلاتر الأكثر ÙØ¹Ø§Ù„ية"> +<!ENTITY closesidebar.label "إغلاق &العناصر الممكن ØØ¬Ø¨Ù‡Ø§"> <!ENTITY showintoolbar.label "عرض ÙÙŠ &شريط الأدوات"> -<!ENTITY status.tooltip "Ø§Ù„ØØ§Ù„Ø©"> -<!ENTITY context.media.label "آدبلوك بلس : ØØ¬Ø¨ أوديوÙيديو"> -<!ENTITY subscription.update.label "ØªØØ¯Ø¨Ø« الÙلاتر"> +<!ENTITY status.tooltip "Ø§Ù„ØØ§Ù„ات:"> +<!ENTITY context.media.label "آدبلوك بلس: ØØ¬Ø¨ الصوت/الصورة"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ar/sendReport.dtd index 5452341..f480c1d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/sendReport.dtd @@ -1,65 +1,65 @@ <!ENTITY screenshot.undo.label "&تراجع"> -<!ENTITY issues.disabledgroups.description "اشتراكات ومجموعات الÙلاتر التالية معطلة، ولكنها قد تسبب أثرا على هذه Ø§Ù„ØµÙØØ© رغم ذلك"> +<!ENTITY issues.disabledgroups.description "إشتراكات ومجموعات الÙلاتر التالية معطلة، ولكنها قد تأثر على هذه Ø§Ù„ØµÙØØ© رغم ذلك:"> <!ENTITY showData.label "إظهار بيانات التقرير"> <!ENTITY typeSelector.falsePositive.label "آدبلوك بلس ÙŠØØ¬Ø¨ &أكثر من اللازم"> -<!ENTITY issues.change.description "تم تغيير إعداداتك. الرجاء إعادة تØÙ…يل Ø§Ù„ØµÙØØ© لتجربة التغييرات وإرسال تقرير بالمشكلة إن لم تكن قد ØÙ„ت بهذه التغييرات"> +<!ENTITY issues.change.description "تم تغيير إعداداتك. الرجاء إعادة تØÙ…يل Ø§Ù„ØµÙØØ© لتجربة التغييرات وإرسال تقرير بالمشكلة إن لم تكن قد ØÙ„ت بهذه التعديلات."> <!ENTITY email.label "الب&ريد الإلكتروني:"> <!ENTITY issues.openPreferences.label "ÙØªØ ØªÙØ¶ÙŠÙ„ات الÙلتر"> <!ENTITY sendPage.confirmation "تم ØÙظ تقريرك. ستستطيع الوصول إليه عن طريق العنوان التالي:"> <!ENTITY copyLink.label "&نسخ رابط التقرير"> <!ENTITY issues.nofilters.description "آدبلوك بلس لا يمنع أي شيء على هذه Ø§Ù„ØµÙØØ©. على الأغلب أن المشكلة التي تواجهها لا تتعلق بآدبلوك بلس Ù†ÙØ³Ù‡."> -<!ENTITY sendPage.knownIssue "على الأغلب أن المشكلة التي قمت بإرسالها Ù…Ø¹Ø±ÙˆÙØ© مسبقاً. للمزيد من المعلومات:"> -<!ENTITY typeSelector.other.description "اختر هذا الخيار إن كنت تشك أن المشكلة بآدبلوك بلس Ù†ÙØ³Ù‡ وليس Ø¨Ø£ØØ¯ الÙلاتر"> -<!ENTITY issues.disabledgroups.enable.label "ØªÙØ¹ÙŠÙ„ مجموعة اشتراك Ùلتر"> +<!ENTITY sendPage.knownIssue "المشكلة التي قمت بالإبلاغ عنه Ù…Ø¹Ø±ÙˆÙØ© مسبقاً. للمزيد من المعلومات:"> +<!ENTITY typeSelector.other.description "إختر هذا الخيار إن كنت تشك أن المشكلة بآدبلوك بلس Ù†ÙØ³Ù‡ وليس Ø¨Ø£ØØ¯ الÙلاتر."> +<!ENTITY issues.disabledgroups.enable.label "ØªÙØ¹ÙŠÙ„ مجموعة إشتراك الÙلاتر"> <!ENTITY typeWarning.override.label "أتÙهم وأرغب بإر&سال التقرير"> <!ENTITY issues.disabled.enable.label "ØªÙØ¹ÙŠÙ„ آدبلوك بلس"> -<!ENTITY update.fixed.description "Ø§Ù„ØªØØ¯ÙŠØ«Ø§Øª لاشتراكات الÙلاتر Ø£ØµÙ„ØØª المشكلة التي أردت الإبلاغ عنها. رجاء أعد ØªØØ¯ÙŠØ« Ø§Ù„ØµÙØØ© وأعد Ø§Ù„Ù…ØØ§ÙˆÙ„ة، اضغط تقرير مرة أخرى إذا بقيت المشكلة."> +<!ENTITY update.fixed.description "Ø§Ù„ØªØØ¯ÙŠØ«Ø§Øª إشتراكات الÙلاتر Ø£ØµÙ„ØØª المشكلة التي أردت الإبلاغ عنها. رجاء أعد ØªØØ¯ÙŠØ« Ø§Ù„ØµÙØØ© وأعد Ø§Ù„Ù…ØØ§ÙˆÙ„ة، إضغط تقرير مرة أخرى إذا بقيت المشكلة."> <!ENTITY anonymous.label "تقرير بدون هوي&Ø©"> <!ENTITY reloadButton.label "إعادة ت&ØÙ…يل Ø§Ù„ØµÙØØ©"> <!ENTITY recentReports.clear.label "&ØØ°Ù كل التقارير"> -<!ENTITY typeSelector.description "هذه Ø§Ù„Ù†Ø§ÙØ°Ø© ستقودك خلال الخطوات المطلوبة لإرسال تبليغ بمشكلة ÙÙŠ آدبلوك بلس. ÙÙŠ البداية عليك اختيار نوع المشكلة التي تواجهها من هذه Ø§Ù„ØµÙØØ©"> +<!ENTITY typeSelector.description "هذه Ø§Ù„Ù†Ø§ÙØ°Ø© ستقودك خلال الخطوات المطلوبة لإرسال تبليغ بمشكلة ÙÙŠ آدبلوك بلس. ÙÙŠ البداية عليك إختيار نوع المشكلة التي تواجهها من هذه Ø§Ù„ØµÙØØ©:"> <!ENTITY screenshot.remove.label "&ØØ°Ù المعلومات Ø§Ù„ØØ³Ø§Ø³Ø©"> -<!ENTITY issues.ownfilters.description "بعض الÙلاتر المطبقة على هذه Ø§Ù„ØµÙØØ© من صنع المستخدم. الرجاء إلغاء ØªÙØ¹ÙŠÙ„ هذه الÙلاتر لأنها ربما تكون سبب المشكلة"> +<!ENTITY issues.ownfilters.description "بعض الÙلاتر المطبقة على هذه Ø§Ù„ØµÙØØ© من صنع المستخدم. الرجاء إلغاء ØªÙØ¹ÙŠÙ„ هذه الÙلاتر لأنها ربما تكون سبب المشكلة:"> <!ENTITY update.inProgress.description "آدبلوك بلس ÙŠØØªØ§Ø¬ Ù„ØªØØ¯ÙŠØ« اشتراكات الÙلاتر للتأكد من أن المشكلة لم يتم إصلاØÙ‡Ø§ مسبقا. الرجاء الانتظار..."> <!ENTITY sendPage.retry.label "إرسالة مرة أخرى"> -<!ENTITY data.label "التبل&يغ عن بيانات"> -<!ENTITY recentReports.label "تقاريرك المرسلة مؤخرا"> -<!ENTITY typeWarning.description "لقد أشرت إلى رغبتك بالتبليغ عن مشكلة ÙÙŠ آدبلوك بلس Ù†ÙØ³Ù‡ وليس بالÙلاتر. الرجاء الانتباه إلى أنه من Ø§Ù„Ø£ÙØ¶Ù„ التبليغ عن مثل هذه المشاكل ÙÙŠ [link]منتدى آدبلوك بلس[/link]. يجب استعمال مبلغ المشاكل Ùقط Ù„Ù„Ø¥Ø¶Ø§ÙØ© إلى مناقشة جارية أصلا لأن Ø£ØØ¯Ø§Ù‹ لن ÙŠÙ„Ø§ØØ¸ تقريرك إن لم تقم بوضع رابط إليه. سيتم إظهار رابط مولد لتقريرك بمجرد أن تقوم بإرسال التقرير."> -<!ENTITY issues.disabled.description "آدبلوك بلس معطل ولن يقوم Ø¨ØØ¬Ø¨ أي شيء ÙÙŠ هذه Ø§Ù„ØØ§Ù„Ø©"> -<!ENTITY attachExtensions.label "إرÙÙ‚ قائمة الملØÙ‚ات النشطة للتقرير ÙÙŠ ØØ§Ù„Ø© كون خطأ ÙÙŠ Ø£ØØ¯ Ø¥Ø¶Ø§ÙØ§Øª سبب المشكلة"> -<!ENTITY issues.nosubscriptions.add.label "Ø¥Ø¶Ø§ÙØ© اشتراك Ùلتر"> -<!ENTITY issues.disabledfilters.enable.label "ØªÙØ¹ÙŠÙ„ Ùلتر"> -<!ENTITY issues.override.label "ال&إعدادات معطلة، المتابعة بالتقرير"> -<!ENTITY issues.nosubscriptions.description "يبدو أنك لم تشترك بأي قوائم Ùلاتر جاهزة والتي ستقوم بإزالة Ø§Ù„Ù…ØØªÙˆÙ‰ الغير من المواقع تلقائيا"> +<!ENTITY data.label "التبل&يغ عن بيانات:"> +<!ENTITY recentReports.label "لقد قمت مؤخرا بإرسال تقارير"> +<!ENTITY typeWarning.description "لقد أشرت إلى رغبتك بالتبليغ عن مشكلة ÙÙŠ آدبلوك بلس Ù†ÙØ³Ù‡ وليس بالÙلاتر. الرجاء الانتباه إلى أنه من Ø§Ù„Ø£ÙØ¶Ù„ التبليغ عن مثل هذه المشاكل ÙÙŠ [link]منتدى آدبلوك بلس[/link]. يجب إستعمال مبلغ المشاكل Ùقط للإستكمال مناقشة جارية لأن لا Ø£ØØ¯Ø§Ù‹ Ø³ÙˆÙ ÙŠÙ„Ø§ØØ¸ تقريرك إن لم تقم بوضع رابط إليه. سيتم إظهار رابط اللذي تم إنشاؤه بمجرد أن تقوم بإرسال التقرير."> +<!ENTITY issues.disabled.description "آدبلوك بلس معطل ولم يقوم Ø¨ØØ¬Ø¨ أي شيء ÙÙŠ هذه Ø§Ù„ØØ§Ù„Ø©."> +<!ENTITY attachExtensions.label "إرÙÙ‚ قائمة Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª Ø§Ù„Ù…ÙØ¹Ù„Ø© للتقرير Ùقد يكون خطأ ÙÙŠ Ø£ØØ¯Ù‡Ø§ هو سبب المشكلة"> +<!ENTITY issues.nosubscriptions.add.label "Ø¥Ø¶Ø§ÙØ© إشتراك Ùلاتر"> +<!ENTITY issues.disabledfilters.enable.label "ØªÙØ¹ÙŠÙ„ الÙلتر"> +<!ENTITY issues.override.label "ال&إعدادات صØÙŠØØ©ØŒ المتابعة بالتقرير"> +<!ENTITY issues.nosubscriptions.description "يبدو أنك لم تشترك بأي قوائم Ùلاتر جاهزة والتي ستقوم بإزالة Ø§Ù„Ù…ØØªÙˆÙ‰ الغير مرغوب به تلقائيا من المواقع."> <!ENTITY typeSelector.falsePositive.description "اختر هذا الخيار ان كان Ù…ØØªÙˆÙ‰ مهم ناقص من Ø§Ù„ØµÙØØ© أو كانت Ø§Ù„ØµÙØØ© تظهر بشكل خاطئ أو لا تعمل بشكل جيد. إن لم يكن باستطاعتك ØªØØ¯ÙŠØ¯ إن كان آدبلوك بلس هو سبب المشكلة جرب تعطيله مؤقتاً"> <!ENTITY typeSelector.other.label "مشكلة Ø£&خرى"> -<!ENTITY emailComment.label "Ù†ØÙ† نشجعك لإدخال بريد إلكتروني صØÙŠØ لكي نتمكن من الاتصال بك إذا كانت هناك أسئلة."> +<!ENTITY emailComment.label "Ù†ØÙ† نشجعك لإدخال بريد إلكتروني صØÙŠØ لكي نتمكن من الاتصال بك بخصوص تقريرك إذا كانت هناك أسئلة. أيضا ÙŠØ³Ù…Ø Ù„Ù†Ø§ بالتعر٠على مساهمتك Ùˆ إعطائها أولوية."> <!ENTITY issues.whitelist.remove.label "إعادة ØªÙØ¹ÙŠÙ„ آدبلوك بلس على هذه Ø§Ù„ØµÙØØ©"> -<!ENTITY outdatedSubscriptions.description "اشتراكات الÙلاتر التالية لم يتم ØªØØ¯ÙŠØ«Ù‡Ø§ منذ أسبوعين على الأقل. الرجاء ØªØØ¯ÙŠØ« هذه الاشتراكات قبل إرسال تقرير، ربما تم Ø¥ØµÙ„Ø§Ø Ø§Ù„Ù…Ø´ÙƒÙ„Ø© مسبقا."> -<!ENTITY dataCollector.description "من ÙØ¶Ù„Ùƒ انتظر بضعة دقائق ريثما يجمع آدبلوك بلس المعلومات المطلوبة"> -<!ENTITY sendButton.label "إرسال التقرير"> -<!ENTITY comment.label "التعلي&Ù‚ (اختياري)Ù€"> -<!ENTITY sendPage.errorMessage "ÙØ´Ù„ إرسال التقرير بسبب الخطأ "?1?". الرجاء التأكد من ØµØØ© اتصالك بالإنترنت وإعادة Ø§Ù„Ù…ØØ§ÙˆÙ„Ø©. إن استمرت المشكلة الرجاء طلب المساعدة ÙÙŠ [link]منتديات آدبلوك بلس[/link]"> +<!ENTITY outdatedSubscriptions.description "إشتراكات الÙلاتر التالية لم يتم ØªØØ¯ÙŠØ«Ù‡Ø§ منذ أسبوعين على الأقل. الرجاء ØªØØ¯ÙŠØ« هذه الإشتراكات قبل إرسال تقرير، ربما تم Ø¥ØµÙ„Ø§Ø Ø§Ù„Ù…Ø´ÙƒÙ„Ø© مسبقا."> +<!ENTITY dataCollector.description "من ÙØ¶Ù„Ùƒ الإنتظر قليلا ريثما يجمع آدبلوك بلس المعلومات المطلوبة."> +<!ENTITY sendButton.label "إرسا&Ù„ التقرير"> +<!ENTITY comment.label "التعلي&Ù‚ (إختياري):"> +<!ENTITY sendPage.errorMessage "ÙØ´Ù„ إرسال التقرير بسبب الخطأ "?1?". الرجاء التأكد من ØµØØ© اتصالك بالإنترنت ثم أعاد Ø§Ù„Ù…ØØ§ÙˆÙ„Ø©. إن استمرت المشكلة الرجاء طلب المساعدة على [link]منتديات آدبلوك بلس[/link]."> <!ENTITY showRecentReports.label "إظهار التقارير المرسلة مؤخرا"> -<!ENTITY commentPage.heading "إدخال تعليق"> -<!ENTITY update.start.label "بداية Ø§Ù„ØªØØ¯ÙŠØ« الان"> -<!ENTITY issues.disabledfilters.description "الÙلاتر التالية معطلة ولكن قد يكون لها أثر على هذه Ø§Ù„ØµÙØØ© رغم ذلك"> -<!ENTITY screenshot.description "Ù†ÙØ³ Ø§Ù„ØµÙØØ© قد تظهر بشكل مختل٠لأشخاص مختلÙين. قد يساعدنا Ùهم المشكلة إن قمت Ø¨Ø¥Ø±ÙØ§Ù‚ صورة لشاشتك مع تقريرك. ستستطيع ØØ°Ù المناطق التي ØªØØªÙˆÙŠ Ù…Ø¹Ù„ÙˆÙ…Ø§Øª ØØ³Ø§Ø³Ø© وكذلك وضع علامة على المناطق التي تظهر بها المشكلة. Ù„ÙØ¹Ù„ ذلك اضغط الزر المناسب ثم اختر منطقة من الصورة باستخدام Ø§Ù„ÙØ£Ø±Ø©"> +<!ENTITY commentPage.heading "أض٠تعليق"> +<!ENTITY update.start.label "بداية Ø§Ù„ØªØØ¯ÙŠØ« اﻵن"> +<!ENTITY issues.disabledfilters.description "الÙلاتر التالية معطلة، ولكن قد يكون لها أثر على هذه Ø§Ù„ØµÙØØ© رغم ذلك:"> +<!ENTITY screenshot.description "Ù†ÙØ³ Ø§Ù„ØµÙØØ© قد تظهر بشكل مختل٠لأشخاص مختلÙين. قد يساعدنا على Ùهم المشكلة إن قمت Ø¨Ø¥Ø±ÙØ§Ù‚ صورة لشاشتك مع تقريرك. ستستطيع ØØ°Ù المناطق التي ØªØØªÙˆÙŠ Ù…Ø¹Ù„ÙˆÙ…Ø§Øª ØØ³Ø§Ø³Ø© وكذلك وضع علامة على المناطق التي تظهر بها المشكلة. Ù„ÙØ¹Ù„ ذلك إضغط الزر المناسب ثم إختر منطقة من الصورة باستخدام Ø§Ù„ÙØ£Ø±Ø©."> <!ENTITY screenshot.attach.label "إر&ÙØ§Ù‚ صورة Ù„Ù„ØµÙØØ© مع التقرير"> -<!ENTITY issues.whitelist.description "آدبلوك بلس معطل ØØ§Ù„يا على Ø§Ù„ØµÙØØ© التي تقوم بالتبليغ عنها. الرجاء إعادة ØªÙØ¹ÙŠÙ„Ù‡ وإعادة تØÙ…يل Ø§Ù„ØµÙØØ© قبل أن تقوم بإرسال التقرير للمساعدة ÙÙŠ التØÙ‚Ù‚ من المشكلة"> +<!ENTITY issues.whitelist.description "آدبلوك بلس معطل ØØ§Ù„يا على Ø§Ù„ØµÙØØ© التي تقوم بالتبليغ عنها. الرجاء إعادة ØªÙØ¹ÙŠÙ„Ù‡ وإعادة تØÙ…يل Ø§Ù„ØµÙØØ© قبل أن تقوم بإرسال التقرير للمساعدة ÙÙŠ التØÙ‚Ù‚ من المشكلة."> <!ENTITY typeSelector.falseNegative.label "آدبلوك بلس لا يقوم Ø¨ØØ¬Ø¨ Ø£ØØ¯ الإ&علانات"> -<!ENTITY typeSelector.heading "اختر نوع المشكلة"> +<!ENTITY typeSelector.heading "إختر نوع المشكلة"> <!ENTITY anonymity.warning "لن نكون قادرين على الرجوع إليك Ùˆ لن نعطي للتقرير أهمية كبيرة."> <!ENTITY wizard.title "مبلغ المشاكل"> -<!ENTITY issues.ownfilters.disable.label "تعطيل Ùلتر"> -<!ENTITY commentPage.description "ÙŠØ³Ù…Ø Ù„Ùƒ الØÙ‚Ù„ التالي بإدخال تعليق ليساعدنا ÙÙŠ Ùهم المشكلة. هذه الخطوة إختيارية ولكننا Ù†ØµØ Ø¨Ù‡Ø§ إن لم تكن المشكلة ÙˆØ§Ø¶ØØ©. ستستطيع أيضا مراجعة بيانات التقرير قبل إرساله"> -<!ENTITY comment.lengthWarning "طول التعليق يتجاوز 1000 ØØ±Ù. سيتم إرسال أول 1000 ØØ±Ù Ùقط"> +<!ENTITY issues.ownfilters.disable.label "تعطيل الÙلتر"> +<!ENTITY commentPage.description "ÙŠØ³Ù…Ø Ù„Ùƒ الØÙ‚Ù„ التالي بإدخال تعليق ليساعدنا ÙÙŠ Ùهم المشكلة. هذه الخطوة إختيارية ولكننا Ù†ØµØ Ø¨Ù‡Ø§ إن لم تكن المشكلة ÙˆØ§Ø¶ØØ©. تستطيع أيضا مراجعة بيانات التقرير قبل إرساله."> +<!ENTITY comment.lengthWarning "طول التعليق يتجاوز 1000 ØØ±Ù. سيتم إرسال أول 1000 ØØ±Ù Ùقط."> <!ENTITY typeSelector.falseNegative.description "اختر هذا الخيار إن كان Ø£ØØ¯ الإعلانات ظاهرا رغم أن آدبلوك بلس Ù…ÙØ¹Ù„"> -<!ENTITY sendPage.waitMessage "الرجاء الانتظار ريثما يقوم آدبلوك بلس بإرسال تقرير"> +<!ENTITY sendPage.waitMessage "الرجاء الإنتظار ريثما يقوم آدبلوك بلس بإرسال تقرير."> <!ENTITY dataCollector.heading "أهلا بك ÙÙŠ مبلغ المشاكل"> <!ENTITY screenshot.heading "Ø¥Ø±ÙØ§Ù‚ صورة للشاشة"> <!ENTITY sendPage.heading "إرسال التقرير"> -<!ENTITY issues.subscriptionCount.description "يبدو أنك مشترك ÙÙŠ الكثير جداً من اشتراكات الÙلاتر وهو غير Ù…ÙØ¶Ù„ لأنه قد يكون السبب ÙÙŠ المشاكل التي تعانيها. نعتذر عن قبول تقرير مشكلتك لأننا لن نستطيع ØªØØ¯ÙŠØ¯ الÙلتر الذي يتسبب بالمشكلة لإبلاغ مطوره. الرجاء إزالة جميع الÙلاتر وإبقاء الهام جداً منها Ùقط ثم تأكد من ذهاب المشكلة أو لا."> +<!ENTITY issues.subscriptionCount.description "يبدو أنك مبالع ÙÙŠ عدد إشتراكات الÙلاتر وهو غير Ù…ÙØ¶Ù„ لأنه قد يكون السبب ÙÙŠ المشاكل التي تواجهها. نعتذر عن عدم قبول تقرير مشكلتك لأننا لن نستطيع ØªØØ¯ÙŠØ¯ الÙلتر الذي يتسبب بالمشكلة. الرجاء إزالة جميع الÙلاتر وإبقاء الهام جداً منها Ùقط ثم تأكد من ذهاب المشكلة أو لا."> <!ENTITY screenshot.mark.label "وضع علا&مة على المشكلة"> <!ENTITY privacyPolicy.label "سياسة الخصوصية"> -<!ENTITY issues.description "قام آدبلوك بلس Ø¨ØªØØ¯ÙŠØ¯ مشاكل بإعداداتك قد تكون هي المسؤولة عن هذه المشكلة وسيجعل التØÙ‚Ù‚ من المشكلة صعباً"> +<!ENTITY issues.description "قام آدبلوك بلس Ø¨ØªØØ¯ÙŠØ¯ مشاكل بإعداداتك قد تكون هي المسؤولة عن هذه المشكلة وسيجعل التØÙ‚Ù‚ من المشكلة صعباً."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ar/sidebar.dtd index 78b50fb..3c90b4a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/sidebar.dtd @@ -1,6 +1,6 @@ <!ENTITY context.flash.label "إضاءة ØÙˆØ§Ù العنصر"> <!ENTITY address.label "العنوان"> -<!ENTITY context.open.label "ÙØªØ ÙÙŠ تبويب جديد"> +<!ENTITY context.open.label "ÙØªØ ÙÙŠ Ù†Ø§ÙØ°Ø© جديدة"> <!ENTITY type.label "النوع"> <!ENTITY tooltip.filterSource.label "مصدر الÙلتر:"> <!ENTITY noitems.label "لا عناصر Ù…ØØ¬ÙˆØ¨Ø©"> @@ -9,10 +9,10 @@ <!ENTITY reattach.label "إعادة Ø¥Ø±ÙØ§Ù‚"> <!ENTITY search.label "بØ&Ø«"> <!ENTITY docDomain.thirdParty "(طر٠خارجي)"> -<!ENTITY filterSource.label "Ùلترة المصدر"> +<!ENTITY filterSource.label "مصدر الÙلتر"> <!ENTITY tooltip.docDomain.label "مصدر الملÙ:"> <!ENTITY context.copy.label "نسخ عنوان العنصر"> -<!ENTITY tooltip.type.label "النوع"> +<!ENTITY tooltip.type.label "النوع:"> <!ENTITY context.disablefilter.label "تعطيل الÙلتر ?1?"> <!ENTITY context.copyFilter.label "نسخ الÙلتر"> <!ENTITY context.block.label "ØØ¬Ø¨ هذا العنصر"> @@ -23,13 +23,13 @@ <!ENTITY detached.title "آدبلوك بلاس : العناصر Ø§Ù„Ù…ØØ¬ÙˆØ¨Ø© (Ø§Ù„Ù…Ù†ÙØµÙ„Ø©)"> <!ENTITY docDomain.firstParty "(طر٠داخلي)"> <!ENTITY tooltip.type.whitelisted "(موثوق)"> -<!ENTITY tooltip.filter.label "الÙلتر Ø§Ù„ÙØ¹Ø§Ù„"> +<!ENTITY tooltip.filter.label "الÙلتر Ø§Ù„ÙØ¹Ø§Ù„:"> <!ENTITY tooltip.filter.disabled "(معطل)"> <!ENTITY context.editfilter.label "تعديل الÙلتر Ø§Ù„ÙØ¹Ø§Ù„"> <!ENTITY tooltip.type.blocked "(Ù…ØØ¬ÙˆØ¨)"> <!ENTITY size.label "Ø§Ù„ØØ¬Ù…"> <!ENTITY context.whitelist.label "Ø¥Ø¶Ø§ÙØ© قانون استثنائي إلى هذا العنصر"> -<!ENTITY context.selectAll.label "اختيار الكل"> +<!ENTITY context.selectAll.label "إختيار الكل"> <!ENTITY state.label "Ø§Ù„ØØ§Ù„Ø©"> <!ENTITY docDomain.label "مصدر الملÙ"> -<!ENTITY tooltip.address.label "العنوان"> +<!ENTITY tooltip.address.label "العنوان:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ar/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ar/subscriptionSelection.dtd index 7c4938b..47a4869 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ar/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ar/subscriptionSelection.dtd @@ -3,10 +3,10 @@ <!ENTITY list.download.retry "إعادة Ø§Ù„Ù…ØØ§ÙˆÙ„Ø©"> <!ENTITY title.label "&عنوان الاشتراك"> <!ENTITY list.download.website "عرض الموقع"> -<!ENTITY supplementMessage "اشتراك الÙلتر هذا يجب أن يستخدم مع اشتراك الÙلتر "?1?" والذي لم تستعمله بعد"> +<!ENTITY supplementMessage "اشتراك الÙلتر هذا يجب أن يستخدم مع اشتراك الÙلتر "?1?" والذي لم تستعمله بعد."> <!ENTITY viewList.label "عرض Ùلاتر"> <!ENTITY visitHomepage.label "زيارة Ø§Ù„ØµÙØØ© الرئيسية"> <!ENTITY addSubscription.label "Ø¥Ø¶Ø§ÙØ© اشتراك"> -<!ENTITY dialog.title "أهلاً بك ÙÙŠ آدبلوك بلس"> -<!ENTITY location.label "&موقع قائمة الÙلاتر"> +<!ENTITY dialog.title "Ø¥Ø¶Ø§ÙØ© قائمة إشتراكات إلى آدبلوك بلس"> +<!ENTITY location.label "&موقع قائمة الÙلاتر:"> <!ENTITY fromWeb.description "الرجاء التأكد من رغبتك ÙÙŠ Ø¥Ø¶Ø§ÙØ© اشتراك الÙلتر هذا. يمكنك أن تغير عنوان أو موقع الاشتراك قبل Ø§Ø¶Ø§ÙØªÙ‡."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/az/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/az/composer.dtd new file mode 100644 index 0000000..2412a65 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/composer.dtd @@ -0,0 +1,33 @@ +<!ENTITY anchor.end.label "ünvanın s&onuna"> +<!ENTITY domainRestriction.label "DomenlÉ™ &kifayÉ™tlÉ™n:"> +<!ENTITY collapse.default.no.label "OlduÄŸu kimi istifadÉ™ et (xeyr)"> +<!ENTITY firstParty.label "Yalnız is&tehsalçı"> +<!ENTITY preferences.label "&Mövcud filtrlÉ™ri göstÉ™r..."> +<!ENTITY pattern.label "Åžablon axtar"> +<!ENTITY thirdParty.label "Yalnız &istehsalçıya aid olmayan"> +<!ENTITY filter.label "Yeni &filtr:"> +<!ENTITY collapse.label "Blok edilmiÅŸlÉ™ri aradn qaldır:"> +<!ENTITY match.warning "Daxil etdiyiniz ÅŸablon artıq blok-edilmiÅŸ/aÄŸ-listÉ™-salınmış ünvana uyÄŸun gÉ™lmir vÉ™ onun üərindÉ™ heç bir effekti olmayacaq."> +<!ENTITY anchor.start.label "ünvanın É™&vÉ™linÉ™"> +<!ENTITY matchCase.label "&UyÄŸunluq halı"> +<!ENTITY custom.pattern.label "&İstÉ™yÉ™ uyÄŸun:"> +<!ENTITY unselectAllTypes.label "Heç birini seçmÉ™"> +<!ENTITY type.whitelist.label "İ&stisna qayda"> +<!ENTITY regexp.warning "Sizin daxil etdiyiniz ÅŸablon Adblock Plus tÉ™rÉ™findÉ™n müntÉ™zÉ™m ifadÉ™ kimi baÅŸa düşülÉ™cÉ™k vÉ™ effektiv emal oluna bilmÉ™yÉ™cÉ™k, bu sizin axtarış sürÉ™tinizi azalda bilÉ™r. ÆgÉ™r niyyÉ™tiniz müntÉ™zÉ™m ifadÉ™ istifadÉ™si deyildirsÉ™, ÅŸablonun sonuna ulduz (*) É™lavÉ™ edin."> +<!ENTITY dialog.title "Adblock Plus filtr qaydası É™lavÉ™ et"> +<!ENTITY basic.label "SadÉ™ görüntü"> +<!ENTITY type.filter.label "&Bloklayıcı filtr"> +<!ENTITY types.label "QÉ™bildÉ™n olanlara tÉ™tbiq et:"> +<!ENTITY shortpattern.warning "Daxil etdiyiniz ÅŸablon optimallaÅŸdırmaq üçün çox qısadır vÉ™ sizin axtarış sürÉ™tinizi azalda bilÉ™r. TÉ™klif edilir ki, bu filtrÉ™ daha uzun ÅŸablon daxil etmÉ™klÉ™ Adblock Plus' un filtri daha effektiv emal etmÉ™yinÉ™ ÅŸÉ™rait yaradasınız."> +<!ENTITY collapse.yes.label "BÉ™li"> +<!ENTITY anchors.label "Ancaq ÅŸablonu qÉ™bul et:"> +<!ENTITY collapse.default.yes.label "OlduÄŸu kimi istifadÉ™ et (bÉ™li)"> +<!ENTITY domainRestriction.help "Bu seçimdÉ™n sÉ™dd xÉ™tti (|) istifadÉ™ edÉ™rÉ™k bir vÉ™ ya daha artıq domen daxil etmÉ™k üçün istifadÉ™ edÉ™ bilÉ™rsiniz. Filtr yalnız seçilmiÅŸ domen(lÉ™r)É™ tÉ™tbiq olunacaq. DomendÉ™n öncÉ™ tilde(~) iÅŸarÉ™si filtrin bu domenÉ™ tÉ™tbiq edilmÉ™yÉ™cÉ™yini göstÉ™rir."> +<!ENTITY accept.label "Filtr É™lavÉ™ et"> +<!ENTITY options.label "SeçimlÉ™r"> +<!ENTITY disabled.warning "Adblock Plus hal-hazırda deaktiv vÉ™ziyyÉ™tdÉ™dir. Buna baxmayaraq siz filtr É™lavÉ™ edÉ™ bilÉ™rsiniz, ancaq filtrlÉ™r [link]Adblock Plus[/link] aktiv edilÉ™nÉ™ qÉ™dÉ™r tÉ™sirsiz qalacaqlar."> +<!ENTITY anchor.start.flexible.label "domen adının É™v&vÉ™linÉ™"> +<!ENTITY collapse.no.label "Xeyr"> +<!ENTITY selectAllTypes.label "Hamısını seç"> +<!ENTITY advanced.label "Detallı baxış"> +<!ENTITY pattern.explanation "Åžablon istÉ™nilÉ™n ünvanın bir hissÉ™si ola bilÉ™r; ulduzlar (*) tÉ™yin edilmÉ™miÅŸ hissÉ™ rolunu oynayır. Filtr yalnız ünvanla tÉ™yin edilmiÅŸ ÅŸablon üst-üstÉ™ düşərsÉ™ iÅŸlÉ™yÉ™cÉ™k."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/az/filters.dtd new file mode 100644 index 0000000..c03bbf1 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/filters.dtd @@ -0,0 +1,78 @@ +<!ENTITY restore.custom.warning "Sizin filtr parametrlÉ™riniz seçilmiÅŸ faylın mÉ™zmunu ilÉ™ É™vÉ™z edilÉ™cÉ™k. Davam etmÉ™k istÉ™yirsiniz?"> +<!ENTITY slow.column "FiltrlÉ™ri ya&vaÅŸlat"> +<!ENTITY enabled.column "A&ktivləşdirildi"> +<!ENTITY subscription.lastDownload.checksumMismatch "BaÅŸ tutmadı, rÉ™qÉ™msal cÉ™m uyÄŸunlaÅŸmadı"> +<!ENTITY noFiltersInGroup.text "SeçilmiÅŸ qrup boÅŸdur."> +<!ENTITY subscription.actions.label "ÆmÉ™liyyatlar"> +<!ENTITY filter.selectAll.label "Hamısını seç"> +<!ENTITY backupButton.label "&Yadda saxla vÉ™ BÉ™rpa et"> +<!ENTITY restore.minVersion.warning "DiqqÉ™t: fayl Adblock Plus' un yeni versiyası ilÉ™ yaradıldı. Bu fayldan bÉ™rpa etmÉ™zdÉ™n É™vvÉ™l Adblock Plus' un son versiyasına yenilÉ™yin."> +<!ENTITY restore.error "Fayldakı mÉ™lumat emal edilÉ™ bilmÉ™di, bÉ™lkÉ™ bu Adblock Plus yaddaÅŸ qutusu faylı deyil?"> +<!ENTITY sort.ascending.label "ÇeÅŸidlÉ™mÉ™ sırası &A > Z olsun"> +<!ENTITY sort.label "&ÇeÅŸidlÉ™"> +<!ENTITY subscription.source.label "Filtr listi"> +<!ENTITY hitcount.column "&Tıklamalar"> +<!ENTITY noFilters.text "HÉ™lÉ™ki özÉ™l filtrlÉ™riniz yoxdur."> +<!ENTITY backup.custom.title "Yalnız özÉ™l filtrlÉ™r"> +<!ENTITY subscription.external.label "BaÅŸqa É™lavÉ™ tÉ™rÉ™findÉ™n yenilÉ™ndi"> +<!ENTITY subscription.delete.label "Sil"> +<!ENTITY noGroupSelected.text "FiltrlÉ™rin görünmÉ™si üçün É™vvÉ™lcÉ™ filtr qrupu seçmÉ™lisiniz."> +<!ENTITY filter.cut.label "KÉ™s"> +<!ENTITY restore.default.label "?1? yaddaÅŸ qutusundan bÉ™rpa et"> +<!ENTITY subscription.lastDownload.inProgress "YüklÉ™nir…"> +<!ENTITY subscriptions.tab.label "Filtr abunÉ™liklÉ™ri"> +<!ENTITY sort.descending.label "ÇeÅŸidlÉ™mÉ™ sırası &A > Z olsun"> +<!ENTITY filters.remove.warning "SeçilmiÅŸ bütün filtrlÉ™ri silmÉ™yÉ™ É™minsiniz?"> +<!ENTITY filter.delete.label "Sil"> +<!ENTITY addSubscriptionAdd.label "ÆlavÉ™ et"> +<!ENTITY viewMenu.label "Bax"> +<!ENTITY subscription.lastDownload.unknown "MÉ™lumat yoxdur"> +<!ENTITY addSubscriptionCancel.label "Ləğv et"> +<!ENTITY subscription.enabled.label "Aktiləşdirildi"> +<!ENTITY noSubscriptions.text "Siz hÉ™lÉ™ ki heç bir filtr abunÉ™liyi É™lavÉ™ etmÉ™yibsiniz. Adblock Plus filtrsiz heç nÉ™yi É™ngÉ™llÉ™mÉ™yÉ™cÉ™k, lütfÉ™n É™lavÉ™ etmÉ™k üçün "Filtr abunÉ™liyi É™lavÉ™ et" dÉ™n istifadÉ™ edin."> +<!ENTITY subscription.update.label "FiltrlÉ™ri yenilÉ™"> +<!ENTITY dialog.title "Adblock Plus filtr seçimlÉ™ri"> +<!ENTITY addFilter.label "Filtr É™&lavÉ™ et"> +<!ENTITY subscription.minVersion.warning "Bu filtr abunÉ™liyi Adblock Plus' un yeni versiyasını tÉ™lÉ™b edir, É™n son Adblock Plus versiyası ilÉ™ yenilÉ™mÉ™lisiniz."> +<!ENTITY subscription.lastDownload.invalidURL "BaÅŸ tutmadı ünvan düzgün deyil"> +<!ENTITY backup.error "FiltrlÉ™ri fayla yazarkÉ™n xÉ™ta baÅŸ verdi. LütfÉ™n faylın yazılma-mühafizÉ™si olmadığını vÉ™ baÅŸqa proqram tÉ™rÉ™findÉ™n istifadÉ™ edilmÉ™diyinÉ™ É™min olun."> +<!ENTITY filter.moveUp.label "Yuxarı qalx"> +<!ENTITY addGroup.label "Filtr vÉ™ &qrup É™lavÉ™ et"> +<!ENTITY filter.edit.label "DüzÉ™nlÉ™"> +<!ENTITY subscription.showHideFilters.label "FiltrlÉ™ri göstÉ™r/gizlÉ™t"> +<!ENTITY acceptableAds2.label "Bezdirici olmayan reklamların bÉ™zilÉ™rinÉ™ icazÉ™ ver"> +<!ENTITY addSubscriptionOther.label "FÉ™rqli abunÉ™lik É™lavÉ™ et"> +<!ENTITY close.label "BaÄŸla"> +<!ENTITY findbar.caseSensitive "UyÄŸunluq halı"> +<!ENTITY sort.none.label "&ÇeÅŸidlÉ™nmÉ™miÅŸ"> +<!ENTITY filter.actions.label "Filtr É™mÉ™liyyatları"> +<!ENTITY filter.copy.label "Kopyala"> +<!ENTITY filter.moveDown.label "AÅŸağı en"> +<!ENTITY filter.resetHitCounts.label "Tıklama statistikasını É™vvÉ™lki vÉ™ziyyÉ™tinÉ™ qaytar"> +<!ENTITY readMore.label "Ætraflı"> +<!ENTITY subscription.moveUp.label "Yuxarı qalx"> +<!ENTITY addSubscription.label "AbunÉ™lik &filtri É™lavÉ™ et"> +<!ENTITY subscription.homepage.label "BaÅŸ sÉ™hifÉ™"> +<!ENTITY backup.complete.title "Bütün filtr vÉ™ abunÉ™liklÉ™r"> +<!ENTITY restore.own.label "Şəxsi yaddaÅŸ qutusunu bÉ™rpa et"> +<!ENTITY restore.complete.warning "Sizin filtr parametrlÉ™riniz seçilmiÅŸ faylın mÉ™zmunu ilÉ™ É™vÉ™z edilÉ™cÉ™k. Davam etmÉ™k istÉ™yirsiniz?"> +<!ENTITY filters.tab.label "ÖzÉ™l filtr"> +<!ENTITY backup.label "Yeni yaddaÅŸ mühafizÉ™si yarat"> +<!ENTITY find.label "Ta&p"> +<!ENTITY subscription.moveDown.label "AÅŸağı düş"> +<!ENTITY subscription.lastDownload.connectionError "BaÅŸ tutmadı yüklÉ™mÉ™ uÄŸursuz oldu"> +<!ENTITY findbar.statusWrappedStart "BaÅŸ hissÉ™yÉ™ çatdı, aşğıdan davam edilÉ™cÉ™k"> +<!ENTITY subscription.lastDownload.success "UÄŸurlu alındı"> +<!ENTITY findbar.placeholder "Filtr tap"> +<!ENTITY subscription.lastDownload.invalidData "BaÅŸ tutmadı filtr list düzgün deyil"> +<!ENTITY findbar.close "Axtarış zolağını baÄŸla"> +<!ENTITY filter.paste.label "Yapışdır"> +<!ENTITY subscription.disabledFilters.enable "Deaktiv edilmiÅŸ filtrlÉ™ri aktivləşdir"> +<!ENTITY lasthit.column "&Son tıklama"> +<!ENTITY findbar.statusWrappedEnd "AÅŸağı hissÉ™yÉ™ çatdı, baÅŸ tÉ™rÉ™fdÉ™n davam edilÉ™cÉ™k"> +<!ENTITY subscription.editTitle.label "BaÅŸlığı düzÉ™nlÉ™"> +<!ENTITY findbar.statusNotFound "İfadÉ™ tapılmadı"> +<!ENTITY subscription.disabledFilters.warning "AbunÉ™likdÉ™ki bÉ™zi filtrlÉ™r deaktiv edildi."> +<!ENTITY filter.column "&Filtr qaydası"> +<!ENTITY subscription.lastDownload.label "Son yüklÉ™mÉ™:"> +<!ENTITY viewList.label "ListÉ™ bax"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/az/firstRun.properties new file mode 100644 index 0000000..9576b63 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/firstRun.properties @@ -0,0 +1,12 @@ +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds. +firstRun_acceptableAdsHeadline=Annoying ads will now be blocked +firstRun_contributor_credits=Contributor Credits +firstRun_donate=donate +firstRun_donate_label=Support our project +firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>. +firstRun_share=Tell your friends +firstRun_share_headline=<a>Give us a hand</a> in making the web a better place +firstRun_title=Adblock Plus has been installed diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/az/global.properties new file mode 100644 index 0000000..10ffd83 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/global.properties @@ -0,0 +1,48 @@ +no_blocking_suggestions=Hazırki sÉ™hifÉ™dÉ™ É™ngÉ™llÉ™nÉ™ bilÉ™cÉ™k bÉ™ndlÉ™r mövcud deyil +action3_tooltip=Adblock Plus' u aktiv/deaktiv etmÉ™k üçün tıklayın. +notification_antiadblock_title=HÉ™dÉ™f mesajlar gizlÉ™dilsin? +type_label_script=yazı +filter_elemhide_nocriteria=GizlÉ™dilÉ™cÉ™k elemntin xatırlanması üçün heç bir kriteriya tÉ™yin edilmÉ™yib +blockingGroup_title=Reklam É™ngÉ™llÉ™mÉ™ qaydaları +whitelisted_tooltip=Adblock Plus hazırki sÉ™hifÉ™dÉ™ deaktiv edildi. +type_label_ping=yoxla +type_label_stylesheet=layihÉ™ sÉ™hifÉ™si +blocked_count_tooltip=?2?-dÉ™n ?1?-i +type_label_font=ÅŸrift +type_label_popup=ani pÉ™ncÉ™rÉ™ +filter_regexp_tooltip=Bu filtr ya müntÉ™zÉ™m ifadÉ™dir yada optimallaÅŸdırmaq üçün çox qısadır. Bu kimi filtrlÉ™rin çoxluÄŸu axtarış sürÉ™tinizi azalda bilÉ™r. +action0_tooltip=Kontekst menusu üçün solu, aktiv/deaktiv etmÉ™k üçün orta düymÉ™ni tıklayın. +whitelisted_page=Adblock Plus hazırki sÉ™hifÉ™ üçün deaktiv edildi +remove_group_warning=Bu qrupu ləğv etmÉ™yÉ™ É™minsiniz? +action1_tooltip=ÆngÉ™llÉ™nÉ™ bilÉ™n maddÉ™lÉ™ri açmaq/baÄŸlamaq üçün solu, aktiv/deaktiv etmÉ™k üçün orta düymÉ™ni tıklayın. +type_label_xmlhttprequest=XML tÉ™lÉ™b +filter_invalid_regexp=Etibarsız ifadÉ™ +active_tooltip=Adblock Plus aktiv edildi, ?1? filtr abunÉ™lik(lÉ™r)i vÉ™ ?2? özÉ™l filtr(lÉ™r) istifadÉ™dir. +type_label_document=sÉ™nÉ™d +type_label_object_subrequest=daxili obyekt tÉ™lÉ™bi +whitelistGroup_title=İstisna qaydalar +disabled_tooltip=Adblock Plus deaktiv edildi. +filter_elemhide_duplicate_id=GizlÉ™dilÉ™cÉ™k elemnetin yalnız bir İD' si qeyd edilÉ™ bilÉ™r +type_label_object=obyekt +action2_tooltip=ParametrlÉ™ri açmaq üçün solu, aktiv/deaktiv etmÉ™k üçün orta düymÉ™ni tıklayın. +type_label_subdocument=çərçivÉ™ +clearStats_warning=Bu bütün filtr tıklama statistikasını vÉ™ filtr tıklama sayını É™vvÉ™lki vÉ™ziyyÉ™tinÉ™ qaytaracaq. Davam etmÉ™yÉ™ É™minsiniz? +filter_unknown_option=Qeyri-müəyyÉ™n filtr seçim +type_label_genericblock=tam blok et +notification_antiadblock_message=Bu sÉ™hifÉ™nin lazımi mesajları Adblock Plus istifadəçilÉ™rinÉ™ göstÉ™rir. Adblock Plus' un hÉ™dÉ™f mesajları gizlÉ™tmÉ™yini istÉ™yirsiniz? +blocked_count_addendum=(hÉ™mdÉ™ aÄŸ-listÉ™ salındı : ?1?, gizlÉ™dilmiÅŸ: ?2?) +subscription_invalid_location=Filtr list yeri üçün nÉ™ düzgün adres nÉ™ dÉ™ düzgün fayl adı qeyd edilmÉ™yib. +type_label_websocket=WebSocket +type_label_image=ÅŸÉ™kil +remove_subscription_warning=Bu abunÉ™liyi ləğv etmÉ™yÉ™ É™minsiniz? +type_label_generichide=tam gizlÉ™ +type_label_other=baÅŸqa +mobile_menu_enable=ABP: aktiv et +type_label_media=sÉ™s/video +mobile_menu_disable_site=ABP: ?1?-dÉ™ deaktiv et +elemhideGroup_title=Element gizlÉ™mÉ™ qaydaları +mobile_menu_enable_site=ABP: ?1?-dÉ™ aktivləşdir +type_label_elemhide=gizli +newGroup_title=Yeni filtr qrupu +default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/az/overlay.dtd new file mode 100644 index 0000000..5374da8 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/overlay.dtd @@ -0,0 +1,33 @@ +<!ENTITY notification.button.no "&Xeyr"> +<!ENTITY sync.label "Adblock Plus parametrlÉ™rini sin&xronlaÅŸdır"> +<!ENTITY whitelist.site.label "?1? - dÉ™ deaktiv et"> +<!ENTITY notification.closing.button.hide "B&u xÉ™bÉ™rdarlığı baÄŸla"> +<!ENTITY filters.label "&Filtr parametrlÉ™ri"> +<!ENTITY disable.label "HÉ™r yerdÉ™ deaktiv et"> +<!ENTITY objecttab.title "Blok et"> +<!ENTITY objecttab.tooltip "Obyekti Adblock Plus ilÉ™ blok etmÉ™k üçün bura tıklayın"> +<!ENTITY menuitem.label "Ad&block Plus parametrlÉ™ri"> +<!ENTITY objecttabs.label "&BölmÉ™lÉ™ri Flash vÉ™ Java - da göstÉ™r"> +<!ENTITY sendReport.label "&SÉ™hifÉ™dÉ™ki sÉ™hvi bildir"> +<!ENTITY whitelist.page.label "Yalnız bu sÉ™hifÉ™dÉ™ aktivləşdir"> +<!ENTITY context.image.label "Adblock Plus: Şəkili blok et"> +<!ENTITY notification.button.yes "&BÉ™li"> +<!ENTITY opensidebar.label "&Blok edilÉ™ bilÉ™n bÉ™ndlÉ™ri açın"> +<!ENTITY notification.button.close "&BaÄŸla"> +<!ENTITY shownotifications.label "Lazımi &xÉ™bÉ™rdarlıqları göstÉ™r"> +<!ENTITY contribute.label "Adblock Plus - É™ maddi yardım"> +<!ENTITY toolbarbutton.label "Adblock Plus"> +<!ENTITY context.frame.label "Adblock Plus: ÇərçivÉ™ni blok et"> +<!ENTITY blocked.tooltip "Bu sÉ™hifÉ™dÉ™ blok edilmiÅŸ bÉ™ndlÉ™r:"> +<!ENTITY notification.closing.button.optout "XÉ™bÉ™rdarlıqları &göstÉ™rmÉ™yi dayandır"> +<!ENTITY counthits.label "Filtr tıklamalarını say"> +<!ENTITY showinstatusbar.label "&Status qutusunda göstÉ™r"> +<!ENTITY sidebar.title "Cari sÉ™hifÉ™dÉ™ki Blok edilÉ™ bilÉ™n bÉ™ndlÉ™r"> +<!ENTITY options.label "&SeçimlÉ™r"> +<!ENTITY context.object.label "Adblock Plus: Obyekti blok et"> +<!ENTITY context.removeWhitelist.label "Adblock Plus: bu sÉ™hifÉ™dÉ™ yenidÉ™n aktiv et"> +<!ENTITY filters.tooltip "Æn aktiv filtrlÉ™r:"> +<!ENTITY closesidebar.label "&Blok edilÉ™ bilÉ™n bÉ™ndlÉ™ri baÄŸlayın"> +<!ENTITY showintoolbar.label "AlÉ™t qutusunda göstÉ™r"> +<!ENTITY status.tooltip "Status:"> +<!ENTITY context.media.label "Adblock Plus: SÉ™s/video - nu blok et"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/az/sendReport.dtd new file mode 100644 index 0000000..f7bf12d --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/sendReport.dtd @@ -0,0 +1,65 @@ +<!ENTITY screenshot.undo.label "&ÆvvÉ™lki hala qayıt"> +<!ENTITY issues.disabledgroups.description "AÅŸağıdakı filtr abunÉ™liklÉ™ri / filtr qrupları deaktiv edilib, ancaq shifÉ™dÉ™ hÉ™lÉ™ dÉ™ tÉ™siri ola bilÉ™r:"> +<!ENTITY showData.label "Raport mÉ™zmununu göstÉ™r"> +<!ENTITY typeSelector.falsePositive.label "Adblock Plus aşırı çox blok edir"> +<!ENTITY issues.change.description "ParametrlÉ™riniz dÉ™yiÅŸdirildi. DÉ™yiÅŸikliklÉ™ri yoxlamaq üçün sÉ™hifÉ™ni yenidÉ™n yüklÉ™yin, dÉ™yiÅŸikliklÉ™rin tÉ™siri olmadığı tÉ™qdirdÉ™ raport edin."> +<!ENTITY email.label "E&mail:"> +<!ENTITY issues.openPreferences.label "Filtr parametrlÉ™rini seçin"> +<!ENTITY sendPage.confirmation "Raportunuz yadda saxlandı. Ona aÅŸağıdakı ünvandan keçə bilÉ™rsiniz:"> +<!ENTITY copyLink.label "&Raport linkini kopyala"> +<!ENTITY issues.nofilters.description "Adblock Plus bu sÉ™hifÉ™dÉ™ heç nÉ™yi É™ngÉ™llÉ™mir. Ehtimal ki, qarşılaÅŸdığınız problem Adblock Plus' a aid deyil."> +<!ENTITY sendPage.knownIssue "Bildirdiyiniz problemin sÉ™bÉ™bi bilinir. Ætraflı:"> +<!ENTITY typeSelector.other.description "Adblock Plus' un filtrindÉ™n deyil özündÉ™n şübhÉ™lÉ™nirsinizsÉ™ bu bÉ™ndi seçin."> +<!ENTITY issues.disabledgroups.enable.label "Filtr abunÉ™liyini / filtr qrupunu aktivləşdir"> +<!ENTITY typeWarning.override.label "BaÅŸa düşürÉ™m vÉ™ raportu göndÉ™rmÉ™k istÉ™yirÉ™m"> +<!ENTITY issues.disabled.enable.label "Adblock Plus' u aktivləşdir"> +<!ENTITY update.fixed.description "Ehtimal ki, filtr abunÉ™liyinizÉ™ edilÉ™n yeniliklÉ™r bildirdiyiniz problemi hÉ™ll edib. LütfÉ™n sÉ™hifÉ™ni yenidÉ™n yüklÉ™yin, problem qalırsa yenidÉ™n Raport' a basın."> +<!ENTITY anonymous.label "&Anonim göndÉ™riÅŸ"> +<!ENTITY reloadButton.label "&SÉ™hifÉ™ni yenidÉ™n yüklÉ™"> +<!ENTITY recentReports.clear.label "&Bütün raportları sil"> +<!ENTITY typeSelector.description "Bu pÉ™ncÉ™rÉ™ sizi Adblock Plus' un problemini göndÉ™rÉ™nÉ™dÉ™k sizÉ™ yardımçi olacaq. Birinci, lütfÉ™n qarşılaÅŸdığınız problemin növünü seçin:"> +<!ENTITY screenshot.remove.label "&Şəxsi mÉ™lumatı sil"> +<!ENTITY issues.ownfilters.description "Bu sÉ™hifÉ™dÉ™ki bÉ™zi filtrlÉ™r istifadəçi-seçimidir. LütfÉ™n problemÉ™ sÉ™bÉ™ ola bilÉ™cÉ™k filtrlÉ™ri deaktiv edin:"> +<!ENTITY update.inProgress.description "Adblock Plus problemin hÉ™lÉ™ hÉ™ll edilmÉ™diyinÉ™ É™min olmaq üçün sizin filtr abunÉ™liyinizi yenilÉ™mÉ™lidir. LütfÉ™n gözlÉ™yin..."> +<!ENTITY sendPage.retry.label "YenidÉ™n göndÉ™r"> +<!ENTITY data.label "Raport mÉ™zmunu:"> +<!ENTITY recentReports.label "TÉ™zÉ™likcÉ™ göndÉ™rilmiÅŸ raportlar"> +<!ENTITY typeWarning.description "Siz Adblock Plus' un filtrlÉ™rlÉ™ deyil ümumi raport növünü seçdiniz. LütfÉ™n bilin ki, bu problem [link]Adblock Plus forum[/link]' unda detallı raport edilib. Raportunuzu link vermÉ™diyiniz halda heç kÉ™s görmÉ™yÉ™cÉ™k, buna görÉ™ dÉ™ raport xÉ™bÉ™rçisindÉ™n yalnız mövcud müzakirÉ™yÉ™ É™lavÉ™ mÉ™lumat vermÉ™k üçün istifadÉ™ edin."> +<!ENTITY issues.disabled.description "Adblock Plus deaktiv edilib, bu halda o heç nÉ™yi É™ngÉ™llÉ™mÉ™yÉ™cÉ™k."> +<!ENTITY attachExtensions.label "ProblemÉ™ sÉ™bÉ™b É™lavÉ™ ziddiyÉ™ti olarsa aktiv É™lavÉ™lÉ™r listini göndÉ™rin"> +<!ENTITY issues.nosubscriptions.add.label "Filtr abunÉ™liyi É™lavÉ™ et"> +<!ENTITY issues.disabledfilters.enable.label "Filtri aktivləşdir"> +<!ENTITY issues.override.label "&ParametrlÉ™r düzgündür, raporta davam edin"> +<!ENTITY issues.nosubscriptions.description "Görünür sÉ™hifÉ™lÉ™rdÉ™n lazımsız mÉ™zmunu silÉ™cÉ™k filtr listÉ™ abunÉ™ olmayıbsınız."> +<!ENTITY typeSelector.falsePositive.description "SÉ™hifÉ™ vacib mÉ™zmunu É™skildirsÉ™, yalnış göstÉ™rirsÉ™, düzgün iÅŸlÉ™mirsÉ™ bu bölmÉ™ni seçin. Problemin sÉ™bÉ™bini öyrÉ™nmÉ™k üçün Adblock Plus' su müvÉ™qqÉ™ti olaraq deaktiv edin."> +<!ENTITY typeSelector.other.label "B&aÅŸqa problem"> +<!ENTITY emailComment.label "Raport haqqında sualımız olarkÉ™n sizinlÉ™ É™laqÉ™ saxlaya bilÉ™cÉ™yimiz e-ünvan daxil etmÉ™yinizi xahiÅŸ edirik. Bu qatqılarınıza prioritetlik vermÉ™yimizÉ™ vÉ™ onlara görÉ™ sizxatırlmağımıza kömÉ™k edÉ™cÉ™k."> +<!ENTITY issues.whitelist.remove.label "Adblock Plus' u bu sÉ™hifÉ™dÉ™ aktivləşdir"> +<!ENTITY outdatedSubscriptions.description "Bu filtr abunÉ™liklÉ™ri É™n azı iki hÉ™ftÉ™dit ki yenilÉ™nmÉ™yib. LütfÉ™n raportdan öncÉ™ bu abunÉ™liklÉ™ri yenilÉ™yin, bu probleminizi hÉ™ll edÉ™ bilÉ™r."> +<!ENTITY dataCollector.description "LütfÉ™n Adblock Plus lazımi mÉ™lumatı toplayanadÉ™k gözlÉ™yin."> +<!ENTITY sendButton.label "Raportu gö&ndÉ™r"> +<!ENTITY comment.label "&Qeyd (seçimÉ™ baÄŸlı):"> +<!ENTITY sendPage.errorMessage "Raport göndÉ™rmÉ™ cÉ™hdi "?1?" xÉ™ta sÉ™bÉ™bi ilÉ™ uÄŸursuz alındı. LütfÉ™n internet É™laqÉ™nizi yoxlayın vÉ™ yenidÉ™n cÉ™hd edin. Problem hÉ™lÉ™ dÉ™ qalırsa [link]Adblock Plus forum[/link] - dÉ™n kömÉ™k alın."> +<!ENTITY showRecentReports.label "TÉ™zÉ™liklÉ™ göndÉ™rilmiÅŸ raportlara bax"> +<!ENTITY commentPage.heading "Qeyd É™lavÉ™ et"> +<!ENTITY update.start.label "YenilÉ™nmÉ™ni indi baÅŸlat"> +<!ENTITY issues.disabledfilters.description "AÅŸağıdakı filtrlÉ™r deaktiv edilib, ancaq shifÉ™dÉ™ hÉ™lÉ™ dÉ™ tÉ™siri ola bilÉ™r:"> +<!ENTITY screenshot.description "Eyni sÉ™hifÉ™ fÉ™rqli istifadəçilÉ™r üçün fÉ™rqli görünÉ™ bilÉ™r. Ekran-ÅŸÉ™kli É™lavÉ™ etmÉ™yiniz bizÉ™ mÉ™sÉ™lÉ™ni baÅŸa düşmÉ™yimizÉ™ kömÉ™k edÉ™ bilÉ™r. Şəxsi mÉ™lumat olan hissÉ™lÉ™ri silÉ™ hÉ™mçinin problem olan sahÉ™lÉ™ri haÅŸiyÉ™yÉ™ ala bilÉ™rsiniz. Bunun üçün uyÄŸun düymÉ™ni basın vÉ™ ÅŸÉ™kili siçanla seçin."> +<!ENTITY screenshot.attach.label "Raporta sÉ™hifÉ™ ÅŸÉ™kli É™lavÉ™ edin"> +<!ENTITY issues.whitelist.description "Adblock Plus raport etmÉ™k istÉ™diyiniz sÉ™hifÉ™dÉ™ deaktiv edilib. LütfÉ™n mÉ™sÉ™lÉ™nin hÉ™llinÉ™ kömÉ™k olacaq raportu göndÉ™rmÉ™zdÉ™n É™vvÉ™l Adblock Plus' u aktivlÅŸdirin."> +<!ENTITY typeSelector.falseNegative.label "Adblock Plus re&klamı blok etmir"> +<!ENTITY typeSelector.heading "Problem növünü seçin"> +<!ENTITY anonymity.warning "SizinlÉ™ É™laqÉ™ saxlaya bilmÉ™yÉ™cÉ™yik vÉ™ raportu çox vacib qiymÉ™tlÉ™ndirÉ™ bilmÉ™yÉ™cÉ™yik."> +<!ENTITY wizard.title "Problem xÉ™bÉ™rçisi"> +<!ENTITY issues.ownfilters.disable.label "Filtri deaktiv edin"> +<!ENTITY commentPage.description "AÅŸağıdakı hissÉ™yÉ™ qeydlÉ™rinizi yazaraq problemi yaxşı izah edÉ™ bilÉ™rsiniz. Bu mÉ™rhÉ™lÉ™ istÉ™yÉ™ baÄŸlıdır, amma problem ciddidirsÉ™ qeyd etmÉ™yiniz mÉ™slÉ™hÉ™t bilinir. Raportu göndÉ™rmÉ™miÅŸdÉ™n É™vvÉ™l onun mÉ™zmununa nÉ™zÉ™r sala bilÉ™rsiniz."> +<!ENTITY comment.lengthWarning "Daxil etdiyiniz qeyd mÉ™tni 1000 hÉ™rfi keçir. Yalnız ilk 1000 - i göndÉ™rilÉ™cÉ™k."> +<!ENTITY typeSelector.falseNegative.description "Adblock Plus aktiv olmasına rəğmÉ™n reklam yenÉ™ görünürsÉ™ bu bÉ™ndi seçin."> +<!ENTITY sendPage.waitMessage "LütfÉ™n Adblock Plus raportunuzu göndÉ™rÉ™nÉ™dÉ™k gözlÉ™yin."> +<!ENTITY dataCollector.heading "Problem xÉ™bÉ™rçisinÉ™ xoÅŸ gÉ™ldiniz"> +<!ENTITY screenshot.heading "Ekran-ÅŸÉ™kli É™lavÉ™ et"> +<!ENTITY sendPage.heading "Raport göndÉ™r"> +<!ENTITY issues.subscriptionCount.description "Görünür aşırı çox filtr abunÉ™liyiniz var. Bu problemlÉ™ri artıracağı üçün mÉ™slÉ™hÉ™t görülmür. mÉ™sÉ™lÉ™nin hansı abunÉ™ müəllifinin öhdÉ™liyindÉ™ olduÄŸunu bilmÉ™diyimiz üçün problem raportunu qÉ™bul edÉ™ bilmirik. LütfÉ™n yalnız vacib filtr abunÉ™liklÉ™rini saxlamaqla qalanlarını silin vÉ™ problemin hÉ™ll olub olmadığını yoxlayın."> +<!ENTITY screenshot.mark.label "&Problemi haÅŸiyÉ™yÉ™ al"> +<!ENTITY privacyPolicy.label "Gizlilik siyasÉ™ti"> +<!ENTITY issues.description "Adblock Plus parametrlÉ™rinizdÉ™ problemÉ™ sÉ™bÉ™b ola bilÉ™cÉ™k vÉ™ ya raport tÉ™hlilini çətinləşdirÉ™cÉ™k aşıqlıq aÅŸkar etdi."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/az/sidebar.dtd new file mode 100644 index 0000000..0514cda --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/sidebar.dtd @@ -0,0 +1,35 @@ +<!ENTITY context.flash.label "Flash bÉ™ndin sÉ™rhÉ™dlÉ™ri"> +<!ENTITY address.label "Ünvan"> +<!ENTITY context.open.label "Xüsusi pÉ™ncÉ™rÉ™dÉ™ aç"> +<!ENTITY type.label "Növ"> +<!ENTITY tooltip.filterSource.label "Filtrin mÉ™nbÉ™yi:"> +<!ENTITY noitems.label "Blok edilÉ™ bilÉ™n bÉ™nd yoxdur"> +<!ENTITY filter.label "Filtr"> +<!ENTITY tooltip.size.label "Ölçü:"> +<!ENTITY reattach.label "YenidÉ™n É™lavÉ™ et"> +<!ENTITY search.label "&Axtar:"> +<!ENTITY docDomain.thirdParty "(istehsalçıya aid olmayan)"> +<!ENTITY filterSource.label "Filtr mÉ™nbÉ™yi"> +<!ENTITY tooltip.docDomain.label "SÉ™nÉ™din mÉ™nbÉ™yi:"> +<!ENTITY context.copy.label "BÉ™ndin ünvanının kopyala"> +<!ENTITY tooltip.type.label "Növ:"> +<!ENTITY context.disablefilter.label "Filtr ?1? - i deaktiv et"> +<!ENTITY context.copyFilter.label "Filtri kopyala"> +<!ENTITY context.block.label "Bu bÉ™ndi blok et"> +<!ENTITY context.enablefilter.label "Filtr ?1? - i yenidÉ™n aktivləşdir"> +<!ENTITY detach.label "Ayır"> +<!ENTITY whitelisted.label "AÄŸ-list sÉ™hifÉ™si"> +<!ENTITY context.disablefilteronsite.label "Bu filtri ?1? - dÉ™ deaktiv et"> +<!ENTITY detached.title "Adblock Plus: Blok oluna bilÉ™n bÉ™ndlÉ™r (xüsusiləşmiÅŸ)"> +<!ENTITY docDomain.firstParty "(istehsalçıya aid olan)"> +<!ENTITY tooltip.type.whitelisted "(aÄŸ-listdÉ™)"> +<!ENTITY tooltip.filter.label "İşlÉ™k filtr:"> +<!ENTITY tooltip.filter.disabled "(deaktiv edilmiÅŸ)"> +<!ENTITY context.editfilter.label "İşlÉ™k filtri düzÉ™nlÉ™"> +<!ENTITY tooltip.type.blocked "(blok edildi)"> +<!ENTITY size.label "Ölçü"> +<!ENTITY context.whitelist.label "BÉ™nd üçün istisna qayda É™lavÉ™ et"> +<!ENTITY context.selectAll.label "Hamısını seç"> +<!ENTITY state.label "Hal"> +<!ENTITY docDomain.label "SÉ™nÉ™din mÉ™nbÉ™yi"> +<!ENTITY tooltip.address.label "Ünvan:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/az/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/az/subscriptionSelection.dtd new file mode 100644 index 0000000..080b57c --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/az/subscriptionSelection.dtd @@ -0,0 +1,12 @@ +<!ENTITY addMain.label ""?1?" filtr abunÉ™liyi dÉ™ É™lavÉ™ et"> +<!ENTITY list.download.failed "Adblock Plus abunÉ™lik listini toplaya bilmÉ™di."> +<!ENTITY list.download.retry "YenidÉ™n cÉ™hd edin"> +<!ENTITY title.label "AbunÉ™&lik baÅŸlığı:"> +<!ENTITY list.download.website "SÉ™hifÉ™yÉ™ nÉ™zÉ™r sal"> +<!ENTITY supplementMessage "Bu filtr sizin hÉ™lÉ™ ki istifadÉ™ etmÉ™diyiniz "?1?" filtr abunÉ™liyi ilÉ™ istifadÉ™ üçün nÉ™zÉ™rdÉ™ tutulub."> +<!ENTITY viewList.label "FiltrlÉ™rÉ™ bax"> +<!ENTITY visitHomepage.label "BaÅŸ sÉ™hifÉ™ni ziyarÉ™ et"> +<!ENTITY addSubscription.label "AbunÉ™lik É™lavÉ™ et"> +<!ENTITY dialog.title "Adblock Plus filtr abunÉ™liyi É™lavÉ™ et"> +<!ENTITY location.label "Filtr list saxlanma yeri:"> +<!ENTITY fromWeb.description "LütfÉ™n filtr abunÉ™liyi É™lavÉ™ etmÉ™k istÉ™yinizi tÉ™sdiqlÉ™yin. AbunÉ™lik É™lavÉ™ etmÉ™zdÉ™n É™vvÉ™l baÅŸlıq vÉ™ saxlanma yerini dÉ™yiÅŸÉ™ bilÉ™rsiniz."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/bg/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bg/composer.dtd index 01ff9d6..030bf0b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/bg/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/composer.dtd @@ -13,12 +13,12 @@ <!ENTITY custom.pattern.label "&ПотребителÑки:"> <!ENTITY unselectAllTypes.label "Откажи вÑичко"> <!ENTITY type.whitelist.label "&Изключение от правилото"> -<!ENTITY regexp.warning "ВъведениÑÑ‚ модел ще Ñе разглежда като редовен израз, който не може да Ñе обработва по-ефективно от Adblock Plus и вероÑтно ще бави работата Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€Ð°. Ðко не целите да ползвате редовен израз, добавете звезда (*) в ÐºÑ€Ð°Ñ Ð½Ð° модела."> +<!ENTITY regexp.warning "ВъведениÑÑ‚ модел ще Ñе разглежда като регулÑрен израз, който не може да Ñе обработва по-ефективно от Adblock Plus и вероÑтно ще бави работата Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€Ð°. Ðко не целите да ползвате регулÑрен израз, добавете звезда (*) в ÐºÑ€Ð°Ñ Ð½Ð° модела."> <!ENTITY dialog.title "ДобавÑне на правило за филтър на Adblock Plus"> <!ENTITY basic.label "ОÑновен изглед"> <!ENTITY type.filter.label "&Блокиращ филтър"> <!ENTITY types.label "Прилагай:"> -<!ENTITY shortpattern.warning "ВъведениÑÑ‚ модел е твърде ÐºÑŠÑ Ð·Ð° оптимизиране и вероÑтно ще бави работата Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€Ð°. Препоръчва Ñе да поÑочите по-дълъг низ за филтъра, за да позволите на Adblock Plus да го обработва по-ефективно."> +<!ENTITY shortpattern.warning "ВъведениÑÑ‚ модел е твърде ÐºÑŠÑ Ð·Ð° оптимизиране и вероÑтно ще бави работата Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€Ð°. Препоръчва Ñе да поÑочите по-дълъг низ за филтъра за по ефективното му ползване от Adblock Plus."> <!ENTITY collapse.yes.label "Да"> <!ENTITY anchors.label "Приемай модела:"> <!ENTITY collapse.default.yes.label "Ползвай по подразбиране (да)"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bg/filters.dtd index 998afaf..11abd52 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/bg/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/filters.dtd @@ -12,7 +12,7 @@ <!ENTITY sort.label "&Подреди по"> <!ENTITY subscription.source.label "СпиÑък Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸"> <!ENTITY hitcount.column "&ПопадениÑ"> -<!ENTITY noFilters.text "Ð’Ñе още нÑма потребителÑки филтри."> +<!ENTITY noFilters.text "ÐÑма потребителÑки филтри вÑе още."> <!ENTITY backup.custom.title "Само потребителÑките филтри"> <!ENTITY subscription.external.label "Обновен от друго разширение"> <!ENTITY subscription.delete.label "Изтрий"> @@ -20,7 +20,7 @@ <!ENTITY filter.cut.label "Изрежи"> <!ENTITY restore.default.label "ВъзÑтанови копието от ?1?"> <!ENTITY subscription.lastDownload.inProgress "ИзтеглÑне…"> -<!ENTITY subscriptions.tab.label "Ðбонаментни филтри"> +<!ENTITY subscriptions.tab.label "Ðбонамент за филтри"> <!ENTITY sort.descending.label "ВъзходÑщо &Я > Ð"> <!ENTITY filters.remove.warning "ÐаиÑтина ли премахвате избраните филтри?"> <!ENTITY filter.delete.label "Изтрий"> @@ -29,11 +29,11 @@ <!ENTITY subscription.lastDownload.unknown "Ð/Д"> <!ENTITY addSubscriptionCancel.label "Отказ"> <!ENTITY subscription.enabled.label "Разрешен"> -<!ENTITY noSubscriptions.text "Ð’Ñе още нÑма абонамент за филтри. Adblock Plus нÑма да блокира нищо без филтри, молÑ, ползвайте „Добави абонамент“ и добавете нÑколко."> +<!ENTITY noSubscriptions.text "ÐÑма абонамент. Без филтри Adblock Plus не блокира нищо. МолÑ, ползвайте „Добави абонамент“ и добавете нещо."> <!ENTITY subscription.update.label "Обнови филтрите"> <!ENTITY dialog.title "ÐаÑтройки на филтрите в Adblock Plus"> <!ENTITY addFilter.label "До&бави филтър"> -<!ENTITY subscription.minVersion.warning "Ðбонаментът за този филтър изиÑква по-нова верÑÐ¸Ñ Ð½Ð° Adblock Plus, затова обновете Adblock Plus до поÑледната верÑиÑ."> +<!ENTITY subscription.minVersion.warning "Ðбонаментът за този филтър изиÑква по-нова верÑÐ¸Ñ Ð½Ð° Adblock Plus. МолÑ, обновете верÑиÑта на Adblock Plus до поÑледната."> <!ENTITY subscription.lastDownload.invalidURL "Провален — недейÑтвителен адреÑ"> <!ENTITY backup.error "Възникна грешка при запиÑване на филтрите във файл. Уверете Ñе, че файлът не е защитен Ñрещу запиÑ, или че не Ñе ползва от друго приложение."> <!ENTITY filter.moveUp.label "ПремеÑти нагоре"> @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Позволи определени &ненатрапчиви реклами"> <!ENTITY addSubscriptionOther.label "Добави друг абонамент"> <!ENTITY close.label "Затвори"> +<!ENTITY findbar.caseSensitive "Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾ изпиÑване"> <!ENTITY sort.none.label "&Ðеподредено"> <!ENTITY filter.actions.label "ДейÑÑ‚Ð²Ð¸Ñ Ð·Ð° филтър"> <!ENTITY filter.copy.label "Копирай"> @@ -54,18 +55,23 @@ <!ENTITY subscription.homepage.label "Ðачална Ñтраница"> <!ENTITY backup.complete.title "Ð’Ñички филтри и абонаменти"> <!ENTITY restore.own.label "ВъзÑтанови ÑобÑтвеното копие"> -<!ENTITY restore.complete.warning "ÐаÑтройките на вÑички филтри ще бъдат замеÑтени ÑÑŠÑ Ñъдържанието на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð». Продължавате ли?"> +<!ENTITY restore.complete.warning "ÐаÑтройките на филтрите ще бъдат замеÑтени ÑÑŠÑ Ñъдържанието на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð». Продължавате ли?"> <!ENTITY filters.tab.label "ПотребителÑки филтри"> <!ENTITY backup.label "Създай резервно копие"> <!ENTITY find.label "&Ðамери"> <!ENTITY subscription.moveDown.label "ПремеÑти надолу"> -<!ENTITY subscription.lastDownload.connectionError "Провален — при изтеглÑне"> +<!ENTITY subscription.lastDownload.connectionError "Провален — провалено изтеглÑне"> +<!ENTITY findbar.statusWrappedStart "ТърÑенето е в началото и ще продължи от краÑ."> <!ENTITY subscription.lastDownload.success "Изправен"> -<!ENTITY subscription.lastDownload.invalidData "Провален — недейÑтвителен ÑпиÑък"> +<!ENTITY findbar.placeholder "Ðамиране на филтър"> +<!ENTITY subscription.lastDownload.invalidData "Провален — недейÑтвителен абонамент"> +<!ENTITY findbar.close "ЗатварÑне на лентата"> <!ENTITY filter.paste.label "ПоÑтави"> <!ENTITY subscription.disabledFilters.enable "Разреши забранените филтри"> <!ENTITY lasthit.column "&ПоÑледно попадение"> +<!ENTITY findbar.statusWrappedEnd "ТърÑенето е в ÐºÑ€Ð°Ñ Ð¸ ще продължи от началото."> <!ENTITY subscription.editTitle.label "Редактирай заглавието"> +<!ENTITY findbar.statusNotFound "Изразът не е намерен."> <!ENTITY subscription.disabledFilters.warning "ÐÑкой филтри от абонамента Ñа забранени."> <!ENTITY filter.column "Правило за &филтър"> <!ENTITY subscription.lastDownload.label "Изтеглен:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/bg/firstRun.properties index ceb4a66..06a047e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/bg/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Предлага Ñе за Android и iOS +firstRun_abbButtonTitle=Вземи Adblock Browser оттук +firstRun_abbPromotionHeadline=Имаш Ñмартфон или таблет? firstRun_acceptableAdsExplanation=ИÑкаме да наÑърчим Ñайтовете да ползват конкретна, ненатрапчива реклама. Ето защо въведохме <a>Ñтроги правила</a> за разпознаване на приемливи реклами, които Ñе показват Ñ Ð½Ð°Ñтройките по подразбиране. И ако вÑе пак желаете да блокирате вÑички да можете <a>да ги забраните</a> за нÑколко Ñекунди. firstRun_acceptableAdsHeadline=Блокира доÑадните реклами firstRun_contributor_credits=Сътрудници diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/bg/global.properties index f10b3da..95dbe5c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/bg/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/global.properties @@ -5,6 +5,7 @@ type_label_script=Ñкрипт filter_elemhide_nocriteria=ÐÑма зададен критерий за разпознаване на ÑÐºÑ€Ð¸Ð²Ð°Ð½Ð¸Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ blockingGroup_title=Правила за блокиране whitelisted_tooltip=Adblock Plus е забранен за текущата Ñтраница. +type_label_ping=заÑвка ping type_label_stylesheet=Ñтилова таблица blocked_count_tooltip=?1? от ?2? type_label_font=шрифт @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus е забранен за текущата Ñтра remove_group_warning=ÐаиÑтина ли премахвате групата? action1_tooltip=Щракнете за отварÑне/затварÑне на блокираните обекти, щракнете ÑÑŠÑ ÑÑ€ÐµÐ´Ð½Ð¸Ñ Ð·Ð° разрешаване/забранÑване. type_label_xmlhttprequest=заÑвка XML +filter_invalid_regexp=ÐедейÑтвителен регулÑрен израз active_tooltip=Adblock Plus е разрешен; абонирани Ñте за ?1? и ползвате ?2? потребителÑки филтри. type_label_document=документ type_label_object_subrequest=подзаÑвка на обект @@ -22,14 +24,19 @@ whitelistGroup_title=Ð˜Ð·ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ правилата disabled_tooltip=Adblock Plus е забранен. filter_elemhide_duplicate_id=Само един идентификатор може да бъде указан за ÑÐºÑ€Ð¸Ð²Ð°Ð½Ð¸Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ type_label_object=обект +filter_elemhideemulation_nodomain=ÐÑма зададен активен домейн в допълненото правило за Ñкриване action2_tooltip=Щракнете за отварÑне на наÑтройките, щракнете ÑÑŠÑ ÑÑ€ÐµÐ´Ð½Ð¸Ñ Ð·Ð° разрешаване/забранÑване. type_label_subdocument=рамка -clearStats_warning=С това нулирате ÑтатиÑтиката за Ð¿Ð¾Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð½Ð° филтъра и забранÑвате преброÑването на попадениÑта за филтъра. Продължавате ли? +clearStats_warning=С това нулирате ÑтатиÑтиката за Ð¿Ð¾Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð½Ð° филтъра и забранÑвате преброÑването им. Продължавате ли? +filter_unknown_option=ÐеизвеÑтна наÑтройка на филтъра +type_label_genericblock=еднотипно блокиран notification_antiadblock_message=Този Ñайт показва целенаÑочени ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð° потребителите на Adblock Plus. Желаете ли Adblock Plus да Ñкрива целенаÑочените ÑъобщениÑ? blocked_count_addendum=(а Ñъщо изключени: ?1? и Ñкрити: ?2?) -subscription_invalid_location=МеÑтоположението на ÑпиÑъка Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸ е или Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвителен Ð°Ð´Ñ€ÐµÑ (URL) или Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвително име на файл. +subscription_invalid_location=МеÑтоположението на филтъра е или Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвителен Ð°Ð´Ñ€ÐµÑ (URL) или Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвително име на файл. +type_label_websocket=заÑвка websocket type_label_image=картина remove_subscription_warning=ÐаиÑтина ли премахвате абонамента? +type_label_generichide=еднотипно Ñкрита type_label_other=друго mobile_menu_enable=ABP: Разреши type_label_media=звук/видео diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bg/overlay.dtd index a0b4b09..eb831ed 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/bg/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ðе"> <!ENTITY sync.label "&СверÑвай наÑтройките на Adblock Plus"> <!ENTITY whitelist.site.label "Забрани за ?1?"> +<!ENTITY notification.closing.button.hide "Затвори &уведомÑването"> <!ENTITY filters.label "ÐаÑтройки на &филтъра"> <!ENTITY disable.label "Забрани навÑÑкъде"> <!ENTITY objecttab.title "Блокирай"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Да"> <!ENTITY opensidebar.label "Отвори &блокираните елементи"> <!ENTITY notification.button.close "&Затвори"> +<!ENTITY shownotifications.label "Показвай Ñамо &полезните"> <!ENTITY contribute.label "Помогни на Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: блокирана рамка"> <!ENTITY blocked.tooltip "Блокирани елементи в Ñтраницата:"> +<!ENTITY notification.closing.button.optout "Спри &вÑички уведомÑваниÑ"> <!ENTITY counthits.label "ОтброÑвай попа&дениÑта на филтъра"> <!ENTITY showinstatusbar.label "&Показвай в лентата на ÑÑŠÑтоÑнието"> <!ENTITY sidebar.title "Блокирани елементи в Ñтраницата"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "По&казвай в лентата Ñ Ð¸Ð½Ñтрументи"> <!ENTITY status.tooltip "СъÑтоÑние:"> <!ENTITY context.media.label "Adblock Plus: блокиран звук/видео"> -<!ENTITY subscription.update.label "Обнови филтрите"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bg/sendReport.dtd index 1ed7f12..013db8d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/bg/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/sendReport.dtd @@ -1,6 +1,5 @@ <!ENTITY screenshot.undo.label "&Отмени"> -<!ENTITY issues.disabledgroups.description "Следните абонаменти за филтър или групи филтри Ñа забранени и въпреки това - влиÑÑÑ‚ на Ñтраницата:"> +<!ENTITY issues.disabledgroups.description "Следните абонамент за филтри или групи Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸ Ñа забранени и въпреки това влиÑÑÑ‚ на Ñтраницата:"> <!ENTITY showData.label "Покажи докладваните данни"> <!ENTITY typeSelector.falsePositive.label "Adblock Plus блокира &прекалено"> <!ENTITY issues.change.description "КонфигурациÑта е променена. МолÑ, презаредете Ñтраницата за проверка на @@ -9,55 +8,44 @@ <!ENTITY issues.openPreferences.label "ОтварÑне на наÑтройките на филтър"> <!ENTITY sendPage.confirmation "Докладът е запиÑан. Ще го откриете на ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ:"> <!ENTITY copyLink.label "&Копирай като препратка"> -<!ENTITY issues.nofilters.description "Adblock Plus не блокира нищо в текущата Ñтраница. Ðаблюдаваната от Ð²Ð°Ñ - неизправноÑÑ‚ по вÑÑка вероÑтноÑÑ‚ не е Ñвързана Ñ Adblock Plus."> +<!ENTITY issues.nofilters.description "Adblock Plus не блокира нищо в текущата Ñтраница. Ðаблюдаваната от Ð²Ð°Ñ Ð½ÐµÐ¸Ð·Ð¿Ñ€Ð°Ð²Ð½Ð¾ÑÑ‚ по вÑÑка вероÑтноÑÑ‚ не е Ñвързана Ñ Adblock Plus."> <!ENTITY sendPage.knownIssue "Докладваната неизправноÑÑ‚ вероÑтно е вече позната. За повече информациÑ:"> <!ENTITY typeSelector.other.description "Изберете наÑтройката когато подозирате, че неизправноÑтта Ñе дължи по-Ñкоро на Adblock Plus, а не на филтрите."> <!ENTITY issues.disabledgroups.enable.label "Разрешаване на абонамент за филтър или група филтри"> <!ENTITY typeWarning.override.label "Приемам и Ð¶ÐµÐ»Ð°Ñ Ð´Ð° предам доклада"> <!ENTITY issues.disabled.enable.label "Разрешаване на Adblock Plus"> -<!ENTITY update.fixed.description "ОбновÑването на вашите абонаменти като че ли разреши докладваната от Ð²Ð°Ñ - неизправноÑÑ‚. МолÑ, презаредете Ñтраницата и пробвайте. Ðко ÑлучаÑÑ‚ - Ñе повтарÑ, натиÑнете „Докладвай отново“."> +<!ENTITY update.fixed.description "ОбновÑването на абонамента за филтрите като че ли разреши докладваната от Ð²Ð°Ñ Ð½ÐµÐ¸Ð·Ð¿Ñ€Ð°Ð²Ð½Ð¾ÑÑ‚. МолÑ, презаредете Ñтраницата и пробвайте. Ðко ÑлучаÑÑ‚ Ñе повтарÑ, натиÑнете „Докладвай отново“."> <!ENTITY anonymous.label "Предай &анонимно"> <!ENTITY reloadButton.label "&Презареди Ñтраницата"> <!ENTITY recentReports.clear.label "Премахни &вÑички доклади"> <!ENTITY typeSelector.description "Прозорецът ще ви преведе през необходимите Ñтъпки за предаване на доклад - за неизправноÑÑ‚ в AdBlock Plus. Първо, на тази Ñтраница, молÑ, изберете вида + за неизправноÑÑ‚ в Adblock Plus. Първо, на тази Ñтраница, молÑ, изберете вида на Ñрещаната неизправноÑÑ‚:"> <!ENTITY screenshot.remove.label "Премахни &чувÑтвителните данни"> -<!ENTITY issues.ownfilters.description "ÐÑкои от приложените към Ñтраницата филтри Ñа зададени от потребителÑ. МолÑ, - забранете филтрите предизвикващи неизправноÑтта:"> -<!ENTITY update.inProgress.description "Adblock Plus обновÑва абонамента за вашите филтри, за да провери дали - неизправноÑтта вече не е била разрешена. МолÑ, изчакайте…"> +<!ENTITY issues.ownfilters.description "ÐÑкои филтри, приложени към Ñтраницата, Ñа зададени от потребителÑ. МолÑ, забранете ги, защото те вероÑтно предизвикват неизправноÑтта:"> +<!ENTITY update.inProgress.description "Adblock Plus обновÑва абонамента за филтрите, за да провери дали неизправноÑтта вече не е била разрешена. МолÑ, изчакайте…"> <!ENTITY sendPage.retry.label "Изпрати отново"> <!ENTITY data.label "&Докладвани данни:"> <!ENTITY recentReports.label "Вашите предадени доклади"> -<!ENTITY typeWarning.description "ПоÑочвате, че ще докладвате обща неизправноÑÑ‚ в AdBlock Plus, а не Ñлучай - Ñ Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ‚Ðµ филтри. МолÑ, имайте предвид, че подобни неизправноÑти - е най-добре да докладвате във [link]форума на Adblock Plus[/link]. ТрÑбва - да ползвате този Докладчик на неизправноÑÑ‚ Ñамо като допълнение към - ÑъщеÑтвуваща диÑкуÑиÑ, тъй като докато не предоÑтавите препратка към - доклада Ñи никой нÑма да го забележи. Такава автоматично генерирана +<!ENTITY typeWarning.description "ПоÑочвате, че ще докладвате обща неизправноÑÑ‚ в Adblock Plus, а не Ñлучай Ñ Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ‚Ðµ филтри. МолÑ, имайте предвид, че подобни неизправноÑти + е най-добре да докладвате във [link]форума на Adblock Plus[/link]. ТрÑбва да ползвате този Докладчик на неизправноÑÑ‚ Ñамо като допълнение към + ÑъщеÑтвуваща диÑкуÑиÑ, тъй като докато не предоÑтавите препратка към доклада Ñи никой нÑма да го забележи. Такава автоматично генерирана препратка ще получите Ñлед предаване на Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾ÐºÐ»Ð°Ð´."> <!ENTITY issues.disabled.description "Adblock Plus забранен и в текущото Ñи ÑÑŠÑтоÑние не блокира нищо."> -<!ENTITY attachExtensions.label "Прилагане на ÑпиÑък Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ‚Ðµ раз&ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐºÑŠÐ¼ доклада в Ñлучай че добавката причинÑва проблема"> +<!ENTITY attachExtensions.label "Прикрепи ÑпиÑък Ñ Ð´ÐµÐ¹Ð½Ð¸Ñ‚Ðµ &разширениÑ, когато Ñе причинÑва от добавка"> <!ENTITY issues.nosubscriptions.add.label "ДобавÑне на абонамент за филтър"> <!ENTITY issues.disabledfilters.enable.label "Разрешаване на филтър"> <!ENTITY issues.override.label "КонфигурациÑта е &правилна, продължи Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð°"> -<!ENTITY issues.nosubscriptions.description "Изглежда не Ñте абонирани за никой от фабричните филтри за автоматично - премахване на нежелано Ñъдържание от Ñайтовете."> +<!ENTITY issues.nosubscriptions.description "Изглежда не Ñте абонирани за никой от фабричните филтри за автоматично премахване на нежелано Ñъдържание от Ñайтовете."> <!ENTITY typeSelector.falsePositive.description "Изберете наÑтройката когато липÑва важно Ñъдържание; то Ñе изобразÑва неправилно; или функционира неправилно в Ñтраницата. Бихте могли да - определите дали Ñе причинÑва от AdBlock Plus, като временно го изключите."> + определите дали Ñе причинÑва от Adblock Plus, като временно го изключите."> <!ENTITY typeSelector.other.label "&Друга неизправноÑÑ‚"> <!ENTITY emailComment.label "Съветваме ви да въведете дейÑтвителен Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща, за да Ñе Ñвържем, ако възникнат въпроÑи. Също така ще можем да удоÑтоверим Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¸Ð½Ð¾Ñ Ð¸ дадем по-виÑок приоритет на доклада."> <!ENTITY issues.whitelist.remove.label "Повторно разрешаване на Adblock Plus"> -<!ENTITY outdatedSubscriptions.description "Ðбонаментите за Ñледните филтри не Ñа обновÑвани от поне две Ñедмици. - МолÑ, обновете ги преди предаването на доклада, защото неизправноÑтта - може вече да е била разрешена."> +<!ENTITY outdatedSubscriptions.description "Ðбонаментът за Ñледните филтри не е обновÑван от поне две Ñедмици. МолÑ, обновете го преди предаването на доклада, защото неизправноÑтта може вече да е била разрешена."> <!ENTITY dataCollector.description "МолÑ, изчакайте нÑколко Ñекунди, докато Adblock Plus Ñъбере необходимите данни."> <!ENTITY sendButton.label "&Изпрати доклада"> <!ENTITY comment.label "&Коментар (по избор):"> @@ -84,17 +72,12 @@ Можете Ñъщо да прегледате докладваните данни, преди изпращане."> <!ENTITY comment.lengthWarning "Дължината на коментара надвишава 1000 знака. Само първите 1000 знака ще бъдат изпратени."> <!ENTITY typeSelector.falseNegative.description "Изберете наÑтройката когато Ñе изобразÑва реклама, въпреки - включването на AdBlock Plus."> + включването на Adblock Plus."> <!ENTITY sendPage.waitMessage "МолÑ, изчакайте докато Adblock Plus изпрати доклада."> <!ENTITY dataCollector.heading "Добре дошли в докладчика на неизправноÑÑ‚"> <!ENTITY screenshot.heading "ПрикрепÑне на екранна Ñнимка"> <!ENTITY sendPage.heading "Изпращане на доклада"> -<!ENTITY issues.subscriptionCount.description "Изглежда Ñте абонирани за твърде много филтри. Подобна наÑтройка е - непрепоръчителна, защото значително повишава шанÑовете от - възникване на неизправноÑти. Ðе можем да приемем Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾ÐºÐ»Ð°Ð´ за - неизправноÑÑ‚ и поради това, че от него не Ñтава ÑÑно кой от авторите на абонаментите за филтър трÑбва да предприеме дейÑтвие. МолÑ, - премахнете вÑички без наиÑтина необходимите ви абонаменти и пробвайте - дали пак наблюдавате неизправноÑтта."> +<!ENTITY issues.subscriptionCount.description "Изглежда Ñте абонирани за твърде много филтри. Подобна наÑтройка е непрепоръчителна, защото значително повишава шанÑовете от възникване на неизправноÑти. Ðе можем да приемем Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾ÐºÐ»Ð°Ð´ за неизправноÑÑ‚ и поради това, че от него не Ñтава ÑÑно кой от авторите на тези филтри трÑбва да предприеме дейÑтвие. МолÑ, премахнете вÑички оÑвен най-Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¸Ñ Ð²Ð¸ абонамент и пробвайте дали пак наблюдавате неизправноÑтта."> <!ENTITY screenshot.mark.label "&Отбележи"> <!ENTITY privacyPolicy.label "Политика на поверителноÑÑ‚"> <!ENTITY issues.description "Adblock Plus уÑтанови неизправноÑти Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñта, които вероÑтно Ñа diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bg/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bg/subscriptionSelection.dtd index c96dd74..5acaca8 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/bg/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bg/subscriptionSelection.dtd @@ -3,10 +3,10 @@ <!ENTITY list.download.retry "Опитай отново"> <!ENTITY title.label "&Заглавие на абонамента:"> <!ENTITY list.download.website "Покажи Ñайта"> -<!ENTITY supplementMessage "Ðбонирането за филтъра изиÑква абонамент за „?1?“, който още не ползвате."> +<!ENTITY supplementMessage "Ðбонаментът изиÑква за „?1?“, който още не използвате."> <!ENTITY viewList.label "Покажи филтрите"> <!ENTITY visitHomepage.label "ПоÑети началната Ñтраница"> -<!ENTITY addSubscription.label "Добави абонамент"> +<!ENTITY addSubscription.label "Добави абонамента"> <!ENTITY dialog.title "Ðбониране за филтър в Adblock Plus"> <!ENTITY location.label "&МеÑтоположение на филтъра:"> -<!ENTITY fromWeb.description "МолÑ, потвърдете абонирането за филтъра. Можете да промените заглавието или меÑтоположението на абонамента, преди да го добавите."> +<!ENTITY fromWeb.description "МолÑ, потвърдете абонамента за филтъра. Можете да промените заглавието или меÑтоположението му, преди да го добавите."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/composer.dtd new file mode 100644 index 0000000..b9abb38 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/composer.dtd @@ -0,0 +1,33 @@ +<!ENTITY anchor.end.label "ঠিকানার শেষে"> +<!ENTITY domainRestriction.label "নিষিদà§à¦§ করা ডোমেইনঃ"> +<!ENTITY collapse.default.no.label "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ (না)"> +<!ENTITY firstParty.label "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° পà§à¦°à¦¥à¦® পকà§à¦·"> +<!ENTITY preferences.label "&বিদà§à¦¯à¦®à¦¾à¦¨ ফিলà§à¦Ÿà¦¾à¦°à¦—à§à¦²à¦¿ দেখান..."> +<!ENTITY pattern.label "পà§à¦¯à¦¾à¦Ÿà¦¾à¦°à§à¦¨ দেখà§à¦¨"> +<!ENTITY thirdParty.label "à¦à¦¬à¦‚ শà§à¦§à§ তৃতীয় পকà§à¦·"> +<!ENTITY filter.label "নতà§à¦¨ &ফিলà§à¦Ÿà¦¾à¦°:"> +<!ENTITY collapse.label "&অবরà§à¦¦à§à¦§à¦—à§à¦²à¦¿ সংকোচন করà§à¦¨:"> +<!ENTITY match.warning "আপনি যে বিনà§à¦¯à¦¾à¦¸ পà§à¦°à¦¬à§‡à¦¶ করিয়েছেন তা আর রà§à¦¦à§à¦§/ সাদাতালিকাকৃত ঠিকানার সাথে মেলে না à¦à¦¬à¦‚ à¦à¦Ÿà¦¿à¦° উপর আর কোন পà§à¦°à¦à¦¾à¦¬ নেই।"> +<!ENTITY anchor.start.label "ঠিকানার শà§à¦°à§à¦¤à§‡à¦‡"> +<!ENTITY matchCase.label "à¦à¦¬à¦‚ কারক মেলান"> +<!ENTITY custom.pattern.label "&সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤:"> +<!ENTITY unselectAllTypes.label "কিছà§à¦‡ নিরà§à¦¬à¦¾à¦šà¦¨ করবেন না"> +<!ENTITY type.whitelist.label "বà§à¦¯à¦¤à¦¿à¦•à§à¦°à¦® &x"> +<!ENTITY regexp.warning "যে বিনà§à¦¯à¦¾à¦¸ আপনি পà§à¦°à¦¬à§‡à¦¶ করিয়েছেন তা à¦à¦•টি নিয়মিত অà¦à¦¿à¦¬à§à¦¯à¦•à§à¦¤à¦¿ হিসেবে বোà¦à¦¾ হবে যা অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ দà§à¦¬à¦¾à¦°à¦¾ দকà§à¦·à¦¤à¦¾à¦° সাথে পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦•রণ সমà§à¦à¦¬ নয় à¦à¦¬à¦‚ আপনার বà§à¦°à¦¾à¦‰à¦œà¦¿à¦‚ অà¦à¦¿à¦œà§à¦žà¦¤à¦¾ ধীর হয়ে যেতে পারে। যদি আপনি নিয়মিত অà¦à¦¿à¦¬à§à¦¯à¦•à§à¦¤à¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে আগà§à¦°à¦¹à§€ না থাকেন, তাহলে বিনà§à¦¯à¦¾à¦¸à§‡à¦° শেষে à¦à¦•টি তারকা চিহà§à¦¨(*) যোগ করà§à¦¨à¥¤"> +<!ENTITY dialog.title "Adblock Plus ফিলà§à¦Ÿà¦¾à¦° বিধি যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY basic.label "মৌলিক দৃশà§à¦¯"> +<!ENTITY type.filter.label "আটকিয়ে রাখা ফিলà§à¦Ÿà¦¾à¦° (&ব)"> +<!ENTITY types.label "যে ধরনে পà§à¦°à§Ÿà§‹à¦— করবেনঃ"> +<!ENTITY shortpattern.warning "আপনি যে বিনà§à¦¯à¦¾à¦¸ পà§à¦°à¦¬à§‡à¦¶ করিয়েছেন তা à¦à¦¤à¦‡ ছোট যে তার সরà§à¦¬à§‹à¦¤à§à¦¤à¦® বà§à¦¯à¦¬à¦¹à¦¾à¦° সমà§à¦à¦¬ নয় à¦à¦¬à¦‚ আপনার বà§à¦°à¦¾à¦‰à¦¸à¦¿à¦‚ অà¦à¦¿à¦œà§à¦žà¦¤à¦¾ ধীর করে ফেলতে পারে। পরামরà§à¦¶ দেয়া হচà§à¦›à§‡ যে , আপনি à¦à¦•টি বড় শিকল পছনà§à¦¦ করà§à¦¨ à¦à¦‡ ছাà¦à¦•নের জনà§à¦¯ যেন অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ ছাà¦à¦•নটিকে আরও দকà§à¦·à¦¤à¦¾à¦° সাথে পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦•রণ করতে পারে ।"> +<!ENTITY collapse.yes.label "হà§à¦¯à¦¾à¦"> +<!ENTITY anchors.label "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° বিনà§à¦¯à¦¾à¦¸ গà§à¦°à¦¹à¦£ করঃ"> +<!ENTITY collapse.default.yes.label "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ (হà§à¦¯à¦¾à¦)"> +<!ENTITY domainRestriction.help "à¦à¦‡ অপশনটি à¦à¦•টি বার লাইন(।) দà§à¦¬à¦¾à¦°à¦¾ বিচà§à¦›à¦¿à¦¨à§à¦¨ à¦à¦• বা à¦à¦•াধিক ডোমেইন কে বিশেষায়িত করতে বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤ à¦à¦‡ ছাà¦à¦•ন শà§à¦§à§à¦®à¦¾à¦¤à§à¦° বাছাইকৃত ডোমেইনের উপর পà§à¦°à§Ÿà§‹à¦— করা যাবে। ডোমেইন নামের আগে à¦à¦•টি (~) চিহà§à¦¨ বোà¦à¦¾à§Ÿ যে ছাà¦à¦•নটি ডোমেইনের উপর পà§à¦°à§Ÿà§‹à¦— করা যাবে না। "> +<!ENTITY accept.label "ফিলà§à¦Ÿà¦¾à¦° যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY options.label "বিকলà§à¦ªà¦¸à¦®à§‚হ"> +<!ENTITY disabled.warning "বরà§à¦¤à¦®à¦¾à¦¨à§‡ Adblock Plus নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে। আপনি à¦à¦–নও ফিলà§à¦Ÿà¦¾à¦° যà§à¦•à§à¦¤ করতে পারেন কিনà§à¦¤à§ তাদের পà§à¦°à¦¯à¦¼à§‹à¦— করা সমà§à¦à¦¬ নয় যদি না আপনি Adblock Plus[/link] [link]সকà§à¦°à¦¿à§Ÿ করেন।"> +<!ENTITY anchor.start.flexible.label "ডোমেইনের নামের শà§à¦°à§à¦¤à§‡à¦‡"> +<!ENTITY collapse.no.label "না"> +<!ENTITY selectAllTypes.label "সব নিরà§à¦¬à¦¾à¦šà¦¨"> +<!ENTITY advanced.label "উনà§à¦¨à¦¤ দৃশà§à¦¯"> +<!ENTITY pattern.explanation "বিনà§à¦¯à¦¾à¦¸ ঠিকানাগà§à¦²à§‹à¦° যেকোনো অংশ হতে পারে; তারকাচিহà§à¦¨ (*) à¦à¦¬à¦¿à¦·à§à¦¯à§Žà¦¬à¦¾à¦£à§€à¦° অযোগà§à¦¯ হিসেবে কাজ করে । ঠিকানা সমূহ যা পà§à¦°à¦¦à¦¤à§à¦¤ বিনà§à¦¯à¦¾à¦¸à§‡à¦° সাথে মিলে, ছাà¦à¦•ন সেখানেই শà§à¦§à§à¦®à¦¾à¦¤à§à¦° পà§à¦°à§Ÿà§‹à¦— হবে।"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/filters.dtd new file mode 100644 index 0000000..4354669 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/filters.dtd @@ -0,0 +1,78 @@ +<!ENTITY restore.custom.warning "আপনার সকল পছনà§à¦¦à¦¸à¦‡ পরিশà§à¦°à§à¦¤à¦• নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ ফাইলের বিষয়বসà§à¦¤à§ দà§à¦¬à¦¾à¦°à¦¾ পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হবে। আপনি কি à¦à¦—োতে চান?"> +<!ENTITY slow.column "ছাà¦à¦•নসমূহ ধীর করà§à¦¨ "> +<!ENTITY enabled.column "স&কà§à¦°à¦¿à¦¯à¦¼"> +<!ENTITY subscription.lastDownload.checksumMismatch "বà§à¦¯à¦°à§à¦¥, তà§à¦°à§à¦Ÿà¦¿à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦• মেলেনি"> +<!ENTITY noFiltersInGroup.text "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ গোষà§à¦ à§€ খালি।"> +<!ENTITY subscription.actions.label "বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦¸à¦®à§à¦¹"> +<!ENTITY filter.selectAll.label "সব নিরà§à¦¬à¦¾à¦šà¦¨"> +<!ENTITY backupButton.label "&বà§à¦¯à¦¾à¦•আপ à¦à¦¬à¦‚ পà§à¦¨à¦ƒà¦¸à§à¦¥à¦¾à¦ªà¦¨"> +<!ENTITY restore.minVersion.warning "সতরà§à¦•তা: à¦à¦‡ ফাইল নতà§à¦¨ অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ সংসà§à¦•রণ দà§à¦¬à¦¾à¦°à¦¾ তৈরি করা হয়েছে। আপনি à¦à¦‡ ফাইলটি পà§à¦¨à¦°à§à¦¬à¦¹à¦¾à¦² করার আগে সরà§à¦¬à¦¶à§‡à¦· অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ সংসà§à¦•রণটি হালনাগাদ করা উচিত।"> +<!ENTITY restore.error "ডাটা ফাইল পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦œà¦¾à¦¤ করা যাবে না, হয়ত à¦à¦Ÿà¦¿ অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ বà§à¦¯à¦¾à¦•আপ ফাইল নয়?"> +<!ENTITY sort.ascending.label "&à¦> জেড বাছাই কà§à¦°à¦®"> +<!ENTITY sort.label "যার দà§à¦¬à¦¾à¦°à¦¾ বাছাই"> +<!ENTITY subscription.source.label "ছাà¦à¦•ন তালিকা"> +<!ENTITY hitcount.column "আঘাতসমà§à¦¹"> +<!ENTITY noFilters.text "আপনার à¦à¦–নো কোন সজà§à¦œà¦¾à¦° উপযোগী ছাà¦à¦•ন নেই।"> +<!ENTITY backup.custom.title "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° পছনà§à¦¦à¦¸à¦‡ পরিশà§à¦°à§à¦¤à¦•"> +<!ENTITY subscription.external.label "অনà§à¦¯ বরà§à¦§à¦¿à¦¤à¦¾à¦‚শ দà§à¦¬à¦¾à¦°à¦¾ হালনাগাদকৃত "> +<!ENTITY subscription.delete.label "মà§à¦›à§à¦¨"> +<!ENTITY noGroupSelected.text "à¦à¦Ÿà¦¿à¦° ছাà¦à¦•ন সমূহ পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ হওয়ার আগে আপনাকে à¦à¦•টি ছাà¦à¦•ন গোষà§à¦ à§€ নিরà§à¦¬à¦¾à¦šà¦¨ করতে হবে।"> +<!ENTITY filter.cut.label "ছেদন"> +<!ENTITY restore.default.label "?1? à¦à¦° বà§à¦¯à¦¾à¦•আপ থেকে পà§à¦¨à¦ƒà¦¸à§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨"> +<!ENTITY subscription.lastDownload.inProgress "ডাউনলোড হচà§à¦›à§‡â€¦"> +<!ENTITY subscriptions.tab.label "ছাà¦à¦•নি সদসà§à¦¯à¦¤à¦¾à¦¸à¦®à§‚হ"> +<!ENTITY sort.descending.label "& জেড> ঠবাছাই কà§à¦°à¦®"> +<!ENTITY filters.remove.warning "আপনি কি সতà§à¦¯à¦¿à¦‡ সকল নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ পরিশà§à¦°à§à¦¤à¦• অপসারণ করতে চান?"> +<!ENTITY filter.delete.label "মà§à¦›à§à¦¨"> +<!ENTITY addSubscriptionAdd.label "যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY viewMenu.label "দেখà§à¦¨"> +<!ENTITY subscription.lastDownload.unknown "পà§à¦°à¦¯à§‹à¦œà§à¦¯ নয়"> +<!ENTITY addSubscriptionCancel.label "বাতিল"> +<!ENTITY subscription.enabled.label "সকà§à¦°à¦¿à§Ÿ করা"> +<!ENTITY noSubscriptions.text "আপনি à¦à¦–নো কোন ছাà¦à¦•ন চà§à¦•à§à¦¤à¦¿ যà§à¦•à§à¦¤ করেননি । অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ ছাà¦à¦•ন বà§à¦¯à¦¤à¦¿à¦¤ কিছৠরà§à¦¦à§à¦§ করবেনা, অনà§à¦—à§à¦°à¦¹ করে কিছৠযà§à¦•à§à¦¤ করতে " ছাà¦à¦•ন চà§à¦•à§à¦¤à¦¿ যà§à¦•à§à¦¤ করà§à¦¨" বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤"> +<!ENTITY subscription.update.label "ছাà¦à¦•ন সমূহ হালনাগাদ করà§à¦¨"> +<!ENTITY dialog.title "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ পরিশà§à¦°à§à¦¤à¦•ের পছনà§à¦¦à¦¸à¦®à§‚হ "> +<!ENTITY addFilter.label "ছাà¦à¦•ন যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY subscription.minVersion.warning "ছাà¦à¦•ন চà§à¦•à§à¦¤à¦¿à¦° à¦à¦•টি নতà§à¦¨ অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• à¦à¦¾à¦°à§à¦¸à¦¨ দরকার, আপনার উচিত সরà§à¦¬à¦¶à§‡à¦· à¦à¦¾à¦°à§à¦¸à¦¨à§‡ হালনাগাদ হওয়া।"> +<!ENTITY subscription.lastDownload.invalidURL "বà§à¦¯à¦°à§à¦¥, যà§à¦•à§à¦¤à¦¿à¦¯à§à¦•à§à¦¤ ঠিকানা নয়"> +<!ENTITY backup.error "পরিশà§à¦°à§à¦¤à¦• ফাইলে লেখার সময় à¦à¦•টি তà§à¦°à§à¦Ÿà¦¿ ছিল। নিশà§à¦šà¦¿à¦¤ হন যে ফাইল লিখন-পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à¦•ৃত নয় অথবা অনà§à¦¯ পà§à¦°à¦¯à¦¼à§‹à¦— দà§à¦¬à¦¾à¦°à¦¾ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হচà§à¦›à§‡à¥¤"> +<!ENTITY filter.moveUp.label "উপরে সরান"> +<!ENTITY addGroup.label "ছাà¦à¦•ন দল যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY filter.edit.label "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾"> +<!ENTITY subscription.showHideFilters.label "ছাà¦à¦•ন সমূহ দেখাও/লà§à¦•াও"> +<!ENTITY acceptableAds2.label "বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত গোপনীয়তা অলঙà§à¦˜à¦™à§à¦•ারী বিজà§à¦žà¦¾à¦ªà¦¨à¦•ে অনà§à¦®à§‹à¦¦à¦¨ দিন"> +<!ENTITY addSubscriptionOther.label "à¦à¦•টি à¦à¦¿à¦¨à§à¦¨ ছাà¦à¦•নি সদসà§à¦¯à¦¤à¦¾ যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY close.label "বনà§à¦§"> +<!ENTITY sort.none.label "অবাছাইকৃত"> +<!ENTITY filter.actions.label "ছাà¦à¦•নের বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦¸à¦®à§à¦¹"> +<!ENTITY filter.copy.label "অনà§à¦²à¦¿à¦ªà¦¿"> +<!ENTITY filter.moveDown.label "নিচে সরান"> +<!ENTITY filter.resetHitCounts.label "আঘাত পরিসংখà§à¦¯à¦¾à¦¨ পà§à¦¨à¦ƒà¦šà¦¾à¦²à§ করà§à¦¨"> +<!ENTITY readMore.label "আরো পড়à§à¦¨"> +<!ENTITY subscription.moveUp.label "উপরে সরান"> +<!ENTITY addSubscription.label "ছাà¦à¦•নি &সদসà§à¦¯à¦¤à¦¾ যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY subscription.homepage.label "নীড়পাতা"> +<!ENTITY backup.complete.title "সকল পরিশà§à¦°à§à¦¤à¦• à¦à¦¬à¦‚ চà§à¦•à§à¦¤à¦¿"> +<!ENTITY restore.own.label "নিজের অনà§à¦°à¦•à§à¦·à¦£à¦Ÿà¦¿ পà§à¦¨à¦°à§à¦¬à¦¹à¦¾à¦² করà§à¦¨"> +<!ENTITY restore.complete.warning "আপনার সব ফিলà§à¦Ÿà¦¾à¦° অগà§à¦°à¦¾à¦§à¦¿à¦•ার নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ ফাইলের বিষয়বসà§à¦¤à§ দà§à¦¬à¦¾à¦°à¦¾ পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হবে। আপনি কি à¦à¦—োতে চান?"> +<!ENTITY filters.tab.label "সà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ ছাà¦à¦•নি"> +<!ENTITY backup.label "নতà§à¦¨ অনà§à¦°à¦•à§à¦·à¦£ তৈরি করà§à¦¨"> +<!ENTITY find.label "খà§à¦&জà§à¦¨"> +<!ENTITY subscription.moveDown.label "নিচে সরান"> +<!ENTITY subscription.lastDownload.connectionError "বà§à¦¯à¦°à§à¦¥, নামানো বà§à¦¯à¦°à§à¦¥à¦¤à¦¾"> +<!ENTITY subscription.lastDownload.success "সফল"> +<!ENTITY subscription.lastDownload.invalidData "বà§à¦¯à¦°à§à¦¥, à¦à¦•টি যà§à¦•à§à¦¤à¦¿à¦¯à§à¦•à§à¦¤ ছাà¦à¦•ন তালিকা নয়"> +<!ENTITY filter.paste.label "পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨"> +<!ENTITY subscription.disabledFilters.enable "বনà§à¦§ ছাà¦à¦•ন চালৠকরà§à¦¨"> +<!ENTITY lasthit.column "শেষ আঘাত"> +<!ENTITY subscription.editTitle.label "শিরোনাম সমà§à¦ªà¦¾à¦¦à¦¨à¦¾"> +<!ENTITY subscription.disabledFilters.warning "চà§à¦•à§à¦¤à¦¿à¦° কিছৠছাà¦à¦•ন বনà§à¦§ আছে।"> +<!ENTITY filter.column "&ফিলà§à¦Ÿà¦¾à¦° বিধি"> +<!ENTITY subscription.lastDownload.label "সরà§à¦¬à¦¶à§‡à¦· ডাউনলোড:"> +<!ENTITY viewList.label "দরà§à¦¶à¦¨ তালিকা"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/firstRun.properties new file mode 100644 index 0000000..8144dfd --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/firstRun.properties @@ -0,0 +1,16 @@ +firstRun_abbButtonSubtitle=Android ও iOS-à¦à¦° জনà§à¦¯ উপলà¦à§à¦¯ +firstRun_abbButtonTitle=à¦à¦–ান থেকে Adblock Browser নিয়ে নিন +firstRun_abbPromotionHeadline=আপনার কি à¦à¦•টা সà§à¦®à¦¾à¦°à§à¦Ÿà¦«à§‹à¦¨ বা টà§à¦¯à¦¾à¦¬à¦²à§‡à¦Ÿ আছে? +firstRun_dataCorruptionWarning=à¦à¦‡ পৃষà§à¦ াটি কি দেখানো অবিরত রাখা হবে?<a>à¦à¦–ানে কà§à¦²à¦¿à¦• করà§à¦¨!</a> +firstRun_feature_social=সামাজিক মিডিয়ার বোতাম সরান +firstRun_title=Adblock Plus ইনসà§à¦Ÿà¦² করা হয়েছে +firstRun_toggle_off=বনà§à¦§ +firstRun_toggle_on=চালৠ+firstRun_share_headline=<a>Give us a hand</a> in making the web a better place +firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds. +firstRun_contributor_credits=Contributor Credits +firstRun_acceptableAdsHeadline=Annoying ads will now be blocked +firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>. +firstRun_donate=donate +firstRun_share=Tell your friends +firstRun_donate_label=Support our project diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/global.properties new file mode 100644 index 0000000..6b61c4f --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/global.properties @@ -0,0 +1,48 @@ +no_blocking_suggestions=বরà§à¦¤à¦®à¦¾à¦¨ পৃষà§à¦ ায় কোনও রà§à¦¦à§à¦§ আইটেম নেই +action3_tooltip=অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ সকà§à¦°à¦¿à¦¯à¦¼/অকà§à¦·à¦® করতে কà§à¦²à¦¿à¦• করà§à¦¨à¥¤ +notification_antiadblock_title=লকà§à¦·à§à¦¯à¦¿à¦¤ বারà§à¦¤à¦¾ লà§à¦•ান? +type_label_script=লিপি +filter_elemhide_nocriteria=লà§à¦•ানো যাবে à¦à¦®à¦¨ উপাদান চেনার জনà§à¦¯ সà§à¦¨à¦¿à¦°à§à¦¦à¦¿à¦·à§à¦Ÿ কোনো শরà§à¦¤ নেই +blockingGroup_title=বিজà§à¦žà¦¾à¦ªà¦¨ অবরোধ নিয়ম +whitelisted_tooltip=বরà§à¦¤à¦®à¦¾à¦¨ পৃষà§à¦ ায় অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ অকà§à¦·à¦® করা হয়েছে। +type_label_ping=পিং +type_label_stylesheet=সà§à¦Ÿà¦¾à¦‡à¦²à¦¤à¦¾à¦²à¦¿à¦•া +blocked_count_tooltip=?2? à¦à¦° মধà§à¦¯à§‡ ?1? +type_label_font=হরফ +type_label_popup=পপ-আপ উইনà§à¦¡à§‹ +filter_regexp_tooltip=à¦à¦‡ ফিলà§à¦Ÿà¦¾à¦° হয় à¦à¦•টি নিয়মিত অà¦à¦¿à¦¬à§à¦¯à¦•à§à¦¤à¦¿ বা সরà§à¦¬à¦¾à¦ªà§‡à¦•à§à¦·à¦¾ অনà§à¦•ূলে করার পকà§à¦·à§‡ অনেক ছোট।à¦à¦‡ ধরনের অনেক পরিশà§à¦°à§à¦¤à¦• আপনার বà§à¦°à¦¾à¦‰à¦œà¦¿à¦‚ ধীর করতে পারে। +action0_tooltip=পà§à¦°à¦¸à¦™à§à¦— তালিকা আনতে কà§à¦²à¦¿à¦• করà§à¦¨, সকà§à¦°à¦¿à§Ÿ/নিষà§à¦•à§à¦°à¦¿à§Ÿ করতে মাà¦à§‡ কà§à¦²à¦¿à¦• করà§à¦¨à¥¤ +whitelisted_page=বরà§à¦¤à¦®à¦¾à¦¨ পৃষà§à¦ ার জনà§à¦¯ অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ অকà§à¦·à¦® করা হয়েছে +remove_group_warning=আপনি কি সতà§à¦¯à¦¿à¦‡ à¦à¦‡ দল অপসারণ করতে চান? +action1_tooltip=রà§à¦¦à§à¦§ আইটেমসমূহ খà§à¦²à¦¤à§‡/বনà§à¦§ করতে কà§à¦²à¦¿à¦• করà§à¦¨, সকà§à¦°à¦¿à§Ÿ/ নিষà§à¦•à§à¦°à¦¿à§Ÿ করতে মাà¦à§‡ কà§à¦²à¦¿à¦• করà§à¦¨à¥¤ +type_label_xmlhttprequest=à¦à¦•à§à¦¸à¦à¦®à¦à¦² অনà§à¦°à§‹à¦§ +filter_invalid_regexp=অকারà§à¦¯à¦•র নিয়মিত অà¦à¦¿à¦¬à§à¦¯à¦•à§à¦¤à¦¿ +active_tooltip=অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ সকà§à¦°à¦¿à§Ÿ, ?1? পরিশà§à¦°à§à¦¤à¦• চà§à¦•à§à¦¤à¦¿(s) à¦à¦¬à¦‚ ?2? পছনà§à¦¦à¦¸à¦‡ পরিশà§à¦°à§à¦¤à¦•(s) বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হচà§à¦›à§‡à¥¤ +type_label_document=নথি +type_label_object_subrequest=উপলকà§à¦· উপঅনà§à¦°à§‹à¦§ +whitelistGroup_title=বà§à¦¯à¦¤à¦¿à¦•à§à¦°à¦® নিয়ম +disabled_tooltip=Adblock Plus নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে। +filter_elemhide_duplicate_id=লà§à¦•িয়ে রাখার জনà§à¦¯à§‡ উপাদানের কেবল à¦à¦•টা আইডি উলà§à¦²à§‡à¦– করা যেতে পারে +type_label_object=উপলকà§à¦· +action2_tooltip=অগà§à¦°à¦¾à¦§à¦¿à¦•ার খà§à¦²à¦¤à§‡ কà§à¦²à¦¿à¦• করà§à¦¨, সকà§à¦°à¦¿à¦¯à¦¼ /নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ করতে মাà¦à§‡ কà§à¦²à¦¿à¦• করà§à¦¨à¥¤ +type_label_subdocument=ফà§à¦°à§‡à¦® +clearStats_warning=à¦à¦Ÿà¦¿ সকল পরিশà§à¦°à§à¦¤à¦• হিট পরিসংখà§à¦¯à¦¾à¦¨à¦•ে পà§à¦¨à¦ƒà¦¸à§à¦¥à¦¾à¦ªà¦¨ à¦à¦¬à¦‚ সকল গননাকারী পরিশà§à¦°à§à¦¤à¦• হিটকে অকà§à¦·à¦® করবে।আপনি কি অগà§à¦°à¦¸à¦° হতে চান? +filter_unknown_option=অজানা ফিলà§à¦Ÿà¦¾à¦° অপশন +type_label_genericblock=generic block +notification_antiadblock_message=à¦à¦‡ সাইট অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•ারীদের লকà§à¦·à§à¦¯à¦¿à¦¤ বারà§à¦¤à¦¾ দেখানর জনà§à¦¯ পরিচিত। আপনি কি অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸à¦•ে à¦à¦‡ বারà§à¦¤à¦¾ লà§à¦•াতে বলতে চান? +blocked_count_addendum=(à¦à¦›à¦¾à§œà¦¾à¦“ সাদাতালিকাà¦à§à¦•à§à¦¤:?1?, লà§à¦•ায়িত:?2?) +subscription_invalid_location=পরিশà§à¦°à§à¦¤à¦• তালিকা অবসà§à¦¥à¦¾à¦¨ কোনোটিই à¦à¦•টি বৈধ ইউআরà¦à¦² বা কোন কারà§à¦¯à¦•র ফাইল নাম নয়। +type_label_image=চিতà§à¦° +remove_subscription_warning=আপনি কি আসলেই à¦à¦‡ সদসà§à¦¯à¦¤à¦¾ অপসারণ করতে চান? +type_label_generichide=generic hide +type_label_other=অনà§à¦¯à¦¾à¦¨à§à¦¯ +mobile_menu_enable=ABP: সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨ +type_label_media=অডিও/à¦à¦¿à¦¡à¦¿à¦“ +mobile_menu_disable_site=ABP: অকà§à¦·à¦® চালৠ?1? +elemhideGroup_title=উপাদান গোপন করার নিয়ম +mobile_menu_enable_site=ABP: সকà§à¦·à¦® চালৠ?1? +type_label_elemhide=লà§à¦•ায়িত +newGroup_title=নতà§à¦¨ পরিশà§à¦°à§à¦¤à¦• দল +default_dialog_title=অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +type_label_websocket=websocket diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/overlay.dtd new file mode 100644 index 0000000..26a4904 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/overlay.dtd @@ -0,0 +1,33 @@ +<!ENTITY notification.button.no "&না"> +<!ENTITY sync.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ সেটিংস বিনিময়ে রাখà§à¦¨"> +<!ENTITY whitelist.site.label "অকà§à¦·à¦® করà§à¦¨ ?1?"> +<!ENTITY notification.closing.button.hide "à¦&ই বিজà§à¦žà¦ªà§à¦¤à¦¿ বনà§à¦§ করà§à¦¨"> +<!ENTITY filters.label "& ফিলà§à¦Ÿà¦¾à¦° অগà§à¦°à¦¾à¦§à¦¿à¦•ার"> +<!ENTITY disable.label "সব জায়গায় নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ করà§à¦¨"> +<!ENTITY objecttab.title "অবরà§à¦¦à§à¦§"> +<!ENTITY objecttab.tooltip "Adblock Plus দিয়ে à¦à¦‡ বসà§à¦¤à§ অবরà§à¦¦à§à¦§ করার জনà§à¦¯ à¦à¦–ানে কà§à¦²à¦¿à¦• করà§à¦¨"> +<!ENTITY menuitem.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ পছনà§à¦¦à¦¸à¦®à§à¦¹"> +<!ENTITY objecttabs.label "টà§à¦¯à¦¾à¦¬ ফà§à¦²à§à¦¯à¦¾à¦¶ à¦à¦¬à¦‚ জাà¦à¦¾ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করà§à¦¨"> +<!ENTITY sendReport.label "&à¦à¦‡ পাতায় সমসà§à¦¯à¦¾ জানান"> +<!ENTITY whitelist.page.label "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° à¦à¦‡ পৃষà§à¦ ায় নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ করà§à¦¨"> +<!ENTITY context.image.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸à¦ƒ ছবি রà§à¦¦à§à¦§ করà§à¦¨"> +<!ENTITY notification.button.yes "&হà§à¦¯à¦¾à¦"> +<!ENTITY opensidebar.label "খোলা & রà§à¦¦à§à¦§ যোগà§à¦¯ আইটেম"> +<!ENTITY notification.button.close "&বনà§à¦§ করà§à¦¨"> +<!ENTITY shownotifications.label "দরকারী বিজà§à¦žà¦ªà§à¦¤à¦¿ &দেখান"> +<!ENTITY contribute.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ ঠঅবদান রাখà§à¦¨"> +<!ENTITY toolbarbutton.label "Adblock Plus"> +<!ENTITY context.frame.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸à¦ƒ কাঠামো রà§à¦¦à§à¦§ করà§à¦¨"> +<!ENTITY blocked.tooltip "à¦à¦‡ পৃষà§à¦ ার অবরà§à¦¦à§à¦§ আইটেমগà§à¦²à¦¿:"> +<!ENTITY notification.closing.button.optout "&বিজà§à¦žà¦ªà§à¦¤à¦¿ দেখানো বনà§à¦§ করà§à¦¨"> +<!ENTITY counthits.label "ফিলà§à¦Ÿà¦¾à¦° à¦à¦¬à¦‚ ঘাত গণনা"> +<!ENTITY showinstatusbar.label "& সà§à¦¥à¦¿à¦¤à¦¿ দণà§à¦¡ দেখান"> +<!ENTITY sidebar.title "à¦à¦‡ পাতার রà§à¦¦à§à¦§ যোগà§à¦¯ আইটেম"> +<!ENTITY options.label "&অপশনস"> +<!ENTITY context.object.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸à¦ƒ উপলকà§à¦· রà§à¦¦à§à¦§ করà§à¦¨"> +<!ENTITY context.removeWhitelist.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸: à¦à¦‡ পাতায় পà§à¦¨à¦°à¦¾à§Ÿ চালৠকরà§à¦¨"> +<!ENTITY filters.tooltip "সরà§à¦¬à¦¾à¦§à¦¿à¦• সকà§à¦°à¦¿à§Ÿ ফিলà§à¦Ÿà¦¾à¦°:"> +<!ENTITY closesidebar.label "বনà§à¦§ & রà§à¦¦à§à¦§ যোগà§à¦¯ আইটেম"> +<!ENTITY showintoolbar.label "টà§à¦² & দণà§à¦¡ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করà§à¦¨"> +<!ENTITY status.tooltip "অবসà§à¦¥à¦¾:"> +<!ENTITY context.media.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸à¦ƒ শবà§à¦¦/ চলচিতà§à¦° রà§à¦¦à§à¦§ করà§à¦¨"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/sendReport.dtd new file mode 100644 index 0000000..d850003 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/sendReport.dtd @@ -0,0 +1,66 @@ +<!ENTITY screenshot.undo.label "&পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফিরà§à¦¨"> +<!ENTITY issues.disabledgroups.description "নিচের ফিলà§à¦Ÿà¦¾à¦° গà§à¦°à¦¾à¦¹à¦• / ফিলà§à¦Ÿà¦¾à¦° গোষà§à¦ à§€ ফিলà§à¦Ÿà¦¾à¦° নিষà§à¦•à§à¦°à¦¿à§Ÿ, কিনà§à¦¤à§ à¦à¦–ন পরà§à¦¯à¦¨à§à¦¤ à¦à¦‡ পৃষà§à¦ ায় তাদের পà§à¦°à¦à¦¾à¦¬ থাকতে পারে:"> +<!ENTITY showData.label "রিপোরà§à¦Ÿà§‡à¦° ডাটা দেখান"> +<!ENTITY typeSelector.falsePositive.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ অনেক বেশি অবরà§à¦¦à§à¦§ করেছে"> +<!ENTITY issues.change.description "আপনার কনফিগারেশন পরিবরà§à¦¤à¦¨ করা হয়েছে। অনà§à¦—à§à¦°à¦¹ করে পরিবরà§à¦¤à¦¨ পরীকà§à¦·à¦¾ করতে পাতাটি পà§à¦¨à¦ƒà¦²à§‹à¦¡ করà§à¦¨ à¦à¦¬à¦‚ যদি বিকলà§à¦ª দà§à¦¬à¦¾à¦°à¦¾ সমসà§à¦¯à¦¾à¦Ÿà¦¿ সমাধান না হয় তাহলে পà§à¦¨à¦ƒà¦°à¦¿à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨à¥¤"> +<!ENTITY email.label "ই&মেইল:"> +<!ENTITY issues.openPreferences.label "ফিলà§à¦Ÿà¦¾à¦° পছনà§à¦¦à¦¸à¦®à§‚হ খà§à¦²à§à¦¨"> +<!ENTITY sendPage.confirmation "আপনার পà§à¦°à¦¤à¦¿à¦¬à§‡à¦¦à¦¨ সংরকà§à¦·à¦£ করা হয়েছে। আপনি à¦à¦Ÿà¦¿ নিচের ঠিকানায় দেখতে পারেন:"> +<!ENTITY copyLink.label "&রিপোরà§à¦Ÿà§‡à¦° লিঙà§à¦• অনà§à¦²à¦¿à¦ªà¦¿ করà§à¦¨"> +<!ENTITY issues.nofilters.description "Adblock Plus বরà§à¦¤à¦®à¦¾à¦¨ পাতায় কোন কিছৠঅবরà§à¦¦à§à¦§ করছে না। আপনি যে সমসà§à¦¯à¦¾à¦Ÿà¦¿ পরà§à¦¯à¦¬à§‡à¦•à§à¦·à¦¨ করছেন সেটি সমà§à¦à¦¬à¦¤ Adblock Plus সমà§à¦ªà¦°à§à¦•িত নয়।"> +<!ENTITY sendPage.knownIssue "আপনার রিপোরà§à¦Ÿà¦•ৃত সমসà§à¦¯à¦¾à¦Ÿà¦¿ হয়তো ইতিমধà§à¦¯à§‡ জানা। আরও তথà§à¦¯:"> +<!ENTITY typeSelector.other.description "à¦à¦‡ অপশন নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨ যদি আপনি সনà§à¦¦à§‡à¦¹ করেন যে সমসà§à¦¯à¦¾à¦Ÿà¦¿ Adblock Plus-à¦à¦° ফিলà§à¦Ÿà¦¾à¦° নয় বরং à¦à¦Ÿà¦¿ à¦à¦° নিজের কারণেই হচà§à¦›à§‡à¥¤"> +<!ENTITY issues.disabledgroups.enable.label "ফিলà§à¦Ÿà¦¾à¦° গোষà§à¦ à§€ / ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾ সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨"> +<!ENTITY typeWarning.override.label "আমি বà§à¦à§‡à¦›à¦¿& à¦à¦¬à¦‚ যেকোনà¦à¦¾à¦¬à§‡à¦‡ রিপোরà§à¦Ÿ জমা দিতে চাই"> +<!ENTITY issues.disabled.enable.label "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨"> +<!ENTITY update.fixed.description "আপনার ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾ হালনাগাদে সমà§à¦à¦¬à¦¤ আপনার উলà§à¦²à§‡à¦– করা সমসà§à¦¯à¦¾à¦° সমাধান আছে। দয়া করে পাতাটি পà§à¦¨à¦ƒà¦²à§‹à¦¡ করà§à¦¨ ও পà§à¦¨à¦ƒà¦šà§‡à¦·à§à¦Ÿà¦¾ করà§à¦¨, যদি সমসà§à¦¯à¦¾ রয়ে যায় তাহলে পà§à¦¨à¦ƒà¦°à¦¿à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨à¥¤"> +<!ENTITY anonymous.label "&নামবিহীন জমা"> +<!ENTITY reloadButton.label "&পাতা পà§à¦¨à¦ƒà¦²à§‹à¦¡ করà§à¦¨"> +<!ENTITY recentReports.clear.label "& সব রিপোরà§à¦Ÿ অপসারণ করà§à¦¨"> +<!ENTITY typeSelector.description "à¦à¦‡ উইনà§à¦¡à§‹à¦Ÿà¦¿ Adblock Plus à¦à¦° ইসà§à¦¯à§ রিপোরà§à¦Ÿ করতে পà§à¦°à§Ÿà§‹à¦œà¦¨à§€à§Ÿ পà§à¦°à¦¦à¦•à§à¦·à§‡à¦ªà¦—à§à¦²à§‹à¦° নিরà§à¦¦à§‡à¦¶à¦¨à¦¾ দিবে। পà§à¦°à¦¥à¦®à§‡, আপনি à¦à¦‡ পাতায় যেই ধরণের ইসà§à¦¯à§à¦° সমà§à¦®à§à¦–িন হচà§à¦›à§‡à¦¨ অনà§à¦—à§à¦°à¦¹à¦ªà§‚রà§à¦¬à¦• তার ধরণ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨:"> +<!ENTITY screenshot.remove.label "&সংবেদনশীল ডাটা সরান"> +<!ENTITY issues.ownfilters.description "à¦à¦‡ পাতায় পà§à¦°à§Ÿà§‹à¦—কৃত কিছৠফিলà§à¦Ÿà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•ারী-বরà§à¦£à¦¿à¦¤à¥¤ দয়া করে ফিলà§à¦Ÿà¦¾à¦° নিষà§à¦•à§à¦°à¦¿à§Ÿ করà§à¦¨ যেটি কারণে হয়তো à¦à¦‡ সমসà§à¦¯à¦¾à¦Ÿà¦¿ হচà§à¦›à§‡:"> +<!ENTITY update.inProgress.description "সমসà§à¦¯à¦¾à¦Ÿà¦¿ ইতিমধà§à¦¯à§‡à¦‡ সমাধান করা হয়েছে নিশà§à¦šà¦¿à¦¤ করতে Adblock পà§à¦²à¦¾à¦¸à§‡à¦° + আপনার ফিলà§à¦Ÿà¦¾à¦° গà§à¦°à¦¾à¦¹à¦• হালনাগাদ করা পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨à¥¤ অনà§à¦—à§à¦°à¦¹ করে অপেকà§à¦·à¦¾ করà§à¦¨..."> +<!ENTITY sendPage.retry.label "আবার পাঠান"> +<!ENTITY data.label "রিপো&রà§à¦Ÿà§‡à¦° ডাটা"> +<!ENTITY recentReports.label "আপনার সমà§à¦ªà§à¦°à¦¤à¦¿ জমা দেয়া রিপোরà§à¦Ÿ"> +<!ENTITY typeWarning.description "আপনি ইঙà§à¦—িত করেছেন যে আপনি ফিলà§à¦Ÿà¦¾à¦°à¦¸à¦¹ à¦à¦•টি সমসà§à¦¯à¦¾à¦° বদলে Adblock Plusসহ à¦à¦•টি সাধারণ সমসà§à¦¯à¦¾ রিপোরà§à¦Ÿ করতে চান। দয়া করে খেয়াল করà§à¦¨ à¦à¦‡ রকম বিষয় রিপোরà§à¦Ÿ করার সেরা জায়গা হল [link]Adblock Plus ফোরাম[/link]। শà§à¦§à§à¦®à¦¾à¦¤à§à¦° à¦à¦•টি বিদà§à¦¯à¦®à¦¾à¦¨ আলোচনার সমà§à¦ªà§‚রক হিসাবে আপনার ইসà§à¦¯à§ রিপোরà§à¦Ÿà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করা উচিত, যেহেতৠআপনার রিপোরà§à¦Ÿ কেউ লকà§à¦·à§à¦¯ নাও করতে পারে যদিনা আপনি à¦à¦•টি লিঙà§à¦•সহ তাদের à¦à¦Ÿà¦¾ পà§à¦°à¦¦à¦¾à¦¨ না করেন। রিপোরà§à¦Ÿ জমা দেওয়ার পরে লিঙà§à¦• সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦à¦¾à¦¬à§‡ উপলবà§à¦§ হবে।"> +<!ENTITY issues.disabled.description "Adblock Plus নিষà§à¦•à§à¦°à¦¿à§Ÿ করা, à¦à¦Ÿà¦¿ বরà§à¦¤à¦®à¦¾à¦¨ অবসà§à¦¥à¦¾à§Ÿ কোন কিছৠঅবরà§à¦¦à§à¦§ করবে না।"> +<!ENTITY attachExtensions.label "অà§à¦¯à¦¾à¦¡-অন দà§à¦¬à¦¨à§à¦¦à§à¦¬à§‡à¦° কারণে সমসà§à¦¯à¦¾ হচà§à¦›à§‡ কিনা পরীকà§à¦·à¦¾ করতে রিপোরà§à¦Ÿà§‡ সকà§à¦°à¦¿à¦¯à¦¼ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨à§‡à¦° à¦à¦•টি তালিকা সংযà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY issues.nosubscriptions.add.label "ছাà¦à¦•নি সদসà§à¦¯à¦¤à¦¾ যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY issues.disabledfilters.enable.label "ফিলà§à¦Ÿà¦¾à¦° সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨"> +<!ENTITY issues.override.label "&কনফিগারেশন সঠিক, রিপোরà§à¦Ÿ করতে অগà§à¦°à¦¸à¦° হোন"> +<!ENTITY issues.nosubscriptions.description "আপনাকে কোন পà§à¦°à¦¾à¦•-তৈরিকৃত ফিলà§à¦Ÿà¦¾à¦°à§‡à¦° গà§à¦°à¦¾à¦¹à¦• বলে মনে হচà§à¦›à§‡ না যা ওয়েবসাইট থেকে অবাঞà§à¦›à¦¿à¦¤ বিষয়বসà§à¦¤à§ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦à¦¾à¦¬à§‡ অপসারণ করে।"> +<!ENTITY typeSelector.falsePositive.description "à¦à¦‡ অপশনটি নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨ যদি পাতাটিতে গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£ বিষয়বসà§à¦¤à§à¦° অà¦à¦¾à¦¬, à¦à§à¦²à¦à¦¾à¦¬à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা বা সঠিকরূপে চালাতে বà§à¦¯à¦°à§à¦¥ হয়। à¦à¦‡ সমসà§à¦¯à¦¾ Adblock Plus-à¦à¦° কারণে হয়েছি কিনা তা আপনি à¦à¦Ÿà¦¿ সাময়িকà¦à¦¾à¦¬à§‡ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ করে নিরà§à¦§à¦¾à¦°à¦£ করতে পারবেন।"> +<!ENTITY typeSelector.other.label "&অনà§à¦¯à¦¾à¦¨à§à¦¯ সমসà§à¦¯à¦¾"> +<!ENTITY emailComment.label "আমরা আপনাকে à¦à¦•টি বৈধ ই-মেইল ঠিকানা পà§à¦°à¦¬à§‡à¦¶ করাতে উতà§à¦¸à¦¾à¦¹à¦¿à¦¤ করছি তাহলে আমরা আপনার সাথে যোগাযোগ করতে পারবো যদি আপনার রিপোরà§à¦Ÿ সমà§à¦ªà¦°à§à¦•ে কোন পà§à¦°à¦¶à§à¦¨ থাকে। ছাড়াও à¦à¦Ÿà¦¿ আমাদের আপনার অবদান সà§à¦¬à§€à¦•ৃতি à¦à¦¬à¦‚ তাà¦à¦¦à§‡à¦° উচà§à¦š অগà§à¦°à¦¾à¦§à¦¿à¦•ার দিতে মঞà§à¦œà§à¦°à¦¿ দেয়।"> +<!ENTITY issues.whitelist.remove.label "à¦à¦‡ পাতায় Adblock Plus পà§à¦¨à¦ƒà¦¸à¦•à§à¦°à¦¿à§Ÿ করà§à¦¨"> +<!ENTITY outdatedSubscriptions.description "অনà§à¦¤à¦¤ দà§à¦‡ সপà§à¦¤à¦¾à¦¹à§‡à¦° জনà§à¦¯ নিমà§à¦¨à¦²à¦¿à¦–িত ফিলà§à¦Ÿà¦¾à¦° গà§à¦°à¦¾à¦¹à¦• হালনাগাদ করা হয়নি। অনà§à¦—à§à¦°à¦¹ করে পà§à¦°à¦¤à¦¿à¦¬à§‡à¦¦à¦¨ দাখিল করার আগে à¦à¦‡ সদসà§à¦¯à¦¤à¦¾à¦—à§à¦²à¦¿ হালনাগাদ করà§à¦¨, বিষয়টি ইতিমধà§à¦¯à§‡ সমাধান করা হতেও পারে।"> +<!ENTITY dataCollector.description "অনà§à¦—à§à¦°à¦¹à¦ªà§‚রà§à¦¬à¦• কিছà§à¦•à§à¦·à¦£ অপেকà§à¦·à¦¾ করà§à¦¨ Adblock Plus পà§à¦°à§Ÿà§‹à¦œà¦¨à§€à§Ÿ তথà§à¦¯ সংরকà§à¦·à¦£ করছে।"> +<!ENTITY sendButton.label "পà§à¦°à¦¤à¦¿à¦¬à§‡à¦¦à¦¨ পা&ঠান"> +<!ENTITY comment.label "&মনà§à¦¤à¦¬à§à¦¯ (à¦à¦šà§à¦›à¦¿à¦•):"> +<!ENTITY sendPage.errorMessage "তà§à¦°à§à¦Ÿà¦¿ কোড "?1?" সহ রিপোরà§à¦Ÿ পà§à¦°à§‡à¦°à¦£ করার চেষà§à¦Ÿà¦¾ বà§à¦¯à¦°à§à¦¥ হয়েছে। অনà§à¦—à§à¦°à¦¹ করে নিশà§à¦šà¦¿à¦¤ করà§à¦¨ আপনার ইনà§à¦Ÿà¦¾à¦°à¦¨à§‡à¦Ÿ সংযোগ আছে à¦à¦¬à¦‚ পà§à¦¨à¦ƒà¦šà§‡à¦·à§à¦Ÿà¦¾ করà§à¦¨à¥¤ যদি সমসà§à¦¯à¦¾à¦Ÿà¦¿ থেকে যায়, তাহলে দয়া করে [link]Adblock Plus ফোরামে[/link] সহায়তার অনà§à¦°à§‹à¦§ করà§à¦¨à¥¤"> +<!ENTITY showRecentReports.label "সমà§à¦ªà§à¦°à¦¤à¦¿ জমা দেয়া রিপোরà§à¦Ÿ দেখান"> +<!ENTITY commentPage.heading "মনà§à¦¤à¦¬à§à¦¯ লিখà§à¦¨"> +<!ENTITY update.start.label "à¦à¦–ন হালনাগাদ শà§à¦°à§ করà§à¦¨"> +<!ENTITY issues.disabledfilters.description "নিচের ফিলà§à¦Ÿà¦¾à¦° নিষà§à¦•à§à¦°à¦¿à§Ÿ করা, কিনà§à¦¤à§ à¦à¦–ন পরà§à¦¯à¦¨à§à¦¤ à¦à¦‡ পৃষà§à¦ ায় তাদের পà§à¦°à¦à¦¾à¦¬ থাকতে পারে:"> +<!ENTITY screenshot.description "à¦à¦•ই পাতা বিà¦à¦¿à¦¨à§à¦¨ জনের জনà§à¦¯ বিà¦à¦¿à¦¨à§à¦¨ রকম দেখাতে পারে। à¦à¦Ÿà¦¾ আপনি আপনার রিপোরà§à¦Ÿà§‡ à¦à¦•টি সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦Ÿ সংযà§à¦•à§à¦¤ করতে সমসà§à¦¯à¦¾à¦Ÿà¦¿ বà§à¦à¦¤à§‡ তা আমাদের সাহাযà§à¦¯ করবে। আপনি সংবেদনশীল তথà§à¦¯ অপসারণ করতে পারেন সেইসাথে সমসà§à¦¯à¦¾ লকà§à¦·à¦£à§€à¦¯à¦¼ সà§à¦¥à¦¾à¦¨ চিহà§à¦¨à¦¿à¦¤ করতে পারেন। তা করার জনà§à¦¯ সংশà§à¦²à¦¿à¦·à§à¦Ÿ বাটন কà§à¦²à¦¿à¦• করà§à¦¨ à¦à¦¬à¦‚ আপনার মাউস দিয়ে à¦à¦•টি চিতà§à¦° নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤"> +<!ENTITY screenshot.attach.label "রিপোরà§à¦Ÿà§‡ à¦à¦•টি চিতà§à¦° সংযà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY issues.whitelist.description "Adblock Plus বরà§à¦¤à¦®à¦¾à¦¨à§‡ à¦à¦‡ পাতায় নিষà§à¦•à§à¦°à¦¿à§Ÿ করা যেটি আপনি রিপোরà§à¦Ÿ করছেন। দয়া করে à¦à¦Ÿà¦¿ পà§à¦¨à¦ƒà¦¸à¦•à§à¦°à¦¿à§Ÿ করà§à¦¨ à¦à¦¬à¦‚ à¦à¦‡ সমসà§à¦¯à¦¾à¦° তদনà§à¦¤à§‡ সহায়তা করার আগে পাতা পà§à¦¨à¦ƒà¦²à§‹à¦¡ করà§à¦¨à¥¤"> +<!ENTITY typeSelector.falseNegative.label "Adblock Plus বিজà§à¦žà¦¾à¦ªà¦¨ অবরà§à¦¦à§à¦§ করেনি"> +<!ENTITY typeSelector.heading "ইসà§à¦¯à§à¦° ধরণ নিরà§à¦§à¦¾à¦°à¦£ করà§à¦¨"> +<!ENTITY anonymity.warning "আমরা আপনার কাছে ফিরে আসতে সকà§à¦·à¦® না à¦à¦¬à¦‚ সমà§à¦à¦¾à¦¬à¦¤ রিপোরà§à¦Ÿà§‡à¦° অগà§à¦°à¦¾à¦§à¦¿à¦•ার কম দেয়া হবে।"> +<!ENTITY wizard.title "ইসà§à¦¯à§ রিপোরà§à¦Ÿà¦¾à¦°"> +<!ENTITY issues.ownfilters.disable.label "ফিলà§à¦Ÿà¦¾à¦° অকà§à¦·à¦® করà§à¦¨"> +<!ENTITY commentPage.description "নিচের লেখার কà§à¦·à§‡à¦¤à§à¦°à¦Ÿà¦¿ আপনাকে মনà§à¦¤à¦¬à§à¦¯ লিখতে দিবে যা আমাদের সমসà§à¦¯à¦¾à¦Ÿà¦¿ বà§à¦à¦¤à§‡ সাহাযà§à¦¯ করবে। à¦à¦‡ ধাপটি à¦à¦šà§à¦›à¦¿à¦• কিনà§à¦¤à§ সà§à¦ªà¦¾à¦°à¦¿à¦¶à¦•ৃত যদি সমসà§à¦¯à¦¾à¦Ÿà¦¿ পà§à¦°à¦•ট হয়। à¦à¦›à¦¾à§œà¦¾ আপনি à¦à¦Ÿà¦¿ পà§à¦°à§‡à¦°à¦£ করা পূরà§à¦¬à§‡ পà§à¦°à¦¤à¦¿à¦¬à§‡à¦¦à¦¨à§‡à¦° উপাতà§à¦¤ পরà§à¦¯à¦¾à¦²à§‹à¦šà¦¨à¦¾ করতে পারেন।"> +<!ENTITY comment.lengthWarning "আপনার মনà§à¦¤à¦¬à§à¦¯à§‡à¦° দৈরà§à¦˜à§à¦¯ ১০০০ অকà§à¦·à¦° অতিকà§à¦°à¦® করেছেন। শà§à¦§à§à¦®à¦¾à¦¤à§à¦° পà§à¦°à¦¥à¦® ১০০০ অকà§à¦·à¦° পà§à¦°à§‡à¦°à¦£ করা হবে।"> +<!ENTITY typeSelector.falseNegative.description "à¦à¦‡ অপশন নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨ যদি Adblock Plus সকà§à¦°à¦¿à¦¯à¦¼ থাকা সতà§à¦¤à§à¦¬à§‡à¦“ বিজà§à¦žà¦¾à¦ªà¦¨ পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ হয়।"> +<!ENTITY sendPage.waitMessage "Adblock পà§à¦²à¦¾à¦¸ আপনার পà§à¦°à¦¤à¦¿à¦¬à§‡à¦¦à¦¨ দাখিল করা পরà§à¦¯à¦¨à§à¦¤ দয়া করে অপেকà§à¦·à¦¾ করà§à¦¨à¥¤"> +<!ENTITY dataCollector.heading "ইসà§à¦¯à§ রিপোরà§à¦Ÿà¦¾à¦°à§‡ সà§à¦¬à¦¾à¦—তম"> +<!ENTITY screenshot.heading "সà§à¦•à§à¦°à¦¿à¦¨à¦¶à¦°à§à¦Ÿ সংযà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY sendPage.heading "পà§à¦°à¦¤à¦¿à¦¬à§‡à¦¦à¦¨ পাঠান"> +<!ENTITY issues.subscriptionCount.description "মনে হচà§à¦›à§‡ আপনি অনেকগà§à¦²à¦¿ ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾à¦° গà§à¦°à¦¾à¦¹à¦• হয়েছেন। à¦à¦‡ সেটআপ সà§à¦ªà¦¾à¦°à¦¿à¦¶à¦•ৃত নয় কারণ à¦à¦Ÿà¦¾ সমসà§à¦¯à¦¾à¦•ে অনেক উচà§à¦š করে তà§à¦²à¦¤à§‡ পারে। à¦à¦›à¦¾à§œà¦¾ আমরা আপনার সমসà§à¦¯à¦¾à¦° পà§à¦°à¦¤à¦¿à¦¬à§‡à¦¦à¦¨à¦“ গà§à¦°à¦¹à¦£ করব না কারণ à¦à¦Ÿà¦¿ সà§à¦ªà¦·à§à¦Ÿ নয় যে ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾à¦° লেখকে পদকà§à¦·à§‡à¦ª নিতে হবে। দয়া করে পà§à¦°à§Ÿà§‹à¦œà¦¨à§€à§Ÿ ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾ রেখে বাকিগà§à¦²à¦¿ সরিয়ে ফেলà§à¦¨ ও সমসà§à¦¯à¦¾à¦Ÿà¦¿ আছে কিনা তা পরীকà§à¦·à¦¾ করà§à¦¨à¥¤"> +<!ENTITY screenshot.mark.label "&সমসà§à¦¯à¦¾ চিহà§à¦¨à¦¿à¦¤ করà§à¦¨"> +<!ENTITY privacyPolicy.label "গোপনীয়তার নীতি"> +<!ENTITY issues.description "Adblock Plus আপনার কনফিগারেশনে সমসà§à¦¯à¦¾ সনাকà§à¦¤ করেছে যা à¦à¦‡ সমসà§à¦¯à¦¾à¦° জনà§à¦¯ দায়ী হতে পারে বা বা কঠিন অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§€ রিপোরà§à¦Ÿ করতে হবে।"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/sidebar.dtd new file mode 100644 index 0000000..ae5bc3a --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/sidebar.dtd @@ -0,0 +1,35 @@ +<!ENTITY context.flash.label "ফà§à¦²à§à¦¯à¦¾à¦¶ আইটেমের সীমানা"> +<!ENTITY address.label "ঠিকানা"> +<!ENTITY context.open.label "নতà§à¦¨ টà§à¦¯à¦¾à¦¬à§‡ খà§à¦²à§à¦¨"> +<!ENTITY type.label "ধরন"> +<!ENTITY tooltip.filterSource.label "ফিলà§à¦Ÿà¦¾à¦°à§‡à¦° উৎস:"> +<!ENTITY noitems.label "বà§à¦²à¦•যোগà§à¦¯ আইটেম নেই"> +<!ENTITY filter.label "ফিলà§à¦Ÿà¦¾à¦°"> +<!ENTITY tooltip.size.label "আকার:"> +<!ENTITY reattach.label "পূণরায় যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY search.label "&অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨:"> +<!ENTITY docDomain.thirdParty "(তৃতীয় পকà§à¦·)"> +<!ENTITY filterSource.label "ফিলà§à¦Ÿà¦¾à¦°à§‡à¦° উৎস"> +<!ENTITY tooltip.docDomain.label "নথির উৎস:"> +<!ENTITY context.copy.label "আইটেমের ঠিকানা অনà§à¦²à¦¿à¦ªà¦¿ করà§à¦¨"> +<!ENTITY tooltip.type.label "ধরন:"> +<!ENTITY context.copyFilter.label "ফিলà§à¦Ÿà¦¾à¦° কপি করà§à¦¨"> +<!ENTITY context.block.label "à¦à¦‡ আইটেমটি অবরà§à¦¦à§à¦§ করà§à¦¨"> +<!ENTITY detach.label "বিচà§à¦›à¦¿à¦¨à§à¦¨ করà§à¦¨"> +<!ENTITY whitelisted.label "সাদাতালিকা পাতা"> +<!ENTITY detached.title "Adblcok Plus: বà§à¦²à¦•যোগà§à¦¯ আইটেমসমূহ (বিচà§à¦›à¦¿à¦¨à§à¦¨)"> +<!ENTITY docDomain.firstParty "(পà§à¦°à¦¥à¦® পকà§à¦·)"> +<!ENTITY tooltip.type.whitelisted "(সাদা তালিকাà¦à§‚কà§à¦¤)"> +<!ENTITY tooltip.filter.label "কারà§à¦¯à¦•রী ফিলà§à¦Ÿà¦¾à¦°:"> +<!ENTITY tooltip.filter.disabled "(নিষà§à¦•à§à¦°à¦¿à§Ÿ)"> +<!ENTITY context.editfilter.label "কারà§à¦¯à¦•রী ফিলà§à¦Ÿà¦¾à¦° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨"> +<!ENTITY tooltip.type.blocked "(বà§à¦²à¦•কৃত)"> +<!ENTITY size.label "আকার"> +<!ENTITY context.whitelist.label "আইটেমের জনà§à¦¯ বà§à¦¯à¦¤à¦¿à¦•à§à¦°à¦® বিধি যোগ করà§à¦¨"> +<!ENTITY context.selectAll.label "সব নিরà§à¦¬à¦¾à¦šà¦¨"> +<!ENTITY state.label "অবসà§à¦¥à¦¾"> +<!ENTITY docDomain.label "নথির উৎস"> +<!ENTITY tooltip.address.label "ঠিকানা:"> +<!ENTITY context.disablefilter.label "Disable filter ?1?"> +<!ENTITY context.enablefilter.label "Re-enable filter ?1?"> +<!ENTITY context.disablefilteronsite.label "Disable this filter on ?1?"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/subscriptionSelection.dtd new file mode 100644 index 0000000..f1d9d17 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/bn-BD/subscriptionSelection.dtd @@ -0,0 +1,12 @@ +<!ENTITY addMain.label "পরিশà§à¦°à§à¦¤à¦• à¦à¦¬à¦‚ সদসà§à¦¯à¦¤à¦¾ "?1?" যà§à¦•à§à¦¤ করà§à¦¨"> +<!ENTITY list.download.failed "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ গà§à¦°à¦¾à¦¹à¦•নামার তালিকা হাতিয়ে নিতে বà§à¦¯à¦°à§à¦¥à¥¤"> +<!ENTITY list.download.retry "আবার চেষà§à¦Ÿà¦¾ করà§à¦¨"> +<!ENTITY title.label "সদসà§à¦¯à¦¤à¦¾à¦° শিরোনাম:"> +<!ENTITY list.download.website "ওয়েবসাইট দেখà§à¦¨"> +<!ENTITY supplementMessage "à¦à¦‡ ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾ ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾ "?1?" দà§à¦¬à¦¾à¦°à¦¾ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হচà§à¦›à§‡ বলে মনে হচà§à¦›à§‡ যা আপà§à¦¬à§à¦¬à¦¨à¦¿ à¦à¦–নো বà§à¦¯à¦¬à¦¹à¦¾à¦° করছেন না।"> +<!ENTITY viewList.label "ফিলà§à¦Ÿà¦¾à¦° দেখà§à¦¨"> +<!ENTITY visitHomepage.label "পà§à¦°à¦§à¦¾à¦¨ পৃষà§à¦ াটি দেখà§à¦¨"> +<!ENTITY addSubscription.label "সদসà§à¦¯à¦¤à¦¾ যোগ"> +<!ENTITY dialog.title "অà§à¦¯à¦¾à¦¡à¦¬à§à¦²à¦• পà§à¦²à¦¾à¦¸ পরিশà§à¦°à§à¦¤à¦• গà§à¦°à¦¾à¦¹à¦•নামা"> +<!ENTITY location.label "ছাà¦à¦•নি তালিকার অবসà§à¦¥à¦¾à¦¨:"> +<!ENTITY fromWeb.description "অনà§à¦—à§à¦°à¦¹ করে à¦à¦‡ ফিলà§à¦Ÿà¦¾à¦° সদসà§à¦¯à¦¤à¦¾ যà§à¦•à§à¦¤ করতে চান তা নিশà§à¦šà¦¿à¦¤ করà§à¦¨à¥¤ আপনার অবসà§à¦¥à¦¾à¦¨ বা সদসà§à¦¯à¦¤à¦¾ শিরোনাম যà§à¦•à§à¦¤ করার আগে পরিবরà§à¦¤à¦¨ করতে পারেন।"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ca/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ca/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ca/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ca/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ca/filters.dtd index 1605173..8b3f926 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ca/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ca/filters.dtd @@ -6,8 +6,8 @@ <!ENTITY subscription.actions.label "Accions"> <!ENTITY filter.selectAll.label "Selecciona-ho tot"> <!ENTITY backupButton.label "Fe&s una còpia de seguretat i restaura"> -<!ENTITY restore.minVersion.warning "Atenció : El fitxer ha estat creat amb una versió més nova d'AdBlock Plus. Hauries d'actualitzar a l'última versió de l'Adblock Plus abans de restaurar des d'aquest fitxer."> -<!ENTITY restore.error "Les dades del fitxer no s'han pogut processar, potser aquest no és un fitxer de còpia de Seguretat de l'AdBlock Plus ?"> +<!ENTITY restore.minVersion.warning "Atenció: El fitxer ha estat creat amb una versió més nova d'Adblock Plus. Hauries d'actualitzar a l'última versió de l'Adblock Plus abans de restaurar des d'aquest fitxer."> +<!ENTITY restore.error "Les dades del fitxer no s'han pogut processar, potser aquest no és un fitxer de còpia de Seguretat de l'Adblock Plus?"> <!ENTITY sort.ascending.label "Ordre &A > Z"> <!ENTITY sort.label "&Ordena per"> <!ENTITY subscription.source.label "Llista de filtres"> @@ -29,9 +29,9 @@ <!ENTITY subscription.lastDownload.unknown "N/D"> <!ENTITY addSubscriptionCancel.label "Cancel·la"> <!ENTITY subscription.enabled.label "Activat"> -<!ENTITY noSubscriptions.text "Encara no heu afegit cap subscripció de filtre; l'AdBlock Plus no blocarà res sense filtres. Utilitzeu l'opció "Afegeix el filtre" per afegir-ne."> +<!ENTITY noSubscriptions.text "Encara no heu afegit cap subscripció de filtre; l'Adblock Plus no blocarà res sense filtres. Utilitzeu l'opció "Afegeix el filtre" per afegir-ne."> <!ENTITY subscription.update.label "Actualitza els Filtres"> -<!ENTITY dialog.title "Preferències de filtre de l'AdBlock Plus"> +<!ENTITY dialog.title "Preferències de filtre de l'Adblock Plus"> <!ENTITY addFilter.label "Afegeix un filt&re"> <!ENTITY subscription.minVersion.warning "Aquesta subscripció de filtre requereix una versió recent. Heu d'actualitzar l'Adblock Plus."> <!ENTITY subscription.lastDownload.invalidURL "Error, no és una adreça và lida"> @@ -41,8 +41,9 @@ <!ENTITY filter.edit.label "Edita"> <!ENTITY subscription.showHideFilters.label "Mostra/amaga els filtres"> <!ENTITY acceptableAds2.label "Permet la publ&icitat no intrusiva"> -<!ENTITY addSubscriptionOther.label "Afegeix altre subscripció de filtre"> -<!ENTITY close.label "Tanca"> +<!ENTITY addSubscriptionOther.label "Afegir altre subscripció de filtre"> +<!ENTITY close.label "Tancar"> +<!ENTITY findbar.caseSensitive "Sensible a majúscules"> <!ENTITY sort.none.label "&Desordenat"> <!ENTITY filter.actions.label "Accions de filtre"> <!ENTITY filter.copy.label "Copia"> @@ -50,22 +51,27 @@ <!ENTITY filter.resetHitCounts.label "Reinicia les estadÃstiques"> <!ENTITY readMore.label "Més informació"> <!ENTITY subscription.moveUp.label "Mou amunt"> -<!ENTITY addSubscription.label "A&fegeix una subscripció de filtre"> +<!ENTITY addSubscription.label "A&fegir una subscripció de filtre"> <!ENTITY subscription.homepage.label "Pà gina d'inici"> <!ENTITY backup.complete.title "Tots els filtres i subscripcions"> <!ENTITY restore.own.label "Restaura d'una còpia de seguretat propia"> <!ENTITY restore.complete.warning "Totes les preferències de filtre serà n substituides amb els continguts del fitxer seleccionat. Vols seguir endavant?"> <!ENTITY filters.tab.label "Filtres personalitzats"> <!ENTITY backup.label "Crea una nova còpia de seguretat"> -<!ENTITY find.label "&Cerca"> +<!ENTITY find.label "&Cercar"> <!ENTITY subscription.moveDown.label "Mou avall"> <!ENTITY subscription.lastDownload.connectionError "Error en la baixada"> +<!ENTITY findbar.statusWrappedStart "Es va arribar al principi, continua des del final"> <!ENTITY subscription.lastDownload.success "Correcte"> +<!ENTITY findbar.placeholder "Cercar un filtre"> <!ENTITY subscription.lastDownload.invalidData "Error, no és una llista và lida de filtres"> +<!ENTITY findbar.close "Tancar la barra de cerca"> <!ENTITY filter.paste.label "Enganxa"> <!ENTITY subscription.disabledFilters.enable "Habilita els filtres"> <!ENTITY lasthit.column "U&ltim encert"> +<!ENTITY findbar.statusWrappedEnd "S'ha arribat al final, continua des del principi"> <!ENTITY subscription.editTitle.label "Edita el tÃtol"> +<!ENTITY findbar.statusNotFound "Frase no localitzada"> <!ENTITY subscription.disabledFilters.warning "Alguns filtres d'aquesta subscripció no estan habilitats."> <!ENTITY filter.column "Regla de &filtre"> <!ENTITY subscription.lastDownload.label "Darrera baixada"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ca/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ca/firstRun.properties index 688a5f0..293fbbb 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ca/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ca/firstRun.properties @@ -1,4 +1,7 @@ -firstRun_acceptableAdsExplanation=Ens agradaria encoratjar els llocs web a utlitzar d'ara en endavant publicitat no intrusiva. És per això que hem establert uns <a>patrons estrictes</a> per identificar els anuncis acceptables, els quals es mostren a sota de les preferències per defecte. Si encara voleu bloquejar tots els anuncis podeu <a>desactivar</a> això en pocs segons. +firstRun_abbButtonSubtitle=Disponible per a Android i iOS +firstRun_abbButtonTitle=Obtingues un Adblock Browser aquà +firstRun_abbPromotionHeadline=Tens un telèfon intel·ligent o tauleta? +firstRun_acceptableAdsExplanation=Ens agradaria encoratjar els llocs web a utilitzar d'ara en endavant publicitat no intrusiva. És per això que hem establert uns <a>patrons estrictes</a> per identificar els anuncis acceptables, els quals es mostren a sota de les preferències per defecte. Si encara voleu bloquejar tots els anuncis podeu <a>desactivar</a> això en pocs segons. firstRun_acceptableAdsHeadline=Els anuncis molestos ara es bloquejaran firstRun_contributor_credits=Reconeiximents als co·laboradors firstRun_dataCorruptionWarning=Es segueix mostrant aquesta pà gina? <a>Cliqueu aquÃ!</a> @@ -15,6 +18,6 @@ firstRun_filterlistsReinitializedWarning=Sembla que un problema ha causat que to firstRun_legacySafariWarning=Està s emprant una versió antiga de Safari que no es troba suportada per Adblock Plus, el que pot fer que no funcioni correctament o amb un pobre rendiment. Es recomana actualitzar a Safari 6.1.1 o superior (amb OS X 10.8 Mountain Lion), o Safari 7.0.1 o superior (amb OS X 10.9 Mavericks), o emprar la darrera versió de Mozilla Firefox, Google Chrome o Opera. firstRun_share=Digueu-ho a les vostres amistats firstRun_share_headline=<a>Dóneu-nos un cop de mà </a> al fer la xarxa un lloc millor -firstRun_title=S'ha instal·lat l'AdBlock Plus +firstRun_title=S'ha instal·lat l'Adblock Plus firstRun_toggle_off=DESACTIVAT firstRun_toggle_on=ACTIVAT diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ca/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ca/global.properties index 58d9afe..19d4533 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ca/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ca/global.properties @@ -5,16 +5,18 @@ type_label_script=script filter_elemhide_nocriteria=Cap criteri especificat per reconeixer l'element a amagar blockingGroup_title=Regles de blocatge d'anuncis whitelisted_tooltip=Adblock Plus està actiu però desactivat en la pà gina actual +type_label_ping=ping type_label_stylesheet=llista d'estils blocked_count_tooltip=?1? de ?2? type_label_font=Tipus de lletra type_label_popup=finestra emergent filter_regexp_tooltip=El filtre és una expressió regular o és massa curt per ser optimitzat. Massa d'aquests filtres poden alentir la vostra navegació. -action0_tooltip=Clica per activar el menu contextual, clica amb el botó del mig per activar/desactivar. +action0_tooltip=Feu clic per activar el menú contextual, clic amb la roda del ratolà per habilitar/inhabilitar. whitelisted_page=Adblock Plus ha estat desactivat per la pà gina actual remove_group_warning=Segur que vols eliminar aquest grup ? -action1_tooltip=Clica per obrir/tancar els elements bloquejables, clica amb el botó del mig per activar/desactivar. +action1_tooltip=Feu clic per obrir/tancar els elements blocables i clic amb la roda del ratolà per habilitar/inhabilitar. type_label_xmlhttprequest=Petició XML +filter_invalid_regexp=Expressió regular no và lida active_tooltip=Adblock Plus està habilitat, ?1? subscripció (ns) de filtre i ?2? filtre personalitzats(s) en ús. type_label_document=document type_label_object_subrequest=Subpetició d'objecte @@ -22,14 +24,19 @@ whitelistGroup_title=Regles d'excepció disabled_tooltip=Adblock Plus està desactivat filter_elemhide_duplicate_id=Només es pot indicar un identificador de l'element a ocultar type_label_object=objecte +filter_elemhideemulation_nodomain=No s'ha especificat cap domini actiu per al filtre d'ocultació d'element estès action2_tooltip=Clica per obrir les preferències, clica amb el botó del mig per activar/desactivar. type_label_subdocument=marc clearStats_warning=Això reiniciarà totes les estadÃstiques d'ús del filtre.Vols procedir? +filter_unknown_option=Opció de filtrat desconegut +type_label_genericblock=bloqueig genèric notification_antiadblock_message=Aquest lloc ha estat conegut per mostrar missatges dirigides als usuaris Adblock Plus. Voleu Adblock Plus per ocultar missatges apuntats? blocked_count_addendum=(també a la llista blanca: ?1?, amagats: ?2?) subscription_invalid_location=La ubicació de la llista de filtres no és una URL và lida ni un nom de fitxer và lid. +type_label_websocket=websocket type_label_image=imatge remove_subscription_warning=Realment desitges eliminar aquesta subscripció? +type_label_generichide=ocultació genèrica type_label_other=Un altre mobile_menu_enable=ABP : Activa type_label_media=à udio/vÃdeo @@ -38,4 +45,4 @@ elemhideGroup_title=Regles d'amagar elements mobile_menu_enable_site=ABP : Activa a ?1? type_label_elemhide=amagat newGroup_title=Nou grup de filtres -default_dialog_title=AdBlock Plus +default_dialog_title=Adblock Plus diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ca/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ca/overlay.dtd index db51a5e..7c71916 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ca/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ca/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&No"> -<!ENTITY sync.label "&Sincronitza la configuració de l'AdBlock Plus"> +<!ENTITY sync.label "&Sincronitza la configuració de l'Adblock Plus"> <!ENTITY whitelist.site.label "Inhabilita l'Adblock Plus a ?1?"> +<!ENTITY notification.closing.button.hide "Tanca a&questa notificació"> <!ENTITY filters.label "&Preferències del filtre"> <!ENTITY disable.label "Inhabilita a tots els llocs"> <!ENTITY objecttab.title "Bloca"> @@ -13,19 +14,20 @@ <!ENTITY notification.button.yes "&SÃ"> <!ENTITY opensidebar.label "Obre &elements blocables"> <!ENTITY notification.button.close "&Tancar"> +<!ENTITY shownotifications.label "Mostra les &notificacions útils"> <!ENTITY contribute.label "Contribueix a l'Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: bloca el marc"> <!ENTITY blocked.tooltip "Elements bloquejats en aquesta pà gina:"> +<!ENTITY notification.closing.button.optout "No mostris més notificacion&s"> <!ENTITY counthits.label "Compta els cops que &funciona el filtre"> <!ENTITY showinstatusbar.label "Mostra a la barra d'&estat"> <!ENTITY sidebar.title "Elements blocables a la pà gina actual"> <!ENTITY options.label "&Opcions"> <!ENTITY context.object.label "Adblock Plus: bloca l'objecte"> -<!ENTITY context.removeWhitelist.label "Adblock Plus:Rehabilita aquesta pà gina"> +<!ENTITY context.removeWhitelist.label "Adblock Plus: rehabilita aquesta pà gina"> <!ENTITY filters.tooltip "Filtres més actius:"> <!ENTITY closesidebar.label "Tanca els elements &blocables"> <!ENTITY showintoolbar.label "Mostra a la &barra d'eines"> <!ENTITY status.tooltip "Estat:"> -<!ENTITY context.media.label "Adblock Plus: Bloqueja à udio/vÃdeo"> -<!ENTITY subscription.update.label "Actualitza els Filtres"> +<!ENTITY context.media.label "Adblock Plus: bloqueja à udio/vÃdeo"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ca/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ca/sidebar.dtd index e68a983..ae87c7e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ca/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ca/sidebar.dtd @@ -20,7 +20,7 @@ <!ENTITY detach.label "Separa"> <!ENTITY whitelisted.label "Pà gina a la llista de permesos"> <!ENTITY context.disablefilteronsite.label "Inhabilita aquest filtre a ?1?"> -<!ENTITY detached.title "AdBlock Plus: Elements Blocables (Separat)"> +<!ENTITY detached.title "Adblock Plus: Elements Blocables (Separat)"> <!ENTITY docDomain.firstParty "(primers)"> <!ENTITY tooltip.type.whitelisted "(a la llista de permesos)"> <!ENTITY tooltip.filter.label "Filtre actiu"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ca/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ca/subscriptionSelection.dtd index a3b3ef3..2aed154 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ca/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ca/subscriptionSelection.dtd @@ -1,9 +1,9 @@ <!ENTITY addMain.label "Afegeix la &subscripció de filtre «?1?»"> -<!ENTITY list.download.failed "L'Adblock Plus ha fallat en trobar la llista de subscripcions."> +<!ENTITY list.download.failed "L'Adblock Plus no ha pogut recuperar la llista de subscripcions."> <!ENTITY list.download.retry "Torna-ho a provar"> <!ENTITY title.label "&TÃtol de la subscripció:"> <!ENTITY list.download.website "Vés a la pà gina web"> -<!ENTITY supplementMessage "Aquesta subscripció de filtre s'ha d'utilitzar amb «?1?» que encara no feu servir."> +<!ENTITY supplementMessage "Aquesta subscripció de filtre s'ha d'utilitzar amb el filtre de subscripció «?1?» que encara no feu servir."> <!ENTITY viewList.label "Mostra els filtres"> <!ENTITY visitHomepage.label "Vés a la pà gina web"> <!ENTITY addSubscription.label "Afegeix una subscripció"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cs/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/cs/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cs/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cs/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/cs/filters.dtd index 498c7a6..06f5774 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cs/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cs/filters.dtd @@ -1,5 +1,5 @@ <!ENTITY restore.custom.warning "VÅ¡echny vaÅ¡e vlastnà filtry budou nahrazeny obsahem vybraného souboru. Chcete pokraÄovat?"> -<!ENTITY slow.column "Po&malé filtry"> +<!ENTITY slow.column "Pomalé filtry"> <!ENTITY enabled.column "Po&volené"> <!ENTITY subscription.lastDownload.checksumMismatch "Chyba, neodpovÃdá kontrolnà souÄet"> <!ENTITY noFiltersInGroup.text "Vybraná skupina je prázdná"> @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Povolit &nÄ›které neruÅ¡ivé reklamy"> <!ENTITY addSubscriptionOther.label "PÅ™idat dalšà sadu cizÃch filtrů"> <!ENTITY close.label "ZavÅ™Ãt"> +<!ENTITY findbar.caseSensitive "RozliÅ¡ovat velikost"> <!ENTITY sort.none.label "&NeÅ™adit"> <!ENTITY filter.actions.label "Akce filtrů"> <!ENTITY filter.copy.label "KopÃrovat"> @@ -60,12 +61,17 @@ <!ENTITY find.label "Na&jÃt"> <!ENTITY subscription.moveDown.label "Posunout dolů"> <!ENTITY subscription.lastDownload.connectionError "Chyba, nepodaÅ™ilo se stáhnout soubor"> +<!ENTITY findbar.statusWrappedStart "Dosažen zaÄátek stránky, pokraÄuje se od konce"> <!ENTITY subscription.lastDownload.success "ÚspÄ›ch"> +<!ENTITY findbar.placeholder "NajÃt filtr"> <!ENTITY subscription.lastDownload.invalidData "Chyba, stažený soubor nenà souborem filtrů Adblock Plus"> +<!ENTITY findbar.close "ZavÅ™Ãt vyhledávacà liÅ¡tu"> <!ENTITY filter.paste.label "Vložit"> <!ENTITY subscription.disabledFilters.enable "Povolit zakázané filtry"> <!ENTITY lasthit.column "Pos&lednà zásah"> +<!ENTITY findbar.statusWrappedEnd "Dosažen konec stránky, pokraÄuje se od zaÄátku"> <!ENTITY subscription.editTitle.label "Upravit název"> +<!ENTITY findbar.statusNotFound "Fráze nenalezena"> <!ENTITY subscription.disabledFilters.warning "NÄ›které filtry v této sadÄ› jsou zakázány."> <!ENTITY filter.column "&Pravidlo filtru"> <!ENTITY subscription.lastDownload.label "Naposledy staženo:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cs/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/cs/firstRun.properties index 4c3bf5c..856008e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cs/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cs/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Dostupný pro Android a iOS +firstRun_abbButtonTitle=ZÃskejte Adblock Browser zde +firstRun_abbPromotionHeadline=Máte smartphone nebo tablet? firstRun_acceptableAdsExplanation=Rádi bychom podpoÅ™ili webové stránky v použÃvánà jasné neobtěžujÃcà reklamy. Proto jsme zavedli <a>pÅ™Ãsná pravidla</a> k urÄenà pÅ™ijatelných reklam, které se pak ve výchozÃm nastavenà zobrazujà . Pokud pÅ™esto chcete blokovat veÅ¡kerou reklamu, můžete toto bÄ›hem chvilky <a>zakázat</a>. firstRun_acceptableAdsHeadline=Otravné reklamy budou nynà blokovány firstRun_contributor_credits=Zásluhy pÅ™ispÄ›vatelů diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cs/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/cs/global.properties index 18ffe9f..be64804 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cs/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cs/global.properties @@ -5,6 +5,7 @@ type_label_script=Skript filter_elemhide_nocriteria=Nebyla uvedena žádná kritérie pro rozpoznánà elementu, který má být skryt blockingGroup_title=Pravidla blokovánà reklam whitelisted_tooltip=Adblock Plus je aktivnÃ, ale pro aktuálnà stránku byl zakázán. +type_label_ping=ping type_label_stylesheet=Å ablona kaskádových stylů blocked_count_tooltip=?1? z ?2? type_label_font=PÃsmo @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus byl pro aktuálnà stránku zakázán remove_group_warning=Chcete opravdu smazat tuhle skupniu? action1_tooltip=Levé tlaÄÃtko: OtevÅ™Ãt blokovatelné prvky type_label_xmlhttprequest=XML požadavek +filter_invalid_regexp=Neplatný regulárnà výraz active_tooltip=Adblock Plus je aktivnÃ, cizà sady filtrů: ?1?, vlastnà filtry: ?2? type_label_document=Dokument type_label_object_subrequest=Subpožadavek objektu @@ -25,11 +27,15 @@ type_label_object=Objekt action2_tooltip=Levé tlaÄÃtko: OtevÅ™Ãt pÅ™edvolby type_label_subdocument=Rámec clearStats_warning=Toto smaže vÅ¡echny statistiky a vypne poÄÃtánà zásahů filtrů. Chcete pokraÄovat? +filter_unknown_option=Neznámá možnost filtru +type_label_genericblock=blokovat notification_antiadblock_message=O této stránce se vÃ, že zobrazuje hlášenà cÃlená na uživatele Adblocku Plus. Chcete, aby Adblock Plus skryl tyto cÃlené zprávy? blocked_count_addendum=(povoleno výjimkou: ?1?, skryto: ?2?) subscription_invalid_location=Zadaná adresa seznamu cizÃch filtrů je buÄ nesprávná URL nebo obsahuje nesprávné jméno souboru. +type_label_websocket=websocket type_label_image=Obrázek remove_subscription_warning=SkuteÄnÄ› si pÅ™ejete odstranit tuto sadu cizÃch filtrů ? +type_label_generichide=skrýt type_label_other=Ostatnà mobile_menu_enable=ABP: povolit type_label_media=zvuk a video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Povolit na ?1? type_label_elemhide=skryto newGroup_title=Nová skupina filtrů default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cs/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/cs/overlay.dtd index 17643da..ac767f4 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cs/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cs/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ne"> <!ENTITY sync.label "Na&stavenà synchronizace Adblocku Plus"> <!ENTITY whitelist.site.label "Vypnout na ?1?"> +<!ENTITY notification.closing.button.hide "&ZavÅ™Ãt toto upozornÄ›nÃ"> <!ENTITY filters.label "&PÅ™edvolby filtrů"> <!ENTITY disable.label "Zakázat vÅ¡ude"> <!ENTITY objecttab.title "Blokovat"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ano"> <!ENTITY opensidebar.label "Zo&brazit blokovatelné objekty"> <!ENTITY notification.button.close "&ZavÅ™Ãt"> +<!ENTITY shownotifications.label "Zobrazovat užiteÄná &upozornÄ›nÃ"> <!ENTITY contribute.label "PÅ™ispÄ›t Adblocku Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Blokovat rámec"> <!ENTITY blocked.tooltip "Blokované prvky na této stránce:"> +<!ENTITY notification.closing.button.optout "&Nezobrazovat upozornÄ›nÃ"> <!ENTITY counthits.label "PoÄÃtat &zásahy filtrů"> <!ENTITY showinstatusbar.label "Zob&razit ve stavovém řádku"> <!ENTITY sidebar.title "Adblock Plus: Blokovatelné objekty na zobrazené stránce"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Zobrazit v &nástrojové liÅ¡tÄ›"> <!ENTITY status.tooltip "Stav:"> <!ENTITY context.media.label "Adblock Plus: Blokovat audio/video"> -<!ENTITY subscription.update.label "Aktualizovat filtry"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cs/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/cs/sendReport.dtd index 5680c0a..a2f1ef4 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cs/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cs/sendReport.dtd @@ -33,7 +33,7 @@ <!ENTITY issues.nosubscriptions.description "Zdá se, že nejste pÅ™ihlášeni k odbÄ›ru žádných cizÃch sad filtrů, které automaticky odstraňujà nežádoucà obsah z webových stránek."> <!ENTITY typeSelector.falsePositive.description "Vyberte tuto možnost, pokud na stránce chybà důležitý obsah, nenà zobrazena správnÄ› nebo nefunguje. Zda je Adblock Plus pÅ™ÃÄinou problému můžete zjistit jeho doÄasným vypnutÃm."> <!ENTITY typeSelector.other.label "Jiný &problém"> -<!ENTITY emailComment.label "Nabádáme vás,aby jste zadali platnou emailovou adresu,aby jsme vás mohli kontaktovat pokud budou nÄ›jaké nesrovnalosti s vaÅ¡im nahlášenÃm.Také nám to umožnà rozeznat vaÅ¡e pÅ™ÃspÄ›vky a pÅ™ikládat jim vyššà prioritu."> +<!ENTITY emailComment.label "DoporuÄujeme zadat platnou e-mailovou adresu, abychom vás v pÅ™ÃpadÄ› dotazů k vaÅ¡emu hlášenà mohli kontaktovat. Také nám to umožnà rozeznat vaÅ¡e pÅ™ÃspÄ›vky a pÅ™ikládat jim vyššà prioritu."> <!ENTITY issues.whitelist.remove.label "Znovu povolit Adblock Plus na této stránce"> <!ENTITY outdatedSubscriptions.description "NásledujÃcà odbÄ›r filtrů nebyl aktualizován minimálnÄ› dva týdny.ProsÃm aktualizujte tyto odbÄ›ry než reportujete chybu,problém už mohl být vyÅ™eÅ¡en."> <!ENTITY dataCollector.description "PoÄkejte prosÃm zatÃmco Adblock Plus sbÃrá potÅ™ebná data."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cy/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/cy/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cy/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cy/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/cy/filters.dtd index fd5a076..0fc0f9e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cy/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cy/filters.dtd @@ -70,3 +70,9 @@ <!ENTITY filter.column "&Rheol hidlydd"> <!ENTITY subscription.lastDownload.label "Lawrlwythiad dywethaf"> <!ENTITY viewList.label "Gweld rhestr"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cy/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/cy/firstRun.properties index 2db6656..21bedc2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cy/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cy/firstRun.properties @@ -18,3 +18,6 @@ firstRun_share_headline=<a>Rhowch help llaw</a> i ni wneud y we'n lle gwell firstRun_title=Mae Adblock Plus wedi'i osod firstRun_toggle_off=I FFWRDD firstRun_toggle_on=YMLAEN +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cy/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/cy/global.properties index 0524a4b..17325eb 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cy/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cy/global.properties @@ -39,3 +39,10 @@ mobile_menu_enable_site=ABP: Galluogi ar ?1? type_label_elemhide=cudd newGroup_title=Grŵp hidlo newydd default_dialog_title=Adblock Plus +type_label_ping=ping +filter_invalid_regexp=Invalid regular expression +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +filter_unknown_option=Unknown filter option +type_label_genericblock=generic block +type_label_websocket=websocket +type_label_generichide=generic hide diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/cy/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/cy/overlay.dtd index 278968a..e589790 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/cy/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/cy/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Na"> <!ENTITY sync.label "&Cysoni gosodiadau Adblock Plus"> <!ENTITY whitelist.site.label "Analluogi ar ?1?"> +<!ENTITY notification.closing.button.hide "Cau'r &hysbysiad hwn"> <!ENTITY filters.label "&Dewisiadau hidlo"> <!ENTITY disable.label "Analluogi ym mhobman"> <!ENTITY objecttab.title "Rhwystro"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ie"> <!ENTITY opensidebar.label "Dangos yr eitemau y gellir &rhwystro"> <!ENTITY notification.button.close "&Cau"> +<!ENTITY shownotifications.label "Dangos &hysbysiadau defnyddiol"> <!ENTITY contribute.label "Cyfrannu i Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Rhwystro fframyn"> <!ENTITY blocked.tooltip "Eitemau rwystrwyd ar y dudalen hon:"> +<!ENTITY notification.closing.button.optout "&Peidio â dangos hysbysiadau"> <!ENTITY counthits.label "&Mesurydd yr hidlydd"> <!ENTITY showinstatusbar.label "Dangos yn y bar &statws"> <!ENTITY sidebar.title "Eitemau gellir eu rhwystro ar y dudalen hon"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Dangos yn y &bar offer"> <!ENTITY status.tooltip "Statws:"> <!ENTITY context.media.label "Adblock Plus: Rhwystro sain/fideo"> -<!ENTITY subscription.update.label "Diweddaru'r hidlyddion"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/da/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/da/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/da/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/da/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/da/filters.dtd index 3d0400b..2a26261 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/da/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/da/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "T&illad upÃ¥trængende annoncering delvist"> <!ENTITY addSubscriptionOther.label "Tilføj endnu et abonnement"> <!ENTITY close.label "Luk"> +<!ENTITY findbar.caseSensitive "Versalfølsom (a/A)"> <!ENTITY sort.none.label "&Usorteret"> <!ENTITY filter.actions.label "Filterhandlinger"> <!ENTITY filter.copy.label "Kopier"> @@ -62,12 +63,17 @@ <!ENTITY find.label "S&øg"> <!ENTITY subscription.moveDown.label "Flyt op"> <!ENTITY subscription.lastDownload.connectionError "Fejlede, hentningsfejl"> +<!ENTITY findbar.statusWrappedStart "NÃ¥ede toppen, fortsætter fra bunden"> <!ENTITY subscription.lastDownload.success "Succes"> +<!ENTITY findbar.placeholder "Søgefilter"> <!ENTITY subscription.lastDownload.invalidData "Fejlede, ikke en gyldig liste over filtre"> +<!ENTITY findbar.close "Luk søgefelt"> <!ENTITY filter.paste.label "Sæt ind"> <!ENTITY subscription.disabledFilters.enable "Aktiver deaktiverede filtre"> <!ENTITY lasthit.column "Seneste h&it"> +<!ENTITY findbar.statusWrappedEnd "NÃ¥et bunden, fortsætter fra toppen"> <!ENTITY subscription.editTitle.label "Rediger titel"> +<!ENTITY findbar.statusNotFound "Sætning ikke fundet"> <!ENTITY subscription.disabledFilters.warning "Dette abonnement indeholder deaktiverede filtre."> <!ENTITY filter.column "&Filterregel"> <!ENTITY subscription.lastDownload.label "Sidst hentet:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/da/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/da/firstRun.properties index 3971eaf..8a2518b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/da/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/da/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Tilgængelig pÃ¥ Android og iOS +firstRun_abbButtonTitle=FÃ¥ Adblock Browser her +firstRun_abbPromotionHeadline=Har du en smartphone eller en tablet? firstRun_acceptableAdsExplanation=Vi vil gerne tilskynde websider til at bruge enkel, diskret annoncering. Derfor har vi indført <a>strenge retningslinjer</a> for at identificere de acceptable annoncer, der vises med standardindstillingerne. Hvis du stadig vil blokere alle annoncer, kan du let <a>deaktivere</a> dette. firstRun_acceptableAdsHeadline=Generende annoncer bliver nu blokeret firstRun_contributor_credits=Tak til diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/da/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/da/global.properties index 6f29187..f114873 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/da/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/da/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=Ingen kriterier angivet for at genkende elementet der skal skjules blockingGroup_title=Blokeringsregler whitelisted_tooltip=Adblock Plus er aktiv men slÃ¥et fra pÃ¥ nuværende side. +type_label_ping=ping type_label_stylesheet=stilark blocked_count_tooltip=?1? ud af ?2? type_label_font=skrifttype @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus er slÃ¥et fra for aktuel side remove_group_warning=Vil du virkelig fjerne denne gruppe? action1_tooltip=Klik for at Ã¥bne/lukke blokérbare elementer, midterklik aktiverer/deaktiverer. type_label_xmlhttprequest=XML-forespørgsel +filter_invalid_regexp=Ugyldigt regulært udtryk active_tooltip=Adblock Plus er aktiveret, ?1? filter-abonnementer og ?2? brugerdefinerede filtre i brug. type_label_document=dokument type_label_object_subrequest=objekt underforespørgsel @@ -25,11 +27,15 @@ type_label_object=objekt action2_tooltip=Klik for at Ã¥bne indstillingerne, midterklik aktiverer/deaktiverer. type_label_subdocument=ramme clearStats_warning=Nulstiller hit statistikker for alle filtre og deaktiverer tælleren. Vil du fortsætte? +filter_unknown_option=Ukendt filtermulighed +type_label_genericblock=Generisk blokering notification_antiadblock_message=Denne side er kendt for mÃ¥lrettede beskeder til Adblock Plus brugere. Skal Adblock Plus skjule disse beskeder ? blocked_count_addendum=(ogsÃ¥ hvidlistet: ?1?, skjult: ?2?) subscription_invalid_location=Filterlistens placering er hverken en gyldig URL eller et gyldigt filnavn. +type_label_websocket=webSocket type_label_image=billede remove_subscription_warning=Vil du virkelig fjerne dette abonnement? +type_label_generichide=Generisk skjul type_label_other=andet mobile_menu_enable=ABP: Aktiver type_label_media=audio/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Aktiver pÃ¥ ?1? type_label_elemhide=skjult newGroup_title=Ny filtergruppe default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/da/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/da/overlay.dtd index c435567..62f0209 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/da/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/da/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nej"> <!ENTITY sync.label "Syn&k Adblock Plus indstillinger"> <!ENTITY whitelist.site.label "SlÃ¥ fra pÃ¥ ?1?"> +<!ENTITY notification.closing.button.hide "Luk d&enne besked"> <!ENTITY filters.label "&Filterpræferencer"> <!ENTITY disable.label "Deaktiver overalt"> <!ENTITY objecttab.title "Bloker"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ja"> <!ENTITY opensidebar.label "Ã…bn bloké&rbare elementer"> <!ENTITY notification.button.close "&Luk"> +<!ENTITY shownotifications.label "Vis &nyttige beskeder"> <!ENTITY contribute.label "Bidrag til Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock ramme"> <!ENTITY blocked.tooltip "Blokerede emner pÃ¥ denne side:"> +<!ENTITY notification.closing.button.optout "&Stop visning af beskeder"> <!ENTITY counthits.label "Tæl filter&hits"> <!ENTITY showinstatusbar.label "&Vis pÃ¥ statuslinje"> <!ENTITY sidebar.title "Blokérbare elementer pÃ¥ aktuel side"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Vi&s pÃ¥ værktøjslinje"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Bloker audio/video"> -<!ENTITY subscription.update.label "Opdater filtre"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/da/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/da/sendReport.dtd index 5965eed..e1eee05 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/da/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/da/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "Dine seneste rapporter"> <!ENTITY typeWarning.description "Du vil indsende en rapport om generelle problemer med Adblock Plus, og ikke med filtrene. Bemærk at den slags problemer behandles bedst i [link]Adblock Plus forum[/link]. Du bør kun bruge denne problemrapport som bilag til en eksisterende diskussion, da ingen bemærker den med mindre du angiver et link. Du vil modtage et link efter afsendelse af rapporten."> <!ENTITY issues.disabled.description "Adblock Plus er deaktiveret og blokerer ingenting."> -<!ENTITY attachExtensions.label "&Vedhæft liste med aktive tilføjelser til konstatering af eventuelle konflikter"> +<!ENTITY attachExtensions.label "Vedhæft en liste med aktive tilføjelser til rapporten, i tilfælde af at en add-on konflikt er Ã¥rsag til problemet"> <!ENTITY issues.nosubscriptions.add.label "Tilføj filterabonnement"> <!ENTITY issues.disabledfilters.enable.label "Aktiver filter"> <!ENTITY issues.override.label "&Indstillingen er korrekt, fortsæt rapporten"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/de/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/de/composer.dtd index cdbe73e..0f36efb 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/de/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/composer.dtd @@ -1,16 +1,16 @@ <!ENTITY anchor.end.label "am En&de der Adresse"> <!ENTITY domainRestriction.label "Auf Do&main beschränken:"> <!ENTITY collapse.default.no.label "Standardeinstellung (nein)"> -<!ENTITY firstParty.label "Nur für Elemente der Urs&prungsseite"> +<!ENTITY firstParty.label "Nur für Elemente der Ursprungsseite"> <!ENTITY preferences.label "Vorhandene Filter an&zeigen…"> <!ENTITY pattern.label "Muster suchen"> -<!ENTITY thirdParty.label "Nur für Elemen&te von Drittseiten"> +<!ENTITY thirdParty.label "Nur für Elemen&te von Drittanbietern"> <!ENTITY filter.label "Neue&r Filter:"> <!ENTITY collapse.label "Platz frei&geben:"> <!ENTITY match.warning "Das Muster, das Sie eingegeben haben, passt nicht mehr zu der Adresse, für die der Filter erstellt werden soll. Es wird keinen Einfluss mehr auf diese Adresse haben."> <!ENTITY anchor.start.label "am An&fang der Adresse"> <!ENTITY matchCase.label "Groß-/&Kleinschreibung beachten"> -<!ENTITY custom.pattern.label "Be&nutzerdefiniert:"> +<!ENTITY custom.pattern.label "&Benutzerdefiniert:"> <!ENTITY unselectAllTypes.label "Keine auswählen"> <!ENTITY type.whitelist.label "&Ausnahmeregel"> <!ENTITY regexp.warning "Das Muster, das Sie eingegeben haben, wird als regulärer Ausdruck interpretiert. Zu viele reguläre Ausdrücke könnten Ihren Browser verlangsamen. Falls Sie nicht beabsichtigt haben, reguläre Ausdrücke zu verwenden, fügen Sie einfach das Symbol '*' am Ende des Musters an."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/de/filters.dtd index afcfba7..56678b5 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/de/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/filters.dtd @@ -34,7 +34,7 @@ <!ENTITY subscription.update.label "Filter aktualisieren"> <!ENTITY dialog.title "Filtereinstellungen von Adblock Plus"> <!ENTITY addFilter.label "&Filter hinzufügen"> -<!ENTITY subscription.minVersion.warning "Diese Filterliste benötigt eine neuere Version von Adblock Plus, Sie sollten auf die neueste Version von Adblock Plus aktualisieren."> +<!ENTITY subscription.minVersion.warning "Diese Filterliste benötigt eine neuere Version von Adblock Plus. Sie sollten die neueste Version von Adblock Plus herunterladen."> <!ENTITY subscription.lastDownload.invalidURL "Fehler, ungültige Adresse"> <!ENTITY backup.error "Beim Schreiben der Filter in die Datei ist ein Problem aufgetreten. Bitte stellen Sie sicher, dass die Datei nicht schreibgeschützt ist oder von einem anderen Programm verwendet wird."> <!ENTITY filter.moveUp.label "Nach oben verschieben"> @@ -44,6 +44,7 @@ <!ENTITY acceptableAds2.label "Einige nicht auf&dringliche Werbung zulassen"> <!ENTITY addSubscriptionOther.label "Anderes Abonnement hinzufügen"> <!ENTITY close.label "Schließen"> +<!ENTITY findbar.caseSensitive "Groß-/Kleinschreibung"> <!ENTITY sort.none.label "&Unsortiert"> <!ENTITY filter.actions.label "Filteraktionen"> <!ENTITY filter.copy.label "Kopieren"> @@ -61,12 +62,17 @@ <!ENTITY find.label "Filter durch&suchen"> <!ENTITY subscription.moveDown.label "Nach unten verschieben"> <!ENTITY subscription.lastDownload.connectionError "Fehler, Download fehlgeschlagen"> +<!ENTITY findbar.statusWrappedStart "Listenanfang erreicht, vom Ende fortgesetzt"> <!ENTITY subscription.lastDownload.success "Erfolgreich"> +<!ENTITY findbar.placeholder "Filter suchen"> <!ENTITY subscription.lastDownload.invalidData "Fehler, keine gültige Filterliste"> +<!ENTITY findbar.close "Suchleiste schließen"> <!ENTITY filter.paste.label "Einfügen"> <!ENTITY subscription.disabledFilters.enable "Deaktivierte Filter aktivieren"> <!ENTITY lasthit.column "Let&zter Treffer"> +<!ENTITY findbar.statusWrappedEnd "Listenende erreicht, vom Anfang fortgesetzt"> <!ENTITY subscription.editTitle.label "Umbenennen"> +<!ENTITY findbar.statusNotFound "Filter nicht gefunden"> <!ENTITY subscription.disabledFilters.warning "Einige Filter in dieser Filterliste sind deaktiviert."> <!ENTITY filter.column "&Filterregel"> <!ENTITY subscription.lastDownload.label "Zuletzt aktualisiert:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/de/firstRun.properties index 6493d0a..3c0a71d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/de/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Verfügbar für Android und iOS +firstRun_abbButtonTitle=Erhalten Sie hier Adblock Browser +firstRun_abbPromotionHeadline=Haben Sie ein Smartphone oder ein Tablet? firstRun_acceptableAdsExplanation=Wir möchten Webseiten dazu ermutigen schlichte und unaufdringliche Werbung zu verwenden. Deshalb werden durch <a>strenge Richtlinien</a> akzeptable Werbeanzeigen bestimmt, welche unter den Standard-Einstellungen noch angezeigt werden. Wenn Sie jedoch alle Werbungen blockieren möchten, können Sie diese Einstellung in kurzer Zeit <a>deaktivieren</a>. firstRun_acceptableAdsHeadline=Lästige Werbung wird jetzt blockiert firstRun_contributor_credits=Mitwirkende diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/de/global.properties index b2cd0f0..88c3c3e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/de/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/global.properties @@ -5,16 +5,18 @@ type_label_script=Skript filter_elemhide_nocriteria=Keine Kriterien angegeben, um das zu versteckende Element zu erkennen blockingGroup_title=Blockierregeln whitelisted_tooltip=Adblock Plus ist auf dieser Seite deaktiviert. +type_label_ping=ping type_label_stylesheet=Stylesheet blocked_count_tooltip=?1? von ?2? type_label_font=Schriftart type_label_popup=Pop-up-Fenster filter_regexp_tooltip=Dieser Filter ist entweder ein regulärer Ausdruck oder zu kurz zum Optimieren. Zu viele solche Filter könnten Ihren Browser verlangsamen. action0_tooltip=Kontextmenü anzeigen. Mittlere Maustaste schaltet Adblock Plus ein und aus. -whitelisted_page=Adblock Plus wurde für die geöffnete Seite deaktiviert +whitelisted_page=Adblock Plus wurde auf der aktuellen Seite deaktiviert remove_group_warning=Sind Sie sicher, dass Sie diese Filtergruppe entfernen möchten? action1_tooltip=Liste blockierbarer Elemente öffnen bzw. schließen. Mittlere Maustaste schaltet Adblock Plus ein und aus. type_label_xmlhttprequest=XML-Anfrage +filter_invalid_regexp=Ungültiger regulärer Ausdruck active_tooltip=Adblock Plus ist aktiv, ?1? Filterabonnement(s) und ?2? eigene Filter werden verwendet. type_label_document=Dokument type_label_object_subrequest=Objekt-Anfrage @@ -25,11 +27,15 @@ type_label_object=Objekt action2_tooltip=Adblock Plus Einstellungen öffnen. Mittlere Maustaste schaltet Adblock Plus ein und aus. type_label_subdocument=Frame clearStats_warning=Alle Trefferstatistiken werden zurückgesetzt und Filtertreffer werden in Zukunft nicht mehr gezählt. Wollen Sie fortfahren? +filter_unknown_option=Unbekannte Filteroption +type_label_genericblock=generischer Block notification_antiadblock_message=Diese Seite hat in der Vergangenheit Adblock Plus-Nutzern gezielt Nachrichten angezeigt. Soll Adblock Plus Nachrichten dieser Art verstecken? blocked_count_addendum=(außerdem Ausnahmen: ?1?, versteckte Elemente: ?2?) subscription_invalid_location=Die eingegebene Adresse ist weder eine gültige Web-Adresse, noch ein gültiger Dateiname. +type_label_websocket=WebSocket-Anfrage type_label_image=Grafik remove_subscription_warning=Sind Sie sicher, dass Sie dieses Abonnement entfernen möchten? +type_label_generichide=generische Ausblendung type_label_other=Andere mobile_menu_enable=ABP: Aktivieren type_label_media=Audio/Video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Aktivieren auf ?1? type_label_elemhide=Versteckt newGroup_title=Neue Filtergruppe default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/de/overlay.dtd index a8afa42..d6ad52b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/de/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nein"> <!ENTITY sync.label "Adblock-Plus-Einstellungen s&ynchronisieren"> <!ENTITY whitelist.site.label "Deaktivieren: auf ?1?"> +<!ENTITY notification.closing.button.hide "Diese Benachrichtigung schließen"> <!ENTITY filters.label "Filterein&stellungen"> <!ENTITY disable.label "Überall deaktivieren"> <!ENTITY objecttab.title "Blockieren"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ja"> <!ENTITY opensidebar.label "&Blockierbare Elemente öffnen"> <!ENTITY notification.button.close "&Schließen"> +<!ENTITY shownotifications.label "Hilfreiche &Benachrichtigungen anzeigen"> <!ENTITY contribute.label "Zu Adblock Plus beitragen"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Frame blockieren"> <!ENTITY blocked.tooltip "Blockierte Elemente auf dieser Seite:"> +<!ENTITY notification.closing.button.optout "&Keine weiteren Benachrichtigungen anzeigen"> <!ENTITY counthits.label "Filtertreffer &zählen"> <!ENTITY showinstatusbar.label "In &Statusleiste anzeigen"> <!ENTITY sidebar.title "Elemente der geöffneten Seite"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "In Symbolleis&te anzeigen"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Audio-/Video-Element blockieren"> -<!ENTITY subscription.update.label "Filter aktualisieren"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/de/sidebar.dtd index cac33e3..61337dd 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/de/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/sidebar.dtd @@ -1,6 +1,6 @@ <!ENTITY context.flash.label "Position des Elements aufzeigen"> <!ENTITY address.label "Adresse"> -<!ENTITY context.open.label "Adresse in neuem Tab öffnen"> +<!ENTITY context.open.label "In neuem Tab öffnen"> <!ENTITY type.label "Typ"> <!ENTITY tooltip.filterSource.label "Herkunft des Filters:"> <!ENTITY noitems.label "Keine blockierbaren Elemente"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/de/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/de/subscriptionSelection.dtd index ee00470..cfb3ade 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/de/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/de/subscriptionSelection.dtd @@ -1,9 +1,9 @@ -<!ENTITY addMain.label "Filterabonnement »?1?« auc&h hinzufügen"> +<!ENTITY addMain.label "Filterabonnement "?1?" auc&h hinzufügen"> <!ENTITY list.download.failed "Adblock Plus konnte die Liste der Filterabonnements nicht herunterladen."> <!ENTITY list.download.retry "Nochmal versuchen"> <!ENTITY title.label "Be&zeichnung des Abonnements:"> -<!ENTITY list.download.website "Internetseite ansehen"> -<!ENTITY supplementMessage "Dieses Filterabonnement sollte in Verbindung mit dem Filterabonnement »?1?« verwendet werden."> +<!ENTITY list.download.website "Zur Webseite wechseln"> +<!ENTITY supplementMessage "Dieses Filterabonnement sollte in Verbindung mit dem Filterabonnement "?1?" verwendet werden."> <!ENTITY viewList.label "Filter ansehen"> <!ENTITY visitHomepage.label "Webseite der Filterliste besuchen"> <!ENTITY addSubscription.label "Filterabonnement hinzufügen"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/filters.dtd index 35ed52d..5e63805 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "De&centne wabjenje dowóliÅ›"> <!ENTITY addSubscriptionOther.label "Drugi abonement pÅ›idaÅ›"> <!ENTITY close.label "ZacyniÅ›"> +<!ENTITY findbar.caseSensitive "Na wjelikopisanje źiwaÅ›"> <!ENTITY sort.none.label "&NjesortÄ›rowany"> <!ENTITY filter.actions.label "Filtrowe akcije"> <!ENTITY filter.copy.label "KopÄ›rowaÅ›"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&PytaÅ›"> <!ENTITY subscription.moveDown.label "DoÅ‚oj"> <!ENTITY subscription.lastDownload.connectionError "NjeraźiÅ‚o, ześěgnjeÅ„ska zmólka"> +<!ENTITY findbar.statusWrappedStart "Górjejce pÅ›iźony, wót doÅ‚ojce pókÅ¡acowaÅ›"> <!ENTITY subscription.lastDownload.success "WuspÄ›ch"> +<!ENTITY findbar.placeholder "Filter pytaÅ›"> <!ENTITY subscription.lastDownload.invalidData "NjeporaźiÅ‚o, žedna pÅ‚aÅ›iwa filtrowa lisćina"> +<!ENTITY findbar.close "PytaÅ„sku rÄ›dku zacyniÅ›"> <!ENTITY filter.paste.label "ZasunuÅ›"> <!ENTITY subscription.disabledFilters.enable "Znjemóžnjone filtry zmóžniÅ›"> <!ENTITY lasthit.column "S&lÄ›dny trjefaÅ•"> +<!ENTITY findbar.statusWrappedEnd "DoÅ‚ojce pÅ›iźony, wót górjejce pókÅ¡acowaÅ›"> <!ENTITY subscription.editTitle.label "Titel wobźěłaÅ›"> +<!ENTITY findbar.statusNotFound "Fraza njejo se namakaÅ‚a"> <!ENTITY subscription.disabledFilters.warning "NÄ›kotare filtry w toÅ› tom abonomenÅ›e su znjemóžnjone."> <!ENTITY filter.column "&Filtrowe pÅ¡awidÅ‚o"> <!ENTITY subscription.lastDownload.label "SlÄ›dne ześěgnjenje:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/firstRun.properties index ccb978f..02d7d5d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/firstRun.properties @@ -18,3 +18,6 @@ firstRun_share_headline=<a>PódajÅ›o nam ruku</a>, aby my web k lÄ›pÅ¡emu mÄ›stn firstRun_title=Adblock Plus jo se instalÄ›rowaÅ‚ firstRun_toggle_off=WUÅ ALTOWANY firstRun_toggle_on=ZAÅ ALTOWANY +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/global.properties index 3b6e734..62338d7 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/global.properties @@ -5,6 +5,7 @@ type_label_script=skript filter_elemhide_nocriteria=Njejsu žedne kriterije pódane, aby element spóznaÅ‚, kótaryž ma se schowaÅ› blockingGroup_title=PÅ¡awidÅ‚a za blokÄ›rowanje wabjenja whitelisted_tooltip=Adblock Plus jo znjemóžnjony na aktualnem boku. +type_label_ping=ping type_label_stylesheet=stilowa pÅ›edÅ‚oga blocked_count_tooltip=?1? z ?2? type_label_font=pismo @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus jo se za aktualny bok znjemóžniÅ‚ remove_group_warning=CoÅ›o toÅ› tu kupku napÅ¡awdu wótpóraÅ›? action1_tooltip=KliknuÅ›, aby se blokÄ›rujobne zapiski wócynili/zacynili, ze srjejźneju tastu kliknuÅ›, aby zmóžniÅ‚/znjemóžniÅ‚. type_label_xmlhttprequest=XML-napÅ¡aÅ¡owanje +filter_invalid_regexp=NjepÅ‚aÅ›iwy regularny wuraz active_tooltip=Adblock Plus jo zmóžnjony, ?1? filtrowe abonementy a ?2? swójske filtry se wužywaju. type_label_document=dokument type_label_object_subrequest=objektowe pódnapÅ¡aÅ¡owanje @@ -25,11 +27,15 @@ type_label_object=objekt action2_tooltip=KliknuÅ›, aby se nastajenja wócynili, ze srjejźneju tastu kliknuÅ›, aby zmóžniÅ‚/znjemóžniÅ‚. type_label_subdocument=wobÅ‚uk clearStats_warning=To stajijo wÅ¡u filtrowu statistiku slÄ›dk a znjemóžnijo licenje filtrowych wótpowÄ›dnikow. CoÅ›o pókÅ¡acowaÅ›? +filter_unknown_option=Njeznata filtrowa opcija +type_label_genericblock=generiske blokÄ›rowanje notification_antiadblock_message=ToÅ› to sedÅ‚o jo za to znate, až pokazujo celowe powěźeÅ„ki za wužywarje Adblock Plus. CoÅ›o, až Adblock Plus chowa celowe powěźeÅ„ki? blocked_count_addendum=(teke w běłej lisćinje: ?1?, schowane: ?2?) subscription_invalid_location=MÄ›stno filtroweje lisćiny njejo daniž pÅ‚aÅ›iwy URL daniž pÅ‚aÅ›iwe datajowe mÄ›. +type_label_websocket=websocket type_label_image=wobraz remove_subscription_warning=CoÅ›o toÅ› ten abonement napÅ¡awdu wótpóraÅ›? +type_label_generichide=generiske schowanje type_label_other=druge mobile_menu_enable=ABP: ZmóžniÅ› type_label_media=awdio/wideo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Na ?1? zmóžniÅ› type_label_elemhide=schowany newGroup_title=Nowa filtrowa kupka default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/overlay.dtd index d69b611..3829874 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/dsb/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/dsb/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&NÄ›"> <!ENTITY sync.label "Nastajenja za syn&chronizÄ›rowanje Adblock Plus"> <!ENTITY whitelist.site.label "Na ?1? znjemóžniÅ›"> +<!ENTITY notification.closing.button.hide "ToÅ› tu po&wěźeÅ„ku zacyniÅ›"> <!ENTITY filters.label "&Filtrowe nastajenja"> <!ENTITY disable.label "WÅ¡uźi znjemóžniÅ›"> <!ENTITY objecttab.title "BlokÄ›rowaÅ›"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Jo"> <!ENTITY opensidebar.label "B&lokÄ›rujobne zapiski wócyniÅ›"> <!ENTITY notification.button.close "&ZacyniÅ›"> +<!ENTITY shownotifications.label "Wužytne p&owěźeÅ„ki pokazaÅ›"> <!ENTITY contribute.label "K Adblock Plus pÅ›inosowaÅ›"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: WobÅ‚uk blokÄ›rowaÅ›"> <!ENTITY blocked.tooltip "BlokÄ›rowane zapiski na toÅ› tom boku:"> +<!ENTITY notification.closing.button.optout "PowěźeÅ„ki wÄ›cej &njepokazaÅ›"> <!ENTITY counthits.label "Fi&ltrowe trjefarje licyÅ›"> <!ENTITY showinstatusbar.label "W &statusowej lejstwje pokazaÅ›"> <!ENTITY sidebar.title "BlokÄ›rujobne zapiski na aktualnem boku"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "W symbolowej rÄ›&dce pokazaÅ›"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Awdio/Wideo blokÄ›rowaÅ›"> -<!ENTITY subscription.update.label "Filtry akutalizÄ›rowaÅ›"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/el/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/el/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/el/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/el/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/el/filters.dtd index 006871b..9d9a213 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/el/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/el/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Îα επιτÏÎπονται &μεÏικÎÏ‚ μη-παÏεμβατικÎÏ‚ διαφημίσεις"> <!ENTITY addSubscriptionOther.label "Î Ïοσθήκη άλλης συνδÏομής"> <!ENTITY close.label "Κλείσιμο"> +<!ENTITY findbar.caseSensitive "Εντοπισμός μπάÏας. ευαίσθητο στην υπόθεση"> <!ENTITY sort.none.label "Χ&ωÏίς ταξινόμηση"> <!ENTITY filter.actions.label "ΕνÎÏγειες φίλτÏων"> <!ENTITY filter.copy.label "ΑντιγÏαφή"> @@ -60,12 +61,17 @@ <!ENTITY find.label "ΕÏ&Ïεση"> <!ENTITY subscription.moveDown.label "Μετακίνηση κάτω"> <!ENTITY subscription.lastDownload.connectionError "ΑπÎτυχε, σφάλμα κατά τη λήψη"> +<!ENTITY findbar.statusWrappedStart "Έφτασες στο πάνω μÎÏος, συνÎχεια από το κάτω μÎÏος"> <!ENTITY subscription.lastDownload.success "Επιτυχής"> +<!ENTITY findbar.placeholder "ΕÏÏεση φίλτÏου"> <!ENTITY subscription.lastDownload.invalidData "ΑπÎτυχε, μη ÎγκυÏη λίστα φίλτÏων"> +<!ENTITY findbar.close "Κλείσιμο γÏαμμής εÏÏεσης"> <!ENTITY filter.paste.label "Επικόλληση"> <!ENTITY subscription.disabledFilters.enable "ΕνεÏγοποίηση απενεÏγοποιημÎνων φίλτÏων"> <!ENTITY lasthit.column "Τε&λευταία επιτυχία"> +<!ENTITY findbar.statusWrappedEnd "Έφτασες στο κάτω μÎÏος, συνÎχεια από το πάνω μÎÏος"> <!ENTITY subscription.editTitle.label "ΕπεξεÏγασία τίτλου"> +<!ENTITY findbar.statusNotFound "Η φÏάση δεν βÏÎθηκε"> <!ENTITY subscription.disabledFilters.warning "Κάποια φίλτÏα σε αυτή την συνδÏομή είναι απενεÏγοποιημÎνα."> <!ENTITY filter.column "Κανόνας &φίλτÏου"> <!ENTITY subscription.lastDownload.label "Τελευταία ενημÎÏωση:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/el/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/el/firstRun.properties index 89b7b84..3ca0d39 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/el/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/el/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=ΔιαθÎσιμος για Android και iOS +firstRun_abbButtonTitle=Κάντε λήψη του Adblock Browser εδώ +firstRun_abbPromotionHeadline=Έχετε smartphone ή tablet; firstRun_acceptableAdsExplanation=Θα θÎλαμε να ενθαÏÏÏνουμε τις ιστοσελίδες να χÏησιμοποιοÏν ξεκάθαÏες, διακÏιτικÎÏ‚ διαφημίσεις. Γι' αυτό το λόγο Îχουμε οÏίσει <a>αυστηÏÎÏ‚ κατευθυντήÏιες γÏαμμÎÏ‚</a> για τον Ï€ÏοσδιοÏισμό των αποδεκτών διαφημίσεων, οι οποίες εμφανίζονται στις Ï€ÏοεπιλεγμÎνες Ïυθμίσεις. Εάν εξακολουθείτε να θÎλετε να αποκλείσετε όλες τις διαφημίσεις μποÏείτε να <a>απενεÏγοποιήσετε</a> αυτήν την επιλογή σε λίγα δευτεÏόλεπτα. firstRun_acceptableAdsHeadline=Οι ενοχλητικÎÏ‚ διαφημίσεις τώÏα θα αποκλειστοÏν firstRun_contributor_credits=Μνεία συντελεστών diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/el/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/el/global.properties index bdd9d06..26839a8 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/el/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/el/global.properties @@ -5,6 +5,7 @@ type_label_script=σενάÏιο εντολών filter_elemhide_nocriteria=Δεν καθοÏίστηκαν κÏιτήÏια ώστε να αναγνωÏιστεί το στοιχείο που θα φιλτÏαÏιστεί blockingGroup_title=Κανόνες φÏαγής διαφημίσεων whitelisted_tooltip=Το Adblock Plus είναι ενεÏγό αλλά απενεÏγοποιημÎνο για την Ï„ÏÎχουσα σελίδα. +type_label_ping=ping type_label_stylesheet=stylesheet blocked_count_tooltip=?1? από τα ?2? type_label_font=γÏαμματοσειÏά @@ -25,11 +26,15 @@ type_label_object=αντικείμενο action2_tooltip=Κλικ για τις επιλογÎÏ‚, μεσαίο κλικ για ενεÏγοποίηση/απενεÏγοποίηση. type_label_subdocument=πλαίσιο clearStats_warning=Αυτό θα μηδενίσει τα στατιστικά και θα απενεÏγοποιήσει τις επιτυχίες των φίλτÏων. ΘÎλετε να συνεχίσετε; +filter_unknown_option=Άγνωστη επιλογή φίλτÏου +type_label_genericblock=γενική φÏαγή notification_antiadblock_message=Αυτή η σελίδα είναι γνωστό ότι Ï€Ïοβάλει στοχευμÎνα μηνÏματα στους χÏήστες του Adblock Plus. ΘÎλετε το Adblock Plus να αποκÏÏπτει στοχευμÎνα μηνÏματα; blocked_count_addendum=(λευκή λίστα: ?1?, κÏυφά: ?2?) subscription_invalid_location=Η τοποθεσία της λίστας φίλτÏων δεν είναι ÎγκυÏη URL οÏτε και όνομα αÏχείου. +type_label_websocket=websocket type_label_image=εικόνα remove_subscription_warning=ΘÎλετε να απομακÏÏνετε αυτή τη συνδÏομή; +type_label_generichide=γενική απόκÏυψη type_label_other=άλλο mobile_menu_enable=ABP: ΕνεÏγοποίηση type_label_media=ήχος/βίντεο @@ -39,3 +44,5 @@ mobile_menu_enable_site=ABP: ΕνεÏγοποίηση στο ?1? type_label_elemhide=κÏυφό newGroup_title=ÎÎα ομάδα φίλτÏων default_dialog_title=Adblock Plus +filter_invalid_regexp=Invalid regular expression +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/el/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/el/overlay.dtd index 8178773..0f3f6ed 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/el/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/el/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Όχι"> <!ENTITY sync.label "Συγ&χÏονισμός των Ïυθμίσεων του Adblock Plus"> <!ENTITY whitelist.site.label "ΑπενεÏγοποίηση στο ?1?"> +<!ENTITY notification.closing.button.hide "&Κλείσιμο της ειδοποίησης"> <!ENTITY filters.label "Î Ïοτιμήσεις &φίλτÏων"> <!ENTITY disable.label "ΑπενεÏγοποίηση παντοÏ"> <!ENTITY objecttab.title "ΦÏαγή"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Îαι"> <!ENTITY opensidebar.label "Άνοιγμ&α των φιλτÏαÏισμÎνων στοιχείων"> <!ENTITY notification.button.close "&Κλείσιμο"> +<!ENTITY shownotifications.label "Εμφάνιση χÏήσιμων &ειδοποιήσεων"> <!ENTITY contribute.label "ΣυνεισφÎÏετε στο Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: φÏαγή πλαισίου"> <!ENTITY blocked.tooltip "Στοιχεία που Îχουν φÏαχθεί σε αυτή τη σελίδα:"> +<!ENTITY notification.closing.button.optout "&Διακοπή εμφάνισης ειδοποιήσεων"> <!ENTITY counthits.label "Κα&ταμÎÏ„Ïηση επιτυχιών φίλτÏων"> <!ENTITY showinstatusbar.label "Εμφάνιση στην γÏαμμή &κατάστασης"> <!ENTITY sidebar.title "Στοιχεία Ï€Ïος φιλτÏάÏισμα στην Ï„ÏÎχουσα σελίδα"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Εμφάνιση στην εÏγαλειο&θήκη"> <!ENTITY status.tooltip "Κατάσταση:"> <!ENTITY context.media.label "Adblock Plus: φÏαγή ήχου/βίντεο"> -<!ENTITY subscription.update.label "ΕνημÎÏωση φίλτÏων"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/el/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/el/sendReport.dtd index 642b03a..b726367 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/el/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/el/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "Οι αναφοÏÎÏ‚ που υποβάλλατε Ï€Ïόσφατα"> <!ENTITY typeWarning.description "Δηλώσατε πως θÎλετε να αναφÎÏετε Îνα γενικό ζήτημα σχετικά με το Adblock Plus παÏά Îνα Ï€Ïόβλημα με τα φίλτÏα. ΠαÏακαλώ Îχετε στο νου σας ότι Ï„Îτοιου είδους ζητήματα ταιÏιάζουν καλÏτεÏα στο [link]forum του Adblock Plus[/link]. Θα Ï€ÏÎπει να χÏησιμοποιείτε την αναφοÏά ζητήματος επιπÏόσθετα μιας υπάÏχουσας συζήτησης στο forum, καθώς κανÎνας δεν θα Ï€ÏοσÎξει την αναφοÏά σας εκτός αν πεÏιÎχει δεσμό Ï€Ïος την συζήτηση. Ο αυτόματα δημιουÏγημÎνος δεσμός θα εμφανιστεί μετά την υποβολή της αναφοÏάς."> <!ENTITY issues.disabled.description "Το Adblock Plus είναι απενεÏγοποιημÎνο, δεν θα φιλτÏάÏει τίποτα στην παÏοÏσα κατάσταση."> -<!ENTITY attachExtensions.label "ΕπισÏναψε την &λίστα με τα ενεÏγά Ï€Ïόσθετα στην αναφοÏά, σε πεÏίπτωση που κάποια ασυμβατότητα Î¼ÎµÏ„Î±Î¾Ï Î±Ï…Ï„ÏŽÎ½ είναι το Ï€Ïόβλημα"> +<!ENTITY attachExtensions.label "Επισυνάψτε την λίστα με τις ενεÏγÎÏ‚ &επεκτάσεις στην αναφοÏά, σε πεÏίπτωση που η αιτία του Ï€Ïοβλήματος οφείλεται σε διÎνεξη των Ï€Ïόσθετων"> <!ENTITY issues.nosubscriptions.add.label "Î Ïοσθήκη συνδÏομής φίλτÏων"> <!ENTITY issues.disabledfilters.enable.label "ΕνεÏγοποίηση φίλτÏου"> <!ENTITY issues.override.label "Οι Ïυθμί&σεις είναι σωστÎÏ‚, συνεχίστε με την αναφοÏά"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/filters.dtd index fa14794..0752837 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Allow some non-intrusive advertising"> <!ENTITY addSubscriptionOther.label "Add a different subscription"> <!ENTITY close.label "Close"> +<!ENTITY findbar.caseSensitive "Match case"> <!ENTITY sort.none.label "Unsorted"> <!ENTITY filter.actions.label "Filter actions"> <!ENTITY filter.copy.label "Copy"> @@ -62,12 +63,17 @@ <!ENTITY find.label "Find"> <!ENTITY subscription.moveDown.label "Move down"> <!ENTITY subscription.lastDownload.connectionError "Failed: download failure"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> <!ENTITY subscription.lastDownload.success "Success"> +<!ENTITY findbar.placeholder "Find filter"> <!ENTITY subscription.lastDownload.invalidData "Failed: not a valid filters list"> +<!ENTITY findbar.close "Close find bar"> <!ENTITY filter.paste.label "Paste"> <!ENTITY subscription.disabledFilters.enable "Enable disabled filters"> <!ENTITY lasthit.column "Last hit"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> <!ENTITY subscription.editTitle.label "Edit title"> +<!ENTITY findbar.statusNotFound "Phrase not found"> <!ENTITY subscription.disabledFilters.warning "Some filters in this subscription are disabled."> <!ENTITY filter.column "Filter rule"> <!ENTITY subscription.lastDownload.label "Last download:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/firstRun.properties index 7185c13..b4e7751 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/firstRun.properties @@ -1,20 +1,13 @@ firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still wish to block every ad you can <a>disable</a> this in a few seconds. -firstRun_acceptableAdsHeadline=Annoying ads will now be blocked -firstRun_contributor_credits=Contributor Credits -firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a> firstRun_donate=Donate -firstRun_donate_label=Support our project -firstRun_feature_malware=Malware Blocking -firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains. -firstRun_feature_social=Remove Social Media Buttons firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons (such as the Facebook Like) which appear on web pages and track your behaviour. -firstRun_feature_tracking=Disable Tracking -firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move. -firstRun_features=Adblock Plus can do more than block ads firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup.\nTherefore we had to reset your own filters and Acceptable Ads settings. Please check your filter lists and acceptable Ads settings in the Adblock Plus settings. -firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera. -firstRun_share=Tell your friends firstRun_share_headline=Help us in making the web a better place firstRun_title=Adblock Plus has been installed -firstRun_toggle_off=OFF -firstRun_toggle_on=ON +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_contributor_credits=Contributor Credits +firstRun_acceptableAdsHeadline=Annoying ads will now be blocked +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here +firstRun_share=Tell your friends +firstRun_donate_label=Support our project diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/global.properties index 6d3b8c6..75f71bb 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=No criteria specified to recognise the element to be hidden blockingGroup_title=Ad Blocking Rules whitelisted_tooltip=Adblock Plus is active but disabled on current page. +type_label_ping=ping type_label_stylesheet=stylesheet blocked_count_tooltip=?1? out of ?2? type_label_font=font @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus has been disabled for the current page remove_group_warning=Do you really want to remove this group? action1_tooltip=Click to open/close blockable items; middle-click to enable/disable. type_label_xmlhttprequest=XML request +filter_invalid_regexp=Invalid regular expression active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use. type_label_document=document type_label_object_subrequest=object sub-request @@ -25,11 +27,15 @@ type_label_object=object action2_tooltip=Click to open preferences; middle-click to enable/disable. type_label_subdocument=frame clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed? +filter_unknown_option=Unknown filter option +type_label_genericblock=generic block notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages? blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?) subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name. +type_label_websocket=websocket type_label_image=image remove_subscription_warning=Do you really want to remove this subscription? +type_label_generichide=generic hide type_label_other=other mobile_menu_enable=ABP: Enable type_label_media=audio/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Enable on ?1? type_label_elemhide=hidden newGroup_title=New filter group default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/overlay.dtd index f754ebe..36cf118 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-GB/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "No"> <!ENTITY sync.label "Syn&chronise Adblock Plus settings"> <!ENTITY whitelist.site.label "Disable on ?1?"> +<!ENTITY notification.closing.button.hide "Close t&his notification"> <!ENTITY filters.label "Filter preferences"> <!ENTITY disable.label "Disable everywhere"> <!ENTITY objecttab.title "Block"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "Yes"> <!ENTITY opensidebar.label "Open blockable items"> <!ENTITY notification.button.close "Close"> +<!ENTITY shownotifications.label "Show useful &notifications"> <!ENTITY contribute.label "Contribute to Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Block frame"> <!ENTITY blocked.tooltip "Blocked items on this page:"> +<!ENTITY notification.closing.button.optout "&Stop showing notifications"> <!ENTITY counthits.label "Count filter hits"> <!ENTITY showinstatusbar.label "Show in status bar"> <!ENTITY sidebar.title "Blockable items on current page"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Show in toolbar"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Block audio/video"> -<!ENTITY subscription.update.label "Update filters"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/filters.dtd index 1ab4720..0041793 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/filters.dtd @@ -90,3 +90,10 @@ <!ENTITY find.label "Fi&nd"> <!ENTITY close.label "Close"> + +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/firstRun.properties index f273e13..9576b63 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/firstRun.properties @@ -1,20 +1,12 @@ +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds. firstRun_acceptableAdsHeadline=Annoying ads will now be blocked firstRun_contributor_credits=Contributor Credits -firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a> firstRun_donate=donate firstRun_donate_label=Support our project -firstRun_feature_malware=Malware Blocking -firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains. -firstRun_feature_social=Remove Social Media Buttons -firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior. -firstRun_feature_tracking=Disable Tracking -firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move. -firstRun_features=Adblock Plus can do more than block ads firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>. -firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera. firstRun_share=Tell your friends firstRun_share_headline=<a>Give us a hand</a> in making the web a better place firstRun_title=Adblock Plus has been installed -firstRun_toggle_off=OFF -firstRun_toggle_on=ON diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/global.properties index 59de9cb..9f67ff0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/global.properties @@ -28,8 +28,11 @@ remove_group_warning=Do you really want to remove this group? clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed? filter_regexp_tooltip=This filter is either a regular expression or too short to be optimized. Too many of these filters might slow down your browsing. +filter_unknown_option=Unknown filter option +filter_invalid_regexp=Invalid regular expression filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified filter_elemhide_nocriteria=No criteria specified to recognize the element to be hidden +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name. @@ -42,11 +45,15 @@ type_label_subdocument=frame type_label_document=document type_label_elemhide=hidden type_label_popup=pop-up window +type_label_generichide=generic hide +type_label_genericblock=generic block type_label_xmlhttprequest=XML request type_label_object_subrequest=object subrequest type_label_media=audio/video type_label_font=font +type_label_ping=ping +type_label_websocket=websocket mobile_menu_enable=ABP: Enable # Note: the placeholder ?1? will be replaced by the site name. Ideally it should be at the end of the string (space is limited and site names can be long). diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/overlay.dtd index 5df3178..a3cab3a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/en-US/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-US/overlay.dtd @@ -31,10 +31,12 @@ <!ENTITY objecttabs.label "Show &tabs on Flash and Java"> <!ENTITY counthits.label "Count filter &hits"> <!ENTITY sync.label "Syn&c Adblock Plus settings"> +<!ENTITY shownotifications.label "Show useful &notifications"> <!ENTITY objecttab.title "Block"> <!ENTITY objecttab.tooltip "Click here to block this object with Adblock Plus"> <!ENTITY notification.button.yes "&Yes"> <!ENTITY notification.button.no "&No"> <!ENTITY notification.button.close "&Close"> -<!ENTITY subscription.update.label "Update filters"> +<!ENTITY notification.closing.button.hide "Close t&his notification"> +<!ENTITY notification.closing.button.optout "&Stop showing notifications"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/composer.dtd new file mode 100644 index 0000000..e547899 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/composer.dtd @@ -0,0 +1,33 @@ +<!ENTITY anchor.end.label "at the e&nd of the address"> +<!ENTITY domainRestriction.label "Restrict to &domain:"> +<!ENTITY collapse.default.no.label "Use default (no)"> +<!ENTITY firstParty.label "Fi&rst-party only"> +<!ENTITY preferences.label "&Show existing filters..."> +<!ENTITY pattern.label "Look for pattern"> +<!ENTITY thirdParty.label "&Third-party only"> +<!ENTITY filter.label "New &filter:"> +<!ENTITY collapse.label "Co&llapse blocked:"> +<!ENTITY match.warning "The pattern you entered no longer matches the address to be blocked/whitelisted and will have no effect on it."> +<!ENTITY anchor.start.label "at the be&ginning of the address"> +<!ENTITY matchCase.label "&Match case"> +<!ENTITY custom.pattern.label "&Custom:"> +<!ENTITY unselectAllTypes.label "Select none"> +<!ENTITY type.whitelist.label "E&xception rule"> +<!ENTITY regexp.warning "The pattern you entered will be interpreted as a regular expression which cannot be efficiently processed by Adblock Plus and may slow down your browsing experience. If you didn't intend to use a regular expression, add an asterisk (*) to the end of the pattern."> +<!ENTITY dialog.title "Add Adblock Plus filter rule"> +<!ENTITY basic.label "Basic view"> +<!ENTITY type.filter.label "&Blocking filter"> +<!ENTITY types.label "Apply to types:"> +<!ENTITY shortpattern.warning "The pattern you entered is too short to be optimised and may slow down your browsing experience. It is recommended that you choose a longer string for this filter to allow Adblock Plus to process the filter more efficiently."> +<!ENTITY collapse.yes.label "Yes"> +<!ENTITY anchors.label "Accept pattern only:"> +<!ENTITY collapse.default.yes.label "Use default (yes)"> +<!ENTITY domainRestriction.help "Use this option to specify one or more domains separated by a bar line (|). The filter will only be applied on the domain(s) selected. A tilde (~) before a domain name indicates that the filter will not be applied on that domain."> +<!ENTITY accept.label "Add filter"> +<!ENTITY options.label "Options"> +<!ENTITY disabled.warning "Adblock Plus is currently disabled. You can still add filters but they will not be applied unless you [link]enable Adblock Plus[/link]."> +<!ENTITY anchor.start.flexible.label "at the be&ginning of the domain name"> +<!ENTITY collapse.no.label "No"> +<!ENTITY selectAllTypes.label "Select all"> +<!ENTITY advanced.label "Advanced view"> +<!ENTITY pattern.explanation "The pattern can be any part of the address; asterisks (*) act as wildcards. The filter will only be applied to addresses matching the pattern provided."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/filters.dtd new file mode 100644 index 0000000..c240c4c --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/filters.dtd @@ -0,0 +1,80 @@ +<!ENTITY restore.custom.warning "All your custom filters will be replaced by the contents of the selected file. Do you want to proceeed?"> +<!ENTITY slow.column "Slo&w filters"> +<!ENTITY enabled.column "E&nabled"> +<!ENTITY subscription.lastDownload.checksumMismatch "Failed, checksum mismatch"> +<!ENTITY noFiltersInGroup.text "The selected group is empty."> +<!ENTITY subscription.actions.label "Actions"> +<!ENTITY filter.selectAll.label "Select All"> +<!ENTITY backupButton.label "&Backup and Restore"> +<!ENTITY restore.minVersion.warning "Warning: the file has been created with a newer Adblock Plus version. You should update to the latest Adblock Plus version before restoring from this file."> +<!ENTITY restore.error "The file's data could not be processed, maybe this isn't an Adblock Plus backup file?"> +<!ENTITY sort.ascending.label "&A > Z sort order"> +<!ENTITY sort.label "&Sort by"> +<!ENTITY subscription.source.label "Filter list"> +<!ENTITY hitcount.column "&Hits"> +<!ENTITY noFilters.text "You don't have any custom filters yet."> +<!ENTITY backup.custom.title "Custom filters only"> +<!ENTITY subscription.external.label "Updated by another extension"> +<!ENTITY subscription.delete.label "Delete"> +<!ENTITY noGroupSelected.text "You need to select a filter group before its filters can be displayed."> +<!ENTITY filter.cut.label "Cut"> +<!ENTITY restore.default.label "Restore backup from ?1?"> +<!ENTITY subscription.lastDownload.inProgress "Downloading…"> +<!ENTITY subscriptions.tab.label "Filter subscriptions"> +<!ENTITY sort.descending.label "&Z > A sort order"> +<!ENTITY filters.remove.warning "Do you really want to remove all selected filters?"> +<!ENTITY filter.delete.label "Delete"> +<!ENTITY addSubscriptionAdd.label "Add"> +<!ENTITY viewMenu.label "View"> +<!ENTITY subscription.lastDownload.unknown "N/A"> +<!ENTITY addSubscriptionCancel.label "Cancel"> +<!ENTITY subscription.enabled.label "Enabled"> +<!ENTITY noSubscriptions.text "You haven't added any filter subscriptions yet. Adblock Plus won't block + anything without filters, please use "Add filter subscription" to + add some."> +<!ENTITY subscription.update.label "Update filters"> +<!ENTITY dialog.title "Adblock Plus Filter Preferences"> +<!ENTITY addFilter.label "A&dd filter"> +<!ENTITY subscription.minVersion.warning "This filter subscription requires a newer Adblock Plus version, you should update to the latest Adblock Plus version."> +<!ENTITY subscription.lastDownload.invalidURL "Failed, not a valid address"> +<!ENTITY backup.error "There was an error writing filters to the file. Make sure that the file isn't write protected or in use by another application."> +<!ENTITY filter.moveUp.label "Move up"> +<!ENTITY addGroup.label "Add filter &group"> +<!ENTITY filter.edit.label "Edit"> +<!ENTITY subscription.showHideFilters.label "Show/hide filters"> +<!ENTITY acceptableAds2.label "Allow some non-&intrusive advertising"> +<!ENTITY addSubscriptionOther.label "Add a different subscription"> +<!ENTITY close.label "Close"> +<!ENTITY sort.none.label "&Unsorted"> +<!ENTITY filter.actions.label "Filter actions"> +<!ENTITY filter.copy.label "Copy"> +<!ENTITY filter.moveDown.label "Move down"> +<!ENTITY filter.resetHitCounts.label "Reset hit statistics"> +<!ENTITY readMore.label "Read more"> +<!ENTITY subscription.moveUp.label "Move up"> +<!ENTITY addSubscription.label "Add &filter subscription"> +<!ENTITY subscription.homepage.label "Homepage"> +<!ENTITY backup.complete.title "All filters and subscriptions"> +<!ENTITY restore.own.label "Restore own backup"> +<!ENTITY restore.complete.warning "All your filter preferences will be replaced by the contents of the selected file. Do you want to proceeed?"> +<!ENTITY filters.tab.label "Custom filters"> +<!ENTITY backup.label "Create new backup"> +<!ENTITY find.label "Fi&nd"> +<!ENTITY subscription.moveDown.label "Move down"> +<!ENTITY subscription.lastDownload.connectionError "Failed, download failure"> +<!ENTITY subscription.lastDownload.success "Success"> +<!ENTITY subscription.lastDownload.invalidData "Failed, not a valid filters list"> +<!ENTITY filter.paste.label "Paste"> +<!ENTITY subscription.disabledFilters.enable "Enable disabled filters"> +<!ENTITY lasthit.column "&Last hit"> +<!ENTITY subscription.editTitle.label "Edit title"> +<!ENTITY subscription.disabledFilters.warning "Some filters in this subscription are disabled."> +<!ENTITY filter.column "&Filter rule"> +<!ENTITY subscription.lastDownload.label "Last download:"> +<!ENTITY viewList.label "View list"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/firstRun.properties new file mode 100644 index 0000000..9576b63 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/firstRun.properties @@ -0,0 +1,12 @@ +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds. +firstRun_acceptableAdsHeadline=Annoying ads will now be blocked +firstRun_contributor_credits=Contributor Credits +firstRun_donate=donate +firstRun_donate_label=Support our project +firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>. +firstRun_share=Tell your friends +firstRun_share_headline=<a>Give us a hand</a> in making the web a better place +firstRun_title=Adblock Plus has been installed diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/global.properties new file mode 100644 index 0000000..b7a2aa5 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/global.properties @@ -0,0 +1,48 @@ +no_blocking_suggestions=No blockable items on the current page +action3_tooltip=Click to enable/disable Adblock Plus. +notification_antiadblock_title=Hide targeted messages? +type_label_script=script +filter_elemhide_nocriteria=No criteria specified to recognise the element to be hidden +blockingGroup_title=Ad Blocking Rules +whitelisted_tooltip=Adblock Plus is disabled on current page. +type_label_ping=ping +type_label_stylesheet=stylesheet +blocked_count_tooltip=?1? out of ?2? +type_label_font=font +type_label_popup=pop-up window +filter_regexp_tooltip=This filter is either a regular expression or too short to be optimised. Too many of these filters might slow down your browsing. +action0_tooltip=Click to bring up context menu, middle-click to enable/disable. +whitelisted_page=Adblock Plus has been disabled for the current page +remove_group_warning=Do you really want to remove this group? +action1_tooltip=Click to open/close blockable items, middle-click to enable/disable. +type_label_xmlhttprequest=XML request +active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use. +type_label_document=document +type_label_object_subrequest=object subrequest +whitelistGroup_title=Exception Rules +disabled_tooltip=Adblock Plus is disabled. +filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified +type_label_object=object +action2_tooltip=Click to open preferences, middle-click to enable/disable. +type_label_subdocument=frame +clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed? +type_label_genericblock=generic block +notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages? +blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?) +subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name. +type_label_image=image +remove_subscription_warning=Do you really want to remove this subscription? +type_label_generichide=generic hide +type_label_other=other +mobile_menu_enable=ABP: Enable +type_label_media=audio/video +mobile_menu_disable_site=ABP: Disable on ?1? +elemhideGroup_title=Element Hiding Rules +mobile_menu_enable_site=ABP: Enable on ?1? +type_label_elemhide=hidden +newGroup_title=New filter group +default_dialog_title=Adblock Plus +filter_invalid_regexp=Invalid regular expression +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +filter_unknown_option=Unknown filter option +type_label_websocket=websocket diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/overlay.dtd new file mode 100644 index 0000000..196aca0 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/overlay.dtd @@ -0,0 +1,33 @@ +<!ENTITY notification.button.no "&No"> +<!ENTITY sync.label "Syn&c Adblock Plus settings"> +<!ENTITY whitelist.site.label "Disable on ?1?"> +<!ENTITY notification.closing.button.hide "Close t&his notification"> +<!ENTITY filters.label "&Filter preferences"> +<!ENTITY disable.label "Disable everywhere"> +<!ENTITY objecttab.title "Block"> +<!ENTITY objecttab.tooltip "Click here to block this object with Adblock Plus"> +<!ENTITY menuitem.label "Ad&block Plus Preferences"> +<!ENTITY objecttabs.label "Show &tabs on Flash and Java"> +<!ENTITY sendReport.label "&Report issue on this page"> +<!ENTITY whitelist.page.label "Disable on this page only"> +<!ENTITY context.image.label "Adblock Plus: Block image"> +<!ENTITY notification.button.yes "&Yes"> +<!ENTITY opensidebar.label "Open &blockable items"> +<!ENTITY notification.button.close "&Close"> +<!ENTITY shownotifications.label "Show useful &notifications"> +<!ENTITY contribute.label "Contribute to Adblock Plus"> +<!ENTITY toolbarbutton.label "Adblock Plus"> +<!ENTITY context.frame.label "Adblock Plus: Block frame"> +<!ENTITY blocked.tooltip "Blocked items on this page:"> +<!ENTITY notification.closing.button.optout "&Stop showing notifications"> +<!ENTITY counthits.label "Count filter &hits"> +<!ENTITY showinstatusbar.label "&Show in status bar"> +<!ENTITY sidebar.title "Blockable items on current page"> +<!ENTITY options.label "&Options"> +<!ENTITY context.object.label "Adblock Plus: Block object"> +<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-enable on this page"> +<!ENTITY filters.tooltip "Most active filters:"> +<!ENTITY closesidebar.label "Close &blockable items"> +<!ENTITY showintoolbar.label "Show in tool&bar"> +<!ENTITY status.tooltip "Status:"> +<!ENTITY context.media.label "Adblock Plus: Block audio/video"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/sendReport.dtd new file mode 100644 index 0000000..b25c4d3 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/sendReport.dtd @@ -0,0 +1,103 @@ +<!ENTITY screenshot.undo.label "&Undo"> +<!ENTITY issues.disabledgroups.description "The following filter subscriptions / filter groups are disabled, yet they might have + an effect on this page:"> +<!ENTITY showData.label "Show report data"> +<!ENTITY typeSelector.falsePositive.label "Adblock Plus is blocking too &much"> +<!ENTITY issues.change.description "Your configuration has been changed. Please reload the page to test the changes + and submit a report if the issue hasn't been resolved by the alterations."> +<!ENTITY email.label "E&mail:"> +<!ENTITY issues.openPreferences.label "Open filter preferences"> +<!ENTITY sendPage.confirmation "Your report has been saved. You can access it at the following address:"> +<!ENTITY copyLink.label "&Copy report link"> +<!ENTITY issues.nofilters.description "Adblock Plus isn't blocking anything on the current page. The issue you are + observing is most likely unrelated to Adblock Plus."> +<!ENTITY sendPage.knownIssue "The issue you reported is probably already known. More information:"> +<!ENTITY typeSelector.other.description "Select this option if you suspect an issue with Adblock Plus itself rather + than its filters."> +<!ENTITY issues.disabledgroups.enable.label "Enable filter subscription / filter group"> +<!ENTITY typeWarning.override.label "I under&stand and want to submit the report anyway"> +<!ENTITY issues.disabled.enable.label "Enable Adblock Plus"> +<!ENTITY update.fixed.description "The updates to your filter subscriptions likely resolved the issue that you + were reporting. Please reload the page and retry, hit Report again if the + problem remains."> +<!ENTITY anonymous.label "&Anonymous submission"> +<!ENTITY reloadButton.label "&Reload page"> +<!ENTITY recentReports.clear.label "&Remove all reports"> +<!ENTITY typeSelector.description "This window will guide you through the steps required for the submission of an Adblock + Plus issue report. First, please select the type of issue that you are experiencing + on this page:"> +<!ENTITY screenshot.remove.label "&Remove sensitive data"> +<!ENTITY issues.ownfilters.description "Some of the filters applied on this page are user-defined. Please disable + the filters that might have caused the issue:"> +<!ENTITY update.inProgress.description "Adblock Plus needs to update your filter subscriptions to make sure that the + issue hasn't been resolved already. Please wait..."> +<!ENTITY sendPage.retry.label "Send again"> +<!ENTITY data.label "Re&port data:"> +<!ENTITY recentReports.label "Your recently submitted reports"> +<!ENTITY typeWarning.description "You have indicated that you want to report a general issue with Adblock Plus rather + than a problem with the filters. Please note that such issues are best reported + in the [link]Adblock Plus forum[/link]. You should only use the issue reporter to + supplement an existing discussion, as nobody will notice your report + unless you provide them with the link to it. The automatically generated link + will be provided after submitting the report."> +<!ENTITY issues.disabled.description "Adblock Plus is disabled; it will not block anything in its current state."> +<!ENTITY attachExtensions.label "Attach a list of active e&xtensions to the report in case an add-on conflict is the cause of the problem"> +<!ENTITY issues.nosubscriptions.add.label "Add filter subscription"> +<!ENTITY issues.disabledfilters.enable.label "Enable filter"> +<!ENTITY issues.override.label "The &configuration is correct. Continue with the report"> +<!ENTITY issues.nosubscriptions.description "You do not appear to be subscribed to any of the pre-made filter lists that + automatically remove unwanted content from websites."> +<!ENTITY typeSelector.falsePositive.description "Select this option if the page lacks important content, displays incorrectly or + fails to function properly. You can determine whether Adblock Plus is the cause + of the problem by disabling it temporarily."> +<!ENTITY typeSelector.other.label "O&ther issue"> +<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions + about your report. It will also allow us to recognize your contributions and to prioritise them higher."> +<!ENTITY issues.whitelist.remove.label "Re-enable Adblock Plus on this page"> +<!ENTITY outdatedSubscriptions.description "The following filter subscriptions haven't been updated for at least two + weeks. Please update these subscriptions before submitting a report, the + issue might be resolved already."> +<!ENTITY dataCollector.description "Please wait a few moments while Adblock Plus gathers the required data."> +<!ENTITY sendButton.label "Se&nd report"> +<!ENTITY comment.label "&Comment (optional):"> +<!ENTITY sendPage.errorMessage "An attempt to send the report failed with error code "?1?". Please ensure you are + connected to the Internet and retry. If the problem persists, please request + assistance in the [link]Adblock Plus forum[/link]."> +<!ENTITY showRecentReports.label "Show recently submitted reports"> +<!ENTITY commentPage.heading "Enter comment"> +<!ENTITY update.start.label "Start update now"> +<!ENTITY issues.disabledfilters.description "The following filters are disabled, yet they might have an effect on this page:"> +<!ENTITY screenshot.description "The same page can look different for different people. It may help us to + understand the problem if you attach a screenshot to your report. You can remove + sections containing sensitive information as well as mark areas where the + problem is noticeable. To do that click the corresponding button and select + a section of the image with your mouse."> +<!ENTITY screenshot.attach.label "A&ttach a page image to the report"> +<!ENTITY issues.whitelist.description "Adblock Plus is currently disabled on the page you are reporting. Please re-enable + it and reload the page before submitting the report to assist the investigation of + this issue."> +<!ENTITY typeSelector.falseNegative.label "Adblock Plus doesn't block an ad&vertisement"> +<!ENTITY typeSelector.heading "Select issue type"> +<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritise the report lower."> +<!ENTITY wizard.title "Issue reporter"> +<!ENTITY issues.ownfilters.disable.label "Disable filter"> +<!ENTITY commentPage.description "The text field below allows you to enter a comment to help us understand the issue. + This step is optional but recommended if the problem isn't obvious. + You can also review the report data before it is sent."> +<!ENTITY comment.lengthWarning "The length of your comment exceeds 1000 characters. Only the first 1000 characters will be sent."> +<!ENTITY typeSelector.falseNegative.description "Select this option if an advertisement is displayed despite + Adblock Plus being enabled."> +<!ENTITY sendPage.waitMessage "Please wait while Adblock Plus is submitting your report."> +<!ENTITY dataCollector.heading "Welcome to the issue reporter"> +<!ENTITY screenshot.heading "Attach screenshot"> +<!ENTITY sendPage.heading "Send report"> +<!ENTITY issues.subscriptionCount.description "It seems that you are subscribed to too many filter subscriptions. This + setup is not recommended because it will make the likeliness + of issues much higher. We also cannot accept your issue report because it + is unclear which filter subscription author needs to take action. Please + remove all but the really necessary filter subscriptions and test whether + the issue still occurs then."> +<!ENTITY screenshot.mark.label "&Mark the problem"> +<!ENTITY privacyPolicy.label "Privacy policy"> +<!ENTITY issues.description "Adblock Plus has detected issues with your configuration that might be responsible + for this issue or will make investigating the report difficult."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/sidebar.dtd new file mode 100644 index 0000000..53c6a67 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/sidebar.dtd @@ -0,0 +1,35 @@ +<!ENTITY context.flash.label "Flash item's borders"> +<!ENTITY address.label "Address"> +<!ENTITY context.open.label "Open in New Tab"> +<!ENTITY type.label "Type"> +<!ENTITY tooltip.filterSource.label "Filter source:"> +<!ENTITY noitems.label "No blockable items"> +<!ENTITY filter.label "Filter"> +<!ENTITY tooltip.size.label "Size:"> +<!ENTITY reattach.label "Reattach"> +<!ENTITY search.label "&Search:"> +<!ENTITY docDomain.thirdParty "(third party)"> +<!ENTITY filterSource.label "Filter source"> +<!ENTITY tooltip.docDomain.label "Document source:"> +<!ENTITY context.copy.label "Copy item's address"> +<!ENTITY tooltip.type.label "Type:"> +<!ENTITY context.disablefilter.label "Disable filter ?1?"> +<!ENTITY context.copyFilter.label "Copy filter"> +<!ENTITY context.block.label "Block this item"> +<!ENTITY context.enablefilter.label "Re-enable filter ?1?"> +<!ENTITY detach.label "Detach"> +<!ENTITY whitelisted.label "Whitelisted page"> +<!ENTITY context.disablefilteronsite.label "Disable this filter on ?1?"> +<!ENTITY detached.title "Adblock Plus: Blockable items (detached)"> +<!ENTITY docDomain.firstParty "(first party)"> +<!ENTITY tooltip.type.whitelisted "(whitelisted)"> +<!ENTITY tooltip.filter.label "Filter in effect:"> +<!ENTITY tooltip.filter.disabled "(disabled)"> +<!ENTITY context.editfilter.label "Edit filter in effect"> +<!ENTITY tooltip.type.blocked "(blocked)"> +<!ENTITY size.label "Size"> +<!ENTITY context.whitelist.label "Add exception rule for item"> +<!ENTITY context.selectAll.label "Select all"> +<!ENTITY state.label "State"> +<!ENTITY docDomain.label "Document source"> +<!ENTITY tooltip.address.label "Address:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/subscriptionSelection.dtd new file mode 100644 index 0000000..3d99536 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/en-ZA/subscriptionSelection.dtd @@ -0,0 +1,12 @@ +<!ENTITY addMain.label "Add filter &subscription "?1?" as well"> +<!ENTITY list.download.failed "Adblock Plus failed to retrieve the list of subscriptions."> +<!ENTITY list.download.retry "Try again"> +<!ENTITY title.label "Subscrip&tion title:"> +<!ENTITY list.download.website "View website"> +<!ENTITY supplementMessage "This filter subscription is meant to be used with the filter subscription "?1?" which you are not using yet."> +<!ENTITY viewList.label "View filters"> +<!ENTITY visitHomepage.label "Visit home page"> +<!ENTITY addSubscription.label "Add subscription"> +<!ENTITY dialog.title "Add Adblock Plus filter subscription"> +<!ENTITY location.label "Fi&lter list location:"> +<!ENTITY fromWeb.description "Please confirm that you want to add this filter subscription. You can change the subscription title or location before adding it."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eo/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/eo/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eo/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eo/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/eo/filters.dtd index a7c498c..d9f04ca 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eo/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eo/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Permesi neal&trudiÄantan reklamon"> <!ENTITY addSubscriptionOther.label "Aldoni alian abonon"> <!ENTITY close.label "Fermi"> +<!ENTITY findbar.caseSensitive "Atenti usklecon"> <!ENTITY sort.none.label "&Nenio"> <!ENTITY filter.actions.label "Filtrilaj agoj"> <!ENTITY filter.copy.label "Kopii"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Serĉi"> <!ENTITY subscription.moveDown.label "Malsupren"> <!ENTITY subscription.lastDownload.connectionError "Malsukcesis, elÅuta eraro"> +<!ENTITY findbar.statusWrappedStart "Alveninta supre, daÅrigi de malsupre"> <!ENTITY subscription.lastDownload.success "Sukceso"> +<!ENTITY findbar.placeholder "Serĉi filtrilon"> <!ENTITY subscription.lastDownload.invalidData "Malsukcesis, tio ne estas listo de validaj filtriloj"> +<!ENTITY findbar.close "Fermi serĉbreton"> <!ENTITY filter.paste.label "Alglui"> <!ENTITY subscription.disabledFilters.enable "Ebligi malebligitajn filtrilojn"> <!ENTITY lasthit.column "&Lasta trafo"> +<!ENTITY findbar.statusWrappedEnd "Alveninta malsupre, daÅrigi de supre"> <!ENTITY subscription.editTitle.label "Redakti titolon"> +<!ENTITY findbar.statusNotFound "Frazo netrovita"> <!ENTITY subscription.disabledFilters.warning "Kelkaj filtriloj en ĉi tiu abono estas malebligitaj."> <!ENTITY filter.column "&Filtrilregulo"> <!ENTITY subscription.lastDownload.label "Lasta elÅuto:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eo/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/eo/firstRun.properties index db06d3f..645ded5 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eo/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eo/firstRun.properties @@ -18,3 +18,6 @@ firstRun_share_headline=<a>Donu al ni manon</a>, por ke ni faru la reton pli bon firstRun_title=Adblock Plus instaliÄis firstRun_toggle_off=MalÅaltita firstRun_toggle_on=Åœaltita +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eo/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/eo/global.properties index f37a94d..52e8762 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eo/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eo/global.properties @@ -5,6 +5,7 @@ type_label_script=skripto filter_elemhide_nocriteria=Neniuj kriterioj specifitaj por ekkoni la kaÅotan elementon blockingGroup_title=Reguloj por bloki reklamon whitelisted_tooltip=Adblock Plus estas malebligita sur ĉi tiu paÄo. +type_label_ping=ping type_label_stylesheet=stilfolio blocked_count_tooltip=?1? el ?2? type_label_font=tiparo @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus estas malebligita por ĉi tiu paÄo remove_group_warning=Ĉu vi vere volas forigi ĉi tiun grupon? action1_tooltip=Klaku por malfermi/fermi blokeblajn elementojn, klaku per la meza musklavo por ebligi/malebligi Äin. type_label_xmlhttprequest=XML-peto +filter_invalid_regexp=Malkorekta regula esprimo active_tooltip=Adblock Plus estas ebligita, ?1? filtrilabonoj kaj ?2? propraj filtriloj estas uzataj. type_label_document=dokumento type_label_object_subrequest=objekta subpeto @@ -25,11 +27,15 @@ type_label_object=objekto action2_tooltip=Klaku por malfermi agordojn, klaku per la meza musklavo por ebligi/malebligi Äin. type_label_subdocument=kadro clearStats_warning=Tio rekomencigos la statistikon de filtrilaj trafoj kaj malebligos la nombradon de filtrilaj trafoj. Ĉu vi volas daÅrigi? +filter_unknown_option=Nekonata filtrila opcio +type_label_genericblock=komuna blokado notification_antiadblock_message=Estas konate, ke ĉi tiu retejo montras celmesaÄojn por uzantoj de Adblock Plus. Ĉu vi volas, ke Adblock Plus kaÅu celmesaÄojn? blocked_count_addendum=(ankaÅ en blanka listo: ?1?, kaÅita: ?2?) subscription_invalid_location=La loko de la listo de filtriloj estas nek valida URL nek valida dosiernomo. +type_label_websocket=websocket type_label_image=bildo remove_subscription_warning=Ĉu vi efektive volas fini ĉi tiun abonon? +type_label_generichide=komuna kaÅado type_label_other=alia mobile_menu_enable=ABP: Ebligi type_label_media=aÅdio/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Ebligi en ?1? type_label_elemhide=kaÅita newGroup_title=Nova grupo de filtriloj default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eo/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/eo/overlay.dtd index 2b6e84f..e45560a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eo/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eo/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ne"> <!ENTITY sync.label "&Sinkronigi agordojn de Adblock Plus"> <!ENTITY whitelist.site.label "Malebligi sur ?1?"> +<!ENTITY notification.closing.button.hide "Fermi ĉi &tiun sciigon"> <!ENTITY filters.label "&Filtrilaj agordoj"> <!ENTITY disable.label "Ĉie malebligi"> <!ENTITY objecttab.title "Bloki"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Jes"> <!ENTITY opensidebar.label "Malfermi &blokeblajn elementojn"> <!ENTITY notification.button.close "&Fermi"> +<!ENTITY shownotifications.label "Montri utilajn &sciigojn"> <!ENTITY contribute.label "Kontribuu al Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Bloki kadron"> <!ENTITY blocked.tooltip "Blokitaj elementoj sur ĉi tiu paÄo:"> +<!ENTITY notification.closing.button.optout "&Ne plu montri sciigojn"> <!ENTITY counthits.label "&Nombri filtriltrafojn"> <!ENTITY showinstatusbar.label "Vidi&gi en statstrio"> <!ENTITY sidebar.title "Blokeblaj elementoj sur la nuna paÄo"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "&Vidigi en ilobreto"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Bloki aÅdion/videon"> -<!ENTITY subscription.update.label "Äœisdatigi filtrilojn"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/filters.dtd index 4c0cf83..d584f67 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Permitir publicidad no &hostigadora"> <!ENTITY addSubscriptionOther.label "Agregar un filtro de suscripción"> <!ENTITY close.label "Cerrar"> +<!ENTITY findbar.caseSensitive "Coincidir May/minús"> <!ENTITY sort.none.label "Sin or&denar"> <!ENTITY filter.actions.label "Acciones de filtro"> <!ENTITY filter.copy.label "Copiar"> @@ -60,12 +61,17 @@ <!ENTITY find.label "Bus&car"> <!ENTITY subscription.moveDown.label "Bajar"> <!ENTITY subscription.lastDownload.connectionError "Falló, error en la descarga"> +<!ENTITY findbar.statusWrappedStart "Se alcanzó el principio, continúa desde el final"> <!ENTITY subscription.lastDownload.success "Se realizó exitosamente"> +<!ENTITY findbar.placeholder "Buscar filtro"> <!ENTITY subscription.lastDownload.invalidData "Falló, no es una lista de filtros válida"> +<!ENTITY findbar.close "Cerrar barra de búsqueda"> <!ENTITY filter.paste.label "Pegar"> <!ENTITY subscription.disabledFilters.enable "Habilitar filtros deshabilitados"> <!ENTITY lasthit.column "Úl&tima vez usado"> +<!ENTITY findbar.statusWrappedEnd "Se ha alcanzado el final, continúa desde el principio"> <!ENTITY subscription.editTitle.label "Editar tÃtulo"> +<!ENTITY findbar.statusNotFound "Frase no encontrada"> <!ENTITY subscription.disabledFilters.warning "Algunos filtros en esta suscripción están deshabilitados."> <!ENTITY filter.column "&Regla de filtro"> <!ENTITY subscription.lastDownload.label "Última descarga:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/firstRun.properties index f3f9c65..14ec9df 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Disponible para Android e iOS +firstRun_abbButtonTitle=Obtené Adblock Browser aquà +firstRun_abbPromotionHeadline=¿Tenés un smartphone o una tableta? firstRun_acceptableAdsExplanation=Nos gustarÃa alentar a que los sitios web usen publicidad más directa y menos hostigadora. Es por eso que establecimos unas <a>pautas estrictas</a> para identificar publicidades aceptables, las cuales se muestran en la configuración predeterminada. Si aún asà querés seguir bloqueando todas las publicidades, podés <a>deshabilitar</a> esto en segundos. firstRun_acceptableAdsHeadline=Las molestas publicidades ahora serán bloqueadas firstRun_contributor_credits=Créditos diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/global.properties index fb119dc..91ab3c0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=No se especificó el criterio para reconocer el elemento a ser ocultado blockingGroup_title=Reglas de bloqueo de publicidad whitelisted_tooltip=Adblock Plus está deshabilitado en la página actual. +type_label_ping=ping type_label_stylesheet=hoja de estilo blocked_count_tooltip=?1? de un total de ?2? type_label_font=tipografÃa @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus fue deshabilitado para la página actual remove_group_warning=¿Estás seguro que querés quitar este grupo? action1_tooltip=Clic para abrir/cerrar los elementos bloqueables, clic con el botón del medio para habilitarlos/deshabilitarlos. type_label_xmlhttprequest=petición XML +filter_invalid_regexp=Expresión regular no válida active_tooltip=Adblock Plus está activo. En uso: ?1? suscripción/es de filtros y ?2? filtro/s personalizado/s. type_label_document=documento type_label_object_subrequest=subpetición de objeto @@ -22,14 +24,19 @@ whitelistGroup_title=Reglas de excepción disabled_tooltip=Adblock Plus está deshabilitado. filter_elemhide_duplicate_id=Se puede especificar solamente un identificador del elemento a ser ocultado. type_label_object=objeto +filter_elemhideemulation_nodomain=No hay un dominio activo para el filtro extendido de ocultamiento de elementos action2_tooltip=Clic para abrir el menú de preferencias, clic con el botón del medio para habilitarlo/deshabilitarlo. type_label_subdocument=marco clearStats_warning=Esto restablecerá todas las estadÃsticas de conteo y las deshabilitará. ¿Querés continuar? +filter_unknown_option=Opción de filtrado desconocida +type_label_genericblock=bloqueo genérico notification_antiadblock_message=Este sitio web es conocido por mostrar mensajes a los usuarios de Adblock Plus. ¿Querés que Adblock Plus los oculte? blocked_count_addendum=(también en la lista segura: ?1?, ocultos: ?2?) subscription_invalid_location=La ubicación de lista de filtros no es válida, o no es válido el nombre de archivo. +type_label_websocket=websocket type_label_image=imagen remove_subscription_warning=¿Estás seguro que querés quitar esta suscripción? +type_label_generichide=ocultamiento genérico type_label_other=otro mobile_menu_enable=ABP: Habilitar type_label_media=audio/video diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/overlay.dtd index 455ccfd..73e82a4 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-AR/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&No"> <!ENTITY sync.label "Si&ncronizar la configuración de Adblock Plus"> <!ENTITY whitelist.site.label "Deshabilitar en ?1?"> +<!ENTITY notification.closing.button.hide "Cerrar &esta notificación"> <!ENTITY filters.label "P&referencias de filtro"> <!ENTITY disable.label "Deshabilitar en todos lados"> <!ENTITY objecttab.title "Bloquear"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&SÃ"> <!ENTITY opensidebar.label "&Abrir elementos bloqueables"> <!ENTITY notification.button.close "&Cerrar"> +<!ENTITY shownotifications.label "Mostrar &notificaciones útiles"> <!ENTITY contribute.label "Contribuà a Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: bloquear marco"> <!ENTITY blocked.tooltip "Elementos bloqueados en esta página:"> +<!ENTITY notification.closing.button.optout "&Dejar de mostrar notificaciones"> <!ENTITY counthits.label "&Veces usado"> <!ENTITY showinstatusbar.label "Mostrar en la barra de &estado"> <!ENTITY sidebar.title "Elementos bloqueables en la página actual"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Mostrar en la barra de &herramientas"> <!ENTITY status.tooltip "Estado:"> <!ENTITY context.media.label "Adblock Plus: bloquear audio/video"> -<!ENTITY subscription.update.label "Actualizar filtros"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/composer.dtd new file mode 100644 index 0000000..a98945c --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/composer.dtd @@ -0,0 +1,33 @@ +<!ENTITY anchor.end.label "ir al &final de la dirección"> +<!ENTITY domainRestriction.label "&Restringir al dominio:"> +<!ENTITY collapse.default.no.label "Usar predeterminado (no)"> +<!ENTITY firstParty.label "So&lo propietarios"> +<!ENTITY preferences.label "Mostrar filtros existentes…"> +<!ENTITY pattern.label "Buscar patrón"> +<!ENTITY thirdParty.label "&Solo terceros"> +<!ENTITY filter.label "Nuevo filtro"> +<!ENTITY collapse.label "Co&lapso bloqueado:"> +<!ENTITY match.warning "El patrón ya no introducido coincide con la dirección que se bloquea / lista blanca, y no tendrá ningún efecto en él."> +<!ENTITY anchor.start.label "&ir al principio de la dirección"> +<!ENTITY matchCase.label "&Coincidir Mayus/Minus"> +<!ENTITY custom.pattern.label "Personalizado:"> +<!ENTITY unselectAllTypes.label "No seleccionar ninguno"> +<!ENTITY type.whitelist.label "regla de excepción"> +<!ENTITY regexp.warning "el patrón que ha introducido sera interpretado como una expresion regular que no se puede procesar de manera eficiente por adblock plus y puede ralentizar su experiencia de navegacion. Si no va a utilizar una expresion regular, añada un asterisco (*) al final del patrón."> +<!ENTITY dialog.title "Añadir regla de filtrado de Adblock Plus"> +<!ENTITY basic.label "Vista básica"> +<!ENTITY type.filter.label "filtro de bloqueo"> +<!ENTITY types.label "aplicar a"> +<!ENTITY shortpattern.warning "El patrón que has escrito es demasiado corta para ser optimizado y puede ralentizar su experiencia de navegación. Se recomienda que usted elige una cadena más larga para este filtro para permitir que Adblock Plus para procesar el filtro de manera más eficiente."> +<!ENTITY collapse.yes.label "SÃ"> +<!ENTITY anchors.label "Acepta el único patrón:"> +<!ENTITY collapse.default.yes.label "Usar predeterminado (sÃ)"> +<!ENTITY domainRestriction.help "usa esta opcion para especificar un o varios dominios separados por ''|''. el filtro sólo se aplicara a los dominios seleccionados. el simbolo ''~'' antes de un dominio indica que no se le aplicara el filtro"> +<!ENTITY accept.label "Añadir filtro"> +<!ENTITY options.label "Opciones"> +<!ENTITY disabled.warning "Adblock Plus está desactivado. Puede añadir filtros, pero no se aplicarán a menos que [link]active Adblock Plus[/link]."> +<!ENTITY anchor.start.flexible.label "&ir al principio del nombre de dominio"> +<!ENTITY collapse.no.label "No"> +<!ENTITY selectAllTypes.label "Seleccionar todos"> +<!ENTITY advanced.label "Vista avanzada"> +<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de una dirección; asteriscos(*) actuan como comodines. El filtro solo se aplicara a direcciones que igualen el patrón proporcionado."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/filters.dtd new file mode 100644 index 0000000..3266e7c --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/filters.dtd @@ -0,0 +1,78 @@ +<!ENTITY restore.custom.warning "Todas sus filtros personalizados se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?"> +<!ENTITY slow.column "Filtros lentos"> +<!ENTITY enabled.column "Activado"> +<!ENTITY subscription.lastDownload.checksumMismatch "Fallido, desajuste de suma de comprobación"> +<!ENTITY noFiltersInGroup.text "El grupo seleccionado está vacÃo."> +<!ENTITY subscription.actions.label "Acciones"> +<!ENTITY filter.selectAll.label "Seleccionar todos"> +<!ENTITY backupButton.label "&Copias de seguridad y restauración"> +<!ENTITY restore.minVersion.warning "Atención: el archivo se creó con una versión más reciente de Adblock Plus. DeberÃa actualizar a la última versión de Adblock Plus antes de hacer una restauración desde este archivo."> +<!ENTITY restore.error "No se pudieron procesar los datos del archivo. ¿Es posible que no sea un archivo de copia de seguridad de Adblock Plus?"> +<!ENTITY sort.ascending.label "Ordenar A-Z"> +<!ENTITY sort.label "& Ordenar por"> +<!ENTITY subscription.source.label "Lista de filtros"> +<!ENTITY hitcount.column "&Contador"> +<!ENTITY noFilters.text "Aún no tiene filtros personalizados."> +<!ENTITY backup.custom.title "Sólo los filtros personalizados"> +<!ENTITY subscription.external.label "Actualizado por otra extensión"> +<!ENTITY subscription.delete.label "Borrar"> +<!ENTITY noGroupSelected.text "Tiene que seleccionar un grupo de filtros para que se muestren sus filtros."> +<!ENTITY filter.cut.label "Cortar"> +<!ENTITY restore.default.label "Restaurar copia de seguridad de ?1?"> +<!ENTITY subscription.lastDownload.inProgress "Descargando..."> +<!ENTITY subscriptions.tab.label "Filtrar subscripciones"> +<!ENTITY sort.descending.label "Ordenar &Z > A"> +<!ENTITY filters.remove.warning "¿Está seguro de querer eliminar todos los filtros seleccionados?"> +<!ENTITY filter.delete.label "Borrar"> +<!ENTITY addSubscriptionAdd.label "Agregar"> +<!ENTITY viewMenu.label "Ver"> +<!ENTITY subscription.lastDownload.unknown "N/D"> +<!ENTITY addSubscriptionCancel.label "Cancelar"> +<!ENTITY subscription.enabled.label "Activado"> +<!ENTITY noSubscriptions.text "Aún no ha añadido nigun filtro de subscripcion. Adblock Plus no bloquea si no hay filtros, por favor usa la opcion "Agregar filtro de subscripcion" para agregar unos."> +<!ENTITY subscription.update.label "Actualizar filtros"> +<!ENTITY dialog.title "Filtrar preferencia para Adblock Plus"> +<!ENTITY addFilter.label "A&ñadir filtro"> +<!ENTITY subscription.minVersion.warning "Este filtro de suscripcion requiere una versión más reciente de Adblock Plus, deberÃas actualizarla a la última versión."> +<!ENTITY subscription.lastDownload.invalidURL "Fallo, direccion inválida"> +<!ENTITY backup.error "Se produjo un error al escribir filtros en el archivo. Asegúrese que el archivo no está protegido contra escritura o siendo utilizado por otra aplicación."> +<!ENTITY filter.moveUp.label "Mueva hacia arriba"> +<!ENTITY addGroup.label "Agregar filtro y grupo"> +<!ENTITY filter.edit.label "Editar"> +<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros"> +<!ENTITY acceptableAds2.label "Permitir cierta publicidad no intrusiva"> +<!ENTITY addSubscriptionOther.label "Añadir otra suscripcion"> +<!ENTITY close.label "Cerrar"> +<!ENTITY findbar.caseSensitive "Coincidir May/minús"> +<!ENTITY sort.none.label "&Sin ordenar"> +<!ENTITY filter.actions.label "Filtrar acciones"> +<!ENTITY filter.copy.label "Copiar"> +<!ENTITY filter.moveDown.label "Mover hacia abajo"> +<!ENTITY filter.resetHitCounts.label "Reiniciar estadÃsticas de uso"> +<!ENTITY readMore.label "Leer más"> +<!ENTITY subscription.moveUp.label "Mueva hacia arriba"> +<!ENTITY addSubscription.label "Agregar y filtrar subscripcion"> +<!ENTITY subscription.homepage.label "Página de inicio"> +<!ENTITY backup.complete.title "Todos los filtros y suscripciones"> +<!ENTITY restore.own.label "Restaurar copia de seguridad propia"> +<!ENTITY restore.complete.warning "Todas sus preferencias de filtros se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?"> +<!ENTITY filters.tab.label "Filtros personalizados"> +<!ENTITY backup.label "Crear nueva copia de seguridad"> +<!ENTITY find.label "&Buscar"> +<!ENTITY subscription.moveDown.label "Mover hacia abajo"> +<!ENTITY subscription.lastDownload.connectionError "Falló, descarga fracaso"> +<!ENTITY findbar.statusWrappedStart "Se alcanzó el principio, continúa desde el final"> +<!ENTITY subscription.lastDownload.success "Suceso"> +<!ENTITY findbar.placeholder "Buscar filtro"> +<!ENTITY subscription.lastDownload.invalidData "Falló, no es válida la lista de filtros"> +<!ENTITY findbar.close "Cerrar barra de búsqueda"> +<!ENTITY filter.paste.label "Pegar"> +<!ENTITY subscription.disabledFilters.enable "Activar filltros deesactivados"> +<!ENTITY lasthit.column "&últimouso"> +<!ENTITY findbar.statusWrappedEnd "Se ha alcanzado el final, continúa desde el principio"> +<!ENTITY subscription.editTitle.label "Editar tÃtulo"> +<!ENTITY findbar.statusNotFound "Frase no encontrada"> +<!ENTITY subscription.disabledFilters.warning "Algúnos filtros en esta suscripcion esta desabilitados."> +<!ENTITY filter.column "Filtrar regla"> +<!ENTITY subscription.lastDownload.label "Última descarga:"> +<!ENTITY viewList.label "Ver lista"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/firstRun.properties new file mode 100644 index 0000000..e19dca9 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/firstRun.properties @@ -0,0 +1,23 @@ +firstRun_abbButtonSubtitle=Disponible para Android e iOS +firstRun_abbButtonTitle=Obtén Adblock Browser aquà +firstRun_abbPromotionHeadline=¿Tienes un smartphone o una tableta? +firstRun_acceptableAdsExplanation=Nos gustarÃa fomentar el uso de una publicidad más directa y menos intrusiva por parte de los sitios web. Por eso hemos establecido unas <a>estrictas directivas </a> para identificar la publicidad aceptable, que se muestra en modo predeterminado. Si sigue queriendo bloquear toda la publicidad puede <a>desactivar</a> este modo en unos pocos segundos. +firstRun_acceptableAdsHeadline=Ahora se bloqueará la publicidad molesta +firstRun_contributor_credits=Colaboradores +firstRun_dataCorruptionWarning=¿Esta página sigue apareciendo? <a>¡Haga clic aquÃ!</a> +firstRun_donate=Donar +firstRun_donate_label=Apoye nuestro proyecto +firstRun_feature_malware=Bloqueo de malware +firstRun_feature_malware_description=Navegue con más seguridad bloqueando dominios identificados como malware. +firstRun_feature_social=Eliminar botones de redes sociales +firstRun_feature_social_description=Elimine automáticamente de su navegación los botones de redes sociales, como los "Me gusta" de Facebook, incluidos en las paginas web y que rastrean sus hábitos. +firstRun_feature_tracking=Desactivar el rastreo +firstRun_feature_tracking_description=Navegue de forma privada desactivando el rastreo - ocultando su rastro a las empresas de publicidad que espÃan cada uno de sus movimientos. +firstRun_features=Adblock Plus puede hacer más cosas que bloquear publicidad +firstRun_filterlistsReinitializedWarning=Parece que un problema provocó que se eliminasen todos los filtros y no se pudo restaurar una copia de seguridad. Por ello ha sido necesario reiniciar los filtros y la configuración de Anuncios Aceptables. Por favor, revise sus listas de filtros y la configuración de Anuncios Aceptables en <a>Opciones de Adblock Plus</a>. +firstRun_legacySafariWarning=Está utilizando una versión antigua de Safari no soportada por Adblock Plus, por lo que podrÃa funcionar incorrectamente o afectar a su experiencia de usuario en algunos sitios web. Le recomendamos actualizar a Safari 6.1.1 o posterior (para Mac OS X 10.8 Mountain Lion), o a Safari 7.0.1 o superior (para Mac OS X 10.9 Mavericks), o usar la última versión de Mozilla Firefox, Google Chrome u Opera. +firstRun_share=Dile a tus amigos +firstRun_share_headline=<a>Ayúdanos</a> a hacer de esta web un mejor lugar +firstRun_title=Adblock Plus ha sido instalado +firstRun_toggle_off=DESACTIVAR +firstRun_toggle_on=ACTIVAR diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/global.properties new file mode 100644 index 0000000..65d3748 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/global.properties @@ -0,0 +1,48 @@ +no_blocking_suggestions=No hay elementos bloqueables en la página actual +action3_tooltip=Haga clic para activar/desactivar Adblock Plus. +notification_antiadblock_title=¿Ocultar mensajes dirigidos a usuarios de Adblock Plus? +type_label_script=script +filter_elemhide_nocriteria=No se especificó ningún criterio para identificar el elemento a ocultar +blockingGroup_title=Reglas de bloqueo de publicidad +whitelisted_tooltip=Adblock Plus está desactivado en la página actual. +type_label_ping=ping +type_label_stylesheet=hoja de estilo +blocked_count_tooltip=?1? de ?2? +type_label_font=fuente +type_label_popup=ventana emergente +filter_regexp_tooltip=Este filtro es una expresión regular o demasiado corto para ser optimizado. Demasiados filtros de este tipo podrÃan hacer más lenta su navegación. +action0_tooltip=Pulse para abrir el menú contextual, pulse el botón central para activar/desactivar. +whitelisted_page=Adblock Plus ha sido desactivado para la página actual +remove_group_warning=¿Está seguro de querer eliminar este grupo? +action1_tooltip=Haga clic para abrir/cerrar elementos bloqueables, pulse el botón central para activar/desactivar. +type_label_xmlhttprequest=solicitud XML +filter_invalid_regexp=Expresión regular inválida +active_tooltip=Adblock Plus está activado, ?1? suscripciones de filtros y ?2? filtros personalizados en uso. +type_label_document=documento +type_label_object_subrequest=subpetición objeto +whitelistGroup_title=Reglas de excepción +disabled_tooltip=Adblock Plus está desactivado. +filter_elemhide_duplicate_id=Sólo puede especificarse una ID del elemento a ocultar +type_label_object=objeto +action2_tooltip=Haga clic para abrir las preferencias, haga click con el botón central para activar/desactivar. +type_label_subdocument=marco +clearStats_warning=Se reiniciarán todas las estadÃsticas de uso de filtros y se desactivarán dichas estadÃsticas de uso de filtros. ¿Desea continuar? +filter_unknown_option=Opción de filtrado desconocida +type_label_genericblock=bloqueo genérico +notification_antiadblock_message=Se sabe que este sitio ha mostrado en el pasado mensajes dirigidos a los usuarios de Adblock Plus. ¿Quiere que Adblock Plus oculte esos mensajes? +blocked_count_addendum=(también en lista blanca: ?1?, ocultos: ?2?) +subscription_invalid_location=La dirección de la lista de filtros no es una URL ni una ruta de archivo válida. +type_label_websocket=websocket +type_label_image=imagen +remove_subscription_warning=¿Está seguro de querer eliminar esta suscripción? +type_label_generichide=ocultación genérica +type_label_other=otro +mobile_menu_enable=ABP: Activar +type_label_media=audio/vÃdeo +mobile_menu_disable_site=ABP: Desactivar en ?1? +elemhideGroup_title=Reglas de ocultación de elementos +mobile_menu_enable_site=ABP: Activar en ?1? +type_label_elemhide=oculto +newGroup_title=Nuevo grupo de filtros +default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/overlay.dtd new file mode 100644 index 0000000..ac8ca23 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/overlay.dtd @@ -0,0 +1,33 @@ +<!ENTITY notification.button.no "&No"> +<!ENTITY sync.label "Opciones de sincronización"> +<!ENTITY whitelist.site.label "¿Deshabilitar en ?1?"> +<!ENTITY notification.closing.button.hide "Cerrar este aviso"> +<!ENTITY filters.label "&Preferencias de filtros"> +<!ENTITY disable.label "Deshabilitar en todos los sitios"> +<!ENTITY objecttab.title "Blloquear"> +<!ENTITY objecttab.tooltip "Haga click aquà para bloquear este objeto con Adblock Plus"> +<!ENTITY menuitem.label "Preferencias de Adblock Plus"> +<!ENTITY objecttabs.label "Mostrar páginas en Flash y Java"> +<!ENTITY sendReport.label "Informar de un problema en esta página"> +<!ENTITY whitelist.page.label "Desactivar solo en esta pagina"> +<!ENTITY context.image.label "Adblock Plus: Bloquear Imagen"> +<!ENTITY notification.button.yes "&SÃ"> +<!ENTITY opensidebar.label "Abrir &items bloqueables"> +<!ENTITY notification.button.close "&Cerrar"> +<!ENTITY shownotifications.label "Mostrar avisos útiles"> +<!ENTITY contribute.label "Contribuir a Adblock Plus"> +<!ENTITY toolbarbutton.label "Adblock Plus"> +<!ENTITY context.frame.label "Adblock Plus: Bloquear marco"> +<!ENTITY blocked.tooltip "Elementos bloqueados en esta página:"> +<!ENTITY notification.closing.button.optout "Dejar de mostrar avisos"> +<!ENTITY counthits.label "Contador de filtros"> +<!ENTITY showinstatusbar.label "Mostrar en la barra de estado"> +<!ENTITY sidebar.title "Elementos bloqueables en la página actual"> +<!ENTITY options.label "&Opciones"> +<!ENTITY context.object.label "Adblock Plus: Bloquear objeto."> +<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-activar publicidad en esta página"> +<!ENTITY filters.tooltip "Filtros más activos:"> +<!ENTITY closesidebar.label "Cerrar elementos bloqueables"> +<!ENTITY showintoolbar.label "Mostrar en la barra de herramientas"> +<!ENTITY status.tooltip "Estado:"> +<!ENTITY context.media.label "Adblock Plus: Bloqueo de audio/vÃdeo"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/sendReport.dtd new file mode 100644 index 0000000..6a5bcf8 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/sendReport.dtd @@ -0,0 +1,67 @@ +<!ENTITY screenshot.undo.label "&Deshacer"> +<!ENTITY issues.disabledgroups.description "Las siguientes suscripciones de filtros/grupos de filtros están desactivadas, estas aun podrÃan tener algún tipo de efecto en esta página:"> +<!ENTITY showData.label "Mostrar datos del informe"> +<!ENTITY typeSelector.falsePositive.label "Adblock Plus está bloqueando demasiado"> +<!ENTITY issues.change.description "Su configuración ha sido cambiada. Por favor, recarga la página para probar los cambios y enviar un reporte si el problema no se ha resuelto con las alteraciones."> +<!ENTITY email.label "Co&rreo electrónico:"> +<!ENTITY issues.openPreferences.label "Abrir preferencias de filtros"> +<!ENTITY sendPage.confirmation "Su informe ha sido guardado. Puede acceder a él en la siguiente dirección:"> +<!ENTITY copyLink.label "&Copiar enlace del reporte"> +<!ENTITY issues.nofilters.description "Adblock Plus no está bloqueando nada en esta página. El problema que observa muy probablemente no está relacionado con Adblock Plus."> +<!ENTITY sendPage.knownIssue "El problema que reporto probablemente ya es conocido. Más información:"> +<!ENTITY typeSelector.other.description "Seleccione esta opción si cree que es un problema con Adblock Plus, y no de sus filtros."> +<!ENTITY issues.disabledgroups.enable.label "Activar suscripción de filtros/grupo de filtros"> +<!ENTITY typeWarning.override.label "&entiendo y quiero enviar el reporte de todas formas"> +<!ENTITY issues.disabled.enable.label "Activar Adblock Plus"> +<!ENTITY update.fixed.description "La actualización de sus suscripciones de filtros probablemente ya resolvió el problema que estabas reportando. Por favor, recarga la página y reintenta. Pulse de nuevo Reportar si el problema permanece."> +<!ENTITY anonymous.label "EnvÃo &anónimo"> +<!ENTITY reloadButton.label "&Recargar página"> +<!ENTITY recentReports.clear.label "Eliminar todos los informes"> +<!ENTITY typeSelector.description "Esta ventana le dará los pasos necesarios para la presentación del informe de Adblock +Plus en cuestión. Primero, por favor seleccione el tipo de problema que está experimentando +en esta página:"> +<!ENTITY screenshot.remove.label "&Eliminar datos sensibles"> +<!ENTITY issues.ownfilters.description "Algunos de los filtros aplicados en esta página son filtros definidos por el usuario. Por favor, desactive los filtros que podrÃan haber causado el problema:"> +<!ENTITY update.inProgress.description "Adblock Plus necesita actualizar sus suscripciones de filtros para asegurarse de que el problema aún no se ha resuelto. Espere, por favor…"> +<!ENTITY sendPage.retry.label "Enviar de nuevo"> +<!ENTITY data.label "&Datos del reporte:"> +<!ENTITY recentReports.label "Informes más recientes"> +<!ENTITY typeWarning.description "Has indicado que quieres reportar un problema general con Adblock Plus en lugar de un problema con los filtros utilizados. Por favor ten en cuenta que este tipo de problemas suele ser mejor reportarlos en el [link]foro de Adblock Plus[/link]. Solo debes utilizar el reportador de problemas como suplemento en una discusión ya existente, puesto que nadie se dará cuenta de tu reporte a menos que proveas un enlace a este. El enlace generado automáticamente se te mostrará luego de enviar el reporte."> +<!ENTITY issues.disabled.description "Adblock Plus está desactivado, no bloqueará nada en su estado actual."> +<!ENTITY attachExtensions.label "Adjuntar una lista de e&xtensiones activas al reporte en caso de que la causa del problema sea un conflicto de add-ons"> +<!ENTITY issues.nosubscriptions.add.label "Añadir suscripción de filtros"> +<!ENTITY issues.disabledfilters.enable.label "Activar filtro"> +<!ENTITY issues.override.label "La &configuración es correcta, continuar con el reporte"> +<!ENTITY issues.nosubscriptions.description "No parece que estés suscrito a alguna de las listas de filtros pre-hechos que automáticamente filtran el contenido no deseado de los sitios web."> +<!ENTITY typeSelector.falsePositive.description "Seleccione esta opción si la pagina carece de contenido importante, se muestra de forma incorrecta o deja de funcionar correctamente. Puede determinar si Adblock Plus es la causa del problema desactivandolo temporalmente."> +<!ENTITY typeSelector.other.label "Otros problemas"> +<!ENTITY emailComment.label "Te recomendamos que introduzcas una dirección válida de correo electrónico para que podamos contactarte si surgen preguntas sobre tu reporte. Esto también nos permitirá reconocer tus contribuciones y darles mayor prioridad."> +<!ENTITY issues.whitelist.remove.label "Reactivar Adblock Plus en esta página"> +<!ENTITY outdatedSubscriptions.description "Las siguientes suscripciones de filtros no se han actualizado desde hace al menos dos semanas. Por favor, actualice esas suscripciones antes de enviar un reporte de error, el problema podrÃa estar ya resuelto."> +<!ENTITY dataCollector.description "Favor espere un momento mientras Adblock Plus reúne los datos necesarios."> +<!ENTITY sendButton.label "E&nviar reporte"> +<!ENTITY comment.label "&Comentario (opcional):"> +<!ENTITY sendPage.errorMessage "Un intento de enviar el reporte produjo un fallo con código de error "?1?". Por favor, asegúrese de que está conectado a Internet y vuelva a intentarlo. Si el problema persiste por favor pida ayuda en el [link]foro de Adblock Plus[/link]."> +<!ENTITY showRecentReports.label "Mostrar informes más recientes"> +<!ENTITY commentPage.heading "Escribir comentario"> +<!ENTITY update.start.label "Iniciar actualización ahora"> +<!ENTITY issues.disabledfilters.description "Los siguientes filtros están desactivados, estos aun podrÃan tener algún tipo de efecto en esta página:"> +<!ENTITY screenshot.description "La misma página puede tener diferente apariencia para diferentes personas. Puede resultar útil para comprender el problema si adjuntas una captura de pantalla al reporte. Puedes eliminar las partes que contengan información sensible y marcar las áreas en las que se nota el problema. Para hacerlo pulse el botón correspondiente y seleccione una sección de la imagen con su ratón."> +<!ENTITY screenshot.attach.label "A&ñadir una imagen de la página al reporte"> +<!ENTITY issues.whitelist.description "Adblock Plus está actualmente desactivado en la página a la que se refiere el reporte. Por favor, reactÃvalo y recarga la página antes de enviar el informe para ayudar en la investigación del problema."> +<!ENTITY typeSelector.falseNegative.label "Adblock Plus no bloquea un anuncio"> +<!ENTITY typeSelector.heading "Elegir el tipo de error"> +<!ENTITY anonymity.warning "No podremos volver a ti y es probable que le demos una prioridad inferior al reporte."> +<!ENTITY wizard.title "Reportar un error"> +<!ENTITY issues.ownfilters.disable.label "Desactivar filtro"> +<!ENTITY commentPage.description "El campo de texto de la parte inferior te permite introducir un comentario para ayudarnos a entender el problema. Este paso es opcional, pero recomendable si el problema no algo obvio. Puedes revisar los datos del reporte antes de que sea enviado."> +<!ENTITY comment.lengthWarning "La longitud de su comentario supera los 1.000 caracteres. Sólo se enviarán los 1.000 primeros."> +<!ENTITY typeSelector.falseNegative.description "Seleccione esta opción si se muestra un anuncio a pesar de que Adblock Plus está activado."> +<!ENTITY sendPage.waitMessage "Por favor, espere mientras Adblock Plus envÃa su informe."> +<!ENTITY dataCollector.heading "Bienvenido al creador de informes de errores"> +<!ENTITY screenshot.heading "Adjuntar captura de pantalla"> +<!ENTITY sendPage.heading "Enviar informe"> +<!ENTITY issues.subscriptionCount.description "Parece que te has suscrito a demasiadas suscripciones de filtros. Esta configuración no es recomendable porque aumenta mucho la probabilidad de que aparezcan problemas. Quizá no podamos procesar su informe de error porque no está claro qué autor de suscripción de filtros tiene que tomar acciones. Por favor, borre todas las suscripciones que no sean realmente necesarias y entonces compruebe si el problema aun ocurre."> +<!ENTITY screenshot.mark.label "&Marcar el problema"> +<!ENTITY privacyPolicy.label "PolÃtica de privacidad"> +<!ENTITY issues.description "Adblock Plus ha detectado problemas con su configuración que podrÃan ser los responsables del problema o que están dificultando la investigación del mismo."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/sidebar.dtd new file mode 100644 index 0000000..aab1d68 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/sidebar.dtd @@ -0,0 +1,35 @@ +<!ENTITY context.flash.label "Resaltar los bordes del elemento"> +<!ENTITY address.label "Dirección"> +<!ENTITY context.open.label "Abrir en nueva pestaña"> +<!ENTITY type.label "Tipo"> +<!ENTITY tooltip.filterSource.label "Origen filtro:"> +<!ENTITY noitems.label "Ningún elemento bloqueable"> +<!ENTITY filter.label "Filtro"> +<!ENTITY tooltip.size.label "Tamaño:"> +<!ENTITY reattach.label "Unir"> +<!ENTITY search.label "buscar:"> +<!ENTITY docDomain.thirdParty "(tercera parte)"> +<!ENTITY filterSource.label "Origen filtro"> +<!ENTITY tooltip.docDomain.label "Origen del documento:"> +<!ENTITY context.copy.label "Copiar la dirección del elemento"> +<!ENTITY tooltip.type.label "Tipo:"> +<!ENTITY context.disablefilter.label "Desactivar filtro ?1?"> +<!ENTITY context.copyFilter.label "Copiar filtro"> +<!ENTITY context.block.label "Bloquear este elemento"> +<!ENTITY context.enablefilter.label "Reactivar filtro ?1?"> +<!ENTITY detach.label "Separar"> +<!ENTITY whitelisted.label "Página de lista blanca"> +<!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?"> +<!ENTITY detached.title "Adblock Plus: ArtÃculos bloqueable (desprendidos)"> +<!ENTITY docDomain.firstParty "(primera parte)"> +<!ENTITY tooltip.type.whitelisted "(en lista blanca)"> +<!ENTITY tooltip.filter.label "Filtro en uso:"> +<!ENTITY tooltip.filter.disabled "(desactivado)"> +<!ENTITY context.editfilter.label "Editar el filtro en uso"> +<!ENTITY tooltip.type.blocked "(bloqueado)"> +<!ENTITY size.label "Tamaño"> +<!ENTITY context.whitelist.label "Añadir regla de excepción para el elemento"> +<!ENTITY context.selectAll.label "Seleccionar todo"> +<!ENTITY state.label "Estado"> +<!ENTITY docDomain.label "Origen del documento"> +<!ENTITY tooltip.address.label "Dirección:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/subscriptionSelection.dtd new file mode 100644 index 0000000..a66c5e1 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-CL/subscriptionSelection.dtd @@ -0,0 +1,12 @@ +<!ENTITY addMain.label "La suscripción "?1?" será reemplazada por el nombre de la suscripción de filtros que se requiere"> +<!ENTITY list.download.failed "Error al recuperar la lista de suscripciones."> +<!ENTITY list.download.retry "Inténtelo de nuevo"> +<!ENTITY title.label "TÃtulo:"> +<!ENTITY list.download.website "Ver página web"> +<!ENTITY supplementMessage "Esta suscripción está pensada para usarse junto a la suscripción "?1?" que aún no se ha iniciado y/o instalado."> +<!ENTITY viewList.label "Ver filtros"> +<!ENTITY visitHomepage.label "Visitar página de inicio"> +<!ENTITY addSubscription.label "Aceptar"> +<!ENTITY dialog.title "Agregar una suscripción de filtros para Adblock Plus"> +<!ENTITY location.label "Ubicación de la lista de los filtros:"> +<!ENTITY fromWeb.description "Confirme que deseas añadir esta suscripción a la base de filtros. Puedes cambiar el tÃtulo o la ubicación antes de añadirla."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/filters.dtd index 27f587b..939635f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "&Permitir cierta publicidad no intrusiva"> <!ENTITY addSubscriptionOther.label "Añadir otra suscripción"> <!ENTITY close.label "Cerrar"> +<!ENTITY findbar.caseSensitive "Coincidir MAY/minús"> <!ENTITY sort.none.label "&Sin ordenar"> <!ENTITY filter.actions.label "Acciones de filtros"> <!ENTITY filter.copy.label "Copiar"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Buscar"> <!ENTITY subscription.moveDown.label "Bajar"> <!ENTITY subscription.lastDownload.connectionError "Error: error de descarga"> +<!ENTITY findbar.statusWrappedStart "Se alcanzó el principio, continúa desde el final"> <!ENTITY subscription.lastDownload.success "Correcto"> +<!ENTITY findbar.placeholder "Buscar filtro"> <!ENTITY subscription.lastDownload.invalidData "Error: lista de filtros no válida"> +<!ENTITY findbar.close "Cerrar barra de búsqueda"> <!ENTITY filter.paste.label "Pegar"> <!ENTITY subscription.disabledFilters.enable "Activar filtros desactivados"> <!ENTITY lasthit.column "Último &uso"> +<!ENTITY findbar.statusWrappedEnd "Se ha alcanzado el final, continúa desde el principio"> <!ENTITY subscription.editTitle.label "Editar tÃtulo"> +<!ENTITY findbar.statusNotFound "Frase no encontrada"> <!ENTITY subscription.disabledFilters.warning "En esta suscripción hay filtros desactivados."> <!ENTITY filter.column "&Regla de filtrado"> <!ENTITY subscription.lastDownload.label "Última descarga:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/firstRun.properties index e7a548e..c2141fa 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/firstRun.properties @@ -1,7 +1,10 @@ +firstRun_abbButtonSubtitle=Disponible para Android e iOS +firstRun_abbButtonTitle=Consigue Adblock Browser aquà +firstRun_abbPromotionHeadline=¿Tienes un smartphone o una tableta? firstRun_acceptableAdsExplanation=Nos gustarÃa fomentar el uso de una publicidad más directa y menos agresiva en los sitios web. Por eso hemos establecido unas <a>directrices estrictas</a> para identificar la publicidad aceptable, que se muestra en modo predeterminado. Si sigue queriendo bloquear toda la publicidad puede <a>desactivar</a> este modo en unos pocos segundos. firstRun_acceptableAdsHeadline=Ahora se bloqueará la publicidad molesta firstRun_contributor_credits=Colaboradores -firstRun_dataCorruptionWarning=¿Sigue apareciendo esta página? <a>Pulse aquÃ</a> +firstRun_dataCorruptionWarning=¿Sigue apareciendo esta página? <a>Haga clic aquÃ</a> firstRun_donate=Donar firstRun_donate_label=Apoye nuestro proyecto firstRun_feature_malware=Bloquear malware diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/global.properties index f1f432e..47fb2bc 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=No se especificó ningún criterio para identificar el elemento a ocultar blockingGroup_title=Reglas de bloqueo de publicidad whitelisted_tooltip=Adblock Plus activado pero deshabilitado en la página actual. +type_label_ping=ping type_label_stylesheet=hoja de estilo blocked_count_tooltip=?1? de un total de ?2? type_label_font=fuente @@ -15,6 +16,7 @@ whitelisted_page=Se ha deshabilitado Adblock Plus para la página actual remove_group_warning=¿Está seguro de querer eliminar este grupo? action1_tooltip=Pulse para abrir/cerrar elementos para bloquear, botón central para activar/desactivar. type_label_xmlhttprequest=solicitud XML +filter_invalid_regexp=Expresión regular inválida active_tooltip=Adblock Plus activado, ?1? suscripciones de filtros y ?2? filtros personalizados en uso. type_label_document=documento type_label_object_subrequest=solicitud de objeto @@ -25,11 +27,15 @@ type_label_object=objeto action2_tooltip=Pulse para abrir las preferencias, botón central para activar/desactivar. type_label_subdocument=marco clearStats_warning=Se reiniciarán todas las estadÃsticas de uso de filtros y se desactivarán dichas estadÃsticas de uso de filtros. ¿Desea continuar con la acción? +filter_unknown_option=Opción de filtrado desconocida +type_label_genericblock=bloqueo genérico notification_antiadblock_message=Se sabe que este sitio ha mostrado en el pasado mensajes dirigidos a los usuarios de Adblock Plus. ¿Quiere que Adblock Plus oculte esos mensajes? blocked_count_addendum=(en lista blanca: ?1?, ocultos: ?2?) subscription_invalid_location=La dirección de la lista de filtros no es una URL ni una ruta de archivo válida. +type_label_websocket=websocket type_label_image=imagen remove_subscription_warning=¿Está seguro de querer eliminar esta suscripción? +type_label_generichide=ocultación genérica type_label_other=otro mobile_menu_enable=ABP: Activar type_label_media=audio/vÃdeo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Activar en ?1? type_label_elemhide=oculto newGroup_title=Nuevo grupo de filtros default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/overlay.dtd index 2586c95..7b4c219 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/overlay.dtd @@ -1,6 +1,7 @@ -<!ENTITY notification.button.no "& No"> +<!ENTITY notification.button.no "&No"> <!ENTITY sync.label "Sincroni&zar predisposiciones de Adblock Plus"> <!ENTITY whitelist.site.label "Desactivar en ?1?"> +<!ENTITY notification.closing.button.hide "C&errar este aviso"> <!ENTITY filters.label "&Preferencias de filtros"> <!ENTITY disable.label "Desactivar globalmente"> <!ENTITY objecttab.title "Bloquear"> @@ -10,13 +11,15 @@ <!ENTITY sendReport.label "&Informar de un problema en esta página"> <!ENTITY whitelist.page.label "Desactivar sólo en esta página"> <!ENTITY context.image.label "ABP - Bloquear imagen"> -<!ENTITY notification.button.yes "& SÃ"> +<!ENTITY notification.button.yes "&SÃ"> <!ENTITY opensidebar.label "Abrir &ventana elementos bloqueables"> <!ENTITY notification.button.close "&Cerrar"> +<!ENTITY shownotifications.label "M&ostrar avisos útiles"> <!ENTITY contribute.label "Ayudar a Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "ABP - Bloquear marco"> <!ENTITY blocked.tooltip "Elementos bloqueados en esta página:"> +<!ENTITY notification.closing.button.optout "&Dejar de mostrar avisos"> <!ENTITY counthits.label "Contar &usos de filtros"> <!ENTITY showinstatusbar.label "Mostrar en la barra &de estado"> <!ENTITY sidebar.title "Elementos bloqueables en la página actual"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Mostrar en la barra de &herramientas"> <!ENTITY status.tooltip "Estado:"> <!ENTITY context.media.label "ABP - Bloquear vÃdeo/audio"> -<!ENTITY subscription.update.label "Actualizar filtros"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/sendReport.dtd index 63a2bcc..0de9ba8 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-ES/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "Sus informes más recientes"> <!ENTITY typeWarning.description "Usted ha indicado que quiere informar de un problema atribuible a Adblock Plus y no a los filtros utilizados. Tenga en cuenta que suele ser mejor informar de este tipo de problemas en el [link]foro de Adblock Plus[/link], y utilizar el generador de informes de problemas sólo como añadido en una discusión ya existente, puesto que nadie se apercibirá de su informe a menos que aporte un enlace al mismo. Tras enviar el informe se le mostrará el enlace generado automáticamente."> <!ENTITY issues.disabled.description "Adblock Plus está desactivado, no bloqueará nada en este estado."> -<!ENTITY attachExtensions.label "Adjuntar una lista de e&xtensiones activas al informe por si la causa del problema es un conflicto entre extensiones"> +<!ENTITY attachExtensions.label "Adjuntar al informe una lista de extensiones activas por si la causa del problema fuera un conflicto entre ellas"> <!ENTITY issues.nosubscriptions.add.label "Añadir suscripción de filtros"> <!ENTITY issues.disabledfilters.enable.label "Activar filtro"> <!ENTITY issues.override.label "La &configuración es correcta, puede seguir con el informe"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/filters.dtd index 5e9cc80..6153ae3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Permitir algo de publicidad no intrusiva"> <!ENTITY addSubscriptionOther.label "Agregar una suscripción diferente"> <!ENTITY close.label "Cerrar"> +<!ENTITY findbar.caseSensitive "Coincidir May/minús"> <!ENTITY sort.none.label "&Sin clasificar"> <!ENTITY filter.actions.label "Comportamiento/Acción de filtros"> <!ENTITY filter.copy.label "Copiar"> @@ -62,12 +63,17 @@ <!ENTITY find.label "&Buscar"> <!ENTITY subscription.moveDown.label "Mover abajo"> <!ENTITY subscription.lastDownload.connectionError "Falló, La descarga ha fracasado"> +<!ENTITY findbar.statusWrappedStart "Se alcanzó el principio, continúa desde el final"> <!ENTITY subscription.lastDownload.success "Éxito"> +<!ENTITY findbar.placeholder "Buscar filtro"> <!ENTITY subscription.lastDownload.invalidData "Falló, no es una lista de filtros válida"> +<!ENTITY findbar.close "Cerrar barra de búsqueda"> <!ENTITY filter.paste.label "Pegar"> <!ENTITY subscription.disabledFilters.enable "Activar filtros desactivados"> <!ENTITY lasthit.column "&Ultima visita"> +<!ENTITY findbar.statusWrappedEnd "Se ha alcanzado el final, continúa desde el principio"> <!ENTITY subscription.editTitle.label "Editar tÃtulo"> +<!ENTITY findbar.statusNotFound "Frase no encontrada"> <!ENTITY subscription.disabledFilters.warning "Algunos filtros en esta suscripción se encuentran desactivados."> <!ENTITY filter.column "Regla de &filtro"> <!ENTITY subscription.lastDownload.label "Ultima descarga:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/firstRun.properties index cba6701..16a3d2f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Disponible para Android e iOS +firstRun_abbButtonTitle=Obtén Adblock Browser aquà +firstRun_abbPromotionHeadline=¿Tienes un smartphone o una tableta? firstRun_acceptableAdsExplanation=Nos gustarÃa fomentar en los sitios web, el uso de publicidad discreta y directa. Es por eso que hemos establecido <a>lineamientos estrictos</a> para identificar anuncios aceptables, que son mostrados bajo las configuraciones predeterminadas. Si aun asà deseas bloquear todos los anuncios, puedes <a>desactivar</a> esta opción en pocos segundos. firstRun_acceptableAdsHeadline=Anuncios molestos serán bloqueados firstRun_contributor_credits=Colaboradores diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/global.properties index fe253c1..c601129 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/global.properties @@ -1,11 +1,12 @@ no_blocking_suggestions=No hay elementos bloqueables en la página actual -action3_tooltip=Click para activar/desactivar Adblock Plus. +action3_tooltip=Pulse para activar/desactivar Adblock Plus. notification_antiadblock_title=¿Ocultar mensajes dirigidos? type_label_script=script filter_elemhide_nocriteria=No hay criterios especÃficos para reconocer el elemento que se oculta -blockingGroup_title=Reglas de Bloqueo de Anuncios +blockingGroup_title=Reglas de bloqueo de anuncios whitelisted_tooltip=Adblock Plus esta desactivado en la página actual. -type_label_stylesheet=estilo de hoja +type_label_ping=ping +type_label_stylesheet=hoja de estilo blocked_count_tooltip=?1? del total de ?2? type_label_font=fuente type_label_popup=ventana emergente @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus ha sido desactivado para la página actual remove_group_warning=¿Realmente desea eliminar este grupo? action1_tooltip=Click para abrir/cerrar elementos bloqueables, click medio para activar/desactivar. type_label_xmlhttprequest=Solicitud XML +filter_invalid_regexp=Expresión regular no válida active_tooltip=Adblock Plus esta activado, ?1? suscripción(es) de filtro(s) y ?2? filtro(s) personalizado(s) en uso. type_label_document=documento type_label_object_subrequest=Solicitud de objeto @@ -24,18 +26,23 @@ filter_elemhide_duplicate_id=Solo una ID de el elemento oculto puede ser especif type_label_object=objeto action2_tooltip=Click para abrir las Preferencias, click medio para activar/desactivar. type_label_subdocument=marco -clearStats_warning=Esto reiniciará todas las estadÃsticas de filtros afectados y desactivará el conteo de accesos de los filtros. ¿Deseas proceder? -notification_antiadblock_message=Es sabido que este sitio muestra mensajes dirigidos a los usuarios de Adblock Plus. ¿Quieres que Adblock plus oculte estos mensajes? -blocked_count_addendum=(tambien permitidos: ?1?, ocultos: ?2?) +clearStats_warning=Se reiniciarán todas las estadÃsticas de uso de filtros y se desactivarán dichas estadÃsticas de uso de filtros. ¿Desea continuar con la acción? +filter_unknown_option=Opción de filtro desconocida +type_label_genericblock=bloqueo genérico +notification_antiadblock_message=Se sabe que este sitio ha mostrado en el pasado mensajes dirigidos a los usuarios de Adblock Plus. ¿Quiere que Adblock Plus oculte esos mensajes? +blocked_count_addendum=(también permitidos: ?1?, ocultos: ?2?) subscription_invalid_location=La ubicación de la lista de filtros no es ni una dirección URL válida, ni un nombre de archivo válido. +type_label_websocket=websocket type_label_image=imagen -remove_subscription_warning=¿Realmente deseas quitar esta subscripción? +remove_subscription_warning=¿Está seguro de querer eliminar esta suscripción? +type_label_generichide=ocultación genérica type_label_other=otro -mobile_menu_enable=ABP: activar +mobile_menu_enable=ABP: Habilitar type_label_media=sonido/video -mobile_menu_disable_site=¿ABP: Deshabilitar en ?1? -elemhideGroup_title=Reglas para Ocultar Elementos -mobile_menu_enable_site=¿ABP: Habilitar en ?1? +mobile_menu_disable_site=ABP: Desactivado para ?1? +elemhideGroup_title=Reglas para ocultar elementos +mobile_menu_enable_site=ABP: Activado para ?1? type_label_elemhide=oculto newGroup_title=Nuevo grupo de filtros default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/overlay.dtd index 379cb9a..04bfdb7 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&No"> <!ENTITY sync.label "&Sincronizar configuración de Adblock Plus"> <!ENTITY whitelist.site.label "Desactivar en ?1?"> +<!ENTITY notification.closing.button.hide "Cerrar &estas notificaciones"> <!ENTITY filters.label "&Preferencias de filtro"> <!ENTITY disable.label "Desactivado en cualquier lugar"> <!ENTITY objecttab.title "Bloquear"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&SÃ"> <!ENTITY opensidebar.label "Abrir elementos bloqueables"> <!ENTITY notification.button.close "&Cerrar"> +<!ENTITY shownotifications.label "Mostrar &notificaciones útiles"> <!ENTITY contribute.label "Desactivar con Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock plus"> <!ENTITY context.frame.label "Adblock Plus: Bloquear marco"> <!ENTITY blocked.tooltip "Elementos bloqueados en esta pagina:"> +<!ENTITY notification.closing.button.optout "&Parar mostrando notificaciones"> <!ENTITY counthits.label "Contar accesos de &filtro"> <!ENTITY showinstatusbar.label "&Mostrar en la barra de estado"> <!ENTITY sidebar.title "Elementos bloqueables en la página actual"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Mostrar barra de &complementos"> <!ENTITY status.tooltip "Estado:"> <!ENTITY context.media.label "Adblock Plus: Bloquear sonido/video"> -<!ENTITY subscription.update.label "Actualizar filtros"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/sendReport.dtd index eb5b334..26ff395 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/sendReport.dtd @@ -20,7 +20,7 @@ <!ENTITY typeSelector.description "Esta ventana lo guiará por pasos, necesarios para el envio de un reporte de problemas de Adblock Plus. Primero, por favor seleccione el tipo de problema que esta experimentando en esta página:"> <!ENTITY screenshot.remove.label "Q&uitar datos sensitivos/privados"> <!ENTITY issues.ownfilters.description "Alguno de los filtros aplicados en esta página se encuentran definidos por el usuarios. Por favor desactive los filtros que pueden causar el problema:"> -<!ENTITY update.inProgress.description "AdBlock Plus necesita actualizar sus suscripciones de filtro para asegurarse de que el problema no ha sido resuelto ya. Por favor, espere..."> +<!ENTITY update.inProgress.description "Adblock Plus necesita actualizar sus suscripciones de filtro para asegurarse de que el problema no ha sido resuelto ya. Por favor, espere..."> <!ENTITY sendPage.retry.label "Enviar otra vez"> <!ENTITY data.label "Da&tos de Reporte"> <!ENTITY recentReports.label "Tus reportes recientemente enviados"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/subscriptionSelection.dtd index c43540e..dd353a1 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/es-MX/subscriptionSelection.dtd @@ -3,10 +3,10 @@ <!ENTITY list.download.retry "Intente de nuevo"> <!ENTITY title.label "&Titulo de la Suscripción:"> <!ENTITY list.download.website "Ver sitio web"> -<!ENTITY supplementMessage "Esta suscripción de filtros está orientada a ser usada con la subscripción de filtro "?1?" la cual aun no está usando."> +<!ENTITY supplementMessage "Esta suscripción de filtro está destinada a ser utilizada con la suscripción de filtro "?1?" que no está usando todavÃa."> <!ENTITY viewList.label "Ver filtros"> <!ENTITY visitHomepage.label "Visitar pagina principal"> <!ENTITY addSubscription.label "Agregar subscripción"> -<!ENTITY dialog.title "Agregar subscripción de filtro de Adblock Plus"> +<!ENTITY dialog.title "Agregar suscripción de filtro de Adblock Plus"> <!ENTITY location.label "&Ubicación de la lista de filtros:"> <!ENTITY fromWeb.description "Por favor confirme que desea agregar esta subscripción de filtro. Usted puede cambiar el titulo de la subscripción o la localización antes de agregarla."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/et/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/et/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/et/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/et/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/et/filters.dtd index 29d8bc5..9392bce 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/et/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/et/filters.dtd @@ -70,3 +70,9 @@ <!ENTITY filter.column "Filtri reegel"> <!ENTITY subscription.lastDownload.label "Viimati alla laaditud:"> <!ENTITY viewList.label "Vaata loetelu"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/et/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/et/firstRun.properties index 811de44..f04923f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/et/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/et/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Saadaval Androidile ja iOSile +firstRun_abbButtonTitle=Hankige Adblock Browser siit +firstRun_abbPromotionHeadline=Kas sul on nutitelefon või tahvelarvuti? firstRun_acceptableAdsExplanation=Sooviksime julgustada veebilehti kasutama otsekoheseid, mittehäirivaid reklaame. Sellepärast on meil <a>ranged eeskirjad</a>, et tuvastada lubatavaid reklaame, mida kuvatakse vaikimise sätete all. Kui sa ikka soovid kõik reklaamid blokeerida, saad sa selle paari sekundi pärast <a>välja lülitada</a>. firstRun_acceptableAdsHeadline=Tüütud kuulutused on nüüd blokeeritud firstRun_dataCorruptionWarning=Kas see leht ilmub ikka? <a>Kliki siia!</a> @@ -14,7 +17,5 @@ firstRun_share_headline=<a>Anna meile käsi</a> veebi muutmises paremaks kohaks firstRun_title=Adblock Plus on paigaldatud firstRun_toggle_off=VÄLJAS firstRun_toggle_on=SEES -firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move. -firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior. firstRun_contributor_credits=Contributor Credits firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>. diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/et/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/et/global.properties index 7802c1e..5eedb45 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/et/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/et/global.properties @@ -1,9 +1,11 @@ no_blocking_suggestions=Antud lehel ei leidu blokeeritavaid elemente action3_tooltip=Hiireklõps lubab/keelab Adblock Plusi. +notification_antiadblock_title=Peida suunatud sõnumid? type_label_script=skript filter_elemhide_nocriteria=Pole antud ühtegi kriteeriumit peidetava elemendi äratundmiseks blockingGroup_title=Blokeerivad reeglid whitelisted_tooltip=Antud lehel on Adblock Plus keelatud. +type_label_ping=ping type_label_stylesheet=laaditabel blocked_count_tooltip=?1?, elemente kokku ?2? type_label_font=font @@ -14,6 +16,7 @@ whitelisted_page=Adblock Plus on antud lehel keelatud remove_group_warning=Kas oled kindel, et soovid seda gruppi kustutada? action1_tooltip=Hiireklõps avab/sulgeb blokeeritavad elemendid, klõps keskmisel nupul lubab/keelab lisa. type_label_xmlhttprequest=XML päring +filter_invalid_regexp=Vigane regulaaravaldis active_tooltip=Adblock Plus on lubatud, kasutusel on ?1? filtrite tellimus(t) ja ?2? isetehtud filtrit. type_label_document=dokument type_label_object_subrequest=objekti alampäring @@ -24,6 +27,7 @@ type_label_object=objekt action2_tooltip=Hiireklõps avab sätted, klõps keskmisel nupul lubab/keelab lisa. type_label_subdocument=raam clearStats_warning=See nullistab kõigi filtrite tabamuste statistika ja keelab filtrite tabamuste loendamise. Kas soovid jätkata? +notification_antiadblock_message=See sait on teadaolevalt näidanud Adblock Plusi kasutajatele suunatud sõnumeid. Kas tahad, et Adblock need suunatud sõnumid peidaks? blocked_count_addendum=(valges nimekirjas: ?1?, peidetud: ?2?) subscription_invalid_location=Filtrite nimekirja asukoht on kas vigane URL või failinimi. type_label_image=pilt @@ -37,5 +41,8 @@ mobile_menu_enable_site=ABP: Luba saidil ?1? type_label_elemhide=peidetud newGroup_title=Uus filtrite grupp default_dialog_title=Adblock Plus -notification_antiadblock_title=Hide targeted messages? -notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages? +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +filter_unknown_option=Unknown filter option +type_label_genericblock=generic block +type_label_websocket=websocket +type_label_generichide=generic hide diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/et/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/et/overlay.dtd index 7110613..49827b4 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/et/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/et/overlay.dtd @@ -1,5 +1,7 @@ +<!ENTITY notification.button.no "&Ei"> <!ENTITY sync.label "Sün&kroniseeri Adblock Plus sätted"> <!ENTITY whitelist.site.label "Keela domeenis ?1?"> +<!ENTITY notification.closing.button.hide "Sulge &teade"> <!ENTITY filters.label "Filtrite sätted"> <!ENTITY disable.label "Keela kõikjal"> <!ENTITY objecttab.title "Blokeeri"> @@ -9,11 +11,15 @@ <!ENTITY sendReport.label "&Teata probleemist antud lehel"> <!ENTITY whitelist.page.label "Keela ainult antud lehel"> <!ENTITY context.image.label "Adblock Plus: Blokeeri pilt"> +<!ENTITY notification.button.yes "&Jah"> <!ENTITY opensidebar.label "Ava blokeeritavad elemendid"> +<!ENTITY notification.button.close "&Sulge"> +<!ENTITY shownotifications.label "Näita &kasulikke teateid"> <!ENTITY contribute.label "Toeta Adblock Plus'i"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Blokeeri raam"> <!ENTITY blocked.tooltip "Blokeeritud elemendid antud lehel:"> +<!ENTITY notification.closing.button.optout "E&nam ei näidata teateid"> <!ENTITY counthits.label "Loenda &filtrite tabamusi"> <!ENTITY showinstatusbar.label "Näita &olekuribal"> <!ENTITY sidebar.title "Blokeeritavad elemendid antud lehel"> @@ -25,7 +31,3 @@ <!ENTITY showintoolbar.label "Nä&ita tööriistade menüüs"> <!ENTITY status.tooltip "Olek:"> <!ENTITY context.media.label "Adblock Plus: Blokeeri audio/video"> -<!ENTITY notification.button.no "&No"> -<!ENTITY notification.button.yes "&Yes"> -<!ENTITY notification.button.close "&Close"> -<!ENTITY subscription.update.label "Uuenda filtreid"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eu/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/eu/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eu/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eu/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/eu/filters.dtd index 71aabc9..4ad8b82 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eu/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eu/filters.dtd @@ -44,6 +44,7 @@ <!ENTITY acceptableAds2.label "Baimendu publizitate ez &intrusiboa"> <!ENTITY addSubscriptionOther.label "Gehitu beste harpidetza bat"> <!ENTITY close.label "Itxi"> +<!ENTITY findbar.caseSensitive "Bereizi letra Larriak/xeheak"> <!ENTITY sort.none.label "Ordenatu &gabe"> <!ENTITY filter.actions.label "Iragazki ekintzak"> <!ENTITY filter.copy.label "Kopiatu"> @@ -52,7 +53,7 @@ <!ENTITY readMore.label "Gehiago irakurri"> <!ENTITY subscription.moveUp.label "Igo"> <!ENTITY addSubscription.label "Geh&itu iragazki harpidetza"> -<!ENTITY subscription.homepage.label "Hasiera orria"> +<!ENTITY subscription.homepage.label "Webgunea"> <!ENTITY backup.complete.title "Iragazki eta harpidetza guztiak"> <!ENTITY restore.own.label "Segurtasun kopia propioa berrezarri"> <!ENTITY restore.complete.warning "Zure iragazki hobespen guztiak aukeratutako fitxategiko edukiarekin ordeztuko dira. Aurrera jarraitu nahi duzu?"> @@ -61,13 +62,18 @@ <!ENTITY find.label "&Bilatu"> <!ENTITY subscription.moveDown.label "Jaitsi"> <!ENTITY subscription.lastDownload.connectionError "Huts egin du; deskarga errorea"> +<!ENTITY findbar.statusWrappedStart "Gorarte heldu da, behetik jarraitzen"> <!ENTITY subscription.lastDownload.success "Ongi"> +<!ENTITY findbar.placeholder "Aurkitu iragazkia"> <!ENTITY subscription.lastDownload.invalidData "Huts egin du; ez da iragazki zerrenda baliagarria"> +<!ENTITY findbar.close "Aukeratu bilaketa-barra"> <!ENTITY filter.paste.label "Itsatsi"> <!ENTITY subscription.disabledFilters.enable "Gaitu desgaitutako iragazkiak"> <!ENTITY lasthit.column "&Azken bategitea"> +<!ENTITY findbar.statusWrappedEnd "Beherarte heldu da, goitik jarraitzen"> <!ENTITY subscription.editTitle.label "Editatu izenburua"> +<!ENTITY findbar.statusNotFound "Ez da esaldia aurkitu"> <!ENTITY subscription.disabledFilters.warning "Harpidetza honetako iragazki batzuk desgaituta daude."> -<!ENTITY filter.column "&Iragazki araua"> +<!ENTITY filter.column "&Iragazki-araua"> <!ENTITY subscription.lastDownload.label "Azken deskarga:"> <!ENTITY viewList.label "Ikusi zerrenda"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eu/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/eu/firstRun.properties index ccaf965..fe0a6b8 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eu/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eu/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Android eta iOS-entzat +firstRun_abbButtonTitle=Eskuratu Adblock Browser hemen +firstRun_abbPromotionHeadline=Smartphone edo tablet-a duzu? firstRun_acceptableAdsExplanation=Webguneak publizitate zintzoa eta ez intrusiboa erabiltzera bultzatu nahi ditugu. Horregatik <a>arau zorrotzak</a> ezarri ditugu iragarki onargarriak bereizteko, lehenetsitako hobespenetan daude ikusgai. Iragarki guztiak blokeatu nahi badituzu aukera hau <a>desgaitu</a> dezakezu. firstRun_acceptableAdsHeadline=Iragarki gogaikarriak blokeatuko dira orain firstRun_contributor_credits=Parte-hartzaileen kredituak diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eu/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/eu/global.properties index 47a7564..1c37939 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eu/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eu/global.properties @@ -5,6 +5,7 @@ type_label_script=scripta filter_elemhide_nocriteria=Ez da zehaztu ezkutatu beharreko elementua aurkitzeko irizpiderik blockingGroup_title=Publizitatea blokeatzeko arauak whitelisted_tooltip=Adblock Plus orri honetan desgaituta dago. +type_label_ping=ping type_label_stylesheet=estilo orria blocked_count_tooltip=?1? / ?2? type_label_font=letra-tipoa @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus ezgaitu egin da uneko orrirako remove_group_warning=Ziur talde hau ezabatu nahi duzula? action1_tooltip=Egin klik elementu blokeagarriak irekitzeko/ixteko; egin erdiko klika gaitzeko/desgaitzeko. type_label_xmlhttprequest=XML eskakizuna +filter_invalid_regexp=Adierazpen erregular baliogabea active_tooltip=Adblock Plus gaituta dago, ?1? iragazki harpidetza eta ?2? iragazki pertsonal erabiliz. type_label_document=dokumentua type_label_object_subrequest=objektu azpieskakizuna @@ -22,14 +24,19 @@ whitelistGroup_title=Salbuespen arauak disabled_tooltip=Adblock Plus ezgaituta dago. filter_elemhide_duplicate_id=Ezkutatu beharreko elementuaren ID bakarra zehaztu daiteke type_label_object=objektua +filter_elemhideemulation_nodomain=Ez da domeinu aktiborik zehaztu elementuak ezkutatzeko iragazki hedatuarentzat action2_tooltip=Egin klik hobespenak irekitzeko, egin erdiko klika gaitzeko/desgaitzeko. type_label_subdocument=markoa clearStats_warning=Honek bategite estatistika guztiak ezabatuko ditu eta iragazkien bategiteak zenbatzeari utziko zaio. Aurrera jarraitu nahi duzu? -notification_antiadblock_message=Webgune honek Adblock Plus erabiltzaileei zuzendutako mezuak erakusten dituela dakigu. Adblock Plus-ek mezu hauek ezkutatzea nahi duzu? +filter_unknown_option=Iragazki aukera ezezaguna +type_label_genericblock=blokeo generikoa +notification_antiadblock_message=Webgune honek Adblock Plus erabiltzaileei zuzendutako mezuak erakusten dituela dakigu. Adblock Plusek mezu hauek ezkutatzea nahi duzu? blocked_count_addendum=(baita baimenduta: ?1?, ezkutuan: ?2?) subscription_invalid_location=Iragazki zerrendaren kokagunea ez da balio duen URLa, ezta fitxategi baten izena ere. +type_label_websocket=websocket type_label_image=irudia remove_subscription_warning=Ziur harpidetza hau ezabatu nahi duzula? +type_label_generichide=ezkutatze generikoa type_label_other=beste bat mobile_menu_enable=ABP: Gaitua type_label_media=audioa/bideoa diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eu/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/eu/overlay.dtd index fa15990..6076725 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eu/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eu/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ez"> <!ENTITY sync.label "&Sinkronizatu Adblock Plus ezarpenak"> <!ENTITY whitelist.site.label "Ezgaitu hemen: ?1?"> +<!ENTITY notification.closing.button.hide "I&txi jakinarazpen hau"> <!ENTITY filters.label "&Iragazki hobespenak"> <!ENTITY disable.label "Ezgaitu edonon"> <!ENTITY objecttab.title "Blokeatu"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Bai"> <!ENTITY opensidebar.label "Ire&ki elementu blokeagarriak"> <!ENTITY notification.button.close "&Itxi"> +<!ENTITY shownotifications.label "Erakutsi &jakinarazpen erabilgarriak"> <!ENTITY contribute.label "Adblock Plus-en parte hartu"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Markoa blokeatu"> <!ENTITY blocked.tooltip "Orri honetan blokeatutako elementuak:"> +<!ENTITY notification.closing.button.optout "&Utzi jakinarazpenak erakusteari"> <!ENTITY counthits.label "Zenbatu iragazkien &bategiteak"> <!ENTITY showinstatusbar.label "Erakutsi &egoera-barran"> <!ENTITY sidebar.title "Elementu blokeagarriak uneko orrialdean"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Erakutsi &tresna-barran"> <!ENTITY status.tooltip "Egoera:"> <!ENTITY context.media.label "Adblock Plus: audio/bideoa blokeatu"> -<!ENTITY subscription.update.label "Eguneratu iragazkiak"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eu/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/eu/sendReport.dtd index 91e07fb..d7191ab 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eu/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eu/sendReport.dtd @@ -3,7 +3,7 @@ <!ENTITY showData.label "Erakutsi txostenaren informazioa"> <!ENTITY typeSelector.falsePositive.label "Adblock Plus gehigarria behar baino gehia&go blokeatzen ari da"> <!ENTITY issues.change.description "Zure konfigurazioa aldatu da. Mesedez birkargatu orria aldaketak egiaztatzeko eta bidali txostena arazoa konpondu ez bada."> -<!ENTITY email.label "E-&Posta:"> +<!ENTITY email.label "E&Posta:"> <!ENTITY issues.openPreferences.label "Ireki iragazki hobespenak"> <!ENTITY sendPage.confirmation "Zure txostena gorde egin da. Honako helbidean eskuratu dezakezu:"> <!ENTITY copyLink.label "Ko&piatu txostenaren lotura"> @@ -24,7 +24,7 @@ <!ENTITY sendPage.retry.label "Bidali berriro"> <!ENTITY data.label "Txostenaren informa&zioa:"> <!ENTITY recentReports.label "Orain dela gutxi bidalitako txostenak"> -<!ENTITY typeWarning.description "Adblock Plusen arazo orokor, baten txostena egin nahi duzula esan duzu, ez iragazkiena. Jabetu zaitez arazo horien berri emateko hobe dela [link]Adblock Plus forum[/link] foroa erabiltza. Arazoen txosten bidalketa erabili soilik badagoen eztabaida bati eransteko, inork ez duelako zure txostena ikusiko lotura bat ematen ez baduzu. Automatikoki sortutako lotura bat emango zaizu txostena bidali eta gero."> +<!ENTITY typeWarning.description "Adblock Plusen arazo orokor baten txostena egin nahi duzula esan duzu, ez iragazkiena. Jabetu zaitez arazo horien berri emateko hobe dela [link]Adblock Plus forum[/link] foroa erabiltzea. Arazoen txosten bidalketa erabili soilik badagoen eztabaida bati eransteko, inork ez duelako zure txostena ikusiko lotura bat ematen ez baduzu. Automatikoki sortutako lotura bat emango zaizu txostena bidali eta gero."> <!ENTITY issues.disabled.description "Adblock Plus ezgaituta dago, ez du ezer blokeatuko oraingo egoeran."> <!ENTITY attachExtensions.label "Erant&si gehigarri aktiboen zerrenda bat txostenera hauen arteko konfliktoak arazoa sor balezakete"> <!ENTITY issues.nosubscriptions.add.label "Gehitu iragazki harpidetza"> @@ -51,7 +51,7 @@ <!ENTITY typeSelector.falseNegative.label "Adblock Plusek ez du &iragarki bat blokeatzen"> <!ENTITY typeSelector.heading "Aukeratu arazo mota"> <!ENTITY anonymity.warning "Ezin izango gara zurekin kontatuan jarri eta ziurrenez lehentasun gutxiago emango diogu txosten honi."> -<!ENTITY wizard.title "Arazoaren txostena bidali da"> +<!ENTITY wizard.title "Arazo txostena"> <!ENTITY issues.ownfilters.disable.label "Iragazkia ezgaitu"> <!ENTITY commentPage.description "Beheko testu eremuak guk arazoa hobeto ulertzeko iruzkin bat sartzea baimentzen dizu. Hau aukerazkoa da baina gomendagarria arazoa begi-bistakoa ez bada. Gainera, txostenaren informazioa gainbegiratu dezakezu bidali aurretik."> <!ENTITY comment.lengthWarning "Iruzkinak 1000 karaktere baino gehiago ditu. Lehen 1000 karaktereak bidaliko dira soilik."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/eu/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/eu/subscriptionSelection.dtd index 0442e3f..af03a7d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/eu/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/eu/subscriptionSelection.dtd @@ -5,7 +5,7 @@ <!ENTITY list.download.website "Ikusi webgunea"> <!ENTITY supplementMessage "Iragazki harpidetza hau "?1?" iragazki harpidetzarekin batera erabiltzekoa da eta zuk ez duzu oraindik erabiltzen."> <!ENTITY viewList.label "Ikusi iragazkiak"> -<!ENTITY visitHomepage.label "Bisitatu hasiera orria"> +<!ENTITY visitHomepage.label "Bisitatu webgunea"> <!ENTITY addSubscription.label "Gehitu harpidetza"> <!ENTITY dialog.title "Gehitu Adblock Plus iragazki harpidetza"> <!ENTITY location.label "Iragaz&ki zerrendaren kokagunea:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fa/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fa/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fa/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fa/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fa/filters.dtd index 2f4d957..425ae65 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fa/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fa/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "اجازه دادن به تبلیغات ناخواسته (&i)"> <!ENTITY addSubscriptionOther.label "یک اشتراک ديگر اضاÙÙ‡ کنید"> <!ENTITY close.label "بستن"> +<!ENTITY findbar.caseSensitive "مطابقت ØØ§Ù„ت ØØ±ÙˆÙ"> <!ENTITY sort.none.label "نا Ù…&رتب"> <!ENTITY filter.actions.label "اقدامات Ùیلتر"> <!ENTITY filter.copy.label "رونوشت"> @@ -60,12 +61,17 @@ <!ENTITY find.label "ÛŒØ§ÙØªÙ† (&n)"> <!ENTITY subscription.moveDown.label "ØØ±Ú©Øª به پایین"> <!ENTITY subscription.lastDownload.connectionError "ناموÙÙ‚ØŒ ÙØ±Ø¢ÛŒÙ†Ø¯ Ø¯Ø±ÛŒØ§ÙØª شکست خورد"> +<!ENTITY findbar.statusWrappedStart "به ابتدا رسید، ادامه از انتها"> <!ENTITY subscription.lastDownload.success "موÙÙ‚"> +<!ENTITY findbar.placeholder "سرند کردن ÛŒØ§ÙØªÙ‡ ها"> <!ENTITY subscription.lastDownload.invalidData "ناموÙÙ‚ØŒ Ùهرست پالایه ها نامعتبر است"> +<!ENTITY findbar.close "بستن میله‎ی جستجو"> <!ENTITY filter.paste.label "جای گذاری"> <!ENTITY subscription.disabledFilters.enable "ÙØ¹Ø§Ù„ کردن Ùیلتر های غیر ÙØ¹Ø§Ù„"> <!ENTITY lasthit.column "آخرین برخ&ورد"> +<!ENTITY findbar.statusWrappedEnd "به انتها رسید، ادامه از ابتدا"> <!ENTITY subscription.editTitle.label "ویرایش عنوان"> +<!ENTITY findbar.statusNotFound "عبارت پیدا نشد"> <!ENTITY subscription.disabledFilters.warning "برخی از Ùیلترها برای این اشتراک غیر ÙØ¹Ø§Ù„ Ù…ÛŒ باشد."> <!ENTITY filter.column "&قواعد Ùیلتر"> <!ENTITY subscription.lastDownload.label "آخرین Ø¯Ø±ÛŒØ§ÙØª:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fa/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fa/firstRun.properties index 0a1820f..5c49ed6 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fa/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fa/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=برای Android Ùˆ iOS موجود است +firstRun_abbButtonTitle=Adblock Browser را از این‌جا بگیرید +firstRun_abbPromotionHeadline=یک تلÙÙ† هوشمند یا تبلت دارید؟ firstRun_acceptableAdsExplanation=من Ù…ÛŒ خواهم وب سایت ها را تشویق کنم تا از تبلیغات درست Ùˆ ØØ³Ø§Ø¨ÛŒ بدون مزاØÙ…ت Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند. این دلیل ساختن <a> دستورالعمل های دقیق </a> است تا بتواند تبلیغات قابل قبول را بپذیرد Ùˆ آن ها را به شما نشان دهد ØŒ تبلیغاتی Ú©Ù‡ در شرایط استاندارد صدق کنند. اگر شما Ù…ÛŒ خواهید هر تبلیغی را از هر ØµÙØÙ‡ ای مسدود کنید Ù…ÛŒ توانید آن را در عرض چند ثانیه <a>غیر ÙØ¹Ø§Ù„</a> کنید. firstRun_acceptableAdsHeadline=تبلیغات آزار دهنده در ØØ§Ù„ ØØ§Ø¶Ø± مسدود خواهد شد firstRun_contributor_credits=اعتبار نویسندگان diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fa/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fa/global.properties index 6ada4e9..5ab8b15 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fa/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fa/global.properties @@ -3,11 +3,12 @@ action3_tooltip=برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„‌کردن Adblock Plus Ú© notification_antiadblock_title=آیا مایلید پیام های هدÙمند برای کاربران Adblock Plus را مخÙÛŒ نمایید؟ type_label_script=نویسه filter_elemhide_nocriteria=هیچ ضابطه ای برای شناسایی عناصری Ú©Ù‡ Ù…ÛŒ بایست پنهان شوند مشخص نشد. -blockingGroup_title=قوانین مسدود کردن تبلیغ +blockingGroup_title=قوانین مسدود کردن تبلیغات whitelisted_tooltip=Adblock Plus برای این ØµÙØÙ‡ ØºÛŒØ±ÙØ¹Ø§Ù„ شده است. +type_label_ping=پینگ type_label_stylesheet=شیوه نامه (stylesheet) blocked_count_tooltip=?1? از میان ?2? -type_label_font=قلم +type_label_font=Ùونت type_label_popup=پنجره پاپ آپ filter_regexp_tooltip=این Ùیلتر یا نوشته مرتب است یا این Ú©Ù‡ خیلی کوچکتر از آن است Ú©Ù‡ یک Ùیلتر مناسب باشد. تعداد زیادی از این نوشته ها Ù…ÛŒ تواند سرعت مرورگر شما را کاهش دهد. action0_tooltip=برای نمایش Ùهرست کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است. @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus برای ØµÙØÙ‡ جاری ØºÛŒØ±ÙØ¹Ø§Ù„ شده Ø remove_group_warning=واقعا Ù…ÛŒ خواهید این گروه را ØØ°Ù کنید؟ action1_tooltip=برای گشودن یا بستن موارد مسدود شده کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است. type_label_xmlhttprequest=XML خواسته شده +filter_invalid_regexp=الگوی جستجوی نامعتبر active_tooltip=Ùوق تبلیغ Ø´Ú©Ù† یا Adblock Plus ÙØ¹Ø§Ù„ است, ?1? اشتراک(های) Ùیلتر Ùˆ ?2? Ùیلتر(ها)ÛŒ Ø³ÙØ§Ø±Ø´ÛŒ در ØØ§Ù„ Ø§Ø³ØªÙØ§Ø¯Ù‡ هستند. type_label_document=سند type_label_object_subrequest=اشیاء زیرخواسته @@ -25,11 +27,15 @@ type_label_object=شیء action2_tooltip=برای گشودن ØªØ±Ø¬ÛŒØØ§Øª کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است. type_label_subdocument=قابک clearStats_warning=این کار تمام آمار ها را پاک کرده Ùˆ آمارگیری را متوق٠می کند. آیا مایل به توق٠هستید؟ +filter_unknown_option=Ùیلتر ناشناس +type_label_genericblock=بلاک عمومی notification_antiadblock_message=این سایت پیام های هدÙمند برای کاربران Adblock Plus نشان Ù…ÛŒ دهد. آیا مایلید Ú©Ù‡ Adblock Plus پیام های هدÙمند را از دید شما مخÙÛŒ کند؟ blocked_count_addendum=(همچنین Ùهرست سÙید: ?1?, پنهان: ?2?) subscription_invalid_location=مکان وارد شده برای Ùهرست Ùیلترها نامعتبر است. +type_label_websocket=وب سوکت type_label_image=تصویر remove_subscription_warning=آیا برای ØØ°Ù اشتراک مطمئن هستید؟ +type_label_generichide=پنهان سازی بر اساس نوع type_label_other=دیگر mobile_menu_enable=ABP: ÙØ¹Ø§Ù„ type_label_media=چند رسانه ای @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: ÙØ¹Ø§Ù„ کردن در ?1? type_label_elemhide=پنهان newGroup_title=گروه Ùیلتر جدید default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fa/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fa/overlay.dtd index 7c6c12a..8dc5a1b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fa/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fa/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&نه"> <!ENTITY sync.label "همگام سازی تن&ظیمات Adblock Plus"> <!ENTITY whitelist.site.label "ØºÛŒØ±ÙØ¹Ø§Ù„ در ?1?"> +<!ENTITY notification.closing.button.hide "بستن این اعلان"> <!ENTITY filters.label "& تنظیمات Ùیلتر"> <!ENTITY disable.label "غیر ÙØ¹Ø§Ù„ کردن در همه جا"> <!ENTITY objecttab.title "مسدود کردن"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "ب&له"> <!ENTITY opensidebar.label "باز کردن موارد &قابل مسدود سازی"> <!ENTITY notification.button.close "&بستن"> +<!ENTITY shownotifications.label "نمایش اعلان های Ù…Ùید"> <!ENTITY contribute.label "Ú©Ù…Ú© کردن به Adblock Plus"> <!ENTITY toolbarbutton.label "Ùوق تبلیغ Ø´Ú©Ù† یا Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus:سد قابک"> <!ENTITY blocked.tooltip "موارد رد شده در این ØµÙØÙ‡:"> +<!ENTITY notification.closing.button.optout "عدم نمایش اعلان ها"> <!ENTITY counthits.label "شمارش &تعداد Ùیلتر شده ها"> <!ENTITY showinstatusbar.label "نمایش در Ù†&وار وضعیت"> <!ENTITY sidebar.title "موارد قابل مسدود شدن در ØµÙØÙ‡ جاری"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "نمایش در نوار ا&بزار"> <!ENTITY status.tooltip "وضعیت:"> <!ENTITY context.media.label "Adblock Plus: سد داده های چند رسانه ای"> -<!ENTITY subscription.update.label "به روز رسانی Ùیلتر"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fi/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fi/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fi/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fi/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fi/filters.dtd index d6ccc11..a66fc99 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fi/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fi/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "S&alli osa ei-häiritsevästä mainonnasta"> <!ENTITY addSubscriptionOther.label "Lisää jokin muu tilaus"> <!ENTITY close.label "Sulje"> +<!ENTITY findbar.caseSensitive "Huomioi kirjainkoko"> <!ENTITY sort.none.label "Ei &lajiteltu"> <!ENTITY filter.actions.label "Suodatintoiminnot"> <!ENTITY filter.copy.label "Kopioi"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Etsi"> <!ENTITY subscription.moveDown.label "Siirrä alas"> <!ENTITY subscription.lastDownload.connectionError "Epäonnistui, latausvirhe"> +<!ENTITY findbar.statusWrappedStart "Päästiin alkuun, jatketaan lopusta"> <!ENTITY subscription.lastDownload.success "Onnistui"> +<!ENTITY findbar.placeholder "Etsi suodatin"> <!ENTITY subscription.lastDownload.invalidData "Epäonnistui, kelvoton suodatinlista"> +<!ENTITY findbar.close "Sulje hakupalkki"> <!ENTITY filter.paste.label "Liitä"> <!ENTITY subscription.disabledFilters.enable "Ota käytöstä poistetut suodattimet käyttöön"> <!ENTITY lasthit.column "&Viimeisin osuma"> +<!ENTITY findbar.statusWrappedEnd "Päästiin loppuun, jatketaan alusta"> <!ENTITY subscription.editTitle.label "Muokkaa otsikkoa"> +<!ENTITY findbar.statusNotFound "Ei osumia"> <!ENTITY subscription.disabledFilters.warning "Jotkin tämän suodatintilauksen suodattimista on poistettu käytöstä."> <!ENTITY filter.column "&Suodatusehto"> <!ENTITY subscription.lastDownload.label "Viimeisin lataus:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fi/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fi/firstRun.properties index 939cbb7..038c852 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fi/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fi/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Saatavilla Androidille ja iOS:lle +firstRun_abbButtonTitle=Hanki Adblock Browser täältä +firstRun_abbPromotionHeadline=Onko sinulla älypuhelin tai tabletti? firstRun_acceptableAdsExplanation=Kannustamme verkkosivuja käyttämään yksinkertaisia mainoksia, jotka eivät häiritse. Tämän vuoksi olemme luoneet <a>tiukat ohjesäännöt</a> hyväksyttävien mainosten tunnistamiseksi, jotka näytetään oletusasetuksilla. Jos silti haluat estää kaikki mainokset, voit ottaa tämän <a>pois käytöstä</a> käden käänteessä. firstRun_acceptableAdsHeadline=Häiritsevät mainokset estetään firstRun_contributor_credits=Avustajat: @@ -16,5 +19,3 @@ firstRun_legacySafariWarning=Käytössäsi on Safarin vanha versio, jota Adblock firstRun_share=Kerro ystävillesi firstRun_share_headline=<a>Auta meitä</a> tekemään verkosta parempi paikka firstRun_title=Adblock Plus on asennettu -firstRun_toggle_off=OFF -firstRun_toggle_on=ON diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fi/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fi/global.properties index fb17172..6aec8a6 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fi/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fi/global.properties @@ -5,6 +5,7 @@ type_label_script=komentosarja filter_elemhide_nocriteria=Piilotettavan elementin määrittävää tunnistetta ei annettu blockingGroup_title=Estoehdot whitelisted_tooltip=Adblock Plus ei ole käytössä tällä sivulla. +type_label_ping=pingata type_label_stylesheet=tyyliohje blocked_count_tooltip=?1? / ?2? type_label_font=kirjasin @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus on poistettu käytöstä tällä sivulla remove_group_warning=Haluatko varmasti poistaa tämän ryhmän? action1_tooltip=Napsautus avaa/sulkee elementtilistan. Keskinapsautus ottaa käyttöön/poistaa käytöstä. type_label_xmlhttprequest=XML-pyyntö +filter_invalid_regexp=Virheellinen normaali-ilmaus active_tooltip=Adblock Plus on käytössä. ?1? suodatintilaus(ta) ja ?2? oma(a) suodatin(ta) käytössä. type_label_document=asiakirja type_label_object_subrequest=objektin alipyyntö @@ -25,11 +27,15 @@ type_label_object=objekti action2_tooltip=Napsautus avaa asetukset. Keskinapsautus ottaa käyttöön/poistaa käytöstä. type_label_subdocument=kehys clearStats_warning=Tämä nollaa kaikki osumatilastot ja poistaa osumien laskemisen käytöstä. Haluatko jatkaa? +filter_unknown_option=Tuntematon suodatusvaihtoehto +type_label_genericblock=yleinen esto notification_antiadblock_message=Tämän sivun tiedetään näyttäneen kohdennettuja viestejä Adblock Plussan käyttäjille. Haluatko, että Adblock Plus piilottaa kohdennetut viestit? blocked_count_addendum=(sallittuja: ?1?, piilotettuja: ?2?) subscription_invalid_location=Suodatinlistan sijainti on joko kelvoton osoite tai tiedoston nimi. +type_label_websocket=websocket type_label_image=kuva remove_subscription_warning=Haluatko varmasti poistaa tämän tilauksen? +type_label_generichide=yleinen piilotus type_label_other=muu mobile_menu_enable=ABP: Ota käyttöön type_label_media=ääni/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Käytä sivustolla ?1? type_label_elemhide=piilotettu newGroup_title=Uusi suodatinryhmä default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fi/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fi/overlay.dtd index 89aa628..4e1ece3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fi/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fi/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ei"> <!ENTITY sync.label "&Synkronoi Adblock Plussan asetukset"> <!ENTITY whitelist.site.label "Ei käytössä osoitteessa ?1?"> +<!ENTITY notification.closing.button.hide "Sulje tämä i&lmoitus"> <!ENTITY filters.label "&Suodatinasetukset"> <!ENTITY disable.label "Poista käytöstä kaikkialla"> <!ENTITY objecttab.title "Estä"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Kyllä"> <!ENTITY opensidebar.label "Näytä &elementit"> <!ENTITY notification.button.close "&Sulje"> +<!ENTITY shownotifications.label "Näytä hyödylliset &ilmoitukset"> <!ENTITY contribute.label "Avusta Adblock Plussaa"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Estä kehys"> <!ENTITY blocked.tooltip "Estetyt elementit tällä sivulla:"> +<!ENTITY notification.closing.button.optout "L&opeta ilmoitusten näyttäminen"> <!ENTITY counthits.label "&Laske suodattimen osumat"> <!ENTITY showinstatusbar.label "&Näytä tilarivillä"> <!ENTITY sidebar.title "Estettävät elementit tällä sivulla"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Nä&ytä työkalupalkissa"> <!ENTITY status.tooltip "Tila:"> <!ENTITY context.media.label "Adblock Plus: Estä ääni/kuva"> -<!ENTITY subscription.update.label "Päivitä suodattimet"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fi/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fi/sidebar.dtd index 7575cdf..b090496 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fi/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fi/sidebar.dtd @@ -1,35 +1,35 @@ -<!ENTITY context.flash.label "Välkytä kohteen reunoja"> -<!ENTITY address.label "Osoite"> -<!ENTITY context.open.label "Avaa uuteen välilehteen"> +<!ENTITY context.flash.label "Valaise kohteen reunoja"> +<!ENTITY address.label "osoite"> +<!ENTITY context.open.label "Avaa uudessa välilehdessä"> <!ENTITY type.label "Tyyppi"> -<!ENTITY tooltip.filterSource.label "Suodattimen lähde:"> -<!ENTITY noitems.label "Ei estettäviä elementtejä"> -<!ENTITY filter.label "Suodatin"> +<!ENTITY tooltip.filterSource.label "Suodatin lähde:"> +<!ENTITY noitems.label "Ei estettäviä kohteita"> +<!ENTITY filter.label "Suodin"> <!ENTITY tooltip.size.label "Koko:"> <!ENTITY reattach.label "Kiinnitä"> -<!ENTITY search.label "&Etsi:"> +<!ENTITY search.label "& Etsi:"> <!ENTITY docDomain.thirdParty "(kolmas osapuoli)"> <!ENTITY filterSource.label "Suodattimen lähde"> -<!ENTITY tooltip.docDomain.label "Asiakirjan lähde:"> -<!ENTITY context.copy.label "Kopioi kohteen osoite"> +<!ENTITY tooltip.docDomain.label "Asiakirja lähde:"> +<!ENTITY context.copy.label "Jäljennä kohteen osoite"> <!ENTITY tooltip.type.label "Tyyppi:"> -<!ENTITY context.disablefilter.label "Poista käytöstä suodatin: ?1?"> -<!ENTITY context.copyFilter.label "Kopioi suodatin"> -<!ENTITY context.block.label "Estä elementti"> -<!ENTITY context.enablefilter.label "Ota käyttöön suodatin: ?1?"> -<!ENTITY detach.label "Irrota"> -<!ENTITY whitelisted.label "Sallittu sivu"> -<!ENTITY context.disablefilteronsite.label "Poista tämä suodatin käytöstä osoiteessa ?1?"> -<!ENTITY detached.title "Adblock Plus: Estettävien elementtien lista (irrotettu)"> +<!ENTITY context.disablefilter.label "Estä suodatin: ?1?"> +<!ENTITY context.copyFilter.label "Kopioi suodin"> +<!ENTITY context.block.label "Estä tämä kohde"> +<!ENTITY context.enablefilter.label "Salli suodatin: ?1?"> +<!ENTITY detach.label "Valitse"> +<!ENTITY whitelisted.label "Sallituksi määritetty sivu"> +<!ENTITY context.disablefilteronsite.label "Estä tämä suodatin kohteessa ?1?"> +<!ENTITY detached.title "Adblock Plus: Estettävissä olevien kohteiden lista (valittavissa)"> <!ENTITY docDomain.firstParty "(ensimmäinen osapuoli)"> -<!ENTITY tooltip.type.whitelisted "(sallittu)"> -<!ENTITY tooltip.filter.label "Vaikuttava suodatin:"> -<!ENTITY tooltip.filter.disabled "(poistettu käytöstä)"> -<!ENTITY context.editfilter.label "Muokkaa suodatinta"> +<!ENTITY tooltip.type.whitelisted "(Määritetty hyväksytyksi)"> +<!ENTITY tooltip.filter.label "Käytössä oleva suodatin:"> +<!ENTITY tooltip.filter.disabled "(ei käytössä)"> +<!ENTITY context.editfilter.label "Muokkaa käytössäolevaa suodatinta"> <!ENTITY tooltip.type.blocked "(estetty)"> <!ENTITY size.label "Koko"> -<!ENTITY context.whitelist.label "Lisää poikkeusehto"> -<!ENTITY context.selectAll.label "Valitse kaikki"> +<!ENTITY context.whitelist.label "Lisää kohteelle poikkeussääntö"> +<!ENTITY context.selectAll.label "Valitse kaikki kohteesta"> <!ENTITY state.label "Tila"> <!ENTITY docDomain.label "Asiakirjan lähde"> <!ENTITY tooltip.address.label "Osoite:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fr/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fr/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fr/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fr/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fr/filters.dtd index 6583fd9..6577f92 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fr/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fr/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Autor&iser certaines publicités non-intrusives"> <!ENTITY addSubscriptionOther.label "Ajouter un autre abonnement"> <!ENTITY close.label "Fermer"> +<!ENTITY findbar.caseSensitive "Sensible à la casse"> <!ENTITY sort.none.label "&Non trié"> <!ENTITY filter.actions.label "Actions sur filtre"> <!ENTITY filter.copy.label "Copier"> @@ -60,12 +61,17 @@ <!ENTITY find.label "Re&chercher"> <!ENTITY subscription.moveDown.label "Descendre"> <!ENTITY subscription.lastDownload.connectionError "Échec, erreur lors du téléchargement !"> +<!ENTITY findbar.statusWrappedStart "Haut atteint, continuant en bas"> <!ENTITY subscription.lastDownload.success "Réussie"> +<!ENTITY findbar.placeholder "Trouver un filtre"> <!ENTITY subscription.lastDownload.invalidData "Échec, ceci n'est pas une liste de filtres valide !"> +<!ENTITY findbar.close "Fermer la barre de recherche"> <!ENTITY filter.paste.label "Coller"> <!ENTITY subscription.disabledFilters.enable "Activer les filtres désactivés"> <!ENTITY lasthit.column "&Dernière utilisation"> +<!ENTITY findbar.statusWrappedEnd "Bas atteint, continuant en haut"> <!ENTITY subscription.editTitle.label "Modifier le nom"> +<!ENTITY findbar.statusNotFound "Phrase non trouvée"> <!ENTITY subscription.disabledFilters.warning "Certains filtres de cet abonnement sont désactivés."> <!ENTITY filter.column "Règle de &filtrage"> <!ENTITY subscription.lastDownload.label "Dernière mise à jour :"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fr/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fr/firstRun.properties index 10a7645..fd774d6 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fr/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fr/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Disponible pour Android et iOS +firstRun_abbButtonTitle=Obtenez Adblock Browser ici +firstRun_abbPromotionHeadline=Avez-vous un smartphone ou une tablette? firstRun_acceptableAdsExplanation=Nous aimerions encourager les sites Web à utiliser de la publicité honnête et discrète. C'est pourquoi nous avons établi <a>des lignes directrices strictes</a> afin d'identifier les annonces acceptables, par défaut. Si vous souhaitez tout de même bloquer toutes les publicités, vous pouvez <a>désactiver</a> cela dans les paramètres en quelques secondes. firstRun_acceptableAdsHeadline=Les pubs seront à présent bloquées firstRun_contributor_credits=Crédits des contributeurs diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fr/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fr/global.properties index 351b82d..2ffd22c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fr/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fr/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=Aucun critère spécifié pour reconnaître l'élément à masquer blockingGroup_title=Règles de blocage de publicités whitelisted_tooltip=Adblock Plus est désactivée pour cette page. +type_label_ping=ping type_label_stylesheet=feuille de styles blocked_count_tooltip=?1? bloqués sur ?2? type_label_font=police @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus a été désactivée pour cette page remove_group_warning=Souhaitez-vous vraiment supprimer ce groupe ? action1_tooltip=Cliquez pour ouvrir/fermer la liste des éléments filtrables, clic du milieu pour activer/désactiver. type_label_xmlhttprequest=requête XML +filter_invalid_regexp=Expression régulière non valide active_tooltip=Adblock Plus est active, ?1? abonnement(s) et ?2? filtre(s) personnel(s) utilisé(s). type_label_document=document type_label_object_subrequest=sous-requête objet @@ -25,11 +27,15 @@ type_label_object=objet action2_tooltip=Cliquez pour ouvrir les préférences, clic du milieu pour activer/désactiver. type_label_subdocument=cadre clearStats_warning=Cela va remettre à zéro les statistiques d'utilisation de filtre et désactiver le comptage d'utilisation de filtre. Souhaitez-vous vraiment faire cela ? +filter_unknown_option=Option de filtre inconnu +type_label_genericblock=blocage général notification_antiadblock_message=Ce site est connu pour afficher des messages destinés aux utilisateurs d'Adblock Plus. Voulez-vous qu'Adblock Plus cache ces messages ? blocked_count_addendum=(également en liste blanche : ?1?, masqué(s) : ?2?) subscription_invalid_location=L'adresse indiquant l'emplacement de la liste de filtres n'est ni une URL valide, ni un nom de fichier valide. +type_label_websocket=websocket type_label_image=image remove_subscription_warning=Souhaitez-vous vraiment supprimer cet abonnement ? +type_label_generichide=masquage général type_label_other=autre mobile_menu_enable=ABP : Activer type_label_media=audio/vidéo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP : Activer pour ?1? type_label_elemhide=masqué newGroup_title=Nouveau groupe de filtres default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fr/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fr/overlay.dtd index d8cc549..9b48fd9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fr/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fr/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Non"> <!ENTITY sync.label "S&ynchroniser les paramètres d'Adblock Plus"> <!ENTITY whitelist.site.label "Désactiver pour ?1?"> +<!ENTITY notification.closing.button.hide "Fermer c&ette notification"> <!ENTITY filters.label "Pré&férences de filtre"> <!ENTITY disable.label "Désactiver partout"> <!ENTITY objecttab.title "Bloquer"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Oui"> <!ENTITY opensidebar.label "Ouvrir la liste des élé&ments filtrables"> <!ENTITY notification.button.close "&Fermer"> +<!ENTITY shownotifications.label "Afficher les &notifications utiles"> <!ENTITY contribute.label "Contribuer à Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Bloquer le cadre avec Adblock Plus"> <!ENTITY blocked.tooltip "Éléments bloqués sur cette page :"> +<!ENTITY notification.closing.button.optout "&Ne plus afficher les notifications"> <!ENTITY counthits.label "Co&mpter la fréquence d'utilisation de filtre"> <!ENTITY showinstatusbar.label "Afficher da&ns la barre d'état"> <!ENTITY sidebar.title "Éléments filtrables dans la page courante"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Afficher dans la barre d'&outils"> <!ENTITY status.tooltip "État :"> <!ENTITY context.media.label "Bloquer les vidéos/audios avec Adblock Plus"> -<!ENTITY subscription.update.label "Mettre à jour les filtres"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/composer.dtd index 79d4830..0c2571d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/composer.dtd @@ -2,21 +2,21 @@ <!ENTITY domainRestriction.label "Behein ta do&mein"> <!ENTITY collapse.default.no.label "Brûk standert (nee)"> <!ENTITY firstParty.label "Allinnich earst diel"> -<!ENTITY preferences.label "&Toan besteande filters..."> +<!ENTITY preferences.label "&Besteande filters toane..."> <!ENTITY pattern.label "Sykje nei patroan"> <!ENTITY thirdParty.label "&Allinnich tredde diel"> -<!ENTITY filter.label "Nije filter:"> +<!ENTITY filter.label "Nije &filter:"> <!ENTITY collapse.label "Blokkearre ynklappe:"> -<!ENTITY match.warning "It patroan dy't jo opjûn hawwe is net lyk oan it adres om te blokkearjen/wytlisten en sil gjin effekt op it hawwe."> +<!ENTITY match.warning "It patroan dy’t jo opjûn hawwe is net lyk oan it adres om te blokkearjen/wytlisten en sil gjin effekt op it hawwe."> <!ENTITY anchor.start.label "oan it begjin fan it adres"> <!ENTITY matchCase.label "&Haadlettergefoelich"> <!ENTITY custom.pattern.label "&Oanpast:"> <!ENTITY unselectAllTypes.label "Selektearje neat"> <!ENTITY type.whitelist.label "&Utsûnderingsrigel"> -<!ENTITY regexp.warning "It patroan dy't jo opjûn hawwe sil ynterpretearre wurde as reguliere ekspresje. In protte reguliere ekspresjes kinne it sneupjen fertrage. As jo net fan plan wienen om reguliere ekspresje te brûken, foegje in symboal * ta oan it ein fan it patroan."> -<!ENTITY dialog.title "Foegje Adblock Plus filterrigel ta"> +<!ENTITY regexp.warning "It patroan dy’t jo opjûn hawwe sil ynterpretearre wurde as reguliere ekspresje. In protte reguliere ekspresjes kinne it sneupjen fertrage. As jo net fan plan wiene om reguliere ekspresje te brûken, foegje in symboal * ta oan it ein fan it patroan."> +<!ENTITY dialog.title "Adblock Plus-filterrigel tafoegje"> <!ENTITY basic.label "Basisbyld"> -<!ENTITY type.filter.label "Blokkearfilter"> +<!ENTITY type.filter.label "&Blokkearfilter"> <!ENTITY types.label "Tapasse op types:"> <!ENTITY shortpattern.warning "It patroan dy't jo opjûn hawwe is te koart om te optimalisearjen, in protte reguliere ekspresje kinne it sneupjen fertrage. It wurdt oanret dat jo in langere útdrukking kieze foar dit filter."> <!ENTITY collapse.yes.label "Ja"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/filters.dtd index 3ef491d..a3ca806 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Let sommige net skreauwende advertinsjes ta"> <!ENTITY addSubscriptionOther.label "In oar abonnemint tafoegje"> <!ENTITY close.label "sluten"> +<!ENTITY findbar.caseSensitive "Haadlettergefoelich"> <!ENTITY sort.none.label "&Net sortearre"> <!ENTITY filter.actions.label "Filter aksjes"> <!ENTITY filter.copy.label "Kopiearje"> @@ -62,12 +63,17 @@ <!ENTITY find.label "Sykje"> <!ENTITY subscription.moveDown.label "omleech"> <!ENTITY subscription.lastDownload.connectionError "Mislearre, ynlaadprobleem"> +<!ENTITY findbar.statusWrappedStart "Boppekant berikt, trochgien fan ûnderkant ôf"> <!ENTITY subscription.lastDownload.success "Slagge"> +<!ENTITY findbar.placeholder "Filter sykje"> <!ENTITY subscription.lastDownload.invalidData "Mislearre, gjin jildige filterlist"> +<!ENTITY findbar.close "Sykbalke slute"> <!ENTITY filter.paste.label "Plakke"> <!ENTITY subscription.disabledFilters.enable "Set filters oan"> <!ENTITY lasthit.column "Lêste hit"> +<!ENTITY findbar.statusWrappedEnd "Underkant berikt, trochgien fan boppekant ôf"> <!ENTITY subscription.editTitle.label "Namme oanpasse"> +<!ENTITY findbar.statusNotFound "Tekst net fûn"> <!ENTITY subscription.disabledFilters.warning "Sommige filters in dit abonnemint stean út."> <!ENTITY filter.column "Filterrigel"> <!ENTITY subscription.lastDownload.label "Lêste ynlaad:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/firstRun.properties index 760d6d6..d0b2f9f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/firstRun.properties @@ -18,3 +18,6 @@ firstRun_share_headline=<a>Jou ús in hantsje</a> om it web in moaiere plak te firstRun_title=Adblock is no ynstalleare firstRun_toggle_off=út firstRun_toggle_on=Oan +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/global.properties index 6e5bfc1..5a34530 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/global.properties @@ -1,33 +1,41 @@ no_blocking_suggestions=Gjin blokkearbere ûnderdielen op dizze side -action3_tooltip=Klik om Adblock Plus yn/út te skeakeljen. +action3_tooltip=Klik en skeakelje Adblock Plus yn/út. +notification_antiadblock_title=Rjochte berjochten ferbergje? type_label_script=skript filter_elemhide_nocriteria=Gjin kritearia spesifisearre om it te ferstoppen elemint te ûntdekken blockingGroup_title=Blokkearregels tafoegje whitelisted_tooltip=Adblock Plus is ynskeakele mar stiet út foar dizze side. +type_label_ping=ping type_label_stylesheet=stylside blocked_count_tooltip=?1? fan de ?2? type_label_font=lettertype type_label_popup=pop-up finster filter_regexp_tooltip=Dit filter is of in reguliere ekspresje of te koart om optimalisearre te wurden. Te folle fan dizze filters kinne it sneupjen fertrage. -action0_tooltip=Klik om it kontekst-menu te iepenjen, midden-klik om yn/út te skeakeljen. +action0_tooltip=Klik en iepenje it kontekst-menu; midden-klik en skeakelje it yn/út. whitelisted_page=Adblock Plus is útskeakele foar dizze side remove_group_warning=Wolst do dizze groep echt furt helje? -action1_tooltip=Klik om blokkearbere ûnderdielen te iepenjen/sluten, midden-klik om yn/út te skeakeljen. +action1_tooltip=Klik en iepenje/slút blokkearbere ûnderdielen; midden-klik en skeakelje yn/út. type_label_xmlhttprequest=XML fersyk -active_tooltip=Adblock Plus is ynskeakele, ?1? filter abonnemint(en) en ?2? oanpaste filter(s) yn gebrûk. +filter_invalid_regexp=Unjildige reguliere ekspresje +active_tooltip=Adblock Plus is ynskeakele, ?1? filterabonnemint(en) en ?2? oanpaste filter(s) yn gebrûk. type_label_document=dokumint type_label_object_subrequest=objekt subfersyk whitelistGroup_title=Utsûnderingsregels disabled_tooltip=Adblock Plus is útskeakele. filter_elemhide_duplicate_id=Der kin allinnich ien ID fan it te ferstoppen elemint spesifisearre wurde type_label_object=objekt -action2_tooltip=Klik om foarkarren te iepenjen, midden-klik om yn/út te skeakeljen. +action2_tooltip=Klik en iepenje foarkarren; midden-klik en skeakelje yn/út. type_label_subdocument=dielfinster clearStats_warning=Dit sil alle filterhitstatistiken opnij ynstelle en it tellen fan filterhits útskeakelje. Wolle jo trochgean? +filter_unknown_option=Unbekende filteropsje +type_label_genericblock=algemien blokkearje +notification_antiadblock_message=Dizze website is ferneamd om it toanen fan rjochte berjochten oan Adblock Plus-brûkers. Wolle jo dat Adblock Plus dizze ferstoppet? blocked_count_addendum=(ek wytliste: ?1?, ferstoppe: ?2?) subscription_invalid_location=Dizze lokaasje foar in filterlist is gjin jildige URL of gjin jildige bestânsnamme. +type_label_websocket=websocket type_label_image=ôfbylding remove_subscription_warning=Witte jo seker dat jo dit abonnemint fuortsmite wolle? +type_label_generichide=algemien ferstopje type_label_other=oars mobile_menu_enable=ABP: Oan sette type_label_media=audio/fideo @@ -37,5 +45,4 @@ mobile_menu_enable_site=ABP: Oan sette op ?1? type_label_elemhide=ferstoppe newGroup_title=Nije filtergroep default_dialog_title=Adblock Plus -notification_antiadblock_title=Hide targeted messages? -notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages? +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/overlay.dtd index 230c0a6..db30cb0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/fy-NL/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nee"> <!ENTITY sync.label "Sync Adblock Plus opsjes"> <!ENTITY whitelist.site.label "Utskeakelje op ?1?"> +<!ENTITY notification.closing.button.hide "D&izze melding slute"> <!ENTITY filters.label "Filterfoarkarren"> <!ENTITY disable.label "Oeral útskeakelje"> <!ENTITY objecttab.title "Blokkearje"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ja"> <!ENTITY opensidebar.label "&Blokkearbere ûnderdielen iepenje"> <!ENTITY notification.button.close "&Slûte"> +<!ENTITY shownotifications.label "Nuttige &meldingen toane"> <!ENTITY contribute.label "Donearje oan Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Dielfinster blokkearje"> <!ENTITY blocked.tooltip "Blokkearre ûnderdielen:"> +<!ENTITY notification.closing.button.optout "Toanen fan meldingen &stopje"> <!ENTITY counthits.label "Tel filterhits"> <!ENTITY showinstatusbar.label "Toane yn steatbalke"> <!ENTITY sidebar.title "Blokkearbere ûnderdelen op dizze side"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "To&ane yn arkbalke"> <!ENTITY status.tooltip "Steat:"> <!ENTITY context.media.label "Adblock Plus: Blokkearje audio/fideo"> -<!ENTITY subscription.update.label "Update filters"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/gl/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/gl/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/gl/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/gl/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/gl/filters.dtd index 23e3259..81d5e92 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/gl/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/gl/filters.dtd @@ -12,7 +12,7 @@ <!ENTITY sort.label "&Ordenar por"> <!ENTITY subscription.source.label "Lista dos filtros"> <!ENTITY hitcount.column "&Veces usado"> -<!ENTITY noFilters.text "Seica aÃnda non tes feito ningún filtro persoalizado."> +<!ENTITY noFilters.text "AÃnda non tes filtros persoalizados."> <!ENTITY backup.custom.title "Só filtros persoalizados"> <!ENTITY subscription.external.label "Actualizado por outro complemento"> <!ENTITY subscription.delete.label "Borrar"> @@ -26,7 +26,7 @@ <!ENTITY filter.delete.label "Borrar"> <!ENTITY addSubscriptionAdd.label "Engadir"> <!ENTITY viewMenu.label "Ver"> -<!ENTITY subscription.lastDownload.unknown "Non disponible"> +<!ENTITY subscription.lastDownload.unknown "Non dispoñible"> <!ENTITY addSubscriptionCancel.label "Cancelar"> <!ENTITY subscription.enabled.label "Activado"> <!ENTITY noSubscriptions.text "AÃnda non engadiches ningunha suscrición. O Adblock Plus non che bloqueará nada se non tes filtros, por favor dalle a "Engadir suscripción ós filtros" para engadir algún."> @@ -37,12 +37,13 @@ <!ENTITY subscription.lastDownload.invalidURL "Erro: enderezo non válido"> <!ENTITY backup.error "Seica houbo un erro ao escribir os filtros no arquivo. Mira a ver se o arquivo non está protexido contra a escritura ou está sendo uso por outro programa."> <!ENTITY filter.moveUp.label "Subir para arriba"> -<!ENTITY addGroup.label "En&gadir grupo de filtros"> +<!ENTITY addGroup.label "Engadir grupo de filtros"> <!ENTITY filter.edit.label "Editar"> <!ENTITY subscription.showHideFilters.label "Amosar/agochar os filtros"> -<!ENTITY acceptableAds2.label "Perm&itir publicidade non invasiva"> +<!ENTITY acceptableAds2.label "Permite algúns anuncios non intrusivos"> <!ENTITY addSubscriptionOther.label "Engadir outra subscrición"> <!ENTITY close.label "Pechar"> +<!ENTITY findbar.caseSensitive "Caso coincidente"> <!ENTITY sort.none.label "Dei&xalo todo atrapallado"> <!ENTITY filter.actions.label "Accións dos filtros"> <!ENTITY filter.copy.label "Copiar"> @@ -51,7 +52,7 @@ <!ENTITY readMore.label "Ler máis"> <!ENTITY subscription.moveUp.label "Subir para arriba"> <!ENTITY addSubscription.label "Engadir subscrición de &filtros"> -<!ENTITY subscription.homepage.label "Páxina"> +<!ENTITY subscription.homepage.label "Páxina de inicio"> <!ENTITY backup.complete.title "Tódolos filtros e suscricións"> <!ENTITY restore.own.label "Recuperar a copia de seguridade propia"> <!ENTITY restore.complete.warning "Tódalas as túas preferencias serán cambiadas polo contido do arquivo que seleccionaches. Estás seguro?"> @@ -60,13 +61,18 @@ <!ENTITY find.label "Busca&r"> <!ENTITY subscription.moveDown.label "Baixar para abaixo"> <!ENTITY subscription.lastDownload.connectionError "Erro: fallo na descarga"> +<!ENTITY findbar.statusWrappedStart "Chegou arriba, seguindo do fondo"> <!ENTITY subscription.lastDownload.success "Valeu"> +<!ENTITY findbar.placeholder "Atopar filtro"> <!ENTITY subscription.lastDownload.invalidData "Erro: lista de filtros non válida"> +<!ENTITY findbar.close "Pechar barra de localizacion"> <!ENTITY filter.paste.label "Pegar"> <!ENTITY subscription.disabledFilters.enable "Activar os filtros inactivos"> <!ENTITY lasthit.column "Ú&ltimo uso"> +<!ENTITY findbar.statusWrappedEnd "Chegou ao fondo, seguindo de arriba"> <!ENTITY subscription.editTitle.label "Editar o tÃtulo"> +<!ENTITY findbar.statusNotFound "Sentenza non atopada"> <!ENTITY subscription.disabledFilters.warning "Algúns filtros desta suscrición estanche desactivados."> <!ENTITY filter.column "Regra de &filtro"> <!ENTITY subscription.lastDownload.label "Baixado o:"> -<!ENTITY viewList.label "Qué publicidade?"> +<!ENTITY viewList.label "Ver listaxe"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/gl/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/gl/firstRun.properties index 103a7f7..2873eb3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/gl/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/gl/firstRun.properties @@ -18,3 +18,6 @@ firstRun_share_headline=<a>Bótanos unha man</a> para facer da rede un sitio mel firstRun_title=O Adblock Plus foiche instalado firstRun_toggle_off=DESACTIVADO firstRun_toggle_on=ACTIVADO +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/gl/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/gl/global.properties index 2fbc69c..9a9dedd 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/gl/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/gl/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=Non se especificaron criterios para recoñecer o elemento que se quere agochar blockingGroup_title=Reglas de bloqueo de publicidade whitelisted_tooltip=O Adblock Plus está activo mais está desactivado nesta páxina. +type_label_ping=ping type_label_stylesheet=folla de estilo blocked_count_tooltip=?1? de ?2? type_label_font=fonte @@ -15,6 +16,7 @@ whitelisted_page=O Adblock Plus foi desactivado nesta páxina remove_group_warning=É verdade que queres borrar este grupo? action1_tooltip=Preme para abrir/pechar elementos bloqueables, e click no medio para activar/desactivar. type_label_xmlhttprequest=solicitude XML +filter_invalid_regexp=Expresión regular invalida active_tooltip=O Adblock Plus está activo, ?1? o filtro de suscrición(s) ?2? e o(s) filtro(s) persoalizado(s) están en uso. type_label_document=documento type_label_object_subrequest=sub-solicitude de obxecto @@ -25,11 +27,15 @@ type_label_object=obxecto action2_tooltip=Preme para abrir as preferencias, e click no medio para activar/desactivar. type_label_subdocument=marco clearStats_warning=Isto vai resetear as estatÃsticas dos filtros e a desactivar a contabilidade do uso dos filtros. Estás seguro que o queres facer? +filter_unknown_option=Opcion de filtrado descoñecida +type_label_genericblock=bloqueo xeral notification_antiadblock_message=Este sitio é coñecido por amosar mensaxes dirixidas ós usuarios do Adblock Plus. Queres que o Adblock plus agoche estas mensaxes dirixidas? blocked_count_addendum=(tamén na Lista Branca: ?1?, agochados: ?2?) subscription_invalid_location=Esa localización da lista de filtros non é nin unha URL válida nin un nome de arquivo válido. +type_label_websocket=websocket type_label_image=imaxe remove_subscription_warning=De seguro de que queres darche de baixa nesta subscrición? +type_label_generichide=ocultacion xeneral type_label_other=outro mobile_menu_enable=ABP - Activar type_label_media=audio/vÃdeo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP - Activar en ?1? type_label_elemhide=agochado newGroup_title=Novo grupo de filtros default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/gl/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/gl/overlay.dtd index 3833961..d9d8677 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/gl/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/gl/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Non"> <!ENTITY sync.label "Sin&cronizar as opcións do Adblock Plus"> <!ENTITY whitelist.site.label "Desactivar en ?1?"> +<!ENTITY notification.closing.button.hide "Pechar e&sta notificación"> <!ENTITY filters.label "Pre&ferencias dos filtros"> <!ENTITY disable.label "Desactivar en tódalas páxinas"> <!ENTITY objecttab.title "Bloquear"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&SÃ"> <!ENTITY opensidebar.label "A&brir temas bloqueables"> <!ENTITY notification.button.close "&Pechar"> +<!ENTITY shownotifications.label "Amosar &notificacións útiles"> <!ENTITY contribute.label "Apoquinar ó Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "ABP - Bloquear o marco"> <!ENTITY blocked.tooltip "Elementos bloqueados nesta páxina:"> +<!ENTITY notification.closing.button.optout "&Non amosar notificacións"> <!ENTITY counthits.label "Co&ntabilizar as veces que se usa cada filtro"> <!ENTITY showinstatusbar.label "Amosar na barra d&e estado"> <!ENTITY sidebar.title "Temas bloqueables na páxina actual"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Amosar na barra &Ferramentas"> <!ENTITY status.tooltip "Estado:"> <!ENTITY context.media.label "ABP - Bloquear o audio/vÃdeo"> -<!ENTITY subscription.update.label "Actualizar os filtros"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/gl/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/gl/sidebar.dtd index f32368a..e58c59b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/gl/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/gl/sidebar.dtd @@ -3,7 +3,7 @@ <!ENTITY context.open.label "Abrir nunha lapela nova"> <!ENTITY type.label "Tipo"> <!ENTITY tooltip.filterSource.label "Fonte do filtro:"> -<!ENTITY noitems.label "Non che hai temas bloqueables"> +<!ENTITY noitems.label "Non hai temas bloqueables"> <!ENTITY filter.label "Filtro"> <!ENTITY tooltip.size.label "Tamaño:"> <!ENTITY reattach.label "Unir de novo"> @@ -13,10 +13,10 @@ <!ENTITY tooltip.docDomain.label "Documento fonte:"> <!ENTITY context.copy.label "Copiar o enderezo do elemento"> <!ENTITY tooltip.type.label "Tipo"> -<!ENTITY context.disablefilter.label "Desactivar o filtro ?1?"> +<!ENTITY context.disablefilter.label "Desactivar filtro ?1?"> <!ENTITY context.copyFilter.label "Copiar o filtro"> <!ENTITY context.block.label "Bloquear este elemento"> -<!ENTITY context.enablefilter.label "Activar o filtro ?1?"> +<!ENTITY context.enablefilter.label "Activar filtro ?1?"> <!ENTITY detach.label "Separar"> <!ENTITY whitelisted.label "Páxina da Lista Branca"> <!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?"> @@ -29,7 +29,7 @@ <!ENTITY tooltip.type.blocked "(bloqueado)"> <!ENTITY size.label "Tamaño"> <!ENTITY context.whitelist.label "Engadir excepción para este elemento"> -<!ENTITY context.selectAll.label "Seleccionalo todo"> +<!ENTITY context.selectAll.label "Seleccionar todo"> <!ENTITY state.label "Estado"> <!ENTITY docDomain.label "Documento fonte"> <!ENTITY tooltip.address.label "Enderezo:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/he/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/he/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/he/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/he/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/he/filters.dtd index 54dfd2f..f9688a5 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/he/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/he/filters.dtd @@ -61,12 +61,18 @@ <!ENTITY subscription.moveDown.label "×”×–×–×” מטה"> <!ENTITY subscription.lastDownload.connectionError "× ×›×©×œ, ההורדה × ×›×©×œ×”"> <!ENTITY subscription.lastDownload.success "הצליח"> +<!ENTITY findbar.placeholder "חיפוש"> <!ENTITY subscription.lastDownload.invalidData "× ×›×©×œ, רשימת ×”×ž×¡× × ×™× ×œ× ×—×•×§×™×ª"> +<!ENTITY findbar.close "סגור ×ת החיפוש"> <!ENTITY filter.paste.label "הדבקה"> <!ENTITY subscription.disabledFilters.enable "×פשר ×ž×¡× × ×™× ×ž× ×•×˜×¨×œ×™×"> <!ENTITY lasthit.column "&לחיצה ××—×¨×•× ×”"> <!ENTITY subscription.editTitle.label "עריכת הכותרת"> +<!ENTITY findbar.statusNotFound "הביטוי ×œ× × ×ž×¦×"> <!ENTITY subscription.disabledFilters.warning "כמה ×ž×”×ž×¡× × ×™× ×‘×”×¨×©×ž×” ×–×ת ×ž× ×•×˜×¨×œ×™×."> <!ENTITY filter.column "חוק &×¡×™× ×•×Ÿ"> <!ENTITY subscription.lastDownload.label "הורדה ××—×¨×•× ×”:"> <!ENTITY viewList.label "הצגת רשימה"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/he/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/he/firstRun.properties index 0e6601d..5b0e74b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/he/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/he/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=זמין עבור Android ו-iOS +firstRun_abbButtonTitle=הורד ×ת Adblock Browser ×›×ן +firstRun_abbPromotionHeadline=יש לך טלפון ×—×›× ×ו ט×בלט? firstRun_acceptableAdsExplanation=×× ×—× ×• ×¨×•×¦×™× ×œ×¢×•×“×“ ××ª×¨×™× ×œ×”×©×ª×ž×© ×‘×¤×¨×¡×•× ×¤×©×•×˜ ×•×œ× ×‘×•×œ×˜. ×–×ת מדוע ×‘×™×¡×¡× ×• <a>×§×•×•×™× ×ž× ×—×™× × ×•×§×©×™×</a> כדי לזהות מודעות מתקבלות, ×שר מופיעות בהגדרות ברירת המחדל. ×× ×‘×¨×¦×•× ×›× ×œ×—×¡×•× ×‘×›×œ ×–×ת ×ת כל המודעות × ×™×ª×Ÿ <a>×œ× ×˜×¨×œ</a> ×–×ת במספר ×©× ×™×•×ª. firstRun_acceptableAdsHeadline=מודעות מציקות ייחסמו מעכשיו firstRun_contributor_credits=×§×¨×“×™×˜×™× ×œ×ª×•×¨×ž×™× diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/he/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/he/global.properties index eee273a..f2a8ab2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/he/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/he/global.properties @@ -15,6 +15,7 @@ whitelisted_page=Adblock Plus ×ž× ×•×˜×¨×œ עבור העמוד ×”× ×•×›×—×™ remove_group_warning=×”×× ×‘×מת ×‘×¨×¦×•× ×š להסיר קבוצה זו? action1_tooltip=לחיצה כדי לפתוח/לסגור ×ת רשימת ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”, לחיצה ×מצעית כדי ל×פשר/×œ× ×˜×¨×œ. type_label_xmlhttprequest=בקשת XML +filter_invalid_regexp=ביטוי רגיל ×œ× ×—×•×§×™ active_tooltip=Adblock Plus מ×פשר, ?1? הרשמת(ות) ×ž×¡× × ×™× ×• ?2? ×ž×¡× ×Ÿ(×™×) מות××ž×™× ×‘×©×™×ž×•×©. type_label_document=מסמך type_label_object_subrequest=תת-דרישת ×ובייקט @@ -25,11 +26,13 @@ type_label_object=×ובייקט action2_tooltip=לחיצה כדי לפתוח ×ת המ××¤×™×™× ×™×, לחיצה ×מצעית כדי ל×פשר/×œ× ×˜×¨×œ. type_label_subdocument=מסגרת clearStats_warning=×–×” ×™×פס ×ת כל סטטיסטיקות הלחיצה של ×”×ž×¡× × ×™× ×•×™× ×˜×¨×œ ×ת ×ž× ×™×™×ª הלחיצה של ×”×ž×¡× ×Ÿ. ×”×× ×œ×”×ž×©×™×š? +filter_unknown_option=×פשרות ×¡×™× ×•×Ÿ ×œ× ×™×“×•×¢×” notification_antiadblock_message=×תר ×–×” ידוע בהצגת הודעות ×ž×›×•×•× ×•×ª למשתמשי Adblock Plus. ×”×× ×‘×¨×¦×•× ×›× ×©-Adblock Plus יסתיר הודעות ×ž×•×›×•×•× ×•×ª? blocked_count_addendum=(×’× ×›×Ÿ ברשימת המורשי×: ?1?, מוסתר: ?2?) subscription_invalid_location=×ž×™×§×•× ×¨×©×™×ž×ª ×”×¡×™× ×•×Ÿ ××™× × ×• כתובת ×תר חוקית ×•×œ× ×©× ×§×•×‘×¥ חוקי. type_label_image=×ª×ž×•× ×” remove_subscription_warning=×”×× ×œ×”×¡×™×¨ ×ת ההרשמה ×”×–×ת? +type_label_generichide=להסתיר ×”×’× ×¨×™×ª type_label_other=×חר mobile_menu_enable=ABP: מ×פשר type_label_media=×ודיו/ויד×ו @@ -39,3 +42,7 @@ mobile_menu_enable_site=ABP: מ×פשר ב-?1? type_label_elemhide=מוסתר newGroup_title=קבוצת ×ž×¡× × ×™× ×—×“×©×” default_dialog_title=Adblock Plus +type_label_ping=ping +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +type_label_genericblock=generic block +type_label_websocket=websocket diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/he/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/he/overlay.dtd index 01a63be..a7f465c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/he/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/he/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&ל×"> <!ENTITY sync.label "&×¡× ×›×¨×•×Ÿ הגדרות Adblock Plus"> <!ENTITY whitelist.site.label "× ×˜×¨×•×œ ב-?1?"> +<!ENTITY notification.closing.button.hide "סגירת התר××” זו"> <!ENTITY filters.label "&העדפות ×¡×™× ×•×Ÿ"> <!ENTITY disable.label "× ×˜×¨×•×œ בכל מקו×"> <!ENTITY objecttab.title "חסימה"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&כן"> <!ENTITY opensidebar.label "&פתיחת רשימת ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”"> <!ENTITY notification.button.close "&סגירה"> +<!ENTITY shownotifications.label "הצגת התר×ות שימושיות"> <!ENTITY contribute.label "×ª×¨×•× ×œ-Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: חסימת מסגרת (פריי×)"> <!ENTITY blocked.tooltip "×¤×¨×™×˜×™× ×—×¡×•×ž×™× ×‘×¢×ž×•×“ ×–×”:"> +<!ENTITY notification.closing.button.optout "הפסק להציג התר×ות"> <!ENTITY counthits.label "×ž× ×” &לחיצות ×ž×¡× ×Ÿ"> <!ENTITY showinstatusbar.label "&הצגה בשורת המצב"> <!ENTITY sidebar.title "×¤×¨×™×˜×™× ×œ×—×¡×™×ž×” בעמוד ×”× ×•×›×—×™"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "&הצגה בסרגל הכלי×"> <!ENTITY status.tooltip "מצב:"> <!ENTITY context.media.label "Adblock Plus: חסימת וויד×ו/×ודיו"> -<!ENTITY subscription.update.label "עדכון ×ž×¡× × ×™×"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/he/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/he/sendReport.dtd index 7a042c1..2ab048c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/he/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/he/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "×“×™×•×•×—×™× ××—×¨×•× ×™× ×©×œ×š ×©× ×©×œ×—×•"> <!ENTITY typeWarning.description "×¦×™×™× ×ª× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×“×•×•×— על בעיה כללית ×¢× Adblock Plus מ×שר בעיה ×¢× ×”×ž×¡× × ×™×. שימו לב שבעיות ×›×לו עדיף לדווח ב[link]×¤×•×¨×•× Adblock Plus[/link]. יש להשתמש במדווח הבעיות רק ×‘× ×•×¡×£ לדיון ×§×™×™×, כיוון ש××£ ×חד ×œ× ×™×©×™× ×œ×‘ לדיווח ×©×œ×›× ××œ× ×× ×™×¡×•×¤×§ קישור ×ליו. הקישור ×©× ×•×¦×¨ ×וטומטית יסופק ל×חר ×”×–× ×ª הדיווח."> <!ENTITY issues.disabled.description "Adblock Plus ×ž× ×•×˜×¨×œ, ×–×” ×œ× ×™×—×¡×•× ×“×‘×¨ במצב ×”× ×•×›×—×™."> -<!ENTITY attachExtensions.label "סיפוח רשימת &ההרחבות הפעילות ×ל הדיווח במקרה ×•× ×™×’×•×“ תוספות ×”×•× ×”×’×•×¨× ×œ×‘×¢×™×”"> +<!ENTITY attachExtensions.label "צירוף רשימת ההרחבות הפעילות ×ל הדיווח במקרה ובעיה ×¢× ×”×ª×•×¡×¤×•×ª ×”×™× ×”×’×•×¨× ×œ×‘×¢×™×”"> <!ENTITY issues.nosubscriptions.add.label "הוספת הרשמת ×ž×¡× ×Ÿ"> <!ENTITY issues.disabledfilters.enable.label "×פשור ×ž×¡× ×Ÿ"> <!ENTITY issues.override.label "&התצורה × ×›×•× ×”, ×פשר להמשיך ×¢× ×”×“×™×•×•×—"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hr/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hr/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hr/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hr/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hr/filters.dtd index efbb24b..7af9722 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hr/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hr/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Dopust&i neke nenametljive reklame"> <!ENTITY addSubscriptionOther.label "Dodaj drugu pretplatu"> <!ENTITY close.label "Zatvori"> +<!ENTITY findbar.caseSensitive "Podudaraj veliÄinu"> <!ENTITY sort.none.label "&Neposloženo"> <!ENTITY filter.actions.label "Radnje filtera"> <!ENTITY filter.copy.label "Kopiraj"> @@ -62,12 +63,17 @@ <!ENTITY find.label "&Traži"> <!ENTITY subscription.moveDown.label "Pomakni dolje"> <!ENTITY subscription.lastDownload.connectionError "NeuspjeÅ¡no, greÅ¡ka preuzimanja"> +<!ENTITY findbar.statusWrappedStart "Dosegnut vrh, nastavljam od dna"> <!ENTITY subscription.lastDownload.success "UspjeÅ¡no"> +<!ENTITY findbar.placeholder "Traži filter"> <!ENTITY subscription.lastDownload.invalidData "NeuspjeÅ¡no, neispravan popis filtera"> +<!ENTITY findbar.close "Zatvori pretragu"> <!ENTITY filter.paste.label "Zalijepi"> <!ENTITY subscription.disabledFilters.enable "Omogući onemogućene filtere"> <!ENTITY lasthit.column "Pos&ljednji pogodak"> +<!ENTITY findbar.statusWrappedEnd "Dosegnuto dno, nastavljam od vrha"> <!ENTITY subscription.editTitle.label "Uredi naziv"> +<!ENTITY findbar.statusNotFound "Izraz nije pronaÄ‘en"> <!ENTITY subscription.disabledFilters.warning "Neki filteri u ovoj pretplati su onemogućeni."> <!ENTITY filter.column "Pravilo &filtera"> <!ENTITY subscription.lastDownload.label "Zadnje preuzimanje:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hr/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hr/firstRun.properties index 4b0724d..047a616 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hr/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hr/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Dostupan za Android i iOS +firstRun_abbButtonTitle=Nabavite Adblock Browser ovdje +firstRun_abbPromotionHeadline=Imate smartphone ili tablet? firstRun_acceptableAdsExplanation=Želimo podupirati web stranice da koriste poÅ¡teno, nenametljivo reklamiranje. Zato smo uspostavili <a>toÄne smjernice</a> za prepoznavanje reklama, koje su prikazane prema uobiÄajenim postavkama. Ako joÅ¡ uvijek želite blokirati svaku reklamu to možete <a>onemogućiti</a> za nekoliko sekuondis. firstRun_acceptableAdsHeadline=Naporni oglasi će sada biti blokirani firstRun_contributor_credits=Zasluge doprinositelja diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hr/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hr/global.properties index 4e368c9..0dc18af 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hr/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hr/global.properties @@ -5,6 +5,7 @@ type_label_script=skripta filter_elemhide_nocriteria=Nema kriterija za prepoznavanje elementa koji će biti skriven blockingGroup_title=Ad Blocking pravila whitelisted_tooltip=Adblock Plus je onemogućen na trenutnoj stranici. +type_label_ping=ping type_label_stylesheet=stil blocked_count_tooltip=?1? od ?2? type_label_font=slovo @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus je onemogućen za trenutnu stranicu remove_group_warning=Želite li stvarno ukloniti ovu grupu? action1_tooltip=Kliknite za otvaranje/zatvaranje blokiranih stavki, srednji klik za omogućavanje/onemogućavanje. type_label_xmlhttprequest=XML zahtjev +filter_invalid_regexp=Nevaljani regularni izraz active_tooltip=Adblock Plus je omogućen, ?1? pretplata na filtere i ?2? prilagoÄ‘enih filtera je u upotrebi. type_label_document=dokument type_label_object_subrequest=podzahtjev objekta @@ -25,11 +27,15 @@ type_label_object=objekt action2_tooltip=Kliknite za otvaranje postavki, srednji klik za omogućavanje/onemogućavanje. type_label_subdocument=okvir clearStats_warning=Ovo će poniÅ¡titi svu statistiku pogodaka filtera i onemogućiti brojanje pogodaka filtera. Želite li nastaviti? +filter_unknown_option=Nepoznata postavka filtera +type_label_genericblock=generiÄko blokiranje notification_antiadblock_message=Za ovu stranicu je poznato da prikazuje ciljane poruke Adblock Plus korisnicima. Želite li da Adblock Plus sakrije ciljane poruke? blocked_count_addendum=(dopuÅ¡teni: ?1?, skriveni: ?2?) subscription_invalid_location=Lokacija popisa filtera nije niti valjana web adresa niti naziv datoteke. +type_label_websocket=websocket type_label_image=slika remove_subscription_warning=Želite li stvarno ukloniti ovu pretplatu? +type_label_generichide=generiÄko skrivanje type_label_other=drugi mobile_menu_enable=ABP: Omogući type_label_media=zvuÄni/video zapisi @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Omogući na ?1? type_label_elemhide=skriveno newGroup_title=Nova grupa filtera default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hr/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hr/overlay.dtd index a7dd691..77cffad 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hr/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hr/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ne"> <!ENTITY sync.label "Sinkroniziraj Adblo&ck Plus postavke"> <!ENTITY whitelist.site.label "Onemogući na ?1?"> +<!ENTITY notification.closing.button.hide "Zatvori o&vu obavijest"> <!ENTITY filters.label "Postavke &filtera"> <!ENTITY disable.label "Onemogući posvuda"> <!ENTITY objecttab.title "Blokiraj"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Da"> <!ENTITY opensidebar.label "Otvori &blokirane stavke"> <!ENTITY notification.button.close "&Zatvori"> +<!ENTITY shownotifications.label "Prikaži korisne &obavijesti"> <!ENTITY contribute.label "Doprinesite Adblock Plus-u"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Blokiraj okvir s Adblock Plus-om"> <!ENTITY blocked.tooltip "Blokirane stavke na ovoj stranici:"> +<!ENTITY notification.closing.button.optout "&Prestani prikazivati obavijesti"> <!ENTITY counthits.label "Broji pogodke fil&tera"> <!ENTITY showinstatusbar.label "Prikaži u &statusnoj traci"> <!ENTITY sidebar.title "Stavke koje se mogu blokirati na trenutnoj stranici"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Prik&aži u alatnoj traci"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Blokiraj audio/video s Adblock Plus-om"> -<!ENTITY subscription.update.label "Ažuriraj filtere"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hr/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hr/sendReport.dtd index 61195b8..de8d22a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hr/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hr/sendReport.dtd @@ -41,7 +41,7 @@ osim ako im ne date poveznicu na to izvješće. Automatski generirana poveznica biti će dostupna nakon prijave izvješća."> <!ENTITY issues.disabled.description "Adblock Plus je onemogućen, neće niÅ¡ta blokirati u ovom trenutnom stanju."> -<!ENTITY attachExtensions.label "Dodaj popis aktivnih dodataka u izvješće u sluÄaju da je dodatak &razlog problema"> +<!ENTITY attachExtensions.label "Priloži popis aktivnih d&odataka u izvješće u sluÄaju da je dodatak uzrok problema"> <!ENTITY issues.nosubscriptions.add.label "Dodaj pretplatu filtera"> <!ENTITY issues.disabledfilters.enable.label "Omogući filter"> <!ENTITY issues.override.label "P&ostavke su ispravne, nastavi s podnoÅ¡enjem izvješća"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/filters.dtd index 18f33fa..073bb0d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "&NjenadbÄ›hawe wabjenje dowolić"> <!ENTITY addSubscriptionOther.label "Druhi abonement pÅ™idać"> <!ENTITY close.label "ZaÄinić"> +<!ENTITY findbar.caseSensitive "Wulkopisanje wobkedźbować"> <!ENTITY sort.none.label "Njeso&rtÄ›rowany"> <!ENTITY filter.actions.label "Filtrowe akcije"> <!ENTITY filter.copy.label "KopÄ›rować"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Pytać"> <!ENTITY subscription.moveDown.label "Dele"> <!ENTITY subscription.lastDownload.connectionError "NjeporadźiÅ‚o, sćahowanski zmylk"> +<!ENTITY findbar.statusWrappedStart "Horjeka dóńdźeny, wot deleka pokroÄować"> <!ENTITY subscription.lastDownload.success "WuspÄ›ch"> +<!ENTITY findbar.placeholder "Filter pytać"> <!ENTITY subscription.lastDownload.invalidData "NjeporadźiÅ‚o, žana pÅ‚aćiwa filtrowa lisćina"> +<!ENTITY findbar.close "Pytansku lajstu zaÄinić"> <!ENTITY filter.paste.label "Zasunyć"> <!ENTITY subscription.disabledFilters.enable "Znjemóžnjene filtry zmóžnić"> <!ENTITY lasthit.column "&Posledni wotpowÄ›dnik"> +<!ENTITY findbar.statusWrappedEnd "Deleka dóńdźeny, wot horjeka pokroÄować"> <!ENTITY subscription.editTitle.label "Titul wobdźěłać"> +<!ENTITY findbar.statusNotFound "Fraza njeje so namakaÅ‚a"> <!ENTITY subscription.disabledFilters.warning "NÄ›kotre filtry w tutym abonemenće su znjemóžnjene."> <!ENTITY filter.column "&Filtrowe prawidÅ‚o"> <!ENTITY subscription.lastDownload.label "Poslednje sćehnjenje:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/firstRun.properties index 46a529d..f873a92 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/firstRun.properties @@ -18,3 +18,6 @@ firstRun_share_headline=<a>Podajće nam ruku</a>, zo bychmy web k lÄ›pÅ¡emu mÄ›s firstRun_title=Adblock Plus je so instalowaÅ‚ firstRun_toggle_off=WUPINJENY firstRun_toggle_on=ZAPINJENY +firstRun_abbPromotionHeadline=Got a smartphone or a tablet? +firstRun_abbButtonSubtitle=Available for Android and iOS +firstRun_abbButtonTitle=Get Adblock Browser here diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/global.properties index 71491fe..118ff35 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/global.properties @@ -5,6 +5,7 @@ type_label_script=skript filter_elemhide_nocriteria=Žane kriterije podate, zo by element spóznaÅ‚o, kotryž ma so schować blockingGroup_title=PrawidÅ‚a za blokowanje reklamy whitelisted_tooltip=Adblock Plus je na tutej stronje znjemóžnjeny. +type_label_ping=ping type_label_stylesheet=stilowa pÅ™edÅ‚oha blocked_count_tooltip=?1? z ?2? type_label_font=pismo @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus je so za tutu stronu znjemóžniÅ‚ remove_group_warning=Chceće tutu skupinu woprawdźe wotstronić? action1_tooltip=Klikńće, zo byšće blokujomne zapiski woÄiniÅ‚/zaÄiniÅ‚, klikńće ze srjedźnej tastu myÅ¡e, zo by zmóžniÅ‚o/znjemóžniÅ‚o. type_label_xmlhttprequest=XML-napraÅ¡owanje +filter_invalid_regexp=NjepÅ‚aćiwy regularny wuraz active_tooltip=Adblock Plus je zmóžnjeny, ?1? filtrowe abonementy a ?2? swójske filtry so wužiwaja. type_label_document=dokument type_label_object_subrequest=objektowe napraÅ¡owanje @@ -25,11 +27,15 @@ type_label_object=objekt action2_tooltip=Klikńće, zo byšće nastajenja woÄiniÅ‚, klikńće ze srjedźnej tastu myÅ¡e, zo by zmóžniÅ‚o/znjemóžniÅ‚o. type_label_subdocument=wobÅ‚uk clearStats_warning=To staji wÅ¡u filtrowu statistiku wróćo a znjemóžni liÄenje filtrowych wotpowÄ›dnikow. Chceće pokoroÄować? +filter_unknown_option=Njeznata filtrowa opcija +type_label_genericblock=generiske blokowanje notification_antiadblock_message=Tute sydÅ‚o je za to znate, zo cilowe zdźělenki za wužiwarjow Adblock Plus pokazuje. Chceće, zo Adblock Plus cilowe zdźělenki chowa? blocked_count_addendum=(tež w běłej lisćinje: ?1?, schowane: ?2?) subscription_invalid_location=MÄ›stno filtroweje lisćiny njeje ani pÅ‚aćiwy URL ani pÅ‚aćiwe datajowe mjeno. +type_label_websocket=websocket type_label_image=wobraz remove_subscription_warning=Chceće woprawdźe tutón abonement wotstronić? +type_label_generichide=generiske schowanje type_label_other=druhi mobile_menu_enable=ABP: Zmóžnić type_label_media=awdio/widejo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Na ?1? zmóžnić type_label_elemhide=schowany newGroup_title=Nowa filtrowa skupina default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/overlay.dtd index cd368ff..15ed4b4 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hsb/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hsb/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&NÄ›"> <!ENTITY sync.label "Nastajenja Adblo&ck Plus synchronizować"> <!ENTITY whitelist.site.label "Na ?1? znjemóžnić"> +<!ENTITY notification.closing.button.hide "T&utu zdźělenku zaÄinić"> <!ENTITY filters.label "&Filtrowe nastajenja"> <!ENTITY disable.label "WÅ¡udźe znjemóžnić"> <!ENTITY objecttab.title "Blokować"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Haj"> <!ENTITY opensidebar.label "Blo&kujomne elementy woÄinić"> <!ENTITY notification.button.close "&ZaÄinić"> +<!ENTITY shownotifications.label "Wužitne &zdźělenki pokazać"> <!ENTITY contribute.label "K Adblock Plus pÅ™inoÅ¡ować"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: WobÅ‚uk blokować"> <!ENTITY blocked.tooltip "Zablokowane elementy na tutej stronje:"> +<!ENTITY notification.closing.button.optout "Zdźělenki &hižo njepokazać"> <!ENTITY counthits.label "&Filtrowe wotpowÄ›dniki liÄić"> <!ENTITY showinstatusbar.label "W &statusowej lajsće pokazać"> <!ENTITY sidebar.title "Blokujomne elementy na aktualnej stronje"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "W gratowej &lajsće pokazać"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Awdio/Widejo blokować"> -<!ENTITY subscription.update.label "Filtry aktualizować"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hu/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hu/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hu/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hu/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hu/filters.dtd index 5059863..d0e0504 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hu/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hu/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Néhány nem &tolakodó hirdetés engedélyezése"> <!ENTITY addSubscriptionOther.label "KülsÅ‘ szűrÅ‘ hozzáadása"> <!ENTITY close.label "Bezárás"> +<!ENTITY findbar.caseSensitive "Kis- és nagy betűk megkülönböztetése"> <!ENTITY sort.none.label "Ren&dezetlen"> <!ENTITY filter.actions.label "SzűrÅ‘ műveletek"> <!ENTITY filter.copy.label "Másolás"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Keresés"> <!ENTITY subscription.moveDown.label "Mozgatás le"> <!ENTITY subscription.lastDownload.connectionError "Sikertelen, letöltési hiba"> +<!ENTITY findbar.statusWrappedStart "Elérte az elejét, folytatás az aljáról"> <!ENTITY subscription.lastDownload.success "Sikeres"> +<!ENTITY findbar.placeholder "SzűrÅ‘ keresése"> <!ENTITY subscription.lastDownload.invalidData "Sikertelen, érvénytelen szűrÅ‘lista"> +<!ENTITY findbar.close "KeresÅ‘sáv bezárása"> <!ENTITY filter.paste.label "Beillesztés"> <!ENTITY subscription.disabledFilters.enable "Letiltott szűrÅ‘k engedélyezése"> <!ENTITY lasthit.column "&Utolsó találat"> +<!ENTITY findbar.statusWrappedEnd "Elérte az alját, folytatás az elejérÅ‘l"> <!ENTITY subscription.editTitle.label "CÃm szerkesztése"> +<!ENTITY findbar.statusNotFound "A kifejezés nem található"> <!ENTITY subscription.disabledFilters.warning "Néhány szűrÅ‘ ebben a listában le van tiltva."> <!ENTITY filter.column "&SzűrÅ‘ szabály"> <!ENTITY subscription.lastDownload.label "Legutóbb letöltve:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hu/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hu/firstRun.properties index 4c2d8ab..ad98f11 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hu/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hu/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=ElérhetÅ‘ Android és iOS készülékekhez +firstRun_abbButtonTitle=Szerezd be az Adblock Browsert itt +firstRun_abbPromotionHeadline=Van egy okostelefonod vagy tableted? firstRun_acceptableAdsExplanation=Szeretnénk arra biztatni a weboldalakat, hogy egyértelmű, nem tolakodó hirdetéseket használjanak. Ezért hoztunk létre <a>szigorú irányelveket</a>, amelyek segÃtségével azonosÃthatók az elfogadható hirdetések, amelyek az alapbeállÃtások között találhatók meg. Ha ennek ellenére minden hirdetést <a>blokkolni</a> szeretne, ezt továbbra is megteheti mindössze néhány másodperc alatt. firstRun_acceptableAdsHeadline=A bosszantó hirdetések mostantól blokkolva lesznek firstRun_contributor_credits=Hozzájárulók névsora diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hu/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hu/global.properties index 3b32ac6..e59f097 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hu/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hu/global.properties @@ -5,6 +5,7 @@ type_label_script=szkript filter_elemhide_nocriteria=Nincs megadva feltétel az elrejtendÅ‘ elemre blockingGroup_title=Reklám szűrÅ‘ szabályok whitelisted_tooltip=Az Adblock be van kapcsolva, de a szűrés le van tiltva az aktuális oldalon. +type_label_ping=válaszidÅ‘ type_label_stylesheet=stÃluslap blocked_count_tooltip=?1?/?2? type_label_font=betűtÃpus @@ -15,6 +16,7 @@ whitelisted_page=Az Adblock Plus le van tiltva az aktuális oldalon remove_group_warning=Biztosan eltávolÃtja ezt a csoportot? action1_tooltip=Kattintson ide a blokkolható elemek megnyitásához/bezárásához, középsÅ‘ gombbal a ki/bekapcsoláshoz. type_label_xmlhttprequest=XML kérés +filter_invalid_regexp=Érvénytelen reguláris kifejezés active_tooltip=Az Adblock Plus aktÃv, ?1? szűrÅ‘(k) és ?2? saját szűrÅ‘(k) van használatban. type_label_document=dokumentum type_label_object_subrequest=objektum alkérés @@ -25,11 +27,15 @@ type_label_object=objektum action2_tooltip=Kattintson ide a beállÃtások megnyitásához, középsÅ‘ gombbal a ki/bekapcsoláshoz. type_label_subdocument=keret clearStats_warning=Ezzel letörli az összes találati statisztikát és letiltja a mentésüket. Biztosan folytatja? +filter_unknown_option=Ismeretlen szűrÅ‘ +type_label_genericblock=általános blokkolás notification_antiadblock_message=Ezen az oldalon célzott üzeneteket jelenÃtenek meg az Adblock Plus felhasználóinak. Szeretné, ha az Adblock Plus elrejtené ezeket az üzeneteket? blocked_count_addendum=(fehér listán: ?1?, rejtett: ?2?) subscription_invalid_location=A megadott külsÅ‘ szűrÅ‘t tartalmazó cÃm helytelen, vagy hibás fájlnevet tartalmaz. +type_label_websocket=websocket type_label_image=kép remove_subscription_warning=Valóban el kÃvánja távolÃtani ezt a szűrÅ‘t? +type_label_generichide=általános elrejtés type_label_other=egyéb mobile_menu_enable=ABP: Engedélyezés type_label_media=hang/videó @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Engedélyezi itt: ?1? type_label_elemhide=rejtett newGroup_title=Új szűrÅ‘ csoport default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hu/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hu/overlay.dtd index 9e5fa9e..d75a923 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hu/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hu/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nem"> <!ENTITY sync.label "Adblock Plus beállÃtások s&zinkronizálása"> <!ENTITY whitelist.site.label "Szűrés tiltása itt: ?1?"> +<!ENTITY notification.closing.button.hide "ÉrtesÃtés bezárása"> <!ENTITY filters.label "SzűrÅ‘ &beállÃtások"> <!ENTITY disable.label "Letiltás mindenhol"> <!ENTITY objecttab.title "Blokkolás"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Igen"> <!ENTITY opensidebar.label "Blokkolható ob&jektumok megjelenÃtése"> <!ENTITY notification.button.close "&Bezárás"> +<!ENTITY shownotifications.label "Hasznos értesÃtések megjelenÃtése"> <!ENTITY contribute.label "Közreműködés az Adblock Plus-hoz"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Keret blokkolása"> <!ENTITY blocked.tooltip "Blokkolt objektumok ezen az oldalon:"> +<!ENTITY notification.closing.button.optout "Ne jelenjenek meg értesÃtések"> <!ENTITY counthits.label "&SzűrÅ‘ találati statisztika mentése"> <!ENTITY showinstatusbar.label "Megje&lenÃtés az állapotsoron"> <!ENTITY sidebar.title "Blokkolható objektumok"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "M&egjelenÃtés az eszköztáron"> <!ENTITY status.tooltip "Ãllapot:"> <!ENTITY context.media.label "Adblock Plus: videó/audió blokkolása"> -<!ENTITY subscription.update.label "SzűrÅ‘k frissÃtése"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hu/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hu/sendReport.dtd index 3647704..01d0a66 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hu/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hu/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "Legutóbb beküldött jelentések"> <!ENTITY typeWarning.description "Ön azt a lehetÅ‘séget választotta, hogy a hiba az Adblock Plus-szal van és nem a szűrÅ‘kkel. Kérem vegye figyelembe, hogy az ilyen hibákat célszerűbb az [link]Adblock Plus fórumon[/link] bejelenteni. Csak akkor használja Ãgy a hibajelentÅ‘t, ha egy meglévÅ‘ szálhoz szeretne hozzátenni, és a jelentésben tüntesse fel a hozzá tartozó hivatkozást is. Az automatikusan generált hivatkozás a jelentés beküldése után áll majd rendelkezésre."> <!ENTITY issues.disabled.description "Az Adblock Plus le van tiltva, Ãgy nem tud semmit blokkolni."> -<!ENTITY attachExtensions.label "A kiterjesztések közti ütközésekbÅ‘l adódó probléma esetén, csatolja a jelentéshez az aktÃv k&iterjesztések listáját"> +<!ENTITY attachExtensions.label "Az aktÃv kiterjesztések listáját csatolja a bejelentéshez abban az esetben, ha kiterjesztések ütközése folyamán probléma adódik."> <!ENTITY issues.nosubscriptions.add.label "Feliratkozás szűrÅ‘re"> <!ENTITY issues.disabledfilters.enable.label "SzűrÅ‘ engedélyezése"> <!ENTITY issues.override.label "A kon&figuráció megfelelÅ‘, bejelentés folytatása"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/filters.dtd index f098c8f..e5c8365 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/filters.dtd @@ -70,3 +70,9 @@ <!ENTITY filter.column "Õ–Õ«&Õ¬Õ¿Ö€"> <!ENTITY subscription.lastDownload.label "ÕŽÕ¥Ö€Õ»Õ«Õ¶ Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´."> <!ENTITY viewList.label "Ô´Õ«Õ¿Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¨"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/firstRun.properties index 4317100..ac28e1a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Õ„Õ¡Õ¿Õ¹Õ¥Õ¬Õ« Õ§ Android-Õ« Ö‡ iOS-Õ« Õ°Õ¡Õ´Õ¡Ö€ +firstRun_abbButtonTitle=ÕÕ¿Õ¡ÖÕ¥Ö„ Adblock Browser Õ¡ÕµÕ½Õ¿Õ¥Õ² +firstRun_abbPromotionHeadline=ÕˆÖ‚Õ¶Õ¥ÕžÖ„ Õ½Õ´Õ¡Ö€Õ©Ö†Õ¸Õ¶ Õ¯Õ¡Õ´ ÕºÕ¬Õ¡Õ¶Õ·Õ¥Õ¿: firstRun_acceptableAdsExplanation=Õ„Õ¥Õ¶Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ <a>Õ¸Ö€Õ¸Õ· Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ«</a> Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¨, Õ¸Ö€Õ¸Õ¾Õ°Õ¥Õ¿Ö‡ Õ£Õ«Õ¿Õ¥Õ¶Ö„, Õ¸Ö€ Õ¶Ö€Õ¡Õ¶Ö„ Õ°Õ¡Õ³Õ¥Õ¬Õ« Õ£Õ¸Õ¾Õ¡Õ¦Õ¤ Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Ö‰ ÔµÕ©Õ¥ Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¤Ö€Õ¡Õ¶Ö„ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬, Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ <a>Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬</a> Õ¤Ö€Õ¡Õ¶Ö„ Õ·Õ¡Õ¿ Õ°Õ¥Õ·Õ¿Ö‰ firstRun_acceptableAdsHeadline=ÕŽÕ¡Õ¿ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¶Õ¥Ö€Õ¶ Õ¡ÕµÕªÕ´ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ¥Õ¶ firstRun_contributor_credits=Ô¾Ö€Õ¡Õ£Ö€Õ« Õ°Õ¥Õ²Õ«Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/global.properties index 69bb1c4..e08eaf8 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/global.properties @@ -25,6 +25,7 @@ type_label_object=Ö…Õ¢ÕµÕ¥Õ¯Õ¿ action2_tooltip=Ô¿Õ¬Õ«Õ¯Õ¸Õ¾` Õ†Õ¡ÕÕ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€; Õ¯Õ¥Õ¿Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ type_label_subdocument=Ö†Ö€Õ¥ÕµÕ´ clearStats_warning=Ô±ÕµÕ½ Õ¯Õ»Õ¶Õ»Õ« Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶ Ö‡ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ« Õ¡ÕµÕ¶:Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬: +type_label_genericblock=Ô¸Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´ notification_antiadblock_message=Ô±ÕµÕ½ Õ¯Õ¡ÕµÖ„Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´ Õ§ Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€ Adblock Plus-Õ« Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶Ö‰ ÕˆÖ‚Õ¦Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö„Ö‰ blocked_count_addendum=?1?-Õ¨ ?2?-Õ«Ö subscription_invalid_location=Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ¯Õ¡Õ´ Õ½ÕÕ¡Õ¬ URL Õ§, Õ¯Õ¡Õ´ Õ½ÕÕ¡Õ¬ Ö†Õ¡ÕµÕ¬Õ« Õ¡Õ¶Õ¸Ö‚Õ¶: @@ -39,3 +40,9 @@ mobile_menu_enable_site=ABP: Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´ type_label_elemhide=Õ©Õ¡Ö„Õ¶Õ¾Õ¡Õ® newGroup_title=Õ†Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ« ÕÕ¸Ö‚Õ´Õ¢ default_dialog_title=Adblock Plus +type_label_ping=ping +filter_invalid_regexp=Invalid regular expression +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +filter_unknown_option=Unknown filter option +type_label_websocket=websocket +type_label_generichide=generic hide diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/overlay.dtd index e3ff0ef..5c32eed 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/hy-AM/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&ÕˆÕ¹"> <!ENTITY sync.label "&ÕÕ«Õ¶Ö„Ö€Õ¸Õ¶Õ¡ÖÕ¶Õ¥Õ¬ Adblock Plus-Õ« Õ¶Õ¡ÕÕ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨"> <!ENTITY whitelist.site.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´"> +<!ENTITY notification.closing.button.hide "ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ½ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´"> <!ENTITY filters.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´ (&F)"> <!ENTITY disable.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡Õ´Õ¥Õ¶Õ¸Ö‚Ö€"> <!ENTITY objecttab.title "Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬"> @@ -13,10 +14,13 @@ <!ENTITY notification.button.yes "&Ô±ÕµÕ¸"> <!ENTITY opensidebar.label "Ô²Õ¡ÖÕ¥Õ¬ Ö†Õ«Õ¬&Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨"> <!ENTITY notification.button.close "&Õ“Õ¡Õ¯Õ¥Õ¬"> +<!ENTITY shownotifications.label " +Ô´Õ«Õ¿Õ¥Õ¬ Ö…Õ£Õ¿Õ¡Õ¯Õ¡Ö€ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"> <!ENTITY contribute.label "Ô±Õ»Õ¡Õ¯ÖÕ¥Õ¬ Adblock Plus-Õ«Õ¶"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ–Ö€Õ¥ÕµÕ´Õ¨"> <!ENTITY blocked.tooltip "Ô±ÕµÕ½ Õ§Õ»Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¡Õ® Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨`"> +<!ENTITY notification.closing.button.optout "&Õ‰ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€"> <!ENTITY counthits.label "Õ€Õ¡Õ·Õ¾Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶ (&h)"> <!ENTITY showinstatusbar.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ &Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ¿Õ¸Õ²Õ¸Ö‚Õ´"> <!ENTITY sidebar.title "Ô±ÕµÕ½ Õ§Õ»Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨"> @@ -28,4 +32,3 @@ <!ENTITY showintoolbar.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ &Õ£Õ¸Ö€Õ®Õ«Ö„Õ¡Õ·Õ¡Ö€Õ¸Ö‚Õ´"> <!ENTITY status.tooltip "ÕŽÕ«Õ³Õ¡Õ¯Õ¨."> <!ENTITY context.media.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Ô±Õ¸Ö‚Õ¤Õ«Õ¸/ÕŽÕ«Õ¤Õ¥Õ¸"> -<!ENTITY subscription.update.label "Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/id/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/id/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/id/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/id/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/id/composer.dtd index 1b0db70..752f8ff 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/id/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/id/composer.dtd @@ -6,17 +6,17 @@ <!ENTITY pattern.label "Mencari pola"> <!ENTITY thirdParty.label "Hanya pihak ke&tiga"> <!ENTITY filter.label "&Penyaring baru:"> -<!ENTITY collapse.label "&Ciutkan yang dicekal:"> +<!ENTITY collapse.label "&tutup yang diblokir:"> <!ENTITY match.warning "Pola yang Anda masukkan tidak lagi cocok dengan alamat yang akan diblokir/dimasukkan dalam daftar putih dan tidak akan berpengaruh sama sekali."> <!ENTITY anchor.start.label "pada &awal alamat"> <!ENTITY matchCase.label "&Cocokkan kapitalisasi"> -<!ENTITY custom.pattern.label "Kustomisasi:"> +<!ENTITY custom.pattern.label "Ubah sesuai"> <!ENTITY unselectAllTypes.label "Jangan pilih apapun"> <!ENTITY type.whitelist.label "Aturan pen&gecualian"> <!ENTITY regexp.warning "Pola yang Anda masukkan akan dianggap sebagai suatu regular expression yang tidak dapat diproses secara efisien oleh Adblock Plus dan mungkin akan memperlambat peramban Anda. Jika Anda tidak berniat untuk menggunakan regular expression, tambahkan tanda bintang (*) di akhir pola."> <!ENTITY dialog.title "Tambah aturan penyaring Adblock Plus"> <!ENTITY basic.label "Tampilan dasar"> -<!ENTITY type.filter.label "filter pemblokiran"> +<!ENTITY type.filter.label "&Saring pemblokiran"> <!ENTITY types.label "Terapkan untuk jenis:"> <!ENTITY shortpattern.warning "Pola yang Anda masukkan terlalu pendek untuk dapat dioptimalkan dan mungkin akan memperlambat peramban Anda. Kami menyarankan agar Anda memilih kata yang lebih panjang untuk penyaring ini sehingga memungkinkan Adblock Plus memproses penyaring tersebut dengan lebih efisien."> <!ENTITY collapse.yes.label "Ya"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/id/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/id/filters.dtd index 3a5de86..2a12396 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/id/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/id/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Izinkan beberapa iklan yang tidak men&colok"> <!ENTITY addSubscriptionOther.label "Tambah langganan yang lainnya"> <!ENTITY close.label "Tutup"> +<!ENTITY findbar.caseSensitive "Persis sama"> <!ENTITY sort.none.label "&Belum diurutkan"> <!ENTITY filter.actions.label "Tindakan penyaring"> <!ENTITY filter.copy.label "Salin"> @@ -62,12 +63,17 @@ <!ENTITY find.label "&Temukan"> <!ENTITY subscription.moveDown.label "Turunkan"> <!ENTITY subscription.lastDownload.connectionError "Gagal, kesalahan pengunduhan"> +<!ENTITY findbar.statusWrappedStart "Sampai di atas, lanjutkan dari bawah"> <!ENTITY subscription.lastDownload.success "Berhasil"> +<!ENTITY findbar.placeholder "Temukan Filter"> <!ENTITY subscription.lastDownload.invalidData "Gagal, daftar penyaring tidak sah"> +<!ENTITY findbar.close "Tutup temukan bar"> <!ENTITY filter.paste.label "Tempel"> <!ENTITY subscription.disabledFilters.enable "Aktifkan penyaring yang dinonaktifkan"> <!ENTITY lasthit.column "Kunjungan &terkini"> +<!ENTITY findbar.statusWrappedEnd "Sampai di bawah, lanjutkan dari atas"> <!ENTITY subscription.editTitle.label "Sunting judul"> +<!ENTITY findbar.statusNotFound "Frasa tidak ditemukan"> <!ENTITY subscription.disabledFilters.warning "Beberapa penyaring pada langganan ini dinonaktifkan."> <!ENTITY filter.column "&Aturan penyaring"> <!ENTITY subscription.lastDownload.label "Terakhir diunduh:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/id/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/id/firstRun.properties index 44a3e65..0ea9046 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/id/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/id/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Tersedia untuk Android dan iOS +firstRun_abbButtonTitle=Dapatkan Adblock Browser di sini +firstRun_abbPromotionHeadline=Punya smartphone atau tablet? firstRun_acceptableAdsExplanation=Kami ingin mendorong situs web untuk menggunakan iklan yang tanpa basa-basi dan tidak mengganggu. Itulah sebabnya kami telah menetapkan <a>panduan ketat</a> untuk mengidentifikasi iklan mana saja yang diizinkan, yang akan ditampilkan dengan pengaturan baku. Jika Anda masih ingin mencekal semua iklan, Anda dapat <a>menonaktifkan</a> fitur ini dalam beberapa detik. firstRun_acceptableAdsHeadline=Iklan yang mengganggu kini akan dicekal firstRun_contributor_credits=Daftar Kontributor diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/id/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/id/global.properties index 14b024b..f6b2cfc 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/id/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/id/global.properties @@ -5,6 +5,7 @@ type_label_script=skrip filter_elemhide_nocriteria=Tidak ada kriteria yang telah ditentukan untuk mengenali elemen yang ingin disembunyikan blockingGroup_title=Aturan Pencekalan Iklan whitelisted_tooltip=Adblock Plus dinonaktifkan pada halaman ini. +type_label_ping=ping type_label_stylesheet=lembar gaya blocked_count_tooltip=?1? dari ?2? type_label_font=Gaya huruf @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus telah dinonaktifkan untuk halaman ini remove_group_warning=Apakah Anda yakin ingin menghapus kelompok ini? action1_tooltip=Klik untuk membuka/menutup butir yang dapat dicekal, klik tengah untuk mengaktifkan/menonaktifkan. type_label_xmlhttprequest=permintaan XML +filter_invalid_regexp=Kalimat biasa yang tidak valid active_tooltip=Adblock Plus diaktifkan, ?1? penyaring langganan dan ?2? penyaring ubahsuaian digunakan. type_label_document=dokumen type_label_object_subrequest=subpermintaan objek @@ -25,11 +27,15 @@ type_label_object=objek action2_tooltip=Klik untuk membuka preferensi, klik tengah untuk mengaktifkan/menonaktifkan. type_label_subdocument=bingkai clearStats_warning=Statistik kunjungan dari semua penyaring akan diatur ulang dan penghitung kunjungan penyaring akan dinonaktifkan. Apakah Anda ingin melanjutkan? +filter_unknown_option=Opsi filter yang tidak diketahui +type_label_genericblock=cekal umum notification_antiadblock_message=Situs ini telah diketahui sering menampilkan pesan yang ditargetkan untuk pengguna Adblock Plus. Apakah Anda ingin Adblick Plus untuk menyembunyikan pesan yang ditargetkan tersebut? blocked_count_addendum=(juga masuk dalam daftar putih: ?1?, dan disembunyikan: ?2?) subscription_invalid_location=Lokasi daftar penyaring bukan merupakan sebuah URL atau nama berkas yang sah. +type_label_websocket=websocket type_label_image=gambar remove_subscription_warning=Apakah Anda yakin ingin menghapus langganan ini? +type_label_generichide=sembunyikan umum type_label_other=lainnya mobile_menu_enable=ABP: Aktifkan type_label_media=audio/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Aktifkan pada ?1? type_label_elemhide=tersembunyi newGroup_title=Kelompok penyaring baru default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/id/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/id/overlay.dtd index 41a67ca..36568a1 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/id/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/id/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Tidak"> <!ENTITY sync.label "&Sinkronkan pengaturan Adblock Plus"> <!ENTITY whitelist.site.label "Nonaktifkan pada ?1?"> +<!ENTITY notification.closing.button.hide "Tutup pemberitahuan"> <!ENTITY filters.label "&Preferensi penyaring"> <!ENTITY disable.label "Nonaktifkan di semua tempat"> <!ENTITY objecttab.title "Cekal"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ya"> <!ENTITY opensidebar.label "Buka &butir yang dapat dicekal"> <!ENTITY notification.button.close "&Tutup"> +<!ENTITY shownotifications.label "Tampilkan pemberitahuan yang berguna"> <!ENTITY contribute.label "Kontribusi untuk Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Cekal bingkai"> <!ENTITY blocked.tooltip "Butir yang dicekal pada halaman ini:"> +<!ENTITY notification.closing.button.optout "Berhenti menampilkan pemberitahuan"> <!ENTITY counthits.label "Hitung &kunjungan penyaring"> <!ENTITY showinstatusbar.label "Tampilkan pada bilah &status"> <!ENTITY sidebar.title "Butir yang dapat dicekal pada halaman ini"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Tampilkan pada bilah &alat"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Cekal audio/video"> -<!ENTITY subscription.update.label "Mutakhirkan penyaring"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/is/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/is/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/is/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/is/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/is/filters.dtd index d22adad..a8a0dff 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/is/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/is/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Leyfa auglýs&ingar sem eru ekki uppáþrengjandi"> <!ENTITY addSubscriptionOther.label "Bæta við öðruvÃsi áskrift"> <!ENTITY close.label "Loka"> +<!ENTITY findbar.caseSensitive "Passa við stafstöðu"> <!ENTITY sort.none.label "Ó&raðað"> <!ENTITY filter.actions.label "SÃu aðgerðir"> <!ENTITY filter.copy.label "Afrita"> @@ -62,12 +63,17 @@ <!ENTITY find.label "&Leita"> <!ENTITY subscription.moveDown.label "Færa niður"> <!ENTITY subscription.lastDownload.connectionError "Mistókst, gat ekki niðurhalað"> +<!ENTITY findbar.statusWrappedStart "Leitaði alveg upp, held áfram að leita neðan frá"> <!ENTITY subscription.lastDownload.success "Tókst"> +<!ENTITY findbar.placeholder "Leita að sÃu"> <!ENTITY subscription.lastDownload.invalidData "Mistókst, ekki gildur sÃulisti"> +<!ENTITY findbar.close "Loka leitarslánni"> <!ENTITY filter.paste.label "LÃma"> <!ENTITY subscription.disabledFilters.enable "Virkja óvirkar sÃur"> <!ENTITY lasthit.column "Seinast &heimsótt"> +<!ENTITY findbar.statusWrappedEnd "Leitaði alveg niður, held áfram að leita ofan frá"> <!ENTITY subscription.editTitle.label "Breyta titli"> +<!ENTITY findbar.statusNotFound "Fann ekki leitarstreng"> <!ENTITY subscription.disabledFilters.warning "Sumar sÃur à þessari áskrift eru óvirkar."> <!ENTITY filter.column "SÃu re&gla"> <!ENTITY subscription.lastDownload.label "Seinasta niðurhal:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/is/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/is/firstRun.properties index ddcc89b..b8d717f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/is/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/is/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Fáanlegur fyrir Android og iOS +firstRun_abbButtonTitle=Náðu à Adblock Browser hér +firstRun_abbPromotionHeadline=Ãttu snjallsÃma eða spjaldtölvu? firstRun_acceptableAdsExplanation=Við viljum hvetja vefsvæði til að nota einfaldar auglýsingar, sem eru ekki uppáþrengjandi. Þess vegna höfum við sett fram <a>ákveðnar reglur</a> til að skilgreina ásættanlegar auglýsingar, sem eru birtar með venjulegum stillingum. Ef þú vilt loka á allar auglýsingar geturðu gert þetta <a>óvirkt</a> á einfaldan hátt. firstRun_acceptableAdsHeadline=Lokað verður á uppáþrengjandi auglýsingar firstRun_contributor_credits=Stuðningsaðilar diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/is/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/is/global.properties index 775228d..9aee7e2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/is/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/is/global.properties @@ -5,6 +5,7 @@ type_label_script=skrifta filter_elemhide_nocriteria=Engin viðmiðun skilgreind til þess að bera kennsl á hlut til að fela blockingGroup_title=Lokunarreglur whitelisted_tooltip=Adblock Plus er à gangi en er óvirkur á núverandi sÃðu. +type_label_ping=ping type_label_stylesheet=stÃlblað blocked_count_tooltip=?1? af ?2? type_label_font=leturgerð @@ -15,6 +16,7 @@ whitelisted_page=Búið er að gera Adblock Plus óvirkt fyrir núverandi sÃðu remove_group_warning=Viltu fjarlægja þennan hóp? action1_tooltip=Smelltu til að opna/loka hlutum, miðju smella til að virkja/gera óvirkt. type_label_xmlhttprequest=XML beiðni +filter_invalid_regexp=Ógild regluleg segð active_tooltip=Adblock Plus er virkur, ?1? sÃu áskriftir og ?2? sérsniðnar sÃur à notkun. type_label_document=skjal type_label_object_subrequest=undiraðgerð hlutar @@ -25,11 +27,15 @@ type_label_object=hlutur action2_tooltip=Smelltu til að opna stillingar, miðju smelltu til að virkja/gera óvirkt. type_label_subdocument=rammi clearStats_warning=Þetta mun endurstilla alla teljara á sÃunotkun og hætta að telja sÃunotkun. Viltu halda áfram? +filter_unknown_option=Óþekkt sÃunnar val +type_label_genericblock=almennar lokunarreglur notification_antiadblock_message=Þetta vefsvæði er þekkt fyrir að sýna áhugamiðuð skilaboð til Adblock Plus notenda. Viltu að Adblock Plus feli þessi áhugamiðuð skilaboð? blocked_count_addendum=(einnig á hvÃtlista: ?1?, falið: ?2?) subscription_invalid_location=Staðsetning sÃu er ekki gilt URL eða gilt skráarnafn. +type_label_websocket=websocket type_label_image=mynd remove_subscription_warning=Viltu fjarlægja þessa áskrift? +type_label_generichide=almennar felureglur type_label_other=annað mobile_menu_enable=ABP: Virkja type_label_media=hljóð/mynd @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Virkja fyrir ?1? type_label_elemhide=falið newGroup_title=Ný sÃu regla default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/is/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/is/overlay.dtd index b35663b..dfab1a5 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/is/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/is/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nei"> <!ENTITY sync.label "Sa&mstilla Adblock Plus stillingar"> <!ENTITY whitelist.site.label "Gera óvirkt á ?1?"> +<!ENTITY notification.closing.button.hide "Loka &þessari tilkynningu"> <!ENTITY filters.label "&SÃu stillingar"> <!ENTITY disable.label "Slökkva á allstaðar"> <!ENTITY objecttab.title "Loka á"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Já"> <!ENTITY opensidebar.label "Skoða h&luti"> <!ENTITY notification.button.close "&Loka"> +<!ENTITY shownotifications.label "Sýna gagnlegar tilky&nningar"> <!ENTITY contribute.label "Taka þátt à Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Loka auglýsingaramma"> <!ENTITY blocked.tooltip "Lokaðir hlutir á þessari sÃðu:"> +<!ENTITY notification.closing.button.optout "Hætta að &sýna tilkynningar"> <!ENTITY counthits.label "Telja sÃu &notkun"> <!ENTITY showinstatusbar.label "&Sýna à stöðuslá"> <!ENTITY sidebar.title "Hlutir á núverandi sÃðu sem hægt er að loka á"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Sýna à &tækjaslá"> <!ENTITY status.tooltip "Staða:"> <!ENTITY context.media.label "Adblock Plus: Loka á myndefni/hljóð"> -<!ENTITY subscription.update.label "Uppfæra sÃur"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/it/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/it/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/it/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/it/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/it/composer.dtd index ad05b55..c9aeec2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/it/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/it/composer.dtd @@ -1,18 +1,18 @@ -<!ENTITY anchor.end.label "alla f&ine dell'indirizzo web"> +<!ENTITY anchor.end.label "alla fi&ne dell'indirizzo"> <!ENTITY domainRestriction.label "Limita al &dominio:"> <!ENTITY collapse.default.no.label "Utilizza predefiniti (no)"> <!ENTITY firstParty.label "Solo dominii di p&rimo livello"> <!ENTITY preferences.label "&Mostra i filtri esistenti…"> <!ENTITY pattern.label "Modelli"> -<!ENTITY thirdParty.label "&Solo domini di terza parte"> +<!ENTITY thirdParty.label "&Solo terze parti"> <!ENTITY filter.label "&Nuovo filtro:"> <!ENTITY collapse.label "&Contrai bloccati:"> <!ENTITY match.warning "Il modello inserito non corrisponde più all'indirizzo web da bloccare/permettere e non avrà quindi alcun effetto"> -<!ENTITY anchor.start.label "all'i&nizio dell'indirizzo web"> +<!ENTITY anchor.start.label "all'inizio dell'indirizzo"> <!ENTITY matchCase.label "Mai&uscole/minuscole"> <!ENTITY custom.pattern.label "&Personalizza:"> <!ENTITY unselectAllTypes.label "Deseleziona"> -<!ENTITY type.whitelist.label "Eccezione"> +<!ENTITY type.whitelist.label "Eccezione dalla regola"> <!ENTITY regexp.warning "Il modello inserito verrà interpretato come espressione regolare. Un numero eccessivo di tali modelli potrebbe rallentare la navigazione. Se non si intende utilizzare le espressioni regolari aggiungere il carattere * alla fine del modello"> <!ENTITY dialog.title "Nuovo filtro di Adblock Plus"> <!ENTITY basic.label "<< Generali"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/it/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/it/filters.dtd index 77200a0..60d68ee 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/it/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/it/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "&Permetti alcune pubblicità non inopportune"> <!ENTITY addSubscriptionOther.label "Altre sottoscrizioni"> <!ENTITY close.label "Chiudi"> +<!ENTITY findbar.caseSensitive "Maiuscole / minuscole"> <!ENTITY sort.none.label "Non or&dinare"> <!ENTITY filter.actions.label "Opzioni del filtro"> <!ENTITY filter.copy.label "Copia"> @@ -62,12 +63,17 @@ <!ENTITY find.label "Tro&va"> <!ENTITY subscription.moveDown.label "Sposta giù"> <!ENTITY subscription.lastDownload.connectionError "Sincronizzazione non riuscita, errore durante il download"> +<!ENTITY findbar.statusWrappedStart "Top raggiunto, continuando dal basso"> <!ENTITY subscription.lastDownload.success "Sincronizzazione effettuata con successo"> +<!ENTITY findbar.placeholder "Trova filtro"> <!ENTITY subscription.lastDownload.invalidData "Sincronizzazione non riuscita, lista dei filtri non valida"> +<!ENTITY findbar.close "Chiudi barra di ricerca"> <!ENTITY filter.paste.label "Incolla"> <!ENTITY subscription.disabledFilters.enable "Attiva i filtri disattivati"> <!ENTITY lasthit.column "&Ultimo accesso"> +<!ENTITY findbar.statusWrappedEnd "Raggiunto in fondo, continuando dall'alto"> <!ENTITY subscription.editTitle.label "Modifica il titolo"> +<!ENTITY findbar.statusNotFound "Frase non trovata"> <!ENTITY subscription.disabledFilters.warning "Alcuni filtri di questa sottoscrizione sono disattivati."> <!ENTITY filter.column "&Ruolo del filtro"> <!ENTITY subscription.lastDownload.label "Ultimo aggiornamento:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/it/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/it/firstRun.properties index e631b7c..96ef6b7 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/it/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/it/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Disponibile per Android e iOS +firstRun_abbButtonTitle=Scarica Adblock Browser qui +firstRun_abbPromotionHeadline=Hai uno smartphone o un tablet? firstRun_acceptableAdsExplanation=Vorremmo incoraggiare i siti web ad utilizzare pubblicità semplici e discrete. Ecco perché sono state stabilite <a>severe linee guida</a> per identificare pubblicità accettabili, che saranno visualizzate con le impostazioni predefinite. Per bloccare comunque tutte le pubblicità è possibile <a>disattivare</a> l'opzione rapidamente firstRun_acceptableAdsHeadline=Le pubblicità fastidiose verranno bloccate firstRun_contributor_credits=Lista dei collaboratori diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/it/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/it/global.properties index 7c4f1fb..e2ca7fd 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/it/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/it/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=Non è stato specificato alcun criterio per rilevare l'elemento da nascondere blockingGroup_title=Gruppo di filtri per bloccare elementi whitelisted_tooltip=Adblock Plus è attiva ma è stata disattivata per la pagina attuale +type_label_ping=ping type_label_stylesheet=foglio di stile blocked_count_tooltip=?1? di ?2? type_label_font=carattere @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus è stata disattivata per la pagina attuale remove_group_warning=Eliminare il gruppo di filtri? action1_tooltip=Fare clic per aprire/chiudere la finestra degli elementi bloccabili, clic centrale per attivare/disattivare type_label_xmlhttprequest=richiesta XML +filter_invalid_regexp=Espressione regolare Invalida active_tooltip=Adblock Plus è attiva (sottoscrizioni di filtri in uso: ?1?, filtri in uso: ?2?) type_label_document=documento type_label_object_subrequest=oggetto sottorichiesto @@ -25,11 +27,15 @@ type_label_object=oggetto action2_tooltip=Fare clic per aprire la finestra di gestione dei filtri, clic centrale per attivare/disattivare type_label_subdocument=riquadro clearStats_warning=Azzerare le statistiche per tutti i filtri e disattivarne il futuro conteggio? +filter_unknown_option=Opzione Filtro Sconosciuta +type_label_genericblock=blocco generico notification_antiadblock_message=Questo sito è noto per mostrare messaggi mirati agli utenti di Adblock Plus. Vuoi che Adblock Plus nasconda i messaggi mirati (pubblicità )? blocked_count_addendum=(elementi permessi: ?1?, elementi nascosti: ?2?) subscription_invalid_location=Attenzione: per poter aggiungere una sottoscrizione è necessario che i campi 'Titolo della sottoscrizione:' ed 'Indirizzo della lista dei filtri:' non siano lasciati vuoti e corrispondano a nomi di file validi. Inserire tali dati e ripetere la procedura +type_label_websocket=webSocket type_label_image=immagine remove_subscription_warning=Eliminare la sottoscrizione di filtri? +type_label_generichide=nascondere generico type_label_other=altro mobile_menu_enable=Attiva ABP type_label_media=audio/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP è attivata per ?1? type_label_elemhide=nascosto newGroup_title=Nuovo gruppo di filtri default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/it/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/it/overlay.dtd index d61dfc7..e9c7785 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/it/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/it/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "No"> <!ENTITY sync.label "Sincronizza le impostazioni di Adbloc&k Plus"> <!ENTITY whitelist.site.label "Disattiva per ?1?"> +<!ENTITY notification.closing.button.hide "Chiudi quest&a notifica"> <!ENTITY filters.label "Gestione dei &filtri"> <!ENTITY disable.label "Disattiva per tutte le pagine"> <!ENTITY objecttab.title "Blocca"> @@ -13,12 +14,14 @@ <!ENTITY notification.button.yes "Sì"> <!ENTITY opensidebar.label "Apri l'elenco degli elementi &bloccabili"> <!ENTITY notification.button.close "Chiudi"> +<!ENTITY shownotifications.label "Visualizza notifiche utili"> <!ENTITY contribute.label "Contribuisci ad Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Blocca riquadro con Adblock Plus"> <!ENTITY blocked.tooltip "Elementi attualmente bloccati"> +<!ENTITY notification.closing.button.optout "Interrompi la visualizzazione delle notifiche"> <!ENTITY counthits.label "&Effettua le statistiche di accesso"> -<!ENTITY showinstatusbar.label "Vi&sualizza nella barra di stato"> +<!ENTITY showinstatusbar.label "Visualizza nella barra di stato"> <!ENTITY sidebar.title "Elenco degli elementi bloccabili con Adblock Plus"> <!ENTITY options.label "&Opzioni di Adblock Plus"> <!ENTITY context.object.label "Blocca oggetto con Adblock Plus"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Visualizza nella &barra degli strumenti"> <!ENTITY status.tooltip "Stato di Adblock Plus"> <!ENTITY context.media.label "Blocca video/audio con Adblock Plus"> -<!ENTITY subscription.update.label "Aggiorna i filtri"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/it/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/it/sendReport.dtd index c2f818b..bc934a9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/it/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/it/sendReport.dtd @@ -41,7 +41,7 @@ <!ENTITY attachExtensions.label "A&llegare una lista di estensioni attive al report nel caso in cui un add-on in conflitto è la causa del problema"> <!ENTITY issues.nosubscriptions.add.label "Aggiungi una sottoscrizione di filtri…"> <!ENTITY issues.disabledfilters.enable.label "Attiva i filtri"> -<!ENTITY issues.override.label "&Le impostazioni di Adblock Plus sono corrette, proseguire con la raccolta dei dati per la segnalazione"> +<!ENTITY issues.override.label "&Le impostazioni sono corrette, proseguire con la segnalazione"> <!ENTITY issues.nosubscriptions.description "Non sembra essere attiva alcuna sottoscrizione di filtri che permette l'eliminazione automatica di banner e/o pubblicità presenti nei siti web"> <!ENTITY typeSelector.falsePositive.description "Selezionare questa opzione se nella pagina web manca parte del contenuto importante, se la pagina web viene diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ja/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ja/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ja/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ja/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ja/filters.dtd index b5d5270..3db6eae 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ja/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ja/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "控ãˆã‚ãªåºƒå‘Šã‚’許å¯(&I)"> <!ENTITY addSubscriptionOther.label "別ã®è³¼èªã™ã‚‹ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ "> <!ENTITY close.label "é–‰ã˜ã‚‹"> +<!ENTITY findbar.caseSensitive "大文å—å°æ–‡å—を区別"> <!ENTITY sort.none.label "ソートã—ãªã„(&U)"> <!ENTITY filter.actions.label "フィルタアクション"> <!ENTITY filter.copy.label "コピー"> @@ -60,12 +61,17 @@ <!ENTITY find.label "検索(&N)"> <!ENTITY subscription.moveDown.label "下ã«ç§»å‹•"> <!ENTITY subscription.lastDownload.connectionError "更新失敗: 接続エラー"> +<!ENTITY findbar.statusWrappedStart "å…ˆé ã«é”ã—ãŸã®ã§æœ«å°¾ã‹ã‚‰ç¶šè¡Œã—ã¾ã™"> <!ENTITY subscription.lastDownload.success "æ›´æ–°æˆåŠŸ"> +<!ENTITY findbar.placeholder "フィルタを検索"> <!ENTITY subscription.lastDownload.invalidData "更新失敗: フィルタリスト無効"> +<!ENTITY findbar.close "検索ãƒãƒ¼ã‚’é–‰ã˜ã‚‹"> <!ENTITY filter.paste.label "貼り付ã‘"> <!ENTITY subscription.disabledFilters.enable "無効ã«ãªã£ã¦ã„るフィルタを有効化"> <!ENTITY lasthit.column "最終ヒット日時(&L)"> +<!ENTITY findbar.statusWrappedEnd "末尾ã«é”ã—ãŸã®ã§å…ˆé ã‹ã‚‰ç¶šè¡Œã—ã¾ã™"> <!ENTITY subscription.editTitle.label "タイトルを編集"> +<!ENTITY findbar.statusNotFound "見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"> <!ENTITY subscription.disabledFilters.warning "è³¼èªã—ã¦ã„るフィルタã®ä¸€éƒ¨ãŒç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™"> <!ENTITY filter.column "フィルタ(&F)"> <!ENTITY subscription.lastDownload.label "更新日時:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ja/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ja/firstRun.properties index 60bdf13..bb8c87c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ja/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ja/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Androidã¨iOSã§åˆ©ç”¨å¯èƒ½ +firstRun_abbButtonTitle=Adblock Browserã‚’ã“ã“ã‹ã‚‰å…¥æ‰‹ +firstRun_abbPromotionHeadline=スマートフォンやタブレットを入手ã—ã¾ã—ãŸã‹ï¼Ÿ firstRun_acceptableAdsExplanation=我々ã¯ã‚¦ã‚§ãƒ–サイトãŒç°¡ç´ ã§æŽ§ãˆã‚ãªåºƒå‘Šã‚’使用ã™ã‚‹ã‚ˆã†å¾ŒæŠ¼ã—ã—ãŸã„ã¨è€ƒãˆã¦ã„ã¾ã™ã€‚ãã®ãŸã‚控ãˆã‚ãªåºƒå‘Šã‚’区別ã™ã‚‹ãŸã‚ã®<a>åŽ³æ ¼ãªã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³</a>ã‚’ç–定ã—ã€ãƒ‡ãƒ•ォルトã§è¨±å¯ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚ã™ã¹ã¦ã®åºƒå‘Šã‚’ブãƒãƒƒã‚¯ã—ãŸã„å ´åˆã¯æ•°ç§’ã§æŽ§ãˆã‚ãªåºƒå‘Šã®è¨±å¯ã‚’<a>無効ã«ã™ã‚‹</a>ã“ã¨ãŒã§ãã¾ã™ 。 firstRun_acceptableAdsHeadline=迷惑ãªåºƒå‘Šã¯ãƒ–ãƒãƒƒã‚¯ã•れã¾ã™ firstRun_contributor_credits=貢献ã—ãŸäºº @@ -16,5 +19,3 @@ firstRun_legacySafariWarning=Adblock Plus ãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãªã„å¤ã„ムfirstRun_share=å‹é”ã«æ•™ãˆã‚‹ firstRun_share_headline=Web をより良ã„å ´æ‰€ã«ã™ã‚‹ãŸã‚ã«<a>å”力ã™ã‚‹</a> firstRun_title=Adblock Plus ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã—㟠-firstRun_toggle_off=OFF -firstRun_toggle_on=ON diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ja/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ja/global.properties index 842af8e..bfee36c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ja/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ja/global.properties @@ -5,16 +5,18 @@ type_label_script=スクリプト filter_elemhide_nocriteria=è¦ç´ ã‚’éžè¡¨ç¤ºã«ã™ã‚‹æ¡ä»¶ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ blockingGroup_title=広告ブãƒãƒƒã‚¯ãƒ«ãƒ¼ãƒ« whitelisted_tooltip=Adblock Plus ã¯ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã§ç„¡åй +type_label_ping=ping type_label_stylesheet=スタイルシート blocked_count_tooltip=ブãƒãƒƒã‚¯æ¸ˆ: ?1?ï¼ãƒ–ãƒãƒƒã‚¯å¯èƒ½ :?2? type_label_font=フォント -type_label_popup=ãƒãƒƒãƒ—アップ +type_label_popup=ãƒãƒƒãƒ—アップ・ウィンドウ filter_regexp_tooltip=ã“ã®ãƒ•ã‚£ãƒ«ã‚¿ã¯æ£è¦è¡¨ç¾ã‚’使用ã—ã¦ã„ã‚‹ã€ã‚‚ã—ãã¯æœ€é©åŒ–ã™ã‚‹ã®ã«çŸéŽãŽã¾ã™ã€‚ã“ã®ã‚ˆã†ãªãƒ•ィルタãŒå¤šã„ã¨ãƒ–ラウザãŒé…ããªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ action0_tooltip=クリックã§ã‚³ãƒ³ãƒ†ã‚ストメニューを表示ã€ä¸ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ whitelisted_page=Adblock Plus ã¯ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã§ç„¡åйã«è¨å®šã•れã¦ã„ã¾ã™ remove_group_warning=本当ã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を削除ã—ã¾ã™ã‹ï¼Ÿ action1_tooltip=クリックã§ãƒ–ãƒãƒƒã‚¯å¯èƒ½é …目一覧を開ï¼é–‰ã€ä¸ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ type_label_xmlhttprequest=XML リクエスト +filter_invalid_regexp=ç„¡åŠ¹ãªæ£è¦è¡¨ç¾ active_tooltip=Adblock Plus 有効 (ãƒ•ã‚£ãƒ«ã‚¿è³¼èªæ•°: ?1?ï¼è‡ªä½œãƒ•ィルタ数: ?2?) type_label_document=ドã‚ュメント type_label_object_subrequest=オブジェクトã®ã‚µãƒ–リクエスト @@ -25,17 +27,22 @@ type_label_object=オブジェクト action2_tooltip=クリックã§è¨å®šã‚’オープンã€ä¸ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ type_label_subdocument=フレームclearStats_warning=全フィルタã®ãƒ’ット数をリセットã—ã€ãƒ’ット数記録機能を無効化ã—ã¾ã™ã‹ï¼Ÿ +filter_unknown_option=未知ã®ãƒ•ィルター オプション +type_label_genericblock=汎用ブãƒãƒƒã‚¯ notification_antiadblock_message=ã“ã®ã‚µã‚¤ãƒˆã¯ Adblock Plus ユーザーを対象ã¨ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ã§çŸ¥ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚Adblock Plus ã§ã“れらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™ã‹ï¼Ÿ blocked_count_addendum=(ホワイトリスト: ?1?ï¼è¦ç´ éžè¡¨ç¤º: ?2?) subscription_invalid_location=è³¼èªã™ã‚‹ãƒ•ィルタ㮠URL ãŒç„¡åйã€ã‚‚ã—ãã¯ä¸æ£ãªãƒ•ァイルåã§ã™ã€‚ +type_label_websocket=websocket type_label_image=ç”»åƒ remove_subscription_warning=本当ã«ã“ã®ãƒ•ィルタã®è³¼èªã‚’削除ã—ã¾ã™ã‹ï¼Ÿ +type_label_generichide=汎用éžè¡¨ç¤º type_label_other=ãã®ä»– mobile_menu_enable=ABP: 有効 -type_label_media=オーディオï¼ãƒ“デオ +type_label_media=オーディオ/ビデオ mobile_menu_disable_site=ABP: ?1? ã§ç„¡åй elemhideGroup_title=è¦ç´ éžè¡¨ç¤ºãƒ«ãƒ¼ãƒ« mobile_menu_enable_site=ABP: ?1? ã§æœ‰åй -type_label_elemhide=è¦ç´ éžè¡¨ç¤º +type_label_elemhide=éžè¡¨ç¤º newGroup_title=æ–°ã—ã„フィルタグループ default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ja/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ja/overlay.dtd index be39d5e..80705b3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ja/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ja/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "ã„ã„ãˆ(&N)"> <!ENTITY sync.label "Adblock Plus è¨å®šã‚’ Sync ã§åŒæœŸ(&C)"> <!ENTITY whitelist.site.label "?1? ã§ç„¡åй"> +<!ENTITY notification.closing.button.hide "ã“ã®é€šçŸ¥ã‚’é–‰ã˜ã‚‹(&H)"> <!ENTITY filters.label "フィルタè¨å®š(&F)"> <!ENTITY disable.label "全ページã§ç„¡åй"> <!ENTITY objecttab.title "ブãƒãƒƒã‚¯ã™ã‚‹"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "ã¯ã„(&Y)"> <!ENTITY opensidebar.label "ブãƒãƒƒã‚¯å¯èƒ½é …目一覧を開ã(&B)"> <!ENTITY notification.button.close "é–‰ã˜ã‚‹(&C)"> +<!ENTITY shownotifications.label "有用ãªé€šçŸ¥ã‚’表示(&N)"> <!ENTITY contribute.label "Adblock Plus ã«è²¢çŒ®ã™ã‚‹"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: フレームをブãƒãƒƒã‚¯"> <!ENTITY blocked.tooltip "ã“ã®ãƒšãƒ¼ã‚¸ã§ãƒ–ãƒãƒƒã‚¯ä¸ã®é …ç›®:"> +<!ENTITY notification.closing.button.optout "通知ã®è¡¨ç¤ºã‚’åœæ¢(&S)"> <!ENTITY counthits.label "フィルタã®ãƒ’ット数を数ãˆã‚‹(&H)"> <!ENTITY showinstatusbar.label "ステータスãƒãƒ¼ã«è¡¨ç¤º(&S)"> <!ENTITY sidebar.title "ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ–ãƒãƒƒã‚¯å¯èƒ½é …目一覧"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "ツールãƒãƒ¼ã«è¡¨ç¤º(&B)"> <!ENTITY status.tooltip "ステータス:"> <!ENTITY context.media.label "Adblock Plus: オーディオï¼ãƒ“デオをブãƒãƒƒã‚¯"> -<!ENTITY subscription.update.label "フィルタを更新"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ja/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ja/sendReport.dtd index d8f1957..98a798a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ja/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ja/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "最近é€ä¿¡ã—ãŸä¸å…·åˆå ±å‘Š"> <!ENTITY typeWarning.description "フィルタã«ã¤ã„ã¦ã§ã¯ãªã Adblock Plus 全般ã®ä¸å…·åˆã‚’å ±å‘Šã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ãªä¸å…·åˆã¯é€šå¸¸ [link]Adblock Plus フォーラム[/link] ã§å ±å‘Šã•れã¦ã„ã¾ã™ã€‚ã¾ãŸã€ä¸å…·åˆå ±å‘Šã¸ã®ãƒªãƒ³ã‚¯ã‚’自らæä¾›ã—ãªã„é™ã‚Šãƒ•ォーラムã®èª°ã‚‚ã‚ãªãŸã®ä¸å…·åˆå ±å‘Šã®å˜åœ¨ã«æ°—付ã‘ãªã„ã®ã§ã€æ—¢å˜ã®è°è«–を補完ã™ã‚‹ãŸã‚ã ã‘ã«ä½¿ç”¨ã—ã¦ãã ã•ã„。ä¸å…·åˆå ±å‘Šã¸ã®ãƒªãƒ³ã‚¯ã¯ãƒ¬ãƒãƒ¼ãƒˆé€ä¿¡å¾Œã«æä¾›ã•れã¾ã™ã€‚"> <!ENTITY issues.disabled.description "Adblock Plus ãŒç„¡åйãªã®ã§ã€ä½•もブãƒãƒƒã‚¯ã•れã¦ã„ã¾ã›ã‚“"> -<!ENTITY attachExtensions.label "アドオンã®ç«¶åˆãŒä¸å…·åˆã®åŽŸå› ã§ã‚ã‚‹å ´åˆãŒã‚ã‚‹ã®ã§ã€å‹•作ã—ã¦ã„るアドオンã®ãƒªã‚¹ãƒˆã‚’ä¸å…·åˆå ±å‘Šã«æ·»ä»˜ã™ã‚‹(&X)"> +<!ENTITY attachExtensions.label "アドオンã®ç«¶åˆãŒä¸å…·åˆã®åŽŸå› ã‹ã‚‚ã—れãªã„ã®ã§ã€ç¾åœ¨æœ‰åйã«ãªã£ã¦ã„るアドオンã®ãƒªã‚¹ãƒˆã‚’ä¸å…·åˆå ±å‘Šã«æ·»ä»˜ã™ã‚‹(&X)"> <!ENTITY issues.nosubscriptions.add.label "è³¼èªã™ã‚‹ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ "> <!ENTITY issues.disabledfilters.enable.label "フィルタを有効化"> <!ENTITY issues.override.label "è¨å®šã«é–“é•ã„ã¯ãªã‹ã£ãŸã®ã§å ±å‘Šã‚’ç¶šã‘ã¾ã™(&C)"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/kk/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/kk/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/kk/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/kk/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/kk/filters.dtd index cf794ce..bb77744 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/kk/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/kk/filters.dtd @@ -10,7 +10,7 @@ <!ENTITY restore.error "Файл мәліметін өңдеу мүмкін емеÑ, мүмкін ол Adblock Plus-тің көшірме файлы ÐµÐ¼ÐµÑ ÑˆÑ‹Ò“Ð°Ñ€?"> <!ENTITY sort.ascending.label "&Ð > Я Ñұрыптау"> <!ENTITY sort.label "&Сұрыптау"> -<!ENTITY subscription.source.label "Фильтлер тізімі"> +<!ENTITY subscription.source.label "Фильтрлер тізімі"> <!ENTITY hitcount.column "Ð¥&иттер"> <!ENTITY noFilters.text "Сізде әлі пайдаланушы фильтрлері жоқ."> <!ENTITY backup.custom.title "Тек пайланушы фильтрлері"> @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "ЗиÑнке&Ñ ÐµÐ¼ÐµÑ ÐºÐµÐ¹Ð±Ñ–Ñ€ жарнаманы Ñ–Ñке қоÑу"> <!ENTITY addSubscriptionOther.label "БаÑқа жазылуды қоÑу"> <!ENTITY close.label "Жабу"> +<!ENTITY findbar.caseSensitive "РегиÑтрді еÑкеру"> <!ENTITY sort.none.label "СұрыптауÑÑ‹&з"> <!ENTITY filter.actions.label "Фильтр әрекеттері"> <!ENTITY filter.copy.label "Көшіру"> @@ -62,12 +63,17 @@ <!ENTITY find.label "І&здеу"> <!ENTITY subscription.moveDown.label "Төмен жылжыту"> <!ENTITY subscription.lastDownload.connectionError "Қате, жүктеу мүмкін емеÑ"> +<!ENTITY findbar.statusWrappedStart "Ò®Ñтіне жеттік, аÑтынан жалғаÑтырамыз"> <!ENTITY subscription.lastDownload.success "Сәтті аÑқталды"> +<!ENTITY findbar.placeholder "Сүзгіні табу"> <!ENTITY subscription.lastDownload.invalidData "Қате, Ð´Ò±Ñ€Ñ‹Ñ Ñүзгілер файлы емеÑ"> +<!ENTITY findbar.close "Табу панелін жабу"> <!ENTITY filter.paste.label "КіріÑтіру"> <!ENTITY subscription.disabledFilters.enable "Сөндірулі фильтрлерді Ñ–Ñке қоÑу"> <!ENTITY lasthit.column "Соңғ&Ñ‹ хит"> +<!ENTITY findbar.statusWrappedEnd "Төменге жеттік, Ò¯Ñтінен жалғаÑтырамыз"> <!ENTITY subscription.editTitle.label "Ðтауын түзету"> +<!ENTITY findbar.statusNotFound "Фраза табылмады"> <!ENTITY subscription.disabledFilters.warning "Бұл жазылудағы кейбір фильтрлер Ñөндірулі."> <!ENTITY filter.column "Фильтр &ережеÑÑ–:"> <!ENTITY subscription.lastDownload.label "Соңғы жаңарту:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/kk/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/kk/firstRun.properties index 23827c5..dfeab06 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/kk/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/kk/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Android және iOS үшін қол жетімді +firstRun_abbButtonTitle=ОÑында Adblock Browser қолданбаÑын алыңыз +firstRun_abbPromotionHeadline=Смартфоныңыз немеÑе планшетіңіз бар ма? firstRun_acceptableAdsExplanation=Біз вебÑайттарды тура, мазаңызды алмайтын жарнаманы қолдануын қалаймыз. Сондықтан біз жарамды жарнаманы анықтаудың <a>қатаң нұÑқаулығын</a> орнаттық, ол жарнамма баÑтапқы баптаулармен көрÑетілетін болады. Егер Ñіз Ñонда да барлық жарнаманы <a>блоктағыңыз</a> келÑе, оÑыны тез арада Ñөндіре алаÑыз. firstRun_acceptableAdsHeadline=Мазаңызды алатын жарнама блокталатын болады firstRun_contributor_credits=Ò®Ð»ÐµÑ Ò›Ð¾Ñқандар @@ -16,5 +19,3 @@ firstRun_legacySafariWarning=Сіз қолданып отырған Safari Ð½Ò±Ñ firstRun_share=ДоÑтарыңызға айтыңыз firstRun_share_headline=Интернетті жақÑырақ қылу үшін <a>бізге көмек қолын Ñозыңыз</a> firstRun_title=Adblock Plus орнатылды -firstRun_toggle_off=OFF -firstRun_toggle_on=ON diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/kk/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/kk/global.properties index dae6af2..44f66fd 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/kk/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/kk/global.properties @@ -5,6 +5,7 @@ type_label_script=Скрипт filter_elemhide_nocriteria=Ðлементті жаÑыру үшін бірде-бір шарт анықталмады blockingGroup_title=Жарнаманы блоктау ережелері whitelisted_tooltip=Adblock Plus қоÑулы, бірақ оÑÑ‹ парақ үшін Ñөндірулі. +type_label_ping=пинг type_label_stylesheet=Стильдер кеÑтеÑÑ– blocked_count_tooltip=?1? келеÑіден ?2? type_label_font=қаріп @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus ағымдағы парақ үшін ÑÓ©Ð½Ð´Ñ–Ñ€Ñ remove_group_warning=Бұл топты өшіруді шынымен қалайÑыз ба? action1_tooltip=Блокталған құраманы ашу/жабу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін. type_label_xmlhttprequest=XML-Ñұранымы +filter_invalid_regexp=ЖарамÑыз тұрақты өрнек active_tooltip=Adblock Plus қоÑулы тұр, ?1? Ñүзгілерге жазылу мен ?2? пайдаланушы Ñүзгілері қолданылуда. type_label_document=Құжат type_label_object_subrequest=объект Ñұранымы @@ -25,11 +27,15 @@ type_label_object=Объект action2_tooltip=Баптауларды ашу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін. type_label_subdocument=Фрейм clearStats_warning=Бұл әрекет барлық фильтрлерді хит ÑтатиÑтикаÑын таÑтап, фильтр хиттерін Ñанауды Ñөндіреді. ЖалғаÑтыруды қалайÑыз ба? +filter_unknown_option=БелгіÑіз фильтр опциÑÑÑ‹ +type_label_genericblock=жалпы блок notification_antiadblock_message=Бұл Ñайт Adblock Plus пайдаланушыларына мақÑатталған хабарламаларды көрÑететіні белгілі. Adblock Plus мақÑатталған хабарламаларды жаÑыруы керек пе? blocked_count_addendum=(Ñүзгіден тыÑ: ?1?, жаÑырын: ?2?) subscription_invalid_location=Енгізілген Ð°Ð´Ñ€ÐµÑ Ð½Ðµ интернет адреÑÑ–, не файл мекен-жайы ретінде анықталмады. +type_label_websocket=вебÑокет type_label_image=Сурет remove_subscription_warning=ОÑÑ‹ жазылуды өшіруды шынымен қалайÑыз ба? +type_label_generichide=жалпы жаÑыру type_label_other=БаÑқа mobile_menu_enable=ABP: ІÑке қоÑу type_label_media=Ðудио/видео @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: КелеÑÑ– үшін Ñ–Ñке қоÑу: ?1? type_label_elemhide=ЖаÑырын newGroup_title=Жаңа фильтрлер тобы default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/kk/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/kk/overlay.dtd index bb7da9a..81e8624 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/kk/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/kk/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Жоқ"> <!ENTITY sync.label "Adblock Plus баптауларын Sync Ñ–&шіне қоÑу"> <!ENTITY whitelist.site.label "КелеÑÑ– үшін Ñөндіру: ?1?"> +<!ENTITY notification.closing.button.hide "Бұ&л хабарламаны жабу"> <!ENTITY filters.label "Фильт&Ñ€ баптаулары"> <!ENTITY disable.label "Әр жерде Ñөндіру"> <!ENTITY objecttab.title "Блоктау"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Иә"> <!ENTITY opensidebar.label "Блокталған құраманы аш&у"> <!ENTITY notification.button.close "Ж&абу"> +<!ENTITY shownotifications.label "&Пайдалы хабарламаларды көрÑету"> <!ENTITY contribute.label "Adblock Plus-қа Ò¯Ð»ÐµÑ Ò›Ð¾Ñу"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Фреймді блоктау"> <!ENTITY blocked.tooltip "Бұл парақтағы блокталған құрама:"> +<!ENTITY notification.closing.button.optout "Хабарламаларды көрÑетуді тоқ&тату"> <!ENTITY counthits.label "Ф&ильтрлер хиттерін Ñанау"> <!ENTITY showinstatusbar.label "Қалып-&күй жолағында көрÑету"> <!ENTITY sidebar.title "Ðғымдағы парақ құрамаÑÑ‹"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "&Панельде көрÑету"> <!ENTITY status.tooltip "Күйі:"> <!ENTITY context.media.label "Adblock Plus: Ðудио/Видеоны блоктау"> -<!ENTITY subscription.update.label "Фильтрлерді жаңарту"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/kk/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/kk/sendReport.dtd index 1e14564..57278a3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/kk/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/kk/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "Сіздің Ñоңғы жіберген хабарламаларыңыз"> <!ENTITY typeWarning.description "Сіз хабарламаны Adblock Plus-пен болған мәÑеле, фильтрлермен ÐµÐ¼ÐµÑ Ð´ÐµÐ¿ белгіледіңіз. Ондай мәÑелелер жөнінде [link]Adblock Plus форумына[/link] хабарлау жөн. ОÑÑ‹ хабарлаушыны тек форумдағы темаға толықтыру ретінде қолданыңыз, Ñғни, хабарламаңыздың ÑілтемеÑін бермеÑеңіз, оны ешкім де байқамайды. ÐвтожаÑалған Ñілтеме хабарламаны жіберуден кейін қолжетерлік болады."> <!ENTITY issues.disabled.description "Adblock Plus қазір Ñөндірулі тұр, Ñондықтан ол ешнәрÑені блоктамайды."> -<!ENTITY attachExtensions.label "Бел&Ñенді кеңейтулер тізімін жіберу, мүмкін, өзара мәÑелелер пайда болған шығар"> +<!ENTITY attachExtensions.label "Бел&Ñенді кеңейтулер тізімін еÑептемеге қоÑып жіберу, мүмкін, өзара әрекеттеÑу мәÑелелері пайда болған шығар"> <!ENTITY issues.nosubscriptions.add.label "Фильтрлерге жазылуды қоÑу"> <!ENTITY issues.disabledfilters.enable.label "Фильтрді Ñ–Ñке қоÑу"> <!ENTITY issues.override.label "Баптаулар дұр&Ñ‹Ñ, хабарламаны жалғаÑтыру"> @@ -62,5 +62,5 @@ <!ENTITY sendPage.heading "Хабарламаны жіберу"> <!ENTITY issues.subscriptionCount.description "Сізде фильтрлерге жазылулар Ñаны тым көп ÑиÑқты. Ондай жағдай қолдануға Ò±Ñынылмайды. Сонымен қатар біз Ñіздің хабарлауыңызды қабылдай алмаймыз, өйткені мәÑеле қай жазылудың Ñалдарынан пайда болғаны түÑінікÑіз. Тек маңызды жазылуларды қалдырып, баÑқаларды өшіріңіз, және мәÑеле қайталана ма, Ñоны көріңіз."> <!ENTITY screenshot.mark.label "Хабарламаны бел&гілеу"> -<!ENTITY privacyPolicy.label "Жекелік ÑаÑÑаиы"> +<!ENTITY privacyPolicy.label "Жекелік ÑаÑÑаты"> <!ENTITY issues.description "Adblock Plus бұл мәÑеле үшін жауапты бола алатын, немеÑе тергеуді қиындататын Ñіздің баптауларыңызды анықтады."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ko/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ko/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ko/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ko/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ko/filters.dtd index b099db4..cbaa2c6 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ko/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ko/filters.dtd @@ -70,3 +70,9 @@ <!ENTITY filter.column "í•„í„° (&F)"> <!ENTITY subscription.lastDownload.label "마지막 다운로드 :"> <!ENTITY viewList.label "í•„í„° ëª©ë¡ ë³´ê¸°"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ko/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ko/firstRun.properties index e260208..c982d4f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ko/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ko/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Android ë° iOSìš© 사용 가능 +firstRun_abbButtonTitle=여기ì—서 Adblock Browser ê°€ì ¸ì˜¤ê¸° +firstRun_abbPromotionHeadline=ìŠ¤ë§ˆíŠ¸í° ë˜ëŠ” íƒœë¸”ë¦¿ì´ ìžˆìŠµë‹ˆê¹Œ? firstRun_acceptableAdsExplanation=우리는 비침입ì ì´ë©° ì´ìš©ìž 친화ì ì¸ ê´‘ê³ ë°©ì‹ì„ 채íƒí•œ 웹사ì´íŠ¸ë¥¼ ê²©ë ¤í•˜ê³ ìž í•©ë‹ˆë‹¤. íŠ¹ì • ê´‘ê³ ë¥¼ 허용하기 위한 <a>ê´‘ê³ í—ˆìš© 지침</a>ì„ ìˆ˜ë¦½í•˜ì˜€ìœ¼ë©°, 기본 ì„¤ì •ìœ¼ë¡œ 그러한 ê´‘ê³ ëŠ” í™”ë©´ì— í‘œì‹œë©ë‹ˆë‹¤. ëª¨ë“ ê´‘ê³ ë¥¼ ì°¨ë‹¨í•˜ë ¤ë©´ ì´ ê¸°ëŠ¥ì˜ <a>ì‚¬ìš©ì„ ì¤‘ì§€</a>í• ìˆ˜ 있습니다. firstRun_acceptableAdsHeadline=ì¸í„°ë„· ì´ìš©ì„ 방해하거나 ë¶ˆë²•Â·ìœ í•´í•œ ê´‘ê³ ëŠ” ì´ì œ 차단ë 것입니다 firstRun_contributor_credits=ê³µí—Œìž ëª…ë‹¨ diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ko/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ko/global.properties index bbd9425..8836211 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ko/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ko/global.properties @@ -5,6 +5,7 @@ type_label_script=스í¬ë¦½íЏ filter_elemhide_nocriteria=ìˆ¨ê¸°ë ¤ëŠ” 요소를 ì¸ì‹í•˜ê¸° 위한 ê¸°ì¤€ì´ ì§€ì •ë˜ì§€ 않았습니다. blockingGroup_title=ìš”ì² ì°¨ë‹¨ í•„í„° whitelisted_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용 (í—ˆìš©ëœ íŽ˜ì´ì§€) +type_label_ping=í•‘ type_label_stylesheet=스타ì¼ì‹œíЏ blocked_count_tooltip=차단 : ?1?ê°œ, ì „ì²´ í•목 : ?2?ê°œ type_label_font=글꼴 @@ -25,11 +26,13 @@ type_label_object=ê°ì²´ action2_tooltip=마우스 ê°€ìš´ë° ë²„íŠ¼ - ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지 type_label_subdocument=í”„ë ˆìž„ clearStats_warning=ëª¨ë“ í•„í„° ì ìš© 횟수가 초기화ë˜ê³ , ì´ í†µê³„ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ 않습니다. ì§„í–‰í•˜ì‹œê² ìŠµë‹ˆê¹Œ? +type_label_genericblock=ì¼ë°˜ì ë¸”ë¡ notification_antiadblock_message=ì´ ì‚¬ì´íŠ¸ëŠ” ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용ìžì—게 표ì 메시지를 보여주는 것으로 ì•Œë ¤ì ¸ 있습니다. ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¡œ 표ì 메시지를 ìˆ¨ê¸°ê² ìŠµë‹ˆê¹Œ? blocked_count_addendum=(허용 : ?1?ê°œ, 요소 숨김 : ?2?ê°œ) subscription_invalid_location=êµ¬ë… í•„í„°ì˜ ìœ„ì¹˜ì— ìž…ë ¥í•˜ëŠ” URL ë˜ëŠ” 파ì¼ëª…ì´ ì˜¬ë°”ë¥´ì§€ 않습니다. type_label_image=ì´ë¯¸ì§€ remove_subscription_warning=ì´ êµ¬ë… í•„í„°ë¥¼ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ? +type_label_generichide=ì¼ë°˜ì 숨기기 type_label_other=기타 mobile_menu_enable=ABP:사용 type_label_media=오디오/비디오 @@ -39,3 +42,7 @@ mobile_menu_enable_site=ABP:사용 - ?1? type_label_elemhide=숨겨진 요소 newGroup_title=새 í•„í„° 그룹 default_dialog_title=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ +filter_invalid_regexp=Invalid regular expression +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +filter_unknown_option=Unknown filter option +type_label_websocket=websocket diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ko/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ko/overlay.dtd index c345c40..8668631 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ko/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ko/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&아니요"> <!ENTITY sync.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ ì„¤ì • ë™ê¸°í™” (&c)"> <!ENTITY whitelist.site.label "사ì´íЏ 허용 : ?1?"> +<!ENTITY notification.closing.button.hide "ì´ ì•Œë¦¼ 닫기"> <!ENTITY filters.label "í•„í„° ì„¤ì • (&F)"> <!ENTITY disable.label "사용 중지"> <!ENTITY objecttab.title "차단"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&예"> <!ENTITY opensidebar.label "차단 가능 ëª©ë¡ (&B)"> <!ENTITY notification.button.close "&닫기"> +<!ENTITY shownotifications.label "ìœ ìš©í•œ 알림 표시"> <!ENTITY contribute.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì— ê³µí—Œí•˜ê¸°"> <!ENTITY toolbarbutton.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤"> <!ENTITY context.frame.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : í”„ë ˆìž„ 차단"> <!ENTITY blocked.tooltip "ì ìš©ëœ í•„í„° 개수"> +<!ENTITY notification.closing.button.optout "알림 표시를 중지합니다"> <!ENTITY counthits.label "í•„í„° ì ìš© 횟수 ê¸°ë¡ (&h)"> <!ENTITY showinstatusbar.label "ìƒíƒœ í‘œì‹œì¤„ì— ì•„ì´ì½˜ ë³´ì´ê¸° (&S)"> <!ENTITY sidebar.title "현재 페ì´ì§€ì˜ 차단 가능한 í•목"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "íˆ´ë°”ì— ì•„ì´ì½˜ ë³´ì´ê¸° (&B)"> <!ENTITY status.tooltip "ìƒíƒœ"> <!ENTITY context.media.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : 비디오/오디오 차단"> -<!ENTITY subscription.update.label "ì—…ë°ì´íЏ"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lt/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/lt/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lt/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lt/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/lt/filters.dtd index 630e8cc..3a33b8f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lt/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lt/filters.dtd @@ -45,6 +45,7 @@ norÄ—dami pridÄ—ti kelis naudokite <!ENTITY acceptableAds2.label "Leisti &neįkyrias reklamas"> <!ENTITY addSubscriptionOther.label "PridÄ—ti kitÄ… prenumeratÄ…"> <!ENTITY close.label "Užverti"> +<!ENTITY findbar.caseSensitive "Skirti didžiÄ…sias ir mažąsias raides"> <!ENTITY sort.none.label "&Nerikiuojama"> <!ENTITY filter.actions.label "Filtro veiksmai"> <!ENTITY filter.copy.label "Kopijuoti"> @@ -62,12 +63,17 @@ norÄ—dami pridÄ—ti kelis naudokite <!ENTITY find.label "Ra&sti"> <!ENTITY subscription.moveDown.label "Perkelti žemyn"> <!ENTITY subscription.lastDownload.connectionError "Nepavyko, atsiuntimo klaida"> +<!ENTITY findbar.statusWrappedStart "Pasiektas virÅ¡us, tÄ™siama nuo apaÄios"> <!ENTITY subscription.lastDownload.success "SÄ—kmingai"> +<!ENTITY findbar.placeholder "Rasti filtrÄ…"> <!ENTITY subscription.lastDownload.invalidData "Nepavyko, netinkamas filtrų sÄ…raÅ¡as"> +<!ENTITY findbar.close "Uždaryti paieÅ¡kos langÄ…"> <!ENTITY filter.paste.label "Ä®dÄ—ti"> <!ENTITY subscription.disabledFilters.enable "Ä®jungti iÅ¡jungtus filtrus"> <!ENTITY lasthit.column "Paskutinis b&lokavimas"> +<!ENTITY findbar.statusWrappedEnd "Pasiekta apaÄia, tÄ™siama nuo virÅ¡aus"> <!ENTITY subscription.editTitle.label "Pervadinti"> +<!ENTITY findbar.statusNotFound "Puslapis nerastas"> <!ENTITY subscription.disabledFilters.warning "Kai kurie filtrai, Å¡ioje prenumeratoje, iÅ¡jungti."> <!ENTITY filter.column "Filtro &taisyklÄ—"> <!ENTITY subscription.lastDownload.label "Paskutinis atsiuntimas:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lt/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/lt/firstRun.properties index e6bbdec..d115481 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lt/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lt/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=„Android“ ir „iOS“ versijos +firstRun_abbButtonTitle=„Adblock Browser“ rasi Äia +firstRun_abbPromotionHeadline=Ä®sigijai iÅ¡manųjį arba planÅ¡etÄ™? firstRun_acceptableAdsExplanation=Mes norÄ—tume paskatinti svetaines naudoti paprastas, nekrentanÄias į akis reklamas. TodÄ—l nustatÄ—me <a>griežtas gaires</a> priimtinų reklamų nustatymui, jos bus rodomos pagal nutylÄ—jimÄ…. Jei vis tiek norite visas reklamas galite <a>iÅ¡jungti</a> Å¡iÄ… galimybÄ™ per kelias sekundes. firstRun_acceptableAdsHeadline=Nuo Å¡iol erzinanÄios reklamos bus užblokuotos firstRun_contributor_credits=PadÄ—kos prisidÄ—jusiems diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lt/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/lt/global.properties index 8480dda..e6a6e73 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lt/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lt/global.properties @@ -5,6 +5,7 @@ type_label_script=scenarijus filter_elemhide_nocriteria=NÄ—ra kriterijaus pagal kurį galima bÅ«tų nusprÄ™sti kurį elementÄ… paslÄ—pti blockingGroup_title=Reklamų blokavimo taisyklÄ—s whitelisted_tooltip=„Adblock Plus“ aktyvus, bet iÅ¡jungtas dabartiniam tinklalapiui. +type_label_ping=ping type_label_stylesheet=stilius blocked_count_tooltip=?1? iÅ¡ ?2? type_label_font=Å¡riftas @@ -15,6 +16,7 @@ whitelisted_page=„Adblock Plus“ yra iÅ¡jungtas dabartiniam tinklalapiui remove_group_warning=Ar tikrai norite paÅ¡alinti Å¡iÄ… grupÄ™? action1_tooltip=SpragtelÄ—kite, norÄ—dami atverti/užverti blokuojamus elementus; spragtelÄ—kite viduriniuoju klaviÅ¡u norÄ—dami įjungti/iÅ¡jungti. type_label_xmlhttprequest=XML užklausa +filter_invalid_regexp=Netinkama reguliarioji iÅ¡raiÅ¡ka active_tooltip=Adblock Plus įjungtas, naudojamos ?1? filtrų prenumeratos ir ?2? pasirinktiniai filtrai. type_label_document=dokumentas type_label_object_subrequest=papildoma objekto užklausa @@ -22,14 +24,19 @@ whitelistGroup_title=IÅ¡imÄių taisyklÄ—s disabled_tooltip=„Adblock Plus“ iÅ¡jungtas. filter_elemhide_duplicate_id=Gali bÅ«ti nurodytas tik vienas elemento ID kurį reikia paslÄ—pti type_label_object=objektas +filter_elemhideemulation_nodomain=NÄ—ra nurodytas aktyvus domenas iÅ¡plÄ—stam slÄ—pimo filtrui action2_tooltip=SpragtelÄ—kite, norÄ—dami atverti nustatymus; spragtelÄ—kite viduriniuoju klaviÅ¡u norÄ—dami įjungti/iÅ¡jungti. type_label_subdocument=kadras clearStats_warning=Bus atstatyta visų filtrų blokavimų statistika ir iÅ¡jungtas blokavimų skaiÄiavimas. Ar norite tÄ™sti? +filter_unknown_option=Nežinoma filtro parinktis +type_label_genericblock=viskÄ… blokuoti notification_antiadblock_message=Å ioje svetainÄ—je rodomi tiksliniai praneÅ¡imai Adblock Plus naudotojams. Ar norite jog Adblock Plus paslÄ—ptų tikslinius praneÅ¡imus? blocked_count_addendum=(baltajame sÄ…raÅ¡e: ?1?, paslÄ—pta: ?2?) subscription_invalid_location=Filtrų sÄ…raÅ¡o adresas nÄ—ra taisyklingas URL ar failo vardas. +type_label_websocket=websocket type_label_image=paveikslÄ—lis remove_subscription_warning=Ar tikrai norite atsisakyti Å¡ios prenumeratos? +type_label_generichide=viskÄ… slÄ—pti type_label_other=kita mobile_menu_enable=ABP: Ä®jungti type_label_media=audio/video diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lt/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/lt/overlay.dtd index 47aba40..461a552 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lt/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lt/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ne"> <!ENTITY sync.label "Adblo&ck Plus Sync nustatymai"> <!ENTITY whitelist.site.label "IÅ¡jungti ?1?"> +<!ENTITY notification.closing.button.hide "Uždaryti šį p&raneÅ¡imÄ…"> <!ENTITY filters.label "&Filtrų nustatymai"> <!ENTITY disable.label "IÅ¡jungti visur"> <!ENTITY objecttab.title "Blokuoti"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Taip"> <!ENTITY opensidebar.label "Atverti &blokuojamus elementus"> <!ENTITY notification.button.close "&Uždaryti"> +<!ENTITY shownotifications.label "Rodyti naudingus &praneÅ¡imus"> <!ENTITY contribute.label "PrisidÄ—ti prie Adblock Plus"> <!ENTITY toolbarbutton.label "„Adblock Plus“"> <!ENTITY context.frame.label "„Adblock Plus“: Blokuoti kadrÄ…"> <!ENTITY blocked.tooltip "Å iame tinklalapyje užblokuoti elementai:"> +<!ENTITY notification.closing.button.optout "&Neberodyti praneÅ¡imų"> <!ENTITY counthits.label "Sus&kaiÄiuoti filtro blokavimus"> <!ENTITY showinstatusbar.label "Rodyti &bÅ«senos juostoje"> <!ENTITY sidebar.title "Blokuojami elementai dabartiniame tinklalapyje"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "&Rodyti priemonių juostoje"> <!ENTITY status.tooltip "BÅ«sena:"> <!ENTITY context.media.label "„Adblock Plus“: Blokuoti audio/video"> -<!ENTITY subscription.update.label "Atnaujinti filtrus"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lt/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/lt/sendReport.dtd index 3ccb11f..e62d10b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lt/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lt/sendReport.dtd @@ -37,7 +37,7 @@ tik papildyti esamas diskusijas, niekas nepastebÄ—s jÅ«sų praneÅ¡imo nebent duosite nuorodÄ… į jį. AutomatiÅ¡kai sukurta nuoroda bus parodyta kai iÅ¡siųsite praneÅ¡imÄ…."> <!ENTITY issues.disabled.description "Adblock Plus yra iÅ¡jungtas, tokioje bÅ«senoje jis nieko neužblokuos."> -<!ENTITY attachExtensions.label "Jei kilo problema dÄ—l plÄ—tinių (add-on), praneÅ¡kite problema pridÄ—je aktyvių plÄ—tinių sÄ…rašą,"> +<!ENTITY attachExtensions.label "Jei kilo problema dÄ—l plÄ—tinių, praneÅ¡kite problema pridÄ—jÄ™ &aktyvių plÄ—tinių sÄ…rašą,"> <!ENTITY issues.nosubscriptions.add.label "PridÄ—ti filtro prenumeratÄ…"> <!ENTITY issues.disabledfilters.enable.label "Ä®jungti filtrÄ…"> <!ENTITY issues.override.label "Konfi&gÅ«racija teisinga, tÄ™skite su praneÅ¡imu"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lv/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/lv/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lv/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lv/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/lv/composer.dtd index 08bd7d8..eb01495 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lv/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lv/composer.dtd @@ -7,7 +7,7 @@ <!ENTITY thirdParty.label "Tikai treÅ¡Äs puses"> <!ENTITY filter.label "Jauns filtrs:"> <!ENTITY collapse.label "BloÄ·Ä“ts sabrukums:"> -<!ENTITY match.warning "Modeli ko jus ievadijat vairs neatbilst adresei bloketiem/baltulistetiem un neizveidos nekad effektu uz ta."> +<!ENTITY match.warning "Paraugs ko jÅ«s ievadÄ«jÄt vairs neatbilst bloÄ·Ä“tajai/baltÄs listes adresei un tam nebÅ«s ietekmes uz to."> <!ENTITY anchor.start.label "adreses sÄkumÄ"> <!ENTITY matchCase.label "SaderÄ«gs gadÄ«jums"> <!ENTITY custom.pattern.label "PielÄgots:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lv/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/lv/filters.dtd index f7c466f..84bb621 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lv/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lv/filters.dtd @@ -33,7 +33,7 @@ <!ENTITY subscription.update.label "AtjauninÄt filtrus"> <!ENTITY dialog.title "Adblock Plus filtra prioritÄtes"> <!ENTITY addFilter.label "Pievienot Filtru"> -<!ENTITY subscription.minVersion.warning "Å o filtru abonēšanai nepiecieÅ¡ama jaunÄka versija Adblock Plus, tadel jums vajadzÄ“tu atjauninÄt ar jaunÄko Adblock Plus versiju."> +<!ENTITY subscription.minVersion.warning "Å o filtru abonēšanai nepiecieÅ¡ama jaunÄka versija Adblock Plus, tÄdēļ jums vajadzÄ“tu atjauninÄt ar jaunÄko Adblock Plus versiju."> <!ENTITY subscription.lastDownload.invalidURL "NeizdevÄs, nav derÄ«ga adrese"> <!ENTITY backup.error "RadÄs kļūda, ierakstot filtrus failÄ. PÄrliecinieties, ka fails nav aizsargÄts pret ierakstu vai netiek izmantots citÄ lietojumprogrammÄ."> <!ENTITY filter.moveUp.label "PÄrvietot uz augÅ¡u"> @@ -61,7 +61,9 @@ <!ENTITY subscription.moveDown.label "PÄrvietot uz leju"> <!ENTITY subscription.lastDownload.connectionError "NeizdevÄs, lejupielÄde neizdevÄs"> <!ENTITY subscription.lastDownload.success "IzdevÄs"> +<!ENTITY findbar.placeholder "Atrast filtru"> <!ENTITY subscription.lastDownload.invalidData "NeizdevÄs, nav derÄ«gs filtru saraksts"> +<!ENTITY findbar.close "Tuvu AtraÅ¡anas joslÄ"> <!ENTITY filter.paste.label "IelÄ«mÄ“t"> <!ENTITY subscription.disabledFilters.enable "IespÄ“jot atspÄ“jotie filtri"> <!ENTITY lasthit.column "PÄ“dÄ“jai klikšķis"> @@ -70,3 +72,7 @@ <!ENTITY filter.column "Filtra noteikumi"> <!ENTITY subscription.lastDownload.label "PÄ“dÄ“jÄ lejupielÄde:"> <!ENTITY viewList.label "SkatÄ«t sarakstu"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lv/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/lv/firstRun.properties index c82bbe1..e06c545 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lv/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lv/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Pieejams Android un iOS ierÄ«cÄ“m +firstRun_abbButtonTitle=DabÅ« Adblock Browser Å¡eit +firstRun_abbPromotionHeadline=Tev pieder viedtÄlrunis vai planÅ¡etdators? firstRun_acceptableAdsExplanation=MÄ“s vÄ“lÄ“tos veicinÄt vienkÄrÅ¡u, neuzbÄzÄ«gu reklÄmu lietoÅ¡anu vietnÄ“s. TÄpÄ“c esam izveidojuÅ¡i <a>stingras vadlÄ«nijas</a> pieņemamo reklÄmu noteikÅ¡anai, kuras parÄdÄ«tas noklusÄ“juma iestatÄ«jumos. Ja JÅ«s joprojÄm vÄ“laties bloÄ·Ä“t pilnÄ«gi visas reklÄmas, JÅ«s varat <a>atspÄ“jot</a> Å¡o pÄ“c dažÄm sekundÄ“m. firstRun_acceptableAdsHeadline=UzmÄcÄ«gas reklÄmas turpmÄk tiks bloÄ·Ä“tas firstRun_contributor_credits=ZiedotÄju saraksts diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lv/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/lv/global.properties index 4eb9bdf..8d8d785 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lv/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lv/global.properties @@ -39,3 +39,10 @@ mobile_menu_enable_site=ABP: IespÄ“jot uz ?1? type_label_elemhide=paslÄ“pts newGroup_title=Jaunu filtru grupas default_dialog_title=Adblock Plus +type_label_ping=ping +filter_invalid_regexp=Invalid regular expression +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +filter_unknown_option=Unknown filter option +type_label_genericblock=generic block +type_label_websocket=websocket +type_label_generichide=generic hide diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/lv/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/lv/overlay.dtd index b67d25c..4b69148 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/lv/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/lv/overlay.dtd @@ -28,4 +28,6 @@ <!ENTITY showintoolbar.label "RÄdÄ«t rÄ«kjoslÄ"> <!ENTITY status.tooltip "Statuss:"> <!ENTITY context.media.label "Adblock Plus: BloÄ·Ä“t audio/video"> -<!ENTITY subscription.update.label "AtjauninÄt filtrus"> +<!ENTITY notification.closing.button.hide "Close t&his notification"> +<!ENTITY shownotifications.label "Show useful &notifications"> +<!ENTITY notification.closing.button.optout "&Stop showing notifications"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ms/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ms/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ms/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ms/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ms/filters.dtd index 9d3541d..80d452e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ms/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ms/filters.dtd @@ -44,6 +44,7 @@ <!ENTITY acceptableAds2.label "Benarkan iklan yan&g tidak mengganggu"> <!ENTITY addSubscriptionOther.label "Tambah langganan lain"> <!ENTITY close.label "Tutup"> +<!ENTITY findbar.caseSensitive "Sepadankan frasa"> <!ENTITY sort.none.label "&Tidak disusun"> <!ENTITY filter.actions.label "Aksi penapis"> <!ENTITY filter.copy.label "Salin"> @@ -61,12 +62,17 @@ <!ENTITY find.label "&Cari"> <!ENTITY subscription.moveDown.label "Pindah ke bawah"> <!ENTITY subscription.lastDownload.connectionError "Gagal, kegagalan memuat-turun"> +<!ENTITY findbar.statusWrappedStart "Sampai atas, bersambung semula dari bawah"> <!ENTITY subscription.lastDownload.success "Berjaya"> +<!ENTITY findbar.placeholder "Cari Penapis"> <!ENTITY subscription.lastDownload.invalidData "Gagal, bukan senarai penapis yang sah"> +<!ENTITY findbar.close "Tutup Carian"> <!ENTITY filter.paste.label "Tampal"> <!ENTITY subscription.disabledFilters.enable "Aktifkan penapis yang telah dinyaktifkan."> <!ENTITY lasthit.column "Hit t&erakhir"> +<!ENTITY findbar.statusWrappedEnd "Sampai bawah, bersambung semula dari atas"> <!ENTITY subscription.editTitle.label "Ubahsuai tajuk"> +<!ENTITY findbar.statusNotFound "Frasa tidak dijumpai"> <!ENTITY subscription.disabledFilters.warning "Sesetengah penapis dalam langganan ini telah dinyahaktifkan."> <!ENTITY filter.column "Pe&raturan penapis"> <!ENTITY subscription.lastDownload.label "Muat-turun terakhir:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ms/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ms/firstRun.properties index a924430..7b65f6a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ms/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ms/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Tersedia untuk Android dan iOS +firstRun_abbButtonTitle=Dapatkan Adblock Browser di sini +firstRun_abbPromotionHeadline=Memiliki telefon pintar atau tablet? firstRun_acceptableAdsExplanation=Kami ingin menggalakkan Laman sesawang untuk menggunakan pengiklanan yang jelas dan tidak mengganggu. Itulah sebabnya mengapa kita mewujudkan <a>garis panduan yang ketat</a> untuk mengenalpasti iklan yang boleh diterima, yang ditunjukkan di bawah tetapan lalai. Jika anda masih mahu menyekat setiap iklan anda boleh <a>mematikan</a> ini dalam beberapa saat. firstRun_acceptableAdsHeadline=Iklan yang mengganggu kini akan disekat firstRun_contributor_credits=Kredit kepada penyumbang diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ms/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ms/global.properties index 54428fe..1ab5009 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ms/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ms/global.properties @@ -5,6 +5,7 @@ type_label_script=skrip filter_elemhide_nocriteria=Tiada kriteria yang dinyatakan untuk mengenal pasti elemen untuk disembunyikan blockingGroup_title=Peraturan Penapisan Iklan whitelisted_tooltip=Adblock Plus dinyahaktifkan pada laman semasa. +type_label_ping=ping type_label_stylesheet=lembaran stail blocked_count_tooltip=?1? daripada ?2? type_label_font=font @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus telah dinyahaktifkan untuk laman semasa remove_group_warning=Adakah anda pasti mahu membuang kumpulan ini? action1_tooltip=Klik untuk membuka/menutup item yang boleh disekat, klik tengah untuk aktifkan/nyahaktifkan. type_label_xmlhttprequest=permintaan XML +filter_invalid_regexp=Ungkapan/Kod yang tidak sah active_tooltip=Adblock Plus telah diaktifkan, ?1? langganan penapis dan ?2? penapis sendiri digunakan. type_label_document=dokumen type_label_object_subrequest=subpermintaan objek @@ -25,17 +27,22 @@ type_label_object=objek action2_tooltip=Klik untuk buka tatarajah, klik tengah untuk aktifkan/nyahaktifkan. type_label_subdocument=bingkai clearStats_warning=Ini akan mengreset semua statistik dan menyahaktifkan kiraan penapis. Teruskan? +filter_unknown_option=Pilihan tapisan tidak diketahui +type_label_genericblock=generic block notification_antiadblock_message=Laman web ini telah dikenali untuk menunjukkan mesej yang disasarkan kepada pengguna Adblock Plus. Adakah anda mahu Adblock Plus untuk menyembunyikan mesej yang disasarkan? blocked_count_addendum=(juga dikecualikan: ?1?, disembunyikan: ?2? subscription_invalid_location=Lokasi senarai penapis sama ada URL atau nama fail adalah tidak sah. +type_label_websocket=websocket type_label_image=imej remove_subscription_warning=Adakah anda mahu membuang langganan ini? +type_label_generichide=generic hide type_label_other=lain mobile_menu_enable=ABP:Aktifkan type_label_media=audio/video mobile_menu_disable_site=ABP:Nyahaktifkan untuk ?1? elemhideGroup_title=Peraturan Penyembunyian Elemen -mobile_menu_enable_site=ABP:Nyahaktifkan untuk ?1? +mobile_menu_enable_site=ABP:Aktifkan untuk ?1? type_label_elemhide=disembunyikan newGroup_title=Kumpulan penapis baru default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ms/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ms/overlay.dtd index c995e22..28610ee 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ms/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ms/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Tiada"> <!ENTITY sync.label "Syn&c tatacara Adblock Plus"> <!ENTITY whitelist.site.label "Nyahaktifkan pada ?1?"> +<!ENTITY notification.closing.button.hide "Tutup notifikasi ini"> <!ENTITY filters.label "&Tatarajah penapis"> <!ENTITY disable.label "Nyahaktif di semua tempat"> <!ENTITY objecttab.title "Sekat"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ya"> <!ENTITY opensidebar.label "Buka &item yang boleh disekat"> <!ENTITY notification.button.close "&Tutup"> +<!ENTITY shownotifications.label "Papar notifikasi berguna"> <!ENTITY contribute.label "Sumbang kepada Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Sekat bingkai"> <!ENTITY blocked.tooltip "Item yang disekat pada laman ini:"> +<!ENTITY notification.closing.button.optout "Hentikan paparan notofikasi"> <!ENTITY counthits.label "&Kira kiraan penapis"> <!ENTITY showinstatusbar.label "Papar&kan di bar status"> <!ENTITY sidebar.title "Item yang boleh disekat pada laman semasa"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Papa&rkan di bar alatan"> <!ENTITY status.tooltip "Keadaan:"> <!ENTITY context.media.label "Adblock Plus: Sekat audio/video"> -<!ENTITY subscription.update.label "Kemaskini penapis"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/composer.dtd index 3292cd0..9527777 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/composer.dtd @@ -1,7 +1,7 @@ <!ENTITY anchor.end.label "pÃ¥ slutte&n av adressen"> <!ENTITY domainRestriction.label "Begrens til &domene:"> <!ENTITY collapse.default.no.label "Bruk standard (nei)"> -<!ENTITY firstParty.label "Kun elementer fra hovedsiden"> +<!ENTITY firstParty.label "Kun fø&rsteparts"> <!ENTITY preferences.label "Vi&s eksisterende filtre..."> <!ENTITY pattern.label "Se etter mønster"> <!ENTITY thirdParty.label "Kun &tredjeparts"> @@ -9,16 +9,16 @@ <!ENTITY collapse.label "Minimer b&lokkerte:"> <!ENTITY match.warning "Mønsteret du laget stemmer ikke lenger overens med adressen som skal blokkeres/hvitelistes, og vil ikke ha noen effekt."> <!ENTITY anchor.start.label "pÃ¥ starten av adressen (&g)"> -<!ENTITY matchCase.label "&Ta hensyn til stor og liten forbokstav (A/a)"> +<!ENTITY matchCase.label "Ta hensyn til s&mÃ¥ eller store bokstaver"> <!ENTITY custom.pattern.label "Egendefinert: (&C)"> <!ENTITY unselectAllTypes.label "Velg ingen"> <!ENTITY type.whitelist.label "Unntaksregel (&x)"> -<!ENTITY regexp.warning "Mønsteret du har laget vil bli tolket som et standarduttrykk, og kan ikke behandles effektivt av Adblock Plus, som igjen vil gjøre nettleseren din tregere. Hvis du ikke hadde tenkt til Ã¥ lage et standarduttrykk, kan du legge til en stjerne (*) pÃ¥ slutten av mønsteret."> +<!ENTITY regexp.warning "Mønsteret du har lagt inn vil bli tolket som et regulært uttrykk som ikke kan behandles effektivt av Adblock Plus og kan gjøre nettleseren din tregere. Hvis du ikke mente Ã¥ lage et regulært uttrykk, legg til en stjerne (*) pÃ¥ slutten av mønsteret."> <!ENTITY dialog.title "Legg til filtreringsregel for Adblock Plus"> <!ENTITY basic.label "Grunnleggende visning"> <!ENTITY type.filter.label "&Blokkeringsfilter"> -<!ENTITY types.label "Bruk pÃ¥:"> -<!ENTITY shortpattern.warning "Mønsteret du skrev inn er for kort til Ã¥ bli optimert, og kan gjøre nettleseren din tregere. Vi anbefaler at du lager en lengre tekstsekvens for dette filteret, slik at Adblock Plus kan behandle filteret mer effektivt."> +<!ENTITY types.label "Bruk pÃ¥ typer:"> +<!ENTITY shortpattern.warning "Mønsteret du skrev inn er for kort til Ã¥ bli optimalisert, og kan gjøre nettleseren din tregere. Vi anbefaler at du velger en lengre tekstsekvens for dette filteret, slik at Adblock Plus kan behandle filteret mer effektivt."> <!ENTITY collapse.yes.label "Ja"> <!ENTITY anchors.label "Aksepter kun mønster:"> <!ENTITY collapse.default.yes.label "Bruk standard (ja)"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/filters.dtd index ac2bc21..680a919 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/filters.dtd @@ -1,11 +1,11 @@ <!ENTITY restore.custom.warning "Alle dine egenkomponerte filtre vil bli erstattet av innholdet i filen du har valgt. Vil du fortsette?"> <!ENTITY slow.column "Trege filtre (&w)"> <!ENTITY enabled.column "Aktivert (&n)"> -<!ENTITY subscription.lastDownload.checksumMismatch "Mislyktes - kontrollsummen stemmer ikke"> +<!ENTITY subscription.lastDownload.checksumMismatch "Mislyktes, kontrollsummen stemmer ikke"> <!ENTITY noFiltersInGroup.text "Den valgte gruppen er tom."> <!ENTITY subscription.actions.label "Handlinger"> <!ENTITY filter.selectAll.label "Velg alle"> -<!ENTITY backupButton.label "Sikkerhetskopier og gjenopprett (&B)"> +<!ENTITY backupButton.label "&Sikkerhetskopier og gjenopprett"> <!ENTITY restore.minVersion.warning "Advarsel: Filen har blitt laget med en nyere versjon av Adblock Plus. Du bør oppdatere til nyeste versjon av Adblock Plus før du bruker denne filen."> <!ENTITY restore.error "Informasjonen i filen kunne ikke bli behandlet. Kanskje dette ikke er en backup-fil for Adblock Plus?"> <!ENTITY sort.ascending.label "&Sortér fra A til Ã…"> @@ -21,7 +21,7 @@ <!ENTITY restore.default.label "Gjenopprett sikkerhetskopi fra ?1?"> <!ENTITY subscription.lastDownload.inProgress "Laster ned..."> <!ENTITY subscriptions.tab.label "Filterabonnementer"> -<!ENTITY sort.descending.label "&Sortér fra Ã… til A"> +<!ENTITY sort.descending.label "Sortér fra &Ã… til A"> <!ENTITY filters.remove.warning "Ønsker du virkelig Ã¥ fjerne alle valgte filtre?"> <!ENTITY filter.delete.label "Slett"> <!ENTITY addSubscriptionAdd.label "Legg til"> @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Tillat noen ikke-pÃ¥trengende annonser"> <!ENTITY addSubscriptionOther.label "Legg til et annet abonnement"> <!ENTITY close.label "Lukk"> +<!ENTITY findbar.caseSensitive "Ta hensyn til smÃ¥ eller store bokstaver"> <!ENTITY sort.none.label "&Usortert"> <!ENTITY filter.actions.label "Filterhandlinger"> <!ENTITY filter.copy.label "Kopier"> @@ -60,12 +61,17 @@ <!ENTITY find.label "Fi&nn"> <!ENTITY subscription.moveDown.label "Flytt ned"> <!ENTITY subscription.lastDownload.connectionError "Feilet, nedlastingsfeil"> +<!ENTITY findbar.statusWrappedStart "Toppen nÃ¥dd, fortsetter fra bunnen"> <!ENTITY subscription.lastDownload.success "Vellykket"> +<!ENTITY findbar.placeholder "Finn filter"> <!ENTITY subscription.lastDownload.invalidData "Feilet, ikke en gyldig filterliste"> +<!ENTITY findbar.close "Lukk søkelinje"> <!ENTITY filter.paste.label "Lim inn"> <!ENTITY subscription.disabledFilters.enable "Aktiver deaktiverte filtre"> -<!ENTITY lasthit.column "Siste treff (&L)"> +<!ENTITY lasthit.column "&Siste treff"> +<!ENTITY findbar.statusWrappedEnd "Bunnen nÃ¥dd, fortsetter fra toppen"> <!ENTITY subscription.editTitle.label "Rediger tittel"> +<!ENTITY findbar.statusNotFound "Fant ikke uttrykket"> <!ENTITY subscription.disabledFilters.warning "Noen filtre i dette abonnementet er deaktivert."> <!ENTITY filter.column "&Filterregel"> <!ENTITY subscription.lastDownload.label "Siste nedlasting:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/firstRun.properties index 978dfbf..e1be073 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Tilgjengelig for Android og iOS +firstRun_abbButtonTitle=Skaff deg Adblock Browser her +firstRun_abbPromotionHeadline=Har du en smarttelefon eller et nettbrett? firstRun_acceptableAdsExplanation=Vi vil oppfordre nettsider til Ã¥ bruke standard, ikke-pÃ¥trengende annonser. Derfor har vi laget <a>strenge retningslinjer</a> for Ã¥ identifisere akseptable annonser, som vises nÃ¥r man har aktivert standardinnstillingene. Hvis du ønsker Ã¥ blokkere alle annonser, kan du <a>velge bort</a> dette straks. firstRun_acceptableAdsHeadline=Irriterende annonser blir fra nÃ¥ av blokkert firstRun_contributor_credits=Takk til diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/global.properties index 45be984..97fb2c2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/global.properties @@ -1,10 +1,11 @@ no_blocking_suggestions=Ingen blokkerbare elementer pÃ¥ nÃ¥værende side action3_tooltip=Klikk for Ã¥ aktivere/deaktivere Adblock Plus. -notification_antiadblock_title=Skjul meldinger til Adblock Plus brukere? +notification_antiadblock_title=Skjul meldinger til Adblock Plus-brukere? type_label_script=script filter_elemhide_nocriteria=Du har ikke spesifisert kriterier for Ã¥ gjenkjenne elementet som skal skjules blockingGroup_title=Regler for annonseblokkering whitelisted_tooltip=Adblock Plus er deaktivert pÃ¥ nÃ¥værende side. +type_label_ping=ping type_label_stylesheet=stilark blocked_count_tooltip=?1? av ?2? type_label_font=font @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus har blitt deaktivert for nÃ¥værende side remove_group_warning=Ønsker du virkelig Ã¥ fjerne denne gruppen? action1_tooltip=Klikk her for Ã¥ Ã¥pne/lukke elementer som kan blokkeres. Midtklikk for Ã¥ aktivere/deaktivere. type_label_xmlhttprequest=XML-forespørsel +filter_invalid_regexp=Ugyldig regulært uttrykk active_tooltip=Adblock Plus er aktivert. ?1? filterabonnementer og ?2? egendefinerte filtre i bruk. type_label_document=dokument type_label_object_subrequest=underforespørsel fra objektet @@ -22,14 +24,19 @@ whitelistGroup_title=Unntaksregler disabled_tooltip=Adblock Plus er deaktivert. filter_elemhide_duplicate_id=Du kan kun angi ett ID for elementet som skal skjules type_label_object=objekt +filter_elemhideemulation_nodomain=Ingen aktive domener er angitt for utvidet elementskjulingsfilter action2_tooltip=Klikk her for Ã¥ Ã¥pne innstillingsvalgene. Midtklikk for Ã¥ aktivere/deaktivere. type_label_subdocument=ramme clearStats_warning=Dette vil nullstille alle treffstatistikker for filtre og deaktivere telleren. Vil du fortsette? -notification_antiadblock_message=Dette omrÃ¥det er kjent for Ã¥ vise meldinger som henvender seg til AdBlock Plus brukere. Vil du at Adblock Plus skal skjule disse meldingene? +filter_unknown_option=Ukjent filteralternativ +type_label_genericblock=generisk blokkering +notification_antiadblock_message=Dette omrÃ¥det er kjent for Ã¥ vise meldinger som henvender seg til Adblock Plus-brukere. Vil du at Adblock Plus skal skjule disse meldingene? blocked_count_addendum=(ogsÃ¥ hvitelistet: ?1?, skjult: ?2?) subscription_invalid_location=Filterlistens plassering er verken en gyldig URL eller et gyldig filnavn. +type_label_websocket=websocket type_label_image=bilde remove_subscription_warning=Ønsker du virkelig Ã¥ fjerne dette abonnementet? +type_label_generichide=generisk skjuling type_label_other=annet mobile_menu_enable=ABP: Aktiver type_label_media=lyd/video diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/overlay.dtd index e5e69e5..a8b6616 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/overlay.dtd @@ -1,31 +1,33 @@ <!ENTITY notification.button.no "&Nei"> <!ENTITY sync.label "Synkroniser innstillinger for Adblo&ck Plus"> <!ENTITY whitelist.site.label "Deaktiver pÃ¥ ?1?"> +<!ENTITY notification.closing.button.hide "&Lukk dette varselet"> <!ENTITY filters.label "&Filterinnstillinger"> <!ENTITY disable.label "Deaktiver overalt"> <!ENTITY objecttab.title "Blokker"> <!ENTITY objecttab.tooltip "Klikk her for Ã¥ blokkere dette elementet med Adblock Plus"> -<!ENTITY menuitem.label "Adblock Plus innstillinger"> +<!ENTITY menuitem.label "Adblock Plus-innstillinger"> <!ENTITY objecttabs.label "Vis faner pÃ¥ Flash og Java"> <!ENTITY sendReport.label "&Rapporter problem pÃ¥ denne siden"> -<!ENTITY whitelist.page.label "Deaktiv kun pÃ¥ denne siden"> +<!ENTITY whitelist.page.label "Deaktiver kun pÃ¥ denne siden"> <!ENTITY context.image.label "Adblock Plus: Blokker bilde"> <!ENTITY notification.button.yes "&Ja"> <!ENTITY opensidebar.label "Ã…pne &blokkerbare elementer"> <!ENTITY notification.button.close "&Lukk"> +<!ENTITY shownotifications.label "Vis nyttige varsler"> <!ENTITY contribute.label "Bidra til Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Blokker ramme"> <!ENTITY blocked.tooltip "Blokkerte elementer pÃ¥ denne siden:"> +<!ENTITY notification.closing.button.optout "&Slutt Ã¥ vise varsler"> <!ENTITY counthits.label "Tell filtertreff (&h)"> -<!ENTITY showinstatusbar.label "Vis i statuslinjen"> +<!ENTITY showinstatusbar.label "Vis pÃ¥ statuslinjen"> <!ENTITY sidebar.title "Blokkerbare elementer pÃ¥ nÃ¥værende side"> <!ENTITY options.label "Alternativer (&O)"> <!ENTITY context.object.label "Adblock Plus: Blokker objekt"> <!ENTITY context.removeWhitelist.label "Reaktiver pÃ¥ denne siden"> <!ENTITY filters.tooltip "Mest aktive filtre:"> -<!ENTITY closesidebar.label "Lukk &blokkérbare elementer"> +<!ENTITY closesidebar.label "Lukk &blokkerbare elementer"> <!ENTITY showintoolbar.label "Vis pÃ¥ verktøylinje (&b)"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Blokker lyd/video"> -<!ENTITY subscription.update.label "Oppdater filtre"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/sendReport.dtd index 1cc95f1..60f4d5d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nb-NO/sendReport.dtd @@ -5,7 +5,7 @@ <!ENTITY issues.change.description "Konfigurasjonene dine er endret. Last inn siden pÃ¥ nytt for Ã¥ teste forandringene, og send inn en ny rapport hvis problemene er vedvarende."> <!ENTITY email.label "E-post: (&m)"> <!ENTITY issues.openPreferences.label "Ã…pne filterinnstillinger"> -<!ENTITY sendPage.confirmation "Rapporten er lagret. Du kan fÃ¥ tilgang til den ved følgende internettadresse:"> +<!ENTITY sendPage.confirmation "Rapporten er lagret. Du kan fÃ¥ tilgang til den pÃ¥ følgende internettadresse:"> <!ENTITY copyLink.label "Kopier rapportlink (&C)"> <!ENTITY issues.nofilters.description "Adblock Plus blokkerer ingenting pÃ¥ denne siden. Problemer du opplever er trolig urelatert til Adblock Plus."> <!ENTITY sendPage.knownIssue "Problemet du rapporterte inn er allerede kjent for oss. Mer informasjon:"> @@ -53,7 +53,7 @@ <!ENTITY wizard.title "Problemrapporterer"> <!ENTITY issues.ownfilters.disable.label "Deaktiver filter"> <!ENTITY commentPage.description "I tekstfeltet nedenfor kan du skrive en kommentar som kan hjelpe oss til Ã¥ forstÃ¥ problemet. Dette er valgfritt, men anbefalt hvis problemet ikke Ã¥penbart. Du kan ogsÃ¥ se pÃ¥ rapportdataene før de sendes."> -<!ENTITY comment.lengthWarning "Lengden pÃ¥ din kommentar er lenger enn 1000 bokstav. Bare de første 1000 bokstavene vil bli inkludert i rapporten."> +<!ENTITY comment.lengthWarning "Kommentaren din er lengre enn 1000 tegn. Kun de første 1000 tegnene vil bli inkludert i rapporten."> <!ENTITY typeSelector.falseNegative.description "Velg dette alternativet hvis et reklameelement vises, selv om Adblock Plus er aktivert."> <!ENTITY sendPage.waitMessage "Vennligst vent mens Adblock Plus sender inn din rapport."> <!ENTITY dataCollector.heading "Velkommen til problemrapportereren"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/nl/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nl/composer.dtd index 4b597f8..8629287 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/composer.dtd @@ -1,8 +1,8 @@ -<!ENTITY anchor.end.label "aan het ei&nde van het adres"> +<!ENTITY anchor.end.label "aan het &einde van het adres"> <!ENTITY domainRestriction.label "Beperken tot &domein:"> <!ENTITY collapse.default.no.label "Standaard gebruiken (nee)"> -<!ENTITY firstParty.label "Alleen van &eigen website"> -<!ENTITY preferences.label "Bestaande filters &weergeven…"> +<!ENTITY firstParty.label "Alleen van eigen &website"> +<!ENTITY preferences.label "Bestaande filters &tonen…"> <!ENTITY pattern.label "Zoeken naar patroon"> <!ENTITY thirdParty.label "Alleen van &derden"> <!ENTITY filter.label "&Nieuw filter:"> @@ -13,7 +13,7 @@ <!ENTITY custom.pattern.label "&Aangepast:"> <!ENTITY unselectAllTypes.label "Niets selecteren"> <!ENTITY type.whitelist.label "&Uitzonderingsregel"> -<!ENTITY regexp.warning "Het patroon dat u hebt ingevoerd zal worden behandeld als een reguliere expressie. Deze kunnen niet efficiënt worden verwerkt door Adblock Plus en kunnen uw browser traag maken. Als het niet uw bedoeling was een reguliere expressie te schrijven, voeg dan een asterisk (*) aan het einde van het patroon toe."> +<!ENTITY regexp.warning "Het patroon dat u hebt ingevoerd zal als een reguliere expressie worden behandeld. Deze kunnen niet efficiënt door Adblock Plus worden verwerkt en kunnen uw browser traag maken. Als het niet uw bedoeling was een reguliere expressie te gebruiken, voeg dan een asterisk (*) aan het einde van het patroon toe."> <!ENTITY dialog.title "Adblock Plus-filterregel toevoegen"> <!ENTITY basic.label "Eenvoudige weergave"> <!ENTITY type.filter.label "&Blokkeringsfilter"> @@ -25,7 +25,7 @@ <!ENTITY domainRestriction.help "Gebruik deze optie om een of meer domeinen te specificeren, gescheiden door een sluisteken (|). Het filter zal alleen op de geselecteerde domeinen worden toegepast. Een tilde (~) voor een domein betekent dat het filter niet op dat domein zal worden toegepast."> <!ENTITY accept.label "Filter toevoegen"> <!ENTITY options.label "Opties"> -<!ENTITY disabled.warning "Adblock Plus is momenteel uitgeschakeld. U kunt nog wel filters toevoegen, maar ze worden niet toegepast tenzij u [link]Adblock Plus weer inschakelt[/link]."> +<!ENTITY disabled.warning "Adblock Plus is momenteel uitgeschakeld. U kunt nog wel filters toevoegen, maar deze worden niet toegepast, tenzij u [link]Adblock Plus weer inschakelt[/link]."> <!ENTITY anchor.start.flexible.label "aan &het begin van de domeinnaam"> <!ENTITY collapse.no.label "Nee"> <!ENTITY selectAllTypes.label "Alles selecteren"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nl/filters.dtd index 14f13a6..84328ac 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/filters.dtd @@ -5,7 +5,7 @@ <!ENTITY noFiltersInGroup.text "De geselecteerde groep is leeg."> <!ENTITY subscription.actions.label "Acties"> <!ENTITY filter.selectAll.label "Alles selecteren"> -<!ENTITY backupButton.label "Ba&ck-up en herstel"> +<!ENTITY backupButton.label "Ba&ck-up maken en terugzetten"> <!ENTITY restore.minVersion.warning "Waarschuwing: het bestand is gemaakt met een nieuwere versie van Adblock Plus. U dient Adblock Plus bij te werken naar de nieuwste versie voordat u iets vanuit dit bestand kunt terugzetten."> <!ENTITY restore.error "De gegevens in het bestand konden niet worden verwerkt; wellicht is het geen back-upbestand van Adblock Plus?"> <!ENTITY sort.ascending.label "Sorteervolgorde &A > Z"> @@ -32,7 +32,7 @@ <!ENTITY noSubscriptions.text "U hebt nog geen filterabonnementen toegevoegd. Adblock Plus blokkeert niets zonder filters; gebruik ‘Filterabonnement toevoegen’ om er enkele toe te voegen."> <!ENTITY subscription.update.label "Filters bijwerken"> <!ENTITY dialog.title "Adblock Plus-filtervoorkeuren"> -<!ENTITY addFilter.label "Fil&ter toevoegen"> +<!ENTITY addFilter.label "Filter &toevoegen"> <!ENTITY subscription.minVersion.warning "Dit filterabonnement vereist een nieuwere versie van Adblock Plus; u dient Adblock Plus bij te werken naar de nieuwste versie."> <!ENTITY subscription.lastDownload.invalidURL "Mislukt, geen geldig adres"> <!ENTITY backup.error "Er is een fout opgetreden bij het wegschrijven van de filters. Zorg ervoor dat het bestand niet tegen schrijven is beveiligd of door een andere toepassing wordt gebruikt."> @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "&Enkele niet-opdringerige advertenties toestaan"> <!ENTITY addSubscriptionOther.label "Een ander abonnement toevoegen"> <!ENTITY close.label "Sluiten"> +<!ENTITY findbar.caseSensitive "Hoofdlettergevoelig"> <!ENTITY sort.none.label "&Ongesorteerd"> <!ENTITY filter.actions.label "Filteracties"> <!ENTITY filter.copy.label "Kopiëren"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Zoeken"> <!ENTITY subscription.moveDown.label "Omlaag verplaatsen"> <!ENTITY subscription.lastDownload.connectionError "Mislukt, downloadprobleem"> +<!ENTITY findbar.statusWrappedStart "Bovenkant bereikt, doorgegaan vanaf onderkant"> <!ENTITY subscription.lastDownload.success "Gelukt"> +<!ENTITY findbar.placeholder "Filter zoeken"> <!ENTITY subscription.lastDownload.invalidData "Mislukt, geen geldige filterlijst"> +<!ENTITY findbar.close "Zoekbalk sluiten"> <!ENTITY filter.paste.label "Plakken"> <!ENTITY subscription.disabledFilters.enable "Uitgeschakelde filters inschakelen"> <!ENTITY lasthit.column "&Laatste treffer"> +<!ENTITY findbar.statusWrappedEnd "Onderkant bereikt, doorgegaan vanaf bovenkant"> <!ENTITY subscription.editTitle.label "Titel bewerken"> +<!ENTITY findbar.statusNotFound "Tekst niet gevonden"> <!ENTITY subscription.disabledFilters.warning "Enkele filters in dit abonnement zijn uitgeschakeld."> <!ENTITY filter.column "&Filterregel"> <!ENTITY subscription.lastDownload.label "Laatste download:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/nl/firstRun.properties index 5c1980a..3e85240 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/firstRun.properties @@ -1,20 +1,23 @@ -firstRun_acceptableAdsExplanation=Wij zouden websites willen aanmoedigen eenvoudige, niet-opdringerige advertenties te gebruiken. Daarom hebben we <a>strikte richtlijnen</a> opgesteld om acceptabele advertenties te identificeren, die worden getoond onder Standaardinstellingen. Als u alsnog alle advertenties wilt blokkeren, kunt u dit in een paar seconden <a>uitschakelen</a>. +firstRun_abbButtonSubtitle=Beschikbaar voor Android en iOS +firstRun_abbButtonTitle=Ontvang hier de Adblock Browser +firstRun_abbPromotionHeadline=Heb je een smartphone of tablet? +firstRun_acceptableAdsExplanation=We zouden websites willen aanmoedigen eenvoudige, niet-opdringerige advertenties te gebruiken. Daarom hebben we <a>strikte richtlijnen</a> opgesteld om acceptabele advertenties te herkennen die bij gebruik van de standaardinstellingen worden getoond. Als u toch alle advertenties wilt blokkeren, kunt u dit binnen enkele seconden <a>uitschakelen</a>. firstRun_acceptableAdsHeadline=Vervelende advertenties zullen nu worden geblokkeerd -firstRun_contributor_credits=Bijdrager Credits +firstRun_contributor_credits=Dankbetuiging aan medewerkers firstRun_dataCorruptionWarning=Blijft deze pagina verschijnen? <a>Klik hier!</a> firstRun_donate=doneren firstRun_donate_label=Steun ons project -firstRun_feature_malware=Malware Blokkering -firstRun_feature_malware_description=Maak het browsen veiliger door het blokkeren van bekende malware domeinen. -firstRun_feature_social=Verwijder Social Media knoppen -firstRun_feature_social_description=Verwijder social media-knoppen (zoals de Facebook "Like" knop) automatisch, omdat die op webpagina's verschijnen en uw surfgedrag volgen. +firstRun_feature_malware=Malwareblokkering +firstRun_feature_malware_description=Maak het browsen veiliger door bekende malwaredomeinen te blokkeren. +firstRun_feature_social=Social-mediaknoppen verwijderen +firstRun_feature_social_description=Verwijder automatisch social-mediaknoppen (zoals de ‘Like’-knop van Facebook) die op webpagina’s verschijnen en uw surfgedrag volgen. firstRun_feature_tracking=Tracking uitschakelen -firstRun_feature_tracking_description=Browse privé door 'tracking' uit te schakelen - verberg uw gegevens voor advertentiebedrijven die al uw surfgedrag zouden volgen. +firstRun_feature_tracking_description=Surf privé door ‘tracking’ uit te schakelen - verberg uw gegevens voor advertentiebedrijven die uw surfgedrag zouden volgen. firstRun_features=Adblock Plus kan meer doen dan advertenties blokkeren -firstRun_filterlistsReinitializedWarning=Het lijkt er op dat een probleem was waardoor alle filters verwijderd werden en het onmogelijk was om een backup terug te zetten. Hierdoor hebben we al uw filters en Acceptabele Advertenties instellingen moeten resetten. Controleer A.U.B. uw instellingen in de <a>Adblock Plus Opties</a>. -firstRun_legacySafariWarning=U gebruikt een oude versie van Safari die niet wordt ondersteund door Adblock Plus. Sommige websites kunnen daardoor onjuist worden weergegeven. Wij raden u aan een update uit te voeren naar Safari versie 6.1.1 of hoger (voor Mac OS X 10.8 Mountain Lion), Safari versie 7.0.1 of hoger (voor Mac OS X 10.9 Mavericks) of de laatste versie van Mozilla Firefox, Google Chrome of Opera te gebruiken. +firstRun_filterlistsReinitializedWarning=Het lijkt erop dat door een probleem alle filters zijn verwijderd, en we konden geen back-up terugzetten. Hierdoor hebben we al uw filters en instellingen voor Acceptabele advertenties moeten herinitialiseren. Controleer uw instellingen in de <a>Adblock Plus-opties</a>. +firstRun_legacySafariWarning=U gebruikt een oude versie van Safari die niet door Adblock Plus wordt ondersteund. Mogelijk werkt dit niet goed of wordt de gebruikersbeleving benadeeld. We raden aan een update naar Safari 6.1.1 of hoger (op Mac OS X 10.8 Mountain Lion) of Safari 7.0.1 of hoger (op Mac OS X 10.9 Mavericks) uit te voeren, of de nieuwste versie van Mozilla Firefox, Google Chrome of Opera te gebruiken. firstRun_share=Vertel uw vrienden -firstRun_share_headline=<a>Help ons</a> om van het web een betere plek te maken -firstRun_title=Adblock plus is geïnstalleerd +firstRun_share_headline=<a>Help ons</a> van het web een betere plek te maken +firstRun_title=Adblock Plus is geïnstalleerd firstRun_toggle_off=UIT firstRun_toggle_on=AAN diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/nl/global.properties index ddd9dc4..72dfd24 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/global.properties @@ -4,17 +4,19 @@ notification_antiadblock_title=Gerichte berichten verbergen? type_label_script=script filter_elemhide_nocriteria=Geen criteria opgegeven om het te verbergen element te herkennen blockingGroup_title=Regels voor advertentieblokkering -whitelisted_tooltip=Adblock Plus is ingeschakeld maar staat uit voor deze pagina. +whitelisted_tooltip=Adblock Plus is uitgeschakeld op deze pagina. +type_label_ping=ping type_label_stylesheet=stijlblad blocked_count_tooltip=?1? van de ?2? type_label_font=lettertype type_label_popup=pop-upvenster -filter_regexp_tooltip=Dit filter is een reguliere expressie of te kort om te kunnen worden geoptimaliseerd. Te veel van dit soort filters kan uw browser traag maken. +filter_regexp_tooltip=Dit filter is een reguliere expressie, of te kort om te worden geoptimaliseerd. Te veel van deze filters kunnen uw browser traag maken. action0_tooltip=Klik om het contextmenu te openen, klik met de middelste muisknop om in/uit te schakelen. whitelisted_page=Adblock Plus is uitgeschakeld voor deze pagina remove_group_warning=Wilt u deze groep echt verwijderen? -action1_tooltip=Klik om blokkeerbare onderdelen te openen/sluiten, klik met de middelste muisknop om in/uit te schakelen. -type_label_xmlhttprequest=XML-verzoek +action1_tooltip=Klik om blokkeerbare items te openen/sluiten, klik met de middelste muisknop om in/uit te schakelen. +type_label_xmlhttprequest=XML-aanvraag +filter_invalid_regexp=Ongeldige reguliere expressie active_tooltip=Adblock Plus is ingeschakeld, ?1? filterabonnement(en) en ?2? aangepast(e) filter(s) in gebruik. type_label_document=document type_label_object_subrequest=object-subverzoek @@ -22,14 +24,19 @@ whitelistGroup_title=Uitzonderingsregels disabled_tooltip=Adblock Plus is uitgeschakeld. filter_elemhide_duplicate_id=Er kan slechts één ID van het te verbergen element worden opgegeven type_label_object=object +filter_elemhideemulation_nodomain=Geen actief domein opgegeven voor uitgebreide elementverbergende filter action2_tooltip=Klik om voorkeuren te openen, klik met de middelste muisknop om in/uit te schakelen. type_label_subdocument=frame clearStats_warning=Dit stelt alle filtertrefferstatistieken opnieuw in en schakelt het tellen van filtertreffers uit. Wilt u doorgaan? +filter_unknown_option=Onbekende filteroptie +type_label_genericblock=algemeen blokkeren notification_antiadblock_message=Deze website staat bekend om het tonen van gerichte berichten aan Adblock Plus-gebruikers. Wilt u dat Adblock Plus deze verbergt? blocked_count_addendum=(ook op witte lijst: ?1?, verborgen: ?2?) subscription_invalid_location=Deze filterlijstlocatie is geen geldige URL, noch een geldige bestandsnaam. +type_label_websocket=websocket type_label_image=afbeelding remove_subscription_warning=Wilt u dit abonnement echt verwijderen? +type_label_generichide=algemeen verbergen type_label_other=anders mobile_menu_enable=ABP: inschakelen type_label_media=audio/video diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nl/overlay.dtd index 7cf1464..000ad21 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nee"> <!ENTITY sync.label "Adblock Plus-instellingen syn&chroniseren"> <!ENTITY whitelist.site.label "Uitschakelen op ?1?"> +<!ENTITY notification.closing.button.hide "D&eze melding sluiten"> <!ENTITY filters.label "&Filtervoorkeuren"> <!ENTITY disable.label "Overal uitschakelen"> <!ENTITY objecttab.title "Blokkeren"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Ja"> <!ENTITY opensidebar.label "&Blokkeerbare items openen"> <!ENTITY notification.button.close "&Sluiten"> +<!ENTITY shownotifications.label "Nuttige &meldingen tonen"> <!ENTITY contribute.label "Bijdragen aan Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: deelvenster blokkeren"> <!ENTITY blocked.tooltip "Geblokkeerde items op deze pagina:"> +<!ENTITY notification.closing.button.optout "Tonen van meldingen &stoppen"> <!ENTITY counthits.label "&Filtertreffers tellen"> <!ENTITY showinstatusbar.label "Tonen in &statusbalk"> <!ENTITY sidebar.title "Blokkeerbare items op deze pagina"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Tonen in werk&balk"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: audio/video blokkeren"> -<!ENTITY subscription.update.label "Filters bijwerken"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nl/sendReport.dtd index c27c5a8..5791137 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/sendReport.dtd @@ -1,12 +1,12 @@ <!ENTITY screenshot.undo.label "Onge&daan maken"> <!ENTITY issues.disabledgroups.description "De volgende filterabonnementen / filtergroepen zijn uitgeschakeld, maar zijn mogelijk wel van invloed op deze pagina:"> <!ENTITY showData.label "Rapportgegevens tonen"> -<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkeert &te veel"> +<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkeert t&e veel"> <!ENTITY issues.change.description "Uw configuratie is gewijzigd. Laad de pagina opnieuw om de wijzigingen te testen en dien een rapport in als het probleem niet door de wijzigingen is verholpen."> <!ENTITY email.label "E-&mailadres:"> <!ENTITY issues.openPreferences.label "Filtervoorkeuren openen"> <!ENTITY sendPage.confirmation "Uw rapport is opgeslagen. U kunt het vinden op het volgende adres:"> -<!ENTITY copyLink.label "Rapport&koppeling kopiëren"> +<!ENTITY copyLink.label "Rapportkoppeling &kopiëren"> <!ENTITY issues.nofilters.description "Adblock Plus blokkeert niets op de huidige pagina. Het door u ervaren probleem heeft zeer waarschijnlijk niets met Adblock Plus te maken."> <!ENTITY sendPage.knownIssue "Het door u gemelde probleem is waarschijnlijk al bekend. Meer informatie:"> <!ENTITY typeSelector.other.description "Selecteer deze optie als u een probleem met Adblock Plus zelf vermoedt in plaats van met de filters."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nl/sidebar.dtd index 74a3a04..e32f520 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/sidebar.dtd @@ -6,7 +6,7 @@ <!ENTITY noitems.label "Geen blokkeerbare items"> <!ENTITY filter.label "Filter"> <!ENTITY tooltip.size.label "Grootte:"> -<!ENTITY reattach.label "Vastkoppelen"> +<!ENTITY reattach.label "Opnieuw koppelen"> <!ENTITY search.label "&Zoeken:"> <!ENTITY docDomain.thirdParty "(derden)"> <!ENTITY filterSource.label "Filterbron"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/nl/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/nl/subscriptionSelection.dtd index c35a8c1..b674d5b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/nl/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/nl/subscriptionSelection.dtd @@ -1,9 +1,9 @@ -<!ENTITY addMain.label "Filterabonnement “?1?†oo&k toevoegen"> +<!ENTITY addMain.label "Filterabonnement ‘?1?’ oo&k toevoegen"> <!ENTITY list.download.failed "Adblock Plus kon de lijst met abonnementen niet ophalen."> <!ENTITY list.download.retry "Opnieuw proberen"> <!ENTITY title.label "A&bonnementstitel:"> <!ENTITY list.download.website "Website bekijken"> -<!ENTITY supplementMessage "Dit filterabonnement is bedoeld om te worden gebruikt met het filterabonnement “?1?â€, dat u nog niet gebruikt."> +<!ENTITY supplementMessage "Dit filterabonnement is bedoeld om te worden gebruikt met het filterabonnement ‘?1?’, dat u nog niet gebruikt."> <!ENTITY viewList.label "Filters bekijken"> <!ENTITY visitHomepage.label "Startpagina bezoeken"> <!ENTITY addSubscription.label "Abonneren"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pl/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pl/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pl/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pl/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pl/filters.dtd index 3d08e0f..f22f408 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pl/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pl/filters.dtd @@ -31,7 +31,7 @@ <!ENTITY subscription.enabled.label "Aktywny"> <!ENTITY noSubscriptions.text "Jeszcze nie dodano żadnego zestawu filtrów. Adblock Plus nie może nic blokować bez filtrów. NaciÅ›nij przycisk „Dodaj zestaw filtrów…â€, by dodać jakiÅ› filtr."> <!ENTITY subscription.update.label "Aktualizuj filtry"> -<!ENTITY dialog.title "Add Adblock Plus – ustawienia filtrów"> +<!ENTITY dialog.title "Adblock Plus – ustawienia filtrów"> <!ENTITY addFilter.label "Dodaj fi&ltr"> <!ENTITY subscription.minVersion.warning "Ten zestaw filtrów dziaÅ‚a z najnowszÄ… wersjÄ… Adblock Plusa. Zaktualizuj Adblock Plusa."> <!ENTITY subscription.lastDownload.invalidURL "Nie powiodÅ‚o siÄ™ – nieprawidÅ‚owy adres"> @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Zezwalaj na nie natrÄ™tne rekla&my"> <!ENTITY addSubscriptionOther.label "Wybierz inny zestaw"> <!ENTITY close.label "Zamknij"> +<!ENTITY findbar.caseSensitive "UwzglÄ™dniaj wielkość znaków"> <!ENTITY sort.none.label "Ni&eposortowane"> <!ENTITY filter.actions.label "CzynnoÅ›ci filtrów"> <!ENTITY filter.copy.label "Kopiuj"> @@ -60,12 +61,17 @@ <!ENTITY find.label "Z&najdź"> <!ENTITY subscription.moveDown.label "PrzenieÅ› w dół"> <!ENTITY subscription.lastDownload.connectionError "Nie powiodÅ‚o siÄ™ – błąd pobierania"> +<!ENTITY findbar.statusWrappedStart "OsiÄ…gniÄ™to górÄ™, przeglÄ…dajÄ…c od doÅ‚u"> <!ENTITY subscription.lastDownload.success "ZakoÅ„czono pomyÅ›lnie"> +<!ENTITY findbar.placeholder "Znajdź filtr"> <!ENTITY subscription.lastDownload.invalidData "Nie powiodÅ‚o siÄ™ – nieprawidÅ‚owy zestaw filtrów"> +<!ENTITY findbar.close "Zamknij pasek szukania"> <!ENTITY filter.paste.label "Wklej"> <!ENTITY subscription.disabledFilters.enable "Włącz wyłączone filtry"> <!ENTITY lasthit.column "&Ostatnie użycie"> +<!ENTITY findbar.statusWrappedEnd "OsiÄ…gniÄ™to dół, przeglÄ…dajÄ…c od góry"> <!ENTITY subscription.editTitle.label "Edytuj nazwÄ™ zestawu"> +<!ENTITY findbar.statusNotFound "Nie znaleziono frazy"> <!ENTITY subscription.disabledFilters.warning "Niektóre filtry w tym zestawie sÄ… wyłączone."> <!ENTITY filter.column "&ReguÅ‚a filtru"> <!ENTITY subscription.lastDownload.label "Ostatnie pobieranie:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pl/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pl/firstRun.properties index 281fcbe..e441260 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pl/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pl/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=DostÄ™pne na iOS i Androida +firstRun_abbButtonTitle=Pobierz Adblock Browser tutaj +firstRun_abbPromotionHeadline=Masz smartfona lub tablet? firstRun_acceptableAdsExplanation=ChcielibyÅ›my zachÄ™cić witryny do używania prostych, dyskretnych reklam. Dlatego mamy zdefiniowane<a> Å›cisÅ‚e wytyczne </ a>okreÅ›lajÄ…ce akceptowalne reklamy wyÅ›wietlane na podstawie tych ustawieÅ„. JeÅ›li chcesz blokować każdÄ… reklamÄ™, możesz tÄ™ funkcjÄ™ <a> wyłączyć </ a> w ciÄ…gu kilku sekund. firstRun_acceptableAdsHeadline=IrytujÄ…ce reklamy bÄ™dÄ… teraz blokowane firstRun_contributor_credits=PodziÄ™kowania dla współtwórców diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pl/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pl/global.properties index 36c805e..5c1d5d2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pl/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pl/global.properties @@ -5,6 +5,7 @@ type_label_script=skrypt filter_elemhide_nocriteria=Nie okreÅ›lono kryteriów rozpoznania elementu do ukrycia blockingGroup_title=ReguÅ‚y blokowania reklam whitelisted_tooltip=Adblock Plus jest aktywny, ale wyłączony na oglÄ…danej stronie. +type_label_ping=ping type_label_stylesheet=arkusz stylów blocked_count_tooltip=?1? z ?2? type_label_font=czcionka @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus zostaÅ‚ wyłączony dla tej strony remove_group_warning=Czy na pewno chcesz usunąć tÄ™ grupÄ™? action1_tooltip=Kliknij l.p.m., aby otworzyć/zamknąć listÄ™ blokowalnych elementów, Å›.p.m., aby włączyć/wyłączyć type_label_xmlhttprequest=żądanie XML +filter_invalid_regexp=NieprawidÅ‚owe wyrażenie regularne active_tooltip=Adblock Plus jest aktywny. Subskrybowane zestawy: ?1? i wÅ‚asne filtry: ?2?. type_label_document=dokument type_label_object_subrequest=subżądanie obiektu @@ -25,11 +27,15 @@ type_label_object=obiekt action2_tooltip=Kliknij l.p.m., aby otworzyć opcje, Å›.p.m., aby włączyć/wyłączyć type_label_subdocument=ramka clearStats_warning=Spowoduje to zresetowanie wszystkich statystyk użycia filtra i wyłączenie zliczania kolejnych użyć. Czy chcesz kontynuować? +filter_unknown_option=Nieznana opcja filtra +type_label_genericblock=pospolite blokuj notification_antiadblock_message=Ta witryna wyÅ›wietla użytkownikom Adblock Plusa ukierunkowane dla nich informacje. Czy chcesz, by Adblock Plus ukrywaÅ‚ tego typu informacje? blocked_count_addendum=(dozwolone:?1?, ukryte:?2?) subscription_invalid_location=Lokalizacja zestawu filtrów ma niewÅ‚aÅ›ciwÄ… nazwÄ™ pliku, albo adres URL +type_label_websocket=websocket type_label_image=obrazek remove_subscription_warning=Czy chcesz usunąć ten zestaw? +type_label_generichide=pospolite ukryj type_label_other=inne mobile_menu_enable=ABP:Włącz type_label_media=audio/wideo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP:Włącz na ?1? type_label_elemhide=ukryty newGroup_title=Nowa grupa filtrów default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pl/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pl/overlay.dtd index 88c4080..94e64fe 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pl/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pl/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nie"> <!ENTITY sync.label "&Synchronizuj ustawienia Adblock Plusa"> <!ENTITY whitelist.site.label "Wyłącz blokowanie na ?1?"> +<!ENTITY notification.closing.button.hide "Zamknij to p&owiadomienie"> <!ENTITY filters.label "&Ustawienia filtra"> <!ENTITY disable.label "Wyłącz wszÄ™dzie"> <!ENTITY objecttab.title "Zablokuj"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Tak"> <!ENTITY opensidebar.label "Otwórz listÄ™ &blokowalnych elementów"> <!ENTITY notification.button.close "&Zamknij"> +<!ENTITY shownotifications.label "WyÅ›wietlaj użyteczne powiadomie&nia"> <!ENTITY contribute.label "Wspomóż Adblock Plusa"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Zablokuj ramkÄ™"> <!ENTITY blocked.tooltip "Zablokowane elementy na tej stronie:"> +<!ENTITY notification.closing.button.optout "Nie wyÅ›wietlaj &powiadomieÅ„"> <!ENTITY counthits.label "Zli&czaj użycie filtra"> <!ENTITY showinstatusbar.label "&WyÅ›wietlaj ikonÄ™ Adblock Plusa na pasku stanu"> <!ENTITY sidebar.title "Blokowalne elementy na aktywnej stronie"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "WyÅ›wietlaj ikonÄ™ Adblock Plusa na pasku na&rzÄ™dzi"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Zablokuj wideo/audio"> -<!ENTITY subscription.update.label "Aktualizuj filtry"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pl/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pl/sendReport.dtd index 9ab38b5..1ea9afd 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pl/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pl/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "Twoje ostatnio wysÅ‚ane zgÅ‚oszenia"> <!ENTITY typeWarning.description "Chcesz zgÅ‚osić ogólny problem dotyczÄ…cy Adblock Plusa, a nie problem z filtrami. Tego rodzaju problemy najlepiej jest zgÅ‚aszać na [link]forum Adblock Plusa[/link]. Reportera błędów powinno siÄ™ używać do uzupeÅ‚nienia dyskusji na forum, ponieważ nikt nie zauważy zgÅ‚oszenia, chyba że dołączysz do niego odnoÅ›nik. Automatycznie generowany odnoÅ›nik zostanie dołączony po wysÅ‚aniu zgÅ‚oszenia."> <!ENTITY issues.disabled.description "Adblock Plus jest wyłączony. Obecnie nic nie bÄ™dzie blokowaÅ‚."> -<!ENTITY attachExtensions.label "Dołącz do zgÅ‚oszenia listÄ™ aktywnych &rozszerzeÅ„, gdy przyczynÄ… problemu jest konflikt z innym rozszerzeniem"> +<!ENTITY attachExtensions.label "Gdy przyczynÄ… problemu jest konflikt z innym dodatkiem, dołącz do zgÅ‚oszenia listÄ™ aktywnych &dodatków"> <!ENTITY issues.nosubscriptions.add.label "Subskrybuj filtry"> <!ENTITY issues.disabledfilters.enable.label "Włącz filtr"> <!ENTITY issues.override.label "&Konfiguracja jest prawidÅ‚owa – kontynuuj zgÅ‚oszenie"> @@ -36,10 +36,10 @@ <!ENTITY emailComment.label "ZachÄ™camy do podania prawidÅ‚owego adresu e-mail, abyÅ›my mogli skontaktować siÄ™ z tobÄ… w przypadku, gdy może to uÅ‚atwić rozwiÄ…zanie problemu. Pozwoli to również rozpoznać naszych współpracowników i nadać ich raportom wyższy priorytet."> <!ENTITY issues.whitelist.remove.label "Włącz ponownie Adblock Plusa na tej stronie"> <!ENTITY outdatedSubscriptions.description "Od dwóch tygodni nastÄ™pujÄ…ce zestawy filtrów nie byÅ‚y aktualizowane. Przed wysÅ‚aniem zgÅ‚oszenia zaktualizuj te zestawy. Być może rozwiąże to twój problem."> -<!ENTITY dataCollector.description "ProszÄ™ poczekać kilka chwil, aż Adblock Plus zbierze wymagane dane."> +<!ENTITY dataCollector.description "Poczekaj chwilÄ™, aż Adblock Plus zbierze wymagane dane."> <!ENTITY sendButton.label "&WyÅ›lij zgÅ‚oszenie"> <!ENTITY comment.label "O&bjaÅ›nienia (opcjonalne):"> -<!ENTITY sendPage.errorMessage "Próba wysÅ‚ania zgÅ‚oszenia nie powiodÅ‚a siÄ™ z powodu „?1?†Sprawdź połączenie z Internetem i ponów próbÄ™. JeÅ›li problem bÄ™dzie nadal wystÄ™powaÅ‚, poproÅ› o pomoc na [link]forum Adblock Plusa[/link]."> +<!ENTITY sendPage.errorMessage "Próba wysÅ‚ania zgÅ‚oszenia nie powiodÅ‚a siÄ™ z powodu „?1?â€. Sprawdź połączenie z Internetem i ponów próbÄ™. JeÅ›li problem bÄ™dzie nadal wystÄ™powaÅ‚, poproÅ› o pomoc na [link]forum Adblock Plusa[/link]."> <!ENTITY showRecentReports.label "WyÅ›wietl ostatnio wysÅ‚ane zgÅ‚oszenia"> <!ENTITY commentPage.heading "Dodaj objaÅ›nienie"> <!ENTITY update.start.label "Aktualizuj teraz"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/filters.dtd index 9db67d1..5f8be9d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Permitir algumas propagandas não-&invasivas"> <!ENTITY addSubscriptionOther.label "Adicionar outra inscrição"> <!ENTITY close.label "Fechar"> +<!ENTITY findbar.caseSensitive "Diferenciar maiúsculas/minúsculas"> <!ENTITY sort.none.label "&Não Organizado"> <!ENTITY filter.actions.label "Ações de filtros"> <!ENTITY filter.copy.label "Copiar"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Localizar"> <!ENTITY subscription.moveDown.label "Para baixo"> <!ENTITY subscription.lastDownload.connectionError "Falhou, falha no download"> +<!ENTITY findbar.statusWrappedStart "InÃcio atingido, continuando do final"> <!ENTITY subscription.lastDownload.success "Êxito"> +<!ENTITY findbar.placeholder "Filtro de pesquisa"> <!ENTITY subscription.lastDownload.invalidData "Falhou, não é uma lista de filtros válida"> +<!ENTITY findbar.close "Fechar barra de pesquisa"> <!ENTITY filter.paste.label "Colar"> <!ENTITY subscription.disabledFilters.enable "Ativar filtros desativados"> <!ENTITY lasthit.column "Ú&ltimo acerto"> +<!ENTITY findbar.statusWrappedEnd "Final atingido, continuando do inÃcio"> <!ENTITY subscription.editTitle.label "Editar tÃtulo"> +<!ENTITY findbar.statusNotFound "Frase não encontrada"> <!ENTITY subscription.disabledFilters.warning "Alguns filtros nesta inscrição estão desativados."> <!ENTITY filter.column "Regra de &Filtro"> <!ENTITY subscription.lastDownload.label "Último download:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/firstRun.properties index 28e868c..922186c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=DisponÃvel para Android e iOS +firstRun_abbButtonTitle=Obtenha o Adblock Browser aqui +firstRun_abbPromotionHeadline=Você tem um smartphone ou tablet? firstRun_acceptableAdsExplanation=GostarÃamos de incentivar sites com publicidade discreta, é simples de usar. É por isso que estabelecemos <a>diretrizes rÃgidas</a> para identificarmos anúncios aceitáveis, que são mostrados em configurações padrão. Se você ainda deseja bloquear todos os anúncios você pode <a>desativar</a> isso em poucos segundos. firstRun_acceptableAdsHeadline=Anúncios chatos serão bloqueados firstRun_contributor_credits=Créditos dos contribuidores diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/global.properties index 1a882de..8eb4594 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=Nenhum critério especificado para reconhecer o elemento a ser ocultado blockingGroup_title=Regras de bloqueio de propaganda whitelisted_tooltip=O Adblock Plus está ativo, mas desativado na página atual. +type_label_ping=ping type_label_stylesheet=folha de estilos blocked_count_tooltip=?1? de ?2? type_label_font=fonte @@ -15,6 +16,7 @@ whitelisted_page=O Adblock Plus foi desativado para a página atual remove_group_warning=Você realmente deseja remover este grupo? action1_tooltip=Clique para abrir/fechar itens bloqueáveis, e com o botão do meio para ativar/desativar. type_label_xmlhttprequest=requisição XML +filter_invalid_regexp=Expressão regular inválida active_tooltip=O Adblock Plus está ativado, com ?1? inscrições de filtros e ?2? filtros personalizados. type_label_document=documento type_label_object_subrequest=sub-requisição do objeto @@ -25,11 +27,15 @@ type_label_object=objeto action2_tooltip=Clique para abrir as preferências, e com o botão do meio para ativar/desativar. type_label_subdocument=frame clearStats_warning=Isso vai reiniciar todas as estatÃsticas de acertos dos filtros e desativar o contador de acertos dos filtros. Você deseja continuar? +filter_unknown_option=Opção de filtro desconhecido +type_label_genericblock=bloqueio genérico notification_antiadblock_message=Este site é conhecido por mostrar mensagens direcionadas a usuários do Adblock Plus. Você quer que o Adblock Plus esconda mensagens direcionadas? blocked_count_addendum=(e também liberados: ?1?, ocultos: ?2?) subscription_invalid_location=O local da lista de filtros não é nem uma URL válida nem um nome válido de arquivo. +type_label_websocket=websocket type_label_image=imagem remove_subscription_warning=Você realmente deseja remover esta inscrição? +type_label_generichide=oculto genérico type_label_other=outro mobile_menu_enable=ABP: Ativado type_label_media=áudio/vÃdeo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Ativado em ?1? type_label_elemhide=oculto newGroup_title=Novo grupo de filtros default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/overlay.dtd index bacca3c..2afa587 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Não"> <!ENTITY sync.label "S&incronizar configurações do Adblock Plus"> <!ENTITY whitelist.site.label "Desativar em ?1?"> +<!ENTITY notification.closing.button.hide "Fechar e&sta notificação"> <!ENTITY filters.label "Opções de &filtros"> <!ENTITY disable.label "Desativar em todas as páginas"> <!ENTITY objecttab.title "Bloquear"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Sim"> <!ENTITY opensidebar.label "A&brir itens bloqueáveis"> <!ENTITY notification.button.close "&Fechar"> +<!ENTITY shownotifications.label "Mostrar &notificações úteis"> <!ENTITY contribute.label "Contribuir com o Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Bloquear quadro"> <!ENTITY blocked.tooltip "Itens bloqueados nesta página:"> +<!ENTITY notification.closing.button.optout "&Parar de mostrar notificações"> <!ENTITY counthits.label "Cont&ar acertos de filtros"> <!ENTITY showinstatusbar.label "&Mostrar na barra de status"> <!ENTITY sidebar.title "Itens bloqueáveis na página atual"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Mostrar na barra de &ferramentas"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Bloquear áudio/vÃdeo"> -<!ENTITY subscription.update.label "Atualizar filtros"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/subscriptionSelection.dtd index 7982acb..c5943a7 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-BR/subscriptionSelection.dtd @@ -5,7 +5,7 @@ <!ENTITY list.download.website "Abrir página da lista de inscrições"> <!ENTITY supplementMessage "Essa inscrição de filtros foi feita para ser usada com inscrição de filtros "?1?", que você ainda não está usando."> <!ENTITY viewList.label "Visualizar filtros"> -<!ENTITY visitHomepage.label "Abrir página da inscrição"> +<!ENTITY visitHomepage.label "Visitar página inicial"> <!ENTITY addSubscription.label "Adicionar inscrição"> <!ENTITY dialog.title "Adicionar inscrição de filtros do Adblock Plus"> <!ENTITY location.label "&Endereço da lista de filtros:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/filters.dtd index 41add0e..0c3bfb4 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/filters.dtd @@ -45,6 +45,7 @@ adicionar um filtro."> <!ENTITY acceptableAds2.label "Perm&itir alguns anúncios não incómodos"> <!ENTITY addSubscriptionOther.label "Adicionar uma subscrição diferente"> <!ENTITY close.label "Fechar"> +<!ENTITY findbar.caseSensitive "Maiúsculas/ minúsculas"> <!ENTITY sort.none.label "&Não ordenar"> <!ENTITY filter.actions.label "Ações de filtros"> <!ENTITY filter.copy.label "Copiar"> @@ -62,12 +63,17 @@ adicionar um filtro."> <!ENTITY find.label "Enco&ntrar"> <!ENTITY subscription.moveDown.label "Mover para baixo"> <!ENTITY subscription.lastDownload.connectionError "Falhou, transferência inválida"> +<!ENTITY findbar.statusWrappedStart "InÃcio atingido, continua no fim"> <!ENTITY subscription.lastDownload.success "Bem sucedido"> +<!ENTITY findbar.placeholder "Pesquisa"> <!ENTITY subscription.lastDownload.invalidData "Falhou, não é uma lista de filtros válida"> +<!ENTITY findbar.close "Fechar"> <!ENTITY filter.paste.label "Colar"> <!ENTITY subscription.disabledFilters.enable "Ativar filtros desativados"> <!ENTITY lasthit.column "Última &utilização"> +<!ENTITY findbar.statusWrappedEnd "Chegou ao fim, voltar ao topo"> <!ENTITY subscription.editTitle.label "Editar tÃtulo"> +<!ENTITY findbar.statusNotFound "Frase não encontrada"> <!ENTITY subscription.disabledFilters.warning "Alguns filtros desta subscrição estão desativados."> <!ENTITY filter.column "Regra de &filtro"> <!ENTITY subscription.lastDownload.label "Última atualização:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/firstRun.properties index e9ab38f..b764360 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=DisponÃvel para Android e iOS +firstRun_abbButtonTitle=Obtenha o Adblock Browser aqui +firstRun_abbPromotionHeadline=Tem um smartphone ou um tablet? firstRun_acceptableAdsExplanation=Gostamos de incentivar os sÃtios web de publicidade a utilizar anúncios não intrusivos. Foi por essa razão que estabelecemos <a>polÃticas restritas</a> para identificar os anúncios aceitáveis e que são mostrados em definições padrão. No entanto, se você quiser bloquear todos os anúncios, pode <a>desativar</a> essa opção facilmente. firstRun_acceptableAdsHeadline=A publicidade será bloqueada firstRun_contributor_credits=Créditos diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/global.properties index d0eae03..11bcc1c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=Nenhum critério especificado para reconhecimento de elementos a bloquear blockingGroup_title=Regras de bloqueio de anúncios whitelisted_tooltip=O Adblock Plus está desativado nesta página. +type_label_ping=ping type_label_stylesheet=folha de estilo blocked_count_tooltip=?1? de ?2? type_label_font=tipo de letra @@ -15,6 +16,7 @@ whitelisted_page=O Adblock Plus foi desativado nesta página remove_group_warning=Quer mesmo remover este grupo? action1_tooltip=Clique para abrir/fechar os itens bloqueáveis, clique na roda do rato para ativar/desativar. type_label_xmlhttprequest=pedido XML +filter_invalid_regexp=Expressão regular invalida active_tooltip=O Adblock Plus está ativado, ?1? subscrições de filtros e ?2? filtros personalizados. type_label_document=documento type_label_object_subrequest=subpedido de objeto @@ -25,11 +27,15 @@ type_label_object=objeto action2_tooltip=Clique para abrir as preferências, clique na roda do rato para ativar/desativar. type_label_subdocument=moldura clearStats_warning=Irá reiniciar as estatÃsticas de todos os filtros e desativar a contagem de bloqueios. Continuar? +filter_unknown_option=Opção de filtro desconhecido +type_label_genericblock=bloquemento generico notification_antiadblock_message=Este sÃtio é conhecido por enviar mensagens dirigidas aos utilizadores do Adblock Plus. Gostaria de ocultar essas mensagens? blocked_count_addendum=(na lista de permissões: ?1?, ocultos: ?2?) subscription_invalid_location=A localização da lista de filtros não é um endereço ou nome de ficheiro válido. +type_label_websocket=WebSockets type_label_image=imagem remove_subscription_warning=Quer mesmo remover esta subscrição? +type_label_generichide=ocultamento generico type_label_other=outro mobile_menu_enable=ABP: Ativar type_label_media=áudio/vÃdeo @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Ativar em ?1? type_label_elemhide=ocultado newGroup_title=Novo grupo de filtros default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/overlay.dtd index 5cd2c95..23786d7 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/pt-PT/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Não"> <!ENTITY sync.label "Sin&cronizar definições do Adblock Plus"> <!ENTITY whitelist.site.label "Desativar em ?1?"> +<!ENTITY notification.closing.button.hide "Fechar esta notificação"> <!ENTITY filters.label "Pre&ferências de filtros"> <!ENTITY disable.label "Desativar em todas as páginas"> <!ENTITY objecttab.title "Bloquear"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Sim"> <!ENTITY opensidebar.label "A&brir itens bloqueáveis"> <!ENTITY notification.button.close "Fe&char"> +<!ENTITY shownotifications.label "Mostrar notificações úteis"> <!ENTITY contribute.label "Colaborar no Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Bloquear moldura"> <!ENTITY blocked.tooltip "Itens bloqueados nesta página:"> +<!ENTITY notification.closing.button.optout "Parar de mostrar notificações"> <!ENTITY counthits.label "&Contar bloqueios do filtro"> <!ENTITY showinstatusbar.label "Mo&strar na barra de estado"> <!ENTITY sidebar.title "Elementos bloqueáveis nesta página"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Mostrar na &barra de ferramentas"> <!ENTITY status.tooltip "Estado:"> <!ENTITY context.media.label "Bloquear áudio/vÃdeo"> -<!ENTITY subscription.update.label "Atualizar filtros"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ro/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ro/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ro/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ro/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ro/composer.dtd index 2bc9f86..350593e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ro/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ro/composer.dtd @@ -5,7 +5,7 @@ <!ENTITY preferences.label "&Arată filtrele existente..."> <!ENTITY pattern.label "Model de căutare pentru potrivire adrese"> <!ENTITY thirdParty.label "La &pagini partener (3rd party)"> -<!ENTITY filter.label "Fil&tru nou:"> +<!ENTITY filter.label "&Filtru nou:"> <!ENTITY collapse.label "Eliberează &spaÅ£iul blocat:"> <!ENTITY match.warning "Modelul introdus nu mai corespunde adresei care trebuie blocată/deblocată ÅŸi de aceea nu va avea nici un efect asupra paginii curente."> <!ENTITY anchor.start.label "la î&nceputul adresei"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ro/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ro/filters.dtd index a74e04b..dae45e8 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ro/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ro/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "&Permite publicitatea discretă"> <!ENTITY addSubscriptionOther.label "Adaugă alt abonament"> <!ENTITY close.label "ÃŽnchide"> +<!ENTITY findbar.caseSensitive "Potrivire exactă"> <!ENTITY sort.none.label "&Neordonat"> <!ENTITY filter.actions.label "AcÈ›iuni filtre"> <!ENTITY filter.copy.label "Copiază"> @@ -60,12 +61,17 @@ <!ENTITY find.label "&Caută"> <!ENTITY subscription.moveDown.label "Mută jos"> <!ENTITY subscription.lastDownload.connectionError "EÅŸuat, descărcare nereuÅŸită"> +<!ENTITY findbar.statusWrappedStart "Am ajuns la început, continuă de la sfârÅŸit"> <!ENTITY subscription.lastDownload.success "Succes"> +<!ENTITY findbar.placeholder "GăseÈ™te filtru"> <!ENTITY subscription.lastDownload.invalidData "EÅŸuat, lista nu este validă"> +<!ENTITY findbar.close "ÃŽnchide bara de găsire"> <!ENTITY filter.paste.label "LipeÅŸte"> <!ENTITY subscription.disabledFilters.enable "Activează filtrele inactive"> <!ENTITY lasthit.column "&Ultima aplicare"> +<!ENTITY findbar.statusWrappedEnd "Am ajuns la sfârÅŸit, continuă de la început"> <!ENTITY subscription.editTitle.label "Editează titlu"> +<!ENTITY findbar.statusNotFound "Fraza nu a fost găsită"> <!ENTITY subscription.disabledFilters.warning "Unele filtre din acest abonament sunt dezactivate."> <!ENTITY filter.column "&Regulă de filtrare"> <!ENTITY subscription.lastDownload.label "Ultima descărcare:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ro/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ro/firstRun.properties index d43c4e6..235f621 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ro/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ro/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Disponibil pentru Android È™i iOS +firstRun_abbButtonTitle=DescărcaÈ›i Adblock Browser de aici +firstRun_abbPromotionHeadline=AveÈ›i un smartphone sau o tabletă? firstRun_acceptableAdsExplanation=Dorim să încurajăm site-urile web în a utiliza publicitate simplă, discretă. De aceea ne-am stabilit <a>reguli de orientare stricte</a> pentru a identifica anunÈ›urile acceptabile, care sunt permise de către setările implicite. Dacă totuÈ™i doriÈ›i să bloca toată publicitatea, puteÈ›i <a>dezactiva</a> aceste permisiuni în câteva secunde. firstRun_acceptableAdsHeadline=Reclamele enervante vor fi blocate acum firstRun_contributor_credits=Contributori @@ -16,5 +19,3 @@ firstRun_legacySafariWarning=FolosiÈ›i o versiune veche de Safari care nu este s firstRun_share=SpuneÈ›i prietenilor dumneavoastră firstRun_share_headline=<a>AjutaÈ›i-ne</a> în a îmbunătăți web-ul firstRun_title=Adblock Plus a fost instalat -firstRun_toggle_off=OFF -firstRun_toggle_on=ON diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ro/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ro/global.properties index e8ed998..2e50f13 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ro/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ro/global.properties @@ -5,6 +5,7 @@ type_label_script=script filter_elemhide_nocriteria=Nu s-a specificat nici un criteriu pentru a identifica elementul pentru ascundere. blockingGroup_title=Reguli de blocare whitelisted_tooltip=Adblock Plus este activ, dar inactiv în pagina curentă. +type_label_ping=ping type_label_stylesheet=foaie de stiluri blocked_count_tooltip=?1? din ?2? type_label_font=corp caracter @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus este inactiv pentru pagina curentă remove_group_warning=Sigur doriÅ£i să înlăturaÅ£i acest grup? action1_tooltip=Clic pentru a deschide lista elementelor blocabile, clic-mijloc pentru a activa/dezactiva. type_label_xmlhttprequest=cerere XML +filter_invalid_regexp=Expresie regulată invalidă active_tooltip=Adblock Plus este activ, sunt folosite ?1? abonamente ÅŸi ?2? filtre proprii. type_label_document=document type_label_object_subrequest=subcerere obiect @@ -25,11 +27,15 @@ type_label_object=obiect action2_tooltip=Clic pentru a modifica opÅ£iuni, clic-mijloc pentru a activa/dezactiva. type_label_subdocument=cadru (frame) clearStats_warning=Toate statisticile filtrelor vor fi iniÅ£ializate ÅŸi înregistrarea lor va fi dezactivată. SunteÅ£i sigur că doriÅ£i să continuaÅ£i? +filter_unknown_option=OpÈ›iune filtru necunoscut +type_label_genericblock=blocare generică notification_antiadblock_message=Acest site trimite mesaje direcÈ›ionate utilizatorilor Adblock Plus. Vrei ca Adblock Plus să ascundă aceste mesaje direcÈ›ionate? blocked_count_addendum=(permisiuni explicite: ?1?, elemente ascunse: ?2?) subscription_invalid_location=LocaÅ£ia pentru filtre nu este validă +type_label_websocket=websocket type_label_image=imagine remove_subscription_warning=Sigur doriÅ£i să îndepărtaÅ£i această subscriere? +type_label_generichide=ascundere generică type_label_other=alt element mobile_menu_enable=ABP: Activează type_label_media=audio-video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Activează pe ?1? type_label_elemhide=ascuns newGroup_title=Grup de filtre nou default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ro/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ro/overlay.dtd index 5d75eab..2d4ac6c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ro/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ro/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nu"> <!ENTITY sync.label "Si&ncronizează setările Adblock Plus"> <!ENTITY whitelist.site.label "Dezactivează Adblock Plus pe ?1?"> +<!ENTITY notification.closing.button.hide "ÃŽnchideÅ£i aceas&tă notificare"> <!ENTITY filters.label "Pre&ferinÈ›e filtre"> <!ENTITY disable.label "Dezactivează peste tot"> <!ENTITY objecttab.title "Blochează"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Da"> <!ENTITY opensidebar.label "Deschide &lista elementelor blocabile"> <!ENTITY notification.button.close "ÃŽn&chide"> +<!ENTITY shownotifications.label "Arată &notificări utile"> <!ENTITY contribute.label "Contribuie la Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: blochează cadru"> <!ENTITY blocked.tooltip "Elemente blocate în pagină:"> +<!ENTITY notification.closing.button.optout "&OpreÅŸte afiÅŸarea notificărilor"> <!ENTITY counthits.label "ÃŽnre&gistrează statisticile filtrelor"> <!ENTITY showinstatusbar.label "Arată în bara de &stare"> <!ENTITY sidebar.title "Adblock Plus: elemente blocabile în pagină"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Arată în bara de &unelte"> <!ENTITY status.tooltip "Stare:"> <!ENTITY context.media.label "Adblock Plus: blochează audio/video"> -<!ENTITY subscription.update.label "Actualizează filtre"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ru/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ru/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ru/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ru/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ru/composer.dtd index b855baf..7392f0b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ru/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ru/composer.dtd @@ -12,7 +12,7 @@ <!ENTITY matchCase.label "&Учитывать региÑтр букв"> <!ENTITY custom.pattern.label "&Другой:"> <!ENTITY unselectAllTypes.label "Убрать вÑе"> -<!ENTITY type.whitelist.label "ИÑ&ключение"> +<!ENTITY type.whitelist.label "&ИÑключение"> <!ENTITY regexp.warning "Введенный шаблон будет понÑÑ‚ как регулÑрное выражение. Большое количеÑтво регулÑрных выражений может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера. ЕÑли вы не ÑобиралиÑÑŒ иÑпользовать регулÑрные выражениÑ, то проÑто добавьте звездочку в конце шаблона."> <!ENTITY dialog.title "СоÑтавление фильтра Ð´Ð»Ñ Adblock Plus"> <!ENTITY basic.label "Стандартный вид"> @@ -28,6 +28,6 @@ <!ENTITY disabled.warning "Adblock Plus ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½. Ð’Ñ‹ можете добавить фильтры, но чтобы они работали нужно [link]включить Adblock Plus[/link]."> <!ENTITY anchor.start.flexible.label "в на&чале имени домена"> <!ENTITY collapse.no.label "Ðет"> -<!ENTITY selectAllTypes.label "Пометить вÑе"> +<!ENTITY selectAllTypes.label "Выбрать вÑÑ‘"> <!ENTITY advanced.label "РаÑширенный вид"> <!ENTITY pattern.explanation "Шаблоном может быть Ð»ÑŽÐ±Ð°Ñ Ñ‡Ð°Ñть адреÑа, причем звездочка (*) заменÑет любое количеÑтво Ñимволов. Фильтр будет применен только к тем адреÑам, которые ÑоответÑтвуют шаблону."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ru/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ru/filters.dtd index d1a858b..d0d390b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ru/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ru/filters.dtd @@ -19,7 +19,7 @@ <!ENTITY noGroupSelected.text "Ðужно выбрать группу, чтобы показать ее фильтры."> <!ENTITY filter.cut.label "Вырезать"> <!ENTITY restore.default.label "ВоÑÑтановить копию от ?1?"> -<!ENTITY subscription.lastDownload.inProgress "ÑейчаÑ..."> +<!ENTITY subscription.lastDownload.inProgress "Загрузка..."> <!ENTITY subscriptions.tab.label "ПодпиÑки"> <!ENTITY sort.descending.label "Ð’ об&ратном порÑдке"> <!ENTITY filters.remove.warning "Ð’Ñ‹ дейÑтвительно хотите удалить вÑе отмеченные фильтры?"> @@ -44,7 +44,8 @@ <!ENTITY acceptableAds2.label "Разре&шить некоторую ненавÑзчивую рекламу"> <!ENTITY addSubscriptionOther.label "Добавить другую подпиÑку"> <!ENTITY close.label "Закрыть"> -<!ENTITY sort.none.label "Бе&з Ñортировки"> +<!ENTITY findbar.caseSensitive "Учитывать региÑтр букв"> +<!ENTITY sort.none.label "&Без Ñортировки"> <!ENTITY filter.actions.label "ДейÑÑ‚Ð²Ð¸Ñ Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ð¼Ð¸"> <!ENTITY filter.copy.label "Копировать"> <!ENTITY filter.moveDown.label "ПомеÑтить ниже"> @@ -61,12 +62,17 @@ <!ENTITY find.label "&Ðайти фильтр"> <!ENTITY subscription.moveDown.label "ПомеÑтить ниже"> <!ENTITY subscription.lastDownload.connectionError "Ошибка: невозможно загрузить"> -<!ENTITY subscription.lastDownload.success "OK"> +<!ENTITY findbar.statusWrappedStart "ДоÑтигнув начала, продолжать Ñ ÐºÐ¾Ð½Ñ†Ð°"> +<!ENTITY subscription.lastDownload.success "УÑпешно"> +<!ENTITY findbar.placeholder "ПоиÑк фильтра"> <!ENTITY subscription.lastDownload.invalidData "Ошибка: неверный формат ÑпиÑка фильтров"> +<!ENTITY findbar.close "Закрыть Ñтроку поиÑка"> <!ENTITY filter.paste.label "Ð’Ñтавить"> <!ENTITY subscription.disabledFilters.enable "Включить отключенные фильтры"> <!ENTITY lasthit.column "ПоÑ&леднее Ñрабатывание"> +<!ENTITY findbar.statusWrappedEnd "ДоÑтигнув конца, продолжать Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°"> <!ENTITY subscription.editTitle.label "Переименовать"> +<!ENTITY findbar.statusNotFound "Фраза не найдена"> <!ENTITY subscription.disabledFilters.warning "Ðекоторые фильтры в Ñтой подпиÑке отключены."> <!ENTITY filter.column "&Правило"> <!ENTITY subscription.lastDownload.label "ПоÑледнее обновление:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ru/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ru/firstRun.properties index 316d4e1..c27d5ac 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ru/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ru/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=ДоÑтупен Ð´Ð»Ñ Android и iOS +firstRun_abbButtonTitle=Скачайте Adblock Browser здеÑÑŒ +firstRun_abbPromotionHeadline=ЕÑть Ñмартфон или планшет? firstRun_acceptableAdsExplanation=Мы хотели бы призвать веб-Ñайты иÑпользовать проÑтую, ненавÑзчивую рекламу. Вот почему мы уÑтановили <a>Ñтрогие принципы</a> Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ñ‹Ñ… объÑвлений, которые разрешены в наÑтройках по умолчанию. ЕÑли вы вÑе еще хотите блокировать каждое объÑвление вы можете <a>Отключить</a> Ñто в течение неÑкольких Ñекунд. firstRun_acceptableAdsHeadline=ÐÐ°Ð´Ð¾ÐµÐ²ÑˆÐ°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð° теперь будет заблокирована firstRun_contributor_credits=ÐŸÐ¾Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ru/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/ru/global.properties index ac168e2..ba96355 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ru/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ru/global.properties @@ -1,35 +1,41 @@ no_blocking_suggestions=Ðа открытой Ñтранице нет Ñлементов, которые можно было бы заблокировать -action3_tooltip=Щелкните здеÑÑŒ, чтобы включить или отключить Adblock Plus. +action3_tooltip=Щёлкните здеÑÑŒ, чтобы включить или отключить Adblock Plus. notification_antiadblock_title=Скрыть целевые ÑообщениÑ? type_label_script=Скрипт filter_elemhide_nocriteria=Ðе указано никаких признаков, чтобы опознать Ñлемент, который нужно Ñкрыть blockingGroup_title=Правила Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ -whitelisted_tooltip=Adblock Plus отключен на Ñтой Ñтранице. +whitelisted_tooltip=Adblock Plus отключён на Ñтой Ñтранице. +type_label_ping=Пинг type_label_stylesheet=Стили blocked_count_tooltip=?1? из ?2? type_label_font=Шрифт type_label_popup=Ð’Ñплывающее окно filter_regexp_tooltip=Ðтот фильтр либо ÑвлÑетÑÑ Ñ€ÐµÐ³ÑƒÐ»Ñрным выражением, либо Ñлишком короткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸. Большое количеÑтво таких фильтров может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера. action0_tooltip=Ðажмите, чтобы открыть контекÑтное меню. Ðажмите Ñреднюю кнопку мыши, чтобы включить или отключить Adblock Plus. -whitelisted_page=Adblock Plus отключен на Ñтой Ñтранице +whitelisted_page=Adblock Plus отключён на Ñтой Ñтранице remove_group_warning=Ð’Ñ‹ уверены, что хотите удалить Ñту группу? -action1_tooltip=Щелкните здеÑÑŒ, чтобы открыть/закрыть ÑпиÑок Ñлементов. Ðажмите Ñреднюю кнопку мыши, чтобы включить или отключить Adblock Plus. +action1_tooltip=Щёлкните здеÑÑŒ, чтобы открыть/закрыть ÑпиÑок Ñлементов. Ðажмите Ñреднюю кнопку мыши, чтобы включить или отключить Adblock Plus. type_label_xmlhttprequest=XML-Ð·Ð°Ð¿Ñ€Ð¾Ñ -active_tooltip=Adblock Plus включен, иÑпользуетÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñок: ?1?, ÑобÑтвенных фильтров: ?2?. +filter_invalid_regexp=Ðеправильное регулÑрное выражение +active_tooltip=Adblock Plus включён, иÑпользуетÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñок: ?1?, ÑобÑтвенных фильтров: ?2?. type_label_document=Документ type_label_object_subrequest=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° whitelistGroup_title=ИÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ -disabled_tooltip=Adblock Plus отключен. +disabled_tooltip=Adblock Plus отключён. filter_elemhide_duplicate_id=У Ñлемента, который нужно Ñкрыть, может быть только один идентификатор type_label_object=Объект action2_tooltip=Ðажмите, чтобы открыть окно уÑтановок. Ðажмите Ñреднюю кнопку мыши, чтобы включить или отключить Adblock Plus. type_label_subdocument=Фрейм clearStats_warning=СтатиÑтика попаданий будет обнулена Ð´Ð»Ñ Ð²Ñех фильтров и в дальнейшем больше не будет запиÑыватьÑÑ. Продолжать? +filter_unknown_option=ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° +type_label_genericblock=ÐžÐ±Ñ‰Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ° notification_antiadblock_message=ИзвеÑтно, что Ñтот Ñайт показывает ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Adblock Plus. Хотите, чтобы Adblock Plus Ñкрывал такие ÑообщениÑ? blocked_count_addendum=(также иÑключений: ?1?, ÑпрÑтано: ?2?) -subscription_invalid_location=Ðе удалоÑÑŒ раÑпознать введенный Ð°Ð´Ñ€ÐµÑ Ð½Ð¸ как Ð°Ð´Ñ€ÐµÑ Ð² интернете, ни как путь файлу. +subscription_invalid_location=Ðе удалоÑÑŒ раÑпознать введённый Ð°Ð´Ñ€ÐµÑ Ð½Ð¸ как Ð°Ð´Ñ€ÐµÑ Ð² интернете, ни как путь файлу. +type_label_websocket=WebSocket type_label_image=Изображение remove_subscription_warning=Ð’Ñ‹ уверены, что хотите удалить Ñту подпиÑку? +type_label_generichide=Общее Ñкрытие type_label_other=ÐеизвеÑтен mobile_menu_enable=ABP: Включить type_label_media=Ðудио/видео @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Включить на ?1? type_label_elemhide=Скрыто newGroup_title=ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° фильтров default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ru/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ru/overlay.dtd index 50378da..b3868b9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ru/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ru/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ðет"> <!ENTITY sync.label "Син&хронизировать наÑтройки Adblock Plus"> <!ENTITY whitelist.site.label "Отключить на ?1?"> +<!ENTITY notification.closing.button.hide "За&крыть Ñто уведомление"> <!ENTITY filters.label "ÐаÑтройки &фильтров"> <!ENTITY disable.label "Отключить везде"> <!ENTITY objecttab.title "Блокировать"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Да"> <!ENTITY opensidebar.label "Открыть Ñ&пиÑок Ñлементов"> <!ENTITY notification.button.close "&Закрыть"> +<!ENTITY shownotifications.label "Показывать полезные &уведомлениÑ"> <!ENTITY contribute.label "Помочь проекту Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Заблокировать фрейм"> <!ENTITY blocked.tooltip "Заблокированные Ñлементы на Ñтой Ñтранице:"> +<!ENTITY notification.closing.button.optout "Ð&е показывать полезные уведомлениÑ"> <!ENTITY counthits.label "С&читать ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð²"> <!ENTITY showinstatusbar.label "Показывать в &Ñтроке ÑоÑтоÑниÑ"> <!ENTITY sidebar.title "ДоÑтупные Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлементы на текущей Ñтранице"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "&Показывать в панели инÑтрументов"> <!ENTITY status.tooltip "СтатуÑ:"> <!ENTITY context.media.label "Adblock Plus: Заблокировать аудио/видео"> -<!ENTITY subscription.update.label "Обновить фильтры"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/ru/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/ru/sendReport.dtd index a777544..2f02a5f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/ru/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/ru/sendReport.dtd @@ -3,7 +3,7 @@ <!ENTITY showData.label "Показать данные ÑообщениÑ"> <!ENTITY typeSelector.falsePositive.label "&Adblock Plus блокирует Ñлишком многое"> <!ENTITY issues.change.description "Ваши наÑтройки изменилиÑÑŒ. ПожалуйÑта, обновите Ñтраницу Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ - внеÑенных изменений и отправьте Ñообщение, еÑли проблема не разрешилаÑÑŒ."> + внеÑённых изменений и отправьте Ñообщение, еÑли проблема не разрешилаÑÑŒ."> <!ENTITY email.label "E-&mail:"> <!ENTITY issues.openPreferences.label "Открыть наÑтройки фильтров"> <!ENTITY sendPage.confirmation "Сообщение отправлено и Ñохранено. Ð’Ñ‹ можете проÑмотреть его по Ñледующей ÑÑылке:"> @@ -17,12 +17,12 @@ <!ENTITY typeWarning.override.label "Я &понÑл и, тем не менее, хочу отправить Ñообщение"> <!ENTITY issues.disabled.enable.label "Включить Adblock Plus"> <!ENTITY update.fixed.description "Обновление ваших подпиÑок на фильтры Ñкорее вÑего решило проблему, о которой - вы хотели Ñообщить. ПожалуйÑта, загрузите Ñтраницу заново и попробуйте еще раз. + вы хотели Ñообщить. ПожалуйÑта, загрузите Ñтраницу заново и попробуйте ещё раз. ЕÑли проблема ÑохранÑетÑÑ, -отправьте отчет повторно."> +отправьте отчёт повторно."> <!ENTITY anonymous.label "Отпр&авить анонимно"> <!ENTITY reloadButton.label "Об&новить Ñтраницу"> -<!ENTITY recentReports.clear.label "&Удалить вÑе отчеты"> +<!ENTITY recentReports.clear.label "&Удалить вÑе отчёты"> <!ENTITY typeSelector.description "МаÑтер поможет вам отправить Ñообщение о проблеме Ñ Adblock Plus. ПожалуйÑта, укажите на Ñтой Ñтранице тип проблемы, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы ÑтолкнулиÑÑŒ:"> <!ENTITY screenshot.remove.label "У&далить конфиденциальные данные"> @@ -32,14 +32,14 @@ что проблема еще не была решена. Подождите, пожалуйÑта..."> <!ENTITY sendPage.retry.label "Отправить еще раз"> <!ENTITY data.label "Да&нные ÑообщениÑ:"> -<!ENTITY recentReports.label "Ваши недавно отправленные отчеты"> +<!ENTITY recentReports.label "Ваши недавно отправленные отчёты"> <!ENTITY typeWarning.description "Ð’Ñ‹ указали, что хотите Ñообщить о проблеме в Adblock Plus, а не в его фильтрах. ПожалуйÑта, учтите, что о таких проблемах лучше Ñообщать на [link]форуме Adblock Plus[/link]. МаÑтер отправки ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñледует иÑпользовать лишь Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ к обÑуждению на форуме, поÑкольку никто не увидит ваше Ñообщение, еÑли не оÑтавить на него ÑÑылку. Ð’Ñ‹ получите автоматичеÑки Ñозданную ÑÑылку поÑле отправки ÑообщениÑ."> -<!ENTITY issues.disabled.description "Adblock Plus отключен и ничего не блокирует в Ñтом ÑоÑтоÑнии."> +<!ENTITY issues.disabled.description "Adblock Plus отключён и ничего не блокирует в Ñтом ÑоÑтоÑнии."> <!ENTITY attachExtensions.label "П&рикрепить ÑпиÑок включенных раÑширений к Ñообщению на Ñлучай, еÑли проблема вызвана конфликтом раÑширений"> <!ENTITY issues.nosubscriptions.add.label "Добавить подпиÑку"> <!ENTITY issues.disabledfilters.enable.label "Включить фильтр"> @@ -51,10 +51,10 @@ Ð’Ñ‹ можете проверить, ÑвлÑетÑÑ Ð»Ð¸ Adblock Plus иÑточником проблемы, временно отключив его."> <!ENTITY typeSelector.other.label "&Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°"> -<!ENTITY emailComment.label "Мы рекомендуем ввеÑти e-mail адреÑ, по которому мы могли бы ÑвÑзатьÑÑ Ð² Ñлучает вопроÑов по вашему Ñообщению. Ðто также позволит нам узнавать Ваши взноÑÑ‹ и обрабатывать их в предпочтительном порÑдке."> +<!ENTITY emailComment.label "Мы рекомендуем ввеÑти e-mail адреÑ, по которому мы могли бы ÑвÑзатьÑÑ Ð² Ñлучае вопроÑов по вашему Ñообщению. Ðто также позволит нам обрабатывать его в предпочтительном порÑдке, еÑли были качеÑтвенные предыдущие ÑообщениÑ."> <!ENTITY issues.whitelist.remove.label "Включить Adblock Plus на Ñтой Ñтранице"> <!ENTITY outdatedSubscriptions.description "Следующие подпиÑки на фильтры не обновлÑлиÑÑŒ более двух недель. ПожалуйÑта, - обновите Ñти подпиÑки перед отправкой отчета, поÑкольку проблема уже + обновите Ñти подпиÑки перед отправкой отчёта, поÑкольку проблема уже может быть решена."> <!ENTITY dataCollector.description "ПожалуйÑта, подождите неÑколько Ñекунд, пока Adblock Plus Ñобирает нужные данные."> <!ENTITY sendButton.label "От&править Ñообщение"> @@ -62,7 +62,7 @@ <!ENTITY sendPage.errorMessage "Ошибка отправки ÑообщениÑ: «?1?». ПожалуйÑта, удоÑтоверьтеÑÑŒ, что ваше Ñоединение Ñ Ñетью Интернет работает, и попробуйте еще раз. ЕÑли проблема оÑтаетÑÑ, обратитеÑÑŒ в [link]форум Adblock Plus[/link]."> -<!ENTITY showRecentReports.label "Показать недавно отправленные отчеты"> +<!ENTITY showRecentReports.label "Показать недавно отправленные отчёты"> <!ENTITY commentPage.heading "Комментарий"> <!ENTITY update.start.label "Обновить подпиÑки"> <!ENTITY issues.disabledfilters.description "Следующие фильтры отключены, но могли бы повлиÑть на Ñту Ñтраницу:"> @@ -71,7 +71,7 @@ или пометить облаÑть Ñнимка, в которой проÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°. Ð”Ð»Ñ Ñтого нажмите на ÑоответÑтвующую кнопку и выберите мышкой чаÑть Ñнимка."> <!ENTITY screenshot.attach.label "При&крепить Ñнимок Ñкрана к Ñообщению"> -<!ENTITY issues.whitelist.description "Adblock Plus отключен на Ñтранице, о которой вы ÑобираетеÑÑŒ Ñообщить. ПожалуйÑта, +<!ENTITY issues.whitelist.description "Adblock Plus отключён на Ñтранице, о которой вы ÑобираетеÑÑŒ Ñообщить. ПожалуйÑта, включите Adblock Plus и обновите Ñтраницу, прежде чем поÑылать Ñообщение. Ðто поможет раÑÑмотрению вашего ÑообщениÑ."> <!ENTITY typeSelector.falseNegative.label "&Adblock Plus не блокирует рекламу"> @@ -87,15 +87,15 @@ <!ENTITY typeSelector.falseNegative.description "ЕÑли неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что Adblock Plus включен, на Ñтранице отображаетÑÑ Ñ€ÐµÐºÐ»Ð°Ð¼Ð°, то Ñледует выбрать Ñтот вариант."> <!ENTITY sendPage.waitMessage "ПожалуйÑта, подождите, пока Adblock Plus отправлÑет ваше Ñообщение."> -<!ENTITY dataCollector.heading "Добро пожаловать в маÑтер отправки отчетов"> +<!ENTITY dataCollector.heading "Добро пожаловать в маÑтер отправки отчётов"> <!ENTITY screenshot.heading "Снимок Ñкрана"> <!ENTITY sendPage.heading "Отправка ÑообщениÑ"> <!ENTITY issues.subscriptionCount.description "Похоже, что вы подпиÑаны на Ñлишком большое количеÑтво ÑпиÑков фильтров. Ðто не рекомендуетÑÑ, поÑкольку Ñильно возраÑтает вероÑтноÑть проблем. Помимо Ñтого, мы не можем принÑть ваше Ñообщение, поÑкольку неÑÑно, какой из ÑпиÑков фильтров нужно иÑправлÑть. ПожалуйÑта, удалите вÑе ÑпиÑки фильтров кроме - дейÑтвительно нужных. ПоÑле Ñтого проверьте, проÑвлÑетÑÑ Ð»Ð¸ еще проблема."> + дейÑтвительно нужных. ПоÑле Ñтого проверьте, проÑвлÑетÑÑ Ð»Ð¸ ещё проблема."> <!ENTITY screenshot.mark.label "&Пометить проблему"> <!ENTITY privacyPolicy.label "Политика конфиденциальноÑти"> <!ENTITY issues.description "Adblock Plus обнаружил проблемы в ваших наÑтройках, которые, возможно, вызвали - данную проблему или уÑложнÑÑ‚ раÑÑмотрение вашего отчета."> + данную проблему или уÑложнÑÑ‚ раÑÑмотрение вашего отчёта."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sk/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sk/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sk/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sk/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sk/filters.dtd index ed28642..80634ac 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sk/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sk/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Povol&iÅ¥ niektoré nevtieravé reklamy"> <!ENTITY addSubscriptionOther.label "PridaÅ¥ iné odoberania"> <!ENTITY close.label "ZatvoriÅ¥"> +<!ENTITY findbar.caseSensitive "RozliÅ¡ovaÅ¥ malé/veľké"> <!ENTITY sort.none.label "&Netriedené"> <!ENTITY filter.actions.label "Úlohy filtrov"> <!ENTITY filter.copy.label "KopÃrovaÅ¥"> @@ -62,12 +63,17 @@ <!ENTITY find.label "Náj&sÅ¥"> <!ENTITY subscription.moveDown.label "Posunúť dole"> <!ENTITY subscription.lastDownload.connectionError "Zlyhanie, sÅ¥ahovanie neúspeÅ¡né"> +<!ENTITY findbar.statusWrappedStart "Dosiahol vrchol, pokraÄovaÅ¥ zdola"> <!ENTITY subscription.lastDownload.success "ÚspeÅ¡né"> +<!ENTITY findbar.placeholder "NájsÅ¥ filter"> <!ENTITY subscription.lastDownload.invalidData "Zlyhanie, neplatný zoznam filtrov"> +<!ENTITY findbar.close "ZatvoriÅ¥ vyhľadávacà panel"> <!ENTITY filter.paste.label "PrilepiÅ¥"> <!ENTITY subscription.disabledFilters.enable "Zapnúť vypnuté filtre"> <!ENTITY lasthit.column "Po&sledný zápis"> +<!ENTITY findbar.statusWrappedEnd "Dosiahol koniec, pokraÄovanie zhora"> <!ENTITY subscription.editTitle.label "UpraviÅ¥ názov"> +<!ENTITY findbar.statusNotFound "Fráza nenájdená"> <!ENTITY subscription.disabledFilters.warning "Niektoré filtre tohto odberu sú vypnuté."> <!ENTITY filter.column "Pravidlo &filtra"> <!ENTITY subscription.lastDownload.label "Posledné prevzatie:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sk/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sk/firstRun.properties index 6dcd4aa..34dbaf3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sk/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sk/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Podporuje systémy Android a iOS +firstRun_abbButtonTitle=Stiahnite si Adblock Browser tu +firstRun_abbPromotionHeadline=Máte smartfón alebo tablet? firstRun_acceptableAdsExplanation=Radi by sme povzbudili webové stránky aby použÃvali jednoduché a nevtieravé inzercie. To je dôvod, preÄo sme zaviedli <a>prÃsne pravidlá</a> na identifikáciu prijateľné reklamy, ktoré sú uvedené v Äasti predvolené nastavenie. Ak si napriek tomu chcete blokovaÅ¥ každú reklamu môžete <a>vypnúť</a> toto za pár sekúnd. firstRun_acceptableAdsHeadline=Otravné reklamy budú teraz blokované firstRun_contributor_credits=Zásluhy autorov @@ -16,5 +19,3 @@ firstRun_legacySafariWarning=PoužÃvate starú verziu Safari, ktorá nepodporuj firstRun_share=Povedzte svojim priateľom firstRun_share_headline=<a>Pomuožte nám</a> urobiÅ¥ web lepÅ¡Ãm miestom firstRun_title=Adblock Plus bol nainÅ¡talovaný -firstRun_toggle_off=OFF -firstRun_toggle_on=ON diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sk/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sk/global.properties index 2294515..6eb4aef 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sk/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sk/global.properties @@ -5,6 +5,7 @@ type_label_script=skript filter_elemhide_nocriteria=Žiadne kritéria neboli Å¡pecifikované pre rozpoznanie prvku na skrytie blockingGroup_title=Pravidlá blokovania whitelisted_tooltip=Adblock Plus je aktÃvny, ale vypnutý na aktuálnej stránke. +type_label_ping=ping type_label_stylesheet=Å týly blocked_count_tooltip=?1? mimo ?2? type_label_font=pÃsmo @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus bol zakázaný pre aktuálnu stránku remove_group_warning=Naozaj chcete odstrániÅ¥ túto skupinu? action1_tooltip=Kliknúť pre OtvoriÅ¥/ZavrieÅ¥ blokovateľné položky, kliknutie prostredným pre Zapnúť/Vypnúť. type_label_xmlhttprequest=XML požiadavka +filter_invalid_regexp=Neplatný regulárny výraz active_tooltip=Adblock Plus je aktÃvny,?1? popis filtra(ov) a ?2? vlastný filtr(e) sa použÃva . type_label_document=dokument type_label_object_subrequest=podžiadosÅ¥ predmetu @@ -25,11 +27,15 @@ type_label_object=predmet action2_tooltip=Kliknúť pre otvorenie nastavenÃ, kliknutie prostredným pre Zapnúť/Vypnúť. type_label_subdocument=rámec clearStats_warning=Toto resetuje vÅ¡etky Å¡tatistiky filtrov a vypne poÄÃtadlo. Chcete pokraÄovaÅ¥? +filter_unknown_option=Neznáma možnosÅ¥ filtra +type_label_genericblock=genericky blokovaÅ¥ notification_antiadblock_message=Táto stránka bola známa zobrazenÃm cielených správ pre použÃvateľa Adblock Plus. Chcete, aby Adblock Plus skryl cielené správy? blocked_count_addendum=(tiež biely zoznam: ?1?, skrytý: ?2?) subscription_invalid_location=Umiestnenie zoznamu filtrov nemá platnú URL alebo platný názov súboru. +type_label_websocket=websocket type_label_image=obrázok remove_subscription_warning=Naozaj si želáte odstrániÅ¥ toto povolenie? +type_label_generichide=genericky skryÅ¥ type_label_other=iný mobile_menu_enable=ABP: Zapnúť type_label_media=zvuk/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Zapnúť na ?1? type_label_elemhide=skrytý newGroup_title=Nová skupina filtrov default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sk/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sk/overlay.dtd index 57c5a78..db4282c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sk/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sk/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Nie"> <!ENTITY sync.label "Syn&chronizovaÅ¥ nastavenia Adblock Plus"> <!ENTITY whitelist.site.label "Vypnúť na ?1?"> +<!ENTITY notification.closing.button.hide "ZatvoriÅ¥ toto upozornenie"> <!ENTITY filters.label "&Nastavenia filtrov"> <!ENTITY disable.label "Vypnúť vÅ¡ade"> <!ENTITY objecttab.title "BlokovaÅ¥"> @@ -9,23 +10,24 @@ <!ENTITY objecttabs.label "ZobraziÅ¥ karty pre &Flash a Java"> <!ENTITY sendReport.label "&OhlásiÅ¥ problém na tejto stránke"> <!ENTITY whitelist.page.label "Vypnúť len na tejto stránke"> -<!ENTITY context.image.label "Adblock obrázok"> +<!ENTITY context.image.label "Adblock Plus: BlokovaÅ¥ obrázok"> <!ENTITY notification.button.yes "&Ãno"> <!ENTITY opensidebar.label "OtvoriÅ¥ &blokovateľné položky"> <!ENTITY notification.button.close "&ZatvoriÅ¥"> +<!ENTITY shownotifications.label "ZobraziÅ¥ užitoÄné položky a oznámenia"> <!ENTITY contribute.label "PrispieÅ¥ na Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> -<!ENTITY context.frame.label "Adblock rámec"> -<!ENTITY blocked.tooltip "BlokovaÅ¥ položky na tejto stránke:"> +<!ENTITY context.frame.label "Adblock Plus: BlokovaÅ¥ rámec"> +<!ENTITY blocked.tooltip "Blokovaných položiek na tejto stránke:"> +<!ENTITY notification.closing.button.optout "ZruÅ¡iÅ¥ zobrazovanie upozornenÃ"> <!ENTITY counthits.label "P&oÄÃtadlo"> <!ENTITY showinstatusbar.label "ZobraziÅ¥ v &stavovom riadku"> <!ENTITY sidebar.title "Blokovateľné položky na aktuálnej stránke"> <!ENTITY options.label "&Možnosti"> -<!ENTITY context.object.label "Adblock objekt"> +<!ENTITY context.object.label "Adblock Plus: BlokovaÅ¥ objekt"> <!ENTITY context.removeWhitelist.label "Adblock Plus: Znovu zapnúť túto stránku"> <!ENTITY filters.tooltip "NajaktÃvnejÅ¡ie filtre:"> <!ENTITY closesidebar.label "ZatvoriÅ¥ &blokovateľné položky"> <!ENTITY showintoolbar.label "ZobraziÅ¥ v pane&li nástrojov"> <!ENTITY status.tooltip "Stav:"> <!ENTITY context.media.label "Adblock Plus: BlokovaÅ¥ audio/video"> -<!ENTITY subscription.update.label "AktualizovaÅ¥ filtre"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sk/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sk/sendReport.dtd index 0bd2884..fdee8b6 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sk/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sk/sendReport.dtd @@ -26,7 +26,7 @@ <!ENTITY recentReports.label "VaÅ¡e nedávno potvrdené správy"> <!ENTITY typeWarning.description "NaznaÄili ste, že chcete ohlásiÅ¥ vÅ¡eobecný problém s Adblock Plus radÅ¡ej ako problém s filtrami. VÅ¡imnite si, že tieto otázky sa lepÅ¡ie rieÅ¡ia na [link]fórume Adblock Plus[/link]. Mali by ste použiÅ¥ reportér problémov pre doplnenie existujúcej diskusie, inak si nikto nevÅ¡imne vaÅ¡u správu skôr, než ju poskytnete na danom odkaze. Automaticky vygenerovaný odkaz bude poskytnutý po potvrdenà správy."> <!ENTITY issues.disabled.description "Adblock Plus je vypnutý, v danom stave nebude niÄ blokovaÅ¥."> -<!ENTITY attachExtensions.label "PriložiÅ¥ &zoznam aktÃvnych rozÅ¡Ãrenà k tejto správe pre prÃpad, že rozÅ¡Ãrenie spôsobuje tento problém"> +<!ENTITY attachExtensions.label "PriložiÅ¥ zoznam aktÃvnych &rozÅ¡Ãrenà k tejto správe pre prÃpad, že rozÅ¡Ãrenie spôsobuje tento problém"> <!ENTITY issues.nosubscriptions.add.label "PridaÅ¥ odber filtra"> <!ENTITY issues.disabledfilters.enable.label "Zapnúť filter"> <!ENTITY issues.override.label "Nasta&venie je správne, pokraÄovaÅ¥ so správou"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sl/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sl/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sl/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sl/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sl/filters.dtd index d953d5e..2e9568d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sl/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sl/filters.dtd @@ -45,6 +45,7 @@ za dodajanje novega filtra."> <!ENTITY acceptableAds2.label "Dovol&i nekatere nevsiljive oglase"> <!ENTITY addSubscriptionOther.label "Dodaj novo naroÄnino"> <!ENTITY close.label "Zapri"> +<!ENTITY findbar.caseSensitive "Razlikuj velike/male Ärke"> <!ENTITY sort.none.label "Nerazvr&Å¡Äeno"> <!ENTITY filter.actions.label "Dejanja filtra"> <!ENTITY filter.copy.label "Kopiraj"> @@ -62,12 +63,17 @@ za dodajanje novega filtra."> <!ENTITY find.label "Najdi"> <!ENTITY subscription.moveDown.label "Premakni navzdol"> <!ENTITY subscription.lastDownload.connectionError "NeuspeÅ¡no, napaka prenosa"> +<!ENTITY findbar.statusWrappedStart "Vrh dosežen, nadaljevanje od spodaj"> <!ENTITY subscription.lastDownload.success "UspeÅ¡no"> +<!ENTITY findbar.placeholder "Najdi filter"> <!ENTITY subscription.lastDownload.invalidData "NeuspeÅ¡no, ni veljaven seznam filtrov"> +<!ENTITY findbar.close "Zapri iskalno vrstico"> <!ENTITY filter.paste.label "Prilepi"> <!ENTITY subscription.disabledFilters.enable "OmogoÄi onemogoÄene filtre"> <!ENTITY lasthit.column "Zad&nji zadetek"> +<!ENTITY findbar.statusWrappedEnd "Dno doseženo, nadaljevanje od zgoraj"> <!ENTITY subscription.editTitle.label "Uredi naslov"> +<!ENTITY findbar.statusNotFound "Izraza ni bilo mogoÄe najti"> <!ENTITY subscription.disabledFilters.warning "V tej naroÄnini so nekateri filtri onemogoÄeni."> <!ENTITY filter.column "Pravilo &filtra"> <!ENTITY subscription.lastDownload.label "Zadnji prenos:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sl/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sl/firstRun.properties index 90abc16..128ffb0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sl/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sl/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Na voljo za Android in iOS +firstRun_abbButtonTitle=Pridobite si tukaj Adblock Browser +firstRun_abbPromotionHeadline=Imate pametni telefon ali tabli firstRun_acceptableAdsExplanation=Želimo spodbujati uporabo preprostih, nevsiljivih oglasov na spletnih straneh. Zato smo vpeljali <a>stroge kriterije</a> prepoznavanja sprejemljivih oglasov, ki so privzeto prikazani. ÄŒe vseeno želite blokirati vse oglase, jih lahko <a>onemogoÄite</a> v nekaj sekundah. firstRun_acceptableAdsHeadline=Nadležni oglasi bodo zdaj blokirani firstRun_contributor_credits=Zasluge sodelavcev diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sl/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sl/global.properties index 18e6696..dc3cab7 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sl/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sl/global.properties @@ -5,6 +5,7 @@ type_label_script=skript filter_elemhide_nocriteria=Za razpoznavo elementa, ki naj bo skrit, ni navedenih pogojev blockingGroup_title=Pravila blokiranja oglasov whitelisted_tooltip=Adblock Plus je za trenutno stran onemogoÄen. +type_label_ping=ping type_label_stylesheet=predlogo strani blocked_count_tooltip=?1? od ?2? type_label_font=pisava @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus je bil za trenutno stran onemogoÄen remove_group_warning=Ste prepriÄani da želite odstraniti to skupino? action1_tooltip=Kliknite za odprtje/zaprtje blokiranih elementov, s srednjim klikom vkljuÄite/izkljuÄite. type_label_xmlhttprequest=zahteva XML +filter_invalid_regexp=Neveljaven regularni izraz active_tooltip=Adblock Plus je aktiven, ?1? naroÄnine na filtre in ?2? filtri po meri so v rabi. type_label_document=dokument type_label_object_subrequest=podzahteva predmeta @@ -22,14 +24,19 @@ whitelistGroup_title=Pravila izjem disabled_tooltip=Adblock Plus je izkljuÄen. filter_elemhide_duplicate_id=Navedete lahko le eno identiteto elementa, ki naj bo skrit type_label_object=predmet +filter_elemhideemulation_nodomain=Ni doloÄene aktivne domene za razÅ¡irjeni element skrivanja filtra action2_tooltip=Kliknite za nastavitve, s srednjim klikom vkljuÄite/izkljuÄite. type_label_subdocument=okvir clearStats_warning=S tem boste ponastavili vso statistiko zadetkov filtra in onemogoÄili Å¡tetje zadetkov filtra. Želite nadaljevati? +filter_unknown_option=Neznana možnost filtra +type_label_genericblock=prezri sploÅ¡na pravila notification_antiadblock_message=Ta stran uporabnikom prikazuje ciljana sporoÄila. Želite, da Adblock Plus skrije ta sporoÄila? blocked_count_addendum=(prav tako prikriti: ?1?, skriti: ?2?) subscription_invalid_location=Mesto seznama filtrov ni niti veljaven URL niti veljavno ime datoteke. +type_label_websocket=websocket type_label_image=sliko remove_subscription_warning=Ste prepriÄani da želite odpovedati naroÄnino? +type_label_generichide=skrij sploÅ¡na pravila type_label_other=drugo mobile_menu_enable=ABP: omogoÄi type_label_media=avdio/video diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sl/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sl/overlay.dtd index 152582a..d432bef 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sl/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sl/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ne"> <!ENTITY sync.label "Sin&hroniziraj nastavitve Adblock Plus"> <!ENTITY whitelist.site.label "OnemogoÄi na ?1?"> +<!ENTITY notification.closing.button.hide "Zapri t& njegovo obvestilo"> <!ENTITY filters.label "Nastavitve &filtra"> <!ENTITY disable.label "OnemogoÄi povsod"> <!ENTITY objecttab.title "Blokiraj"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Da"> <!ENTITY opensidebar.label "Odpri &elemente blokad"> <!ENTITY notification.button.close "&Zapri"> +<!ENTITY shownotifications.label "Prikaži koristno & obvestila"> <!ENTITY contribute.label "Prispevajte k Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock - okviri"> <!ENTITY blocked.tooltip "Blokirani elementi na tej strani:"> +<!ENTITY notification.closing.button.optout "& Ustavi prikazovanje obvestil"> <!ENTITY counthits.label "Å tej za&detke filtra"> <!ENTITY showinstatusbar.label "Pokaži &v vrstici stanja"> <!ENTITY sidebar.title "Elementi blokad na trenutni strani"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Po&kaži v orodni vrstici"> <!ENTITY status.tooltip "Stanje:"> <!ENTITY context.media.label "Adblock Plus: Blokiraj zvok/video"> -<!ENTITY subscription.update.label "Posodobi filtre"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sq/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sq/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sq/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sq/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sq/composer.dtd index 3337f0a..1acd348 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sq/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sq/composer.dtd @@ -3,10 +3,10 @@ <!ENTITY collapse.default.no.label "Përdor të parazgjedhurën (jo):"> <!ENTITY firstParty.label "Vetëm të parët"> <!ENTITY preferences.label "Trego filtrin ekzistues..."> -<!ENTITY pattern.label "Kërko për motivin"> +<!ENTITY pattern.label "Shiko për model"> <!ENTITY thirdParty.label "Vetëm të tretët"> <!ENTITY filter.label "Filtër i ri:"> -<!ENTITY collapse.label "Shkatërro te bllokuarat:"> +<!ENTITY collapse.label "Shkurto të bllokuarat:"> <!ENTITY match.warning "Motivi që dhatë nuk përputhet më me adresat e bllokuara/lejuara dhe nuk ka më efekt mbi to."> <!ENTITY anchor.start.label "në fillim të adresës"> <!ENTITY matchCase.label "Përputh shembullin"> @@ -28,6 +28,6 @@ <!ENTITY disabled.warning "Adblock Plus nuk punon për momentin. Mund të shtoni filtra por nuk do të funksionojnë nëse ju nuk [link]mundësoni Adblock Plus[/link]."> <!ENTITY anchor.start.flexible.label "në fillim të domain name"> <!ENTITY collapse.no.label "Jo"> -<!ENTITY selectAllTypes.label "Përzgjidhi krejt"> +<!ENTITY selectAllTypes.label "Zgjidh të gjitha"> <!ENTITY advanced.label "Pamje e avancuar"> <!ENTITY pattern.explanation "Motivi mund të jetë çdo pjesë e adresës; simboli (*) vepron si xhoker. Filtri do të zbatohet vetëm në adresat që i përshtaten motivit të dhënë."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sq/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sq/filters.dtd index ac96eab..1ad8aee 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sq/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sq/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Lejo ndoca reklamë jo të &bezdisshme"> <!ENTITY addSubscriptionOther.label "Shto nje abonim tjeter"> <!ENTITY close.label "Mbylle"> +<!ENTITY findbar.caseSensitive "Përputh shembullin"> <!ENTITY sort.none.label "Pa radhitur"> <!ENTITY filter.actions.label "Veprime filtrash"> <!ENTITY filter.copy.label "Kopjo"> @@ -60,12 +61,17 @@ <!ENTITY find.label "Kërko"> <!ENTITY subscription.moveDown.label "Zbrite poshtë"> <!ENTITY subscription.lastDownload.connectionError "Deshtoi,gabim shkarkimi"> +<!ENTITY findbar.statusWrappedStart "Arrit lartë, duke vazhduar nga fundi"> <!ENTITY subscription.lastDownload.success "Sukses"> +<!ENTITY findbar.placeholder "Kërko filtër"> <!ENTITY subscription.lastDownload.invalidData "Deshtoi,nje liste jo e vlefshme filtrash"> +<!ENTITY findbar.close "Mbylle hapsirën kërkuese"> <!ENTITY filter.paste.label "Hedh"> <!ENTITY subscription.disabledFilters.enable "Aktivizoni filtrat e aktivizuar"> <!ENTITY lasthit.column "Shtypja e fundit"> +<!ENTITY findbar.statusWrappedEnd "Arrit në fund, duke vazhduar nga lartë"> <!ENTITY subscription.editTitle.label "Përpunoni titullin"> +<!ENTITY findbar.statusNotFound "Shprehja nuk u gjet"> <!ENTITY subscription.disabledFilters.warning "Për këtë pajtim, disa nga filtrat janë çaktivizuar."> <!ENTITY filter.column "Rregulla e filtrimit"> <!ENTITY subscription.lastDownload.label "Shkarkimi i fundit:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sq/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sq/firstRun.properties index f7697f5..d2ab5a4 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sq/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sq/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Në dispozicion për Android dhe iOS +firstRun_abbButtonTitle=Merre Adblock Browser këtu +firstRun_abbPromotionHeadline=Ke një telefon inteligjent apo tablet? firstRun_acceptableAdsExplanation=Ne do të donim tju inkurajonim të përdorit faqet e internetit të drejtpërdrejtë,pa reklama. Kjo është arsyeja pse ne kemi krijuar <a> udhëzime strikte </a> për të identifikuar reklama pranueshme, të cilat janë paraqitur në default settings. Nëse ju ende i doni të bllokoni çdo reklame ju mund <a> çaktivizoni </a> në pak sekonda. firstRun_acceptableAdsHeadline=Te gjitha Reklamat do te bllokohen firstRun_contributor_credits=Kredite kontribues diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sq/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sq/global.properties index 9bb1539..d86ae82 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sq/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sq/global.properties @@ -5,6 +5,7 @@ type_label_script=skripta filter_elemhide_nocriteria=Nuk ka kritere të përcaktuara për të njohur element të jetë fshehur blockingGroup_title=Rregullat Ad Blocking whitelisted_tooltip=Adblock Plus është aktiv por i pasivizuar në këtë faqe. +type_label_ping=fishkëllimë e plumbit type_label_stylesheet=stilet blocked_count_tooltip=?1?jasht nga ?2? type_label_font=shkronjat @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus është caktivizuar për faqen e tanishme remove_group_warning=doni me verte ta hiqni kete grup? action1_tooltip=Kliko për të hapur / artikuj blockable, mesme-klikoni për të mundësuar / disable. type_label_xmlhttprequest=kerkimi për XML +filter_invalid_regexp=Shprehja e pavlefshme e rregullt active_tooltip=Adblock Plus është aktivizuar, ?1? abonim filter (s) dhe ?2? filter custom (s) në përdorim. type_label_document=dokumenti type_label_object_subrequest=objekti subrequest @@ -25,11 +27,15 @@ type_label_object=objekti action2_tooltip=Kliko për të hapur preferencat, mesme-klikoni për të mundësuar / disable. type_label_subdocument=ndarja clearStats_warning=Kjo do të rivendos të gjitha filtrat dhe te caktivizoje filtrat hits. A doni për të vazhduar? +filter_unknown_option=Opsioni i filtërit te panjohur +type_label_genericblock=bllok gjenerik notification_antiadblock_message=Kjo faqe ka qenë i njohur për të treguar mesazhe në shënjestër për përdoruesit Adblock Plus. A doni Adblock Plus për të fshehur mesazhet në shënjestër? blocked_count_addendum=(whitelisted gjithashtu: ?1?, fshehur: ?2?) subscription_invalid_location=Filtrat ne liste nuk kane asnjë URL të vlefshme dhe as një emër i vlefshëm file. +type_label_websocket=Gropë e Web-it\n type_label_image=figura remove_subscription_warning=Doni me verte ra hiqni kete subscripion? +type_label_generichide=fshi gjenerik type_label_other=tjera mobile_menu_enable=ABP: Mbroj type_label_media=zë/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Aktivizo ?1? type_label_elemhide=fshehur newGroup_title=Grup filtrash i ri default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sq/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sq/overlay.dtd index 996cff4..f207a5f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sq/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sq/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Jo"> <!ENTITY sync.label "Sync Adblock Plus settings"> <!ENTITY whitelist.site.label "Çaktivizo në ?1?"> +<!ENTITY notification.closing.button.hide "Mbyll k&ëtë njoftim"> <!ENTITY filters.label "&filtër preferencat"> <!ENTITY disable.label "Caktivizo Kudo"> <!ENTITY objecttab.title "Blloko"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&po"> <!ENTITY opensidebar.label "Hap elementet &bllokuese"> <!ENTITY notification.button.close "&Mbyll"> +<!ENTITY shownotifications.label "Trego njoftime të dobishme"> <!ENTITY contribute.label "Kontribut te Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Pjesët e bllokuara"> <!ENTITY blocked.tooltip "Jane bllokuar te dhena ne kete faqe:"> +<!ENTITY notification.closing.button.optout "&Ndalo shfaqjen e njoftimeve"> <!ENTITY counthits.label "Llogarit filtrat&hits"> <!ENTITY showinstatusbar.label "&Trego ne status bar"> <!ENTITY sidebar.title "Artikuj Blockable në faqen aktuale"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Trego ne tool&bar"> <!ENTITY status.tooltip "Gjendja:"> <!ENTITY context.media.label "Adblock Plus:Blloko audi/video"> -<!ENTITY subscription.update.label "Përditësoni filtra"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sr/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sr/filters.dtd index 0aae653..26457d3 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sr/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/filters.dtd @@ -1,7 +1,7 @@ <!ENTITY restore.custom.warning "Сви ваши прилагођени филтери ће бити замењени Ñа онима из изабрање датотеке. Желите ли да наÑтавите?"> <!ENTITY slow.column "Спор&и филтери"> <!ENTITY enabled.column "Омогуће&н"> -<!ENTITY subscription.lastDownload.checksumMismatch "ÐеуÑпело, неÑлагање извештаја"> +<!ENTITY subscription.lastDownload.checksumMismatch "Грешка: неÑлагање контролног збира"> <!ENTITY noFiltersInGroup.text "Изабрана група је празна."> <!ENTITY subscription.actions.label "Радње"> <!ENTITY filter.selectAll.label "Изабери Ñве"> @@ -34,7 +34,7 @@ <!ENTITY dialog.title "Подешавања Adblock Plus филтера"> <!ENTITY addFilter.label "&Додај филтер"> <!ENTITY subscription.minVersion.warning "Ова претплата на филтер захтева новију верзију додатка Adblock Plus. Молимо Ð²Ð°Ñ Ð´Ð° унапредите додатак."> -<!ENTITY subscription.lastDownload.invalidURL "ÐеуÑпело, неиÑправна адреÑа"> +<!ENTITY subscription.lastDownload.invalidURL "Грешка: неиÑправна адреÑа"> <!ENTITY backup.error "Дошло је до грешке приликом чувања филтера у датотеку. Проверите да датотека није Ñамо за читање или је не корити нека друга апликација."> <!ENTITY filter.moveUp.label "Помери нагоре"> <!ENTITY addGroup.label "Додај &групу филтера"> @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Дозволи &ненаметљиве рекламе"> <!ENTITY addSubscriptionOther.label "Додај другу претплату"> <!ENTITY close.label "Затвори"> +<!ENTITY findbar.caseSensitive "Подударање великих и малих Ñлова"> <!ENTITY sort.none.label "Ð&епоређано"> <!ENTITY filter.actions.label "Радње филтера"> <!ENTITY filter.copy.label "Копирај"> @@ -59,13 +60,18 @@ <!ENTITY backup.label "Ðаправи нову резервну копију"> <!ENTITY find.label "Прона&ђи"> <!ENTITY subscription.moveDown.label "Помери надоле"> -<!ENTITY subscription.lastDownload.connectionError "ÐеуÑпело, грешка у преузимању"> +<!ENTITY subscription.lastDownload.connectionError "Грешка при преузимању"> +<!ENTITY findbar.statusWrappedStart "ДоÑтигнут врх, наÑтавак Ñа дна"> <!ENTITY subscription.lastDownload.success "УÑпешно"> -<!ENTITY subscription.lastDownload.invalidData "ÐеуÑпело, није лиÑта филтера"> +<!ENTITY findbar.placeholder "Филтер претраге"> +<!ENTITY subscription.lastDownload.invalidData "Грешка: неиÑправан формат ÑпиÑка филтера"> +<!ENTITY findbar.close "Затвори траку претраге"> <!ENTITY filter.paste.label "Ðалепи"> <!ENTITY subscription.disabledFilters.enable "Омогући онемогућене филтере"> <!ENTITY lasthit.column "ПоÑ&ледњи погодак"> +<!ENTITY findbar.statusWrappedEnd "ДоÑтигнуто дно, наÑтавак Ñа врха"> <!ENTITY subscription.editTitle.label "Уреди наÑлов"> +<!ENTITY findbar.statusNotFound "Израз није пронађен"> <!ENTITY subscription.disabledFilters.warning "Ðеки филтери Ñа ÑпиÑка Ñу онемогућени."> <!ENTITY filter.column "Правило &филтера"> <!ENTITY subscription.lastDownload.label "ПоÑледње преузимање:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sr/firstRun.properties index 76aaf8a..124c995 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sr/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=ДоÑтупан за Android и iOS +firstRun_abbButtonTitle=Преузмите Adblock Browser овде +firstRun_abbPromotionHeadline=Имате паметни телефон или теблет? firstRun_acceptableAdsExplanation=Желели биÑмо да охрабримо Ñајтове да кориÑте фер и ненападно оглашавање, и зато Ñмо покренули <a>Ñтриктан правилник</a> у циљу препознавања прихватљивих оглаÑа који је могуће видети под подразумеваним поÑтавкама. Ðко и даље желите да блокирате Ñве оглаÑе, можете <a>онемогућити</a> ову опцију. firstRun_acceptableAdsHeadline=ДоÑадне рекламе ће Ñада бити блокиране firstRun_contributor_credits=Кредитовани Ñарадници diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sr/global.properties index b7fe0ce..a988a54 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sr/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/global.properties @@ -5,6 +5,7 @@ type_label_script=Ñкрипт filter_elemhide_nocriteria=Ðије пронађен критеријум за препознавање елемента који ће бити Ñакривен. blockingGroup_title=Правила за блокирање реклама whitelisted_tooltip=Adblock Plus је онемогућен на тренутној Ñтрани. +type_label_ping=pingovanje type_label_stylesheet=Ñтил blocked_count_tooltip=?1? од ?2? type_label_font=фонт @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus је иÑкључен за ову Ñтрану remove_group_warning=Желите ли да уклоните ову групу? action1_tooltip=Кликните да биÑте отворили Ñтавке које Ñе могу блокирати, а Ñредњи клик за укључивање/иÑкључивање. type_label_xmlhttprequest=XML захтев +filter_invalid_regexp=Ðеважећи регуларни израз active_tooltip=Adblock Plus је омогућен, ?1? претплата на филтере, ?2? прилагођених филтера у употреби. type_label_document=документ type_label_object_subrequest=подзахтев за објектом @@ -25,11 +27,15 @@ type_label_object=објекат action2_tooltip=Кликните да биÑте отворили подешавања, а Ñредњи клик за омогућавање/онемогућавање. type_label_subdocument=оквир clearStats_warning=Ово ће поништити ÑтатиÑтике Ñвих филтера и онемогућити даље бројање. Желите ли да наÑтавите? +filter_unknown_option=Ðепозната опција филтера +type_label_genericblock=опште блокирање notification_antiadblock_message=Познато је да овај Ñајт приказује циљане поруке кориÑницима Adblock Plus-а. Желите ли да Ñакријете те поруке? blocked_count_addendum=(такође допуштено: ?1?, Ñакривено: ?2?) subscription_invalid_location=ÐеиÑправна адреÑа и име датотеке Ñа ÑпиÑком филтера. +type_label_websocket=websocket type_label_image=Ñлика remove_subscription_warning=Желите ли да уклоните ову претплату? +type_label_generichide=опште Ñкривање type_label_other=друго mobile_menu_enable=ABP: омогући type_label_media=аудио/видео @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: омогући на ?1? type_label_elemhide=Ñакривен newGroup_title=Ðова група филтера default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sr/overlay.dtd index 1505dfc..5facfb1 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sr/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Ðе"> <!ENTITY sync.label "ПоÑтавке &уÑклађивања Adblock Plus-а"> <!ENTITY whitelist.site.label "Онемогући на ?1?"> +<!ENTITY notification.closing.button.hide "Затвори ово обавештење"> <!ENTITY filters.label "Подешавања &филтера"> <!ENTITY disable.label "Онемогући Ñвуда"> <!ENTITY objecttab.title "Блокирај"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Да"> <!ENTITY opensidebar.label "О&твори Ñтавке које Ñе могу блокирати"> <!ENTITY notification.button.close "&Затвори"> +<!ENTITY shownotifications.label "Приказуј кориÑна обавештења"> <!ENTITY contribute.label "ДопринеÑите Adblock Plus-у"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Блокирај оквир"> <!ENTITY blocked.tooltip "Блокиране Ñтавке на овој Ñтрани:"> +<!ENTITY notification.closing.button.optout "Ðе приказуј обавештења"> <!ENTITY counthits.label "Бр&ој поготке филтера"> <!ENTITY showinstatusbar.label "Прикажи у &ÑтатуÑној траци"> <!ENTITY sidebar.title "Ставке које Ñе могу блокирати на овој Ñтраници"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Прикажи у &траци Ñа алаткама"> <!ENTITY status.tooltip "Стање:"> <!ENTITY context.media.label "Блокирај аудио/видео"> -<!ENTITY subscription.update.label "Ðжурирај филтере"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sr/sendReport.dtd index d1ca2a3..ac4f7b9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sr/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/sendReport.dtd @@ -1,65 +1,65 @@ <!ENTITY screenshot.undo.label "&Опозови"> -<!ENTITY issues.disabledgroups.description "Следећа претплата на филтер претплату, или групу филтера је иÑкључена, и можда има утицаја на Ñтраницу:"> +<!ENTITY issues.disabledgroups.description "Следеће пријаве / групе филтера, иако онемогућене, можда имају утицаја на ову Ñтраницу:"> <!ENTITY showData.label "Прикажи податке у извештају"> -<!ENTITY typeSelector.falsePositive.label "Adblock Plus блокира превише (&м)"> -<!ENTITY issues.change.description "Ваша подешавања Ñу измењена. Поново учитајте Ñтраницу да биÑте видели промене, па пошаљите извештај ако проблем и даље није решен."> -<!ENTITY email.label "Е-мејл: (&а)"> -<!ENTITY issues.openPreferences.label "Отвори подешавања филтера"> -<!ENTITY sendPage.confirmation "Ваш извештај је Ñачуван. Можете да му приÑтупите на Ñледећој адреÑи:"> +<!ENTITY typeSelector.falsePositive.label "&Adblock Plus блокира превише"> +<!ENTITY issues.change.description "ПоÑтавке Ñу промењене. ОÑвежите Ñтраницу да биÑте проверили унете измене. Ðко проблем није решен, пошаљите нам извештај."> +<!ENTITY email.label "&Е-адреÑа:"> +<!ENTITY issues.openPreferences.label "Отвори поÑтавке филтера"> +<!ENTITY sendPage.confirmation "Ваш извештај је Ñачуван. Можете му приÑтупити на Ñледећој адреÑи:"> <!ENTITY copyLink.label "Копирај &везу до извештаја"> -<!ENTITY issues.nofilters.description "Adblock Plus не блокира ништа на тренутној Ñтраници. Овај проблем највероватније није повезан Ñа Ñа Adblock Plus-ом."> +<!ENTITY issues.nofilters.description "Adblock Plus не блокира ништа на тренутној Ñтраници. Овај проблем највероватније нема везе Ñа Adblock Plus-ом."> <!ENTITY sendPage.knownIssue "Проблем који Ñте пријавили је вероватно већ познат. Више информација:"> <!ENTITY typeSelector.other.description "Изаберите ову опцију ако миÑлите да Ñâм Adblock Plus узрокује проблем, а не филтери."> -<!ENTITY issues.disabledgroups.enable.label "Омогући претплату на филтер/групу филтера"> +<!ENTITY issues.disabledgroups.enable.label "Омогући пријаву / групу филтера"> <!ENTITY typeWarning.override.label "&Разумем и ипак желим да пошаљем извештај"> <!ENTITY issues.disabled.enable.label "Омогући Adblock Plus"> <!ENTITY update.fixed.description "Претплате на ваш филтер Ñу вероватно већ отклониле проблем који Ñте пријавили. Поново учитајте Ñтраницу, па покушајте поново. Ðко проблем и даље поÑтоји, поново га пријавите."> -<!ENTITY anonymous.label "&Ðнонимна пријава"> -<!ENTITY reloadButton.label "&Поново учитај Ñтраницу"> -<!ENTITY recentReports.clear.label "Уклони Ñве п&ријаве"> +<!ENTITY anonymous.label "&Пошаљи анонимно"> +<!ENTITY reloadButton.label "&ОÑвежи Ñтраницу"> +<!ENTITY recentReports.clear.label "&Уклони Ñве извештаје"> <!ENTITY typeSelector.description "Овај прозор ће Ð’Ð°Ñ Ð²Ð¾Ð´Ð¸Ñ‚Ð¸ кроз кораке за решавање проблема у Adblock Plus-у и њихово пријављивање. За почетак, изаберите врÑту проблема на који Ñте наишли на овој Ñтраници:"> -<!ENTITY screenshot.remove.label "&Уклони приватне податке"> +<!ENTITY screenshot.remove.label "&Уклони поверљиве податке"> <!ENTITY issues.ownfilters.description "Ðеке филтере примењене на овој Ñтраници Ñу Ñтворили кориÑници. Онемогућите оне за које миÑлите да би могли бити узрок проблема."> -<!ENTITY update.inProgress.description "Adblock Plus мора ажурирати ваше претплате на филтере ради како би проверио да ли је проблем већ отклоњен. Сачекајте..."> -<!ENTITY sendPage.retry.label "Поново пошаљи"> +<!ENTITY update.inProgress.description "Adblock Plus треба да ажурира ваше пријаве како би проверио да ли је проблем већ отклоњен. Сачекајте…"> +<!ENTITY sendPage.retry.label "Пошаљи поново"> <!ENTITY data.label "П&одаци у извештају:"> <!ENTITY recentReports.label "Ваши недавно поÑлати извештаји"> <!ENTITY typeWarning.description "Ðавели Ñте да желите пријавити општи проблем Ñа Adblock Plus-ом, а не Ñа филтером. Имајте на уму да је такве проблеме најбоље пријавити на [link]форуму Adblock Plus-а[/link]. Овај ÑиÑтем за пријављивање биÑте требали да кориÑтите Ñамо као допуну раÑправи, јер нико неће видети Ваш извештај док му не даднете везу до њега. ÐутоматÑки направљену везу ћете добити одмах након Ñлања извештаја."> <!ENTITY issues.disabled.description "Adblock Plus је онемогућен и ништа неће блокирати."> <!ENTITY attachExtensions.label "Додај лиÑту активних екÑтензија у извештај у Ñлучају када је конфликт додатака узрок проблема"> -<!ENTITY issues.nosubscriptions.add.label "Додај претплату на филтер"> -<!ENTITY issues.disabledfilters.enable.label "Омогућите филтер"> -<!ENTITY issues.override.label "Подешавања Ñу &иÑправна. ÐаÑтави Ñа пријављивањем."> +<!ENTITY issues.nosubscriptions.add.label "Додај пријаву"> +<!ENTITY issues.disabledfilters.enable.label "Омогући филтер"> +<!ENTITY issues.override.label "&ПоÑтавке Ñу иÑправне; наÑтави Ñа Ñлањем извештаја"> <!ENTITY issues.nosubscriptions.description "Изгледа да ниÑте претплаћени ни на један ÑпиÑак филтера који аутоматÑки уклањају нежељени Ñадржај Ñа Ñтраница."> <!ENTITY typeSelector.falsePositive.description "Изаберите ову опцију ако Ñтраници недоÑтају неки битни Ñадржаји, погрешно изгледа или не ради како треба. Пробајте да привремено онемогућите Adblock Plus, па проверите да ли је онда Ñве у реду."> -<!ENTITY typeSelector.other.label "Други проблем (&Ñ‚)"> -<!ENTITY emailComment.label "Молимо Ð²Ð°Ñ Ð´Ð° унеÑете важећу и-мејл адреÑу да биÑмо могли да Ð²Ð°Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð¼Ð¾ уколико има питања у вези Ñа вашом пријавом. Такође, то ће нам допуÑтити да препознамо ваше доприноÑе и да им дамо већу важноÑÑ‚."> +<!ENTITY typeSelector.other.label "&Други проблем"> +<!ENTITY emailComment.label "Молимо Ð²Ð°Ñ Ð´Ð° унеÑете иÑправну е-адреÑу да биÑмо могли да Ð²Ð°Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð¼Ð¾ ако имамо питања у вези Ñа вашим извештајем. Тиме ће и ваши извештаји имати већи приоритет."> <!ENTITY issues.whitelist.remove.label "Омогући Adblock Plus на овој Ñтраници"> -<!ENTITY outdatedSubscriptions.description "Следеће претплате на филтере ноÑу ажуриране више од две Ñедмице. Ðжурирајте их пре него што пријавите проблем, јер би га то могло отклонити."> +<!ENTITY outdatedSubscriptions.description "Следеће пријаве ниÑу ажуриране бар две недеље. Ðжурирајте их пре него што пошаљете извештај јер би то могло да реши проблем."> <!ENTITY dataCollector.description "Сачекајте неколико тренутака док Adblock Plus прибави потребне податке."> -<!ENTITY sendButton.label "&Пошаљите извештај"> -<!ENTITY comment.label "&Коментар (произвољно):"> +<!ENTITY sendButton.label "&Пошаљи извештај"> +<!ENTITY comment.label "&Коментар (необавезно):"> <!ENTITY sendPage.errorMessage "Покушај Ñлања извештаја није уÑпео - грешка „?1?â€. Уверите Ñе да Ñте повезани Ñа Интернетом, па покушајте поново. Ðко проблем и даље поÑтоји, помоћ потражите на [link]форуму Adblock Plus-а[/link]."> -<!ENTITY showRecentReports.label "Прикажи недавно поÑлате пријаве"> -<!ENTITY commentPage.heading "УнеÑи коментар"> +<!ENTITY showRecentReports.label "Прикажи недавно поÑлате извештаје"> +<!ENTITY commentPage.heading "УнеÑите коментар"> <!ENTITY update.start.label "Ðжурирај"> -<!ENTITY issues.disabledfilters.description "Следећи филтери, иако онемогућени, можда имају утицаја на Ñтраницу:"> +<!ENTITY issues.disabledfilters.description "Следећи филтери, иако онемогућени, можда имају утицаја на ову Ñтраницу:"> <!ENTITY screenshot.description "ИÑта Ñтраница може да изгледа различито код различитих оÑоба, и помогло би нам ако приложите Ñнимак проблема који пријављујете. Можете да уклоните или замаÑкирате приватне информације, а да биÑте то учинили кликните одговарајуће дугме, и мишем изаберите жељени део Ñлике."> -<!ENTITY screenshot.attach.label "Приложите Ñнимак Ñ&транице уз извештај"> +<!ENTITY screenshot.attach.label "Приложи &Ñнимак Ñтранице уз извештај"> <!ENTITY issues.whitelist.description "Adblock Plus је тренутно онемогућен на Ñтраници коју пријављујете. Омогућите га и поново учитајте Ñтраницу пре него што пошаљете молбу за иÑпитивање проблема."> -<!ENTITY typeSelector.falseNegative.label "Adblock Plus не блокира рекламу/е (&в)"> -<!ENTITY typeSelector.heading "Изаберите врÑту проблема"> -<!ENTITY anonymity.warning "Ðећемо бити у могућноÑти да поново допремо до Ð²Ð°Ñ Ð¸ то ће вероватно Ñнизити приоритет пријаве."> -<!ENTITY wizard.title "Пријављивање грешака"> +<!ENTITY typeSelector.falseNegative.label "&Adblock Plus не блокира оглаÑе"> +<!ENTITY typeSelector.heading "Изаберите тип проблема"> +<!ENTITY anonymity.warning "Ðећемо моћи да Ð²Ð°Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð¼Ð¾. Приоритет вашег извештаја ће вероватно бити низак."> +<!ENTITY wizard.title "Пријава грешака"> <!ENTITY issues.ownfilters.disable.label "Онемогући филтер"> <!ENTITY commentPage.description "Доње поље за текÑÑ‚ омогућава вам да додате коментар, како биÑте нам помогли да лакше Ñхватимо проблем. Овај корак је произвољан али је пожељан, ако проблем није лако уочљив. Можете и да још једном прегледате извештај пре него што га пошаљете."> <!ENTITY comment.lengthWarning "Дужина вашег коментара прелази 1000 знакова. Само првих 1000 знакова ће бити поÑлато."> -<!ENTITY typeSelector.falseNegative.description "Изаберите ову опцију ако је реклама приказана иако је Adblock Plus омогућен."> -<!ENTITY sendPage.waitMessage "Сачекајте док Adblock Plus не пошаље Ваш извештај."> -<!ENTITY dataCollector.heading "Добро дошли у део за пријаву грешака"> -<!ENTITY screenshot.heading "Приложи Ñнимак"> +<!ENTITY typeSelector.falseNegative.description "Изаберите ову опцију ако је Ð¾Ð³Ð»Ð°Ñ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð½ иако је Adblock Plus омогућен."> +<!ENTITY sendPage.waitMessage "Сачекајте док Adblock Plus не пошаље ваш извештај."> +<!ENTITY dataCollector.heading "Добро дошли у одељак за пријаву грешака"> +<!ENTITY screenshot.heading "Снимак екрана"> <!ENTITY sendPage.heading "Пошаљи извештај"> <!ENTITY issues.subscriptionCount.description "Изгледа да Ñте Ñе претплатили на превише филтера. То није препоручљиво, јер повећава вероватноћу да наÑтану проблеми. Поред тога, не можемо да прихватимо ваш извештај о грешкама јер је нејаÑно која претплата на филтер Ñадржи грешку. Молимо Ð²Ð°Ñ Ð´Ð° уклоните Ñве непотребне претплате на филтере и проверите да ли још увек има проблема."> <!ENTITY screenshot.mark.label "О&значи проблем"> <!ENTITY privacyPolicy.label "Политика приватноÑти"> -<!ENTITY issues.description "Adblock Plus је уочио проблем Ñа Вашим подешавањима, што може бити узрок овог проблема или отежати његово иÑпитивање."> +<!ENTITY issues.description "Adblock Plus је открио проблем Ñа поÑтавкама који може бити узрок овог проблема или може отежати његово иÑпитивање."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sr/sidebar.dtd index 98f3a7e..409eac9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sr/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/sidebar.dtd @@ -1,35 +1,35 @@ -<!ENTITY context.flash.label "ОÑветли границе Ñтавке"> +<!ENTITY context.flash.label "ОÑветли ивице елемента"> <!ENTITY address.label "ÐдреÑа"> -<!ENTITY context.open.label "Отвори на новом лиÑту"> -<!ENTITY type.label "Ð’Ñ€Ñта"> +<!ENTITY context.open.label "Отвори у новој картици"> +<!ENTITY type.label "Тип"> <!ENTITY tooltip.filterSource.label "Извор филтера:"> -<!ENTITY noitems.label "Ðема Ñтавки за блокирање"> +<!ENTITY noitems.label "Ðема елемената за блокирање"> <!ENTITY filter.label "Филтер"> <!ENTITY tooltip.size.label "Величина:"> -<!ENTITY reattach.label "Поново Ñпоји"> -<!ENTITY search.label "&Тражи:"> -<!ENTITY docDomain.thirdParty "(трећа Ñтрана)"> +<!ENTITY reattach.label "Поново Ñпој"> +<!ENTITY search.label "&Претрага:"> +<!ENTITY docDomain.thirdParty "(захтев Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³ Ñајта)"> <!ENTITY filterSource.label "Извор филтера"> <!ENTITY tooltip.docDomain.label "Извор документа:"> -<!ENTITY context.copy.label "Умножи адреÑу Ñтавке"> -<!ENTITY tooltip.type.label "Ð’Ñ€Ñта:"> +<!ENTITY context.copy.label "Копирај адреÑу елемента"> +<!ENTITY tooltip.type.label "Тип:"> <!ENTITY context.disablefilter.label "Онемогући филтер ?1?"> -<!ENTITY context.copyFilter.label "Умножи филтер"> -<!ENTITY context.block.label "Блокирај ову Ñтавку"> +<!ENTITY context.copyFilter.label "Копирај филтер"> +<!ENTITY context.block.label "Блокирај елемент"> <!ENTITY context.enablefilter.label "Омогући филтер ?1?"> -<!ENTITY detach.label "Одвоји"> -<!ENTITY whitelisted.label "Бела лиÑта"> -<!ENTITY context.disablefilteronsite.label "Онемогући овај филтер на ?1?"> -<!ENTITY detached.title "Adblock Plus: Ñтавке које Ñе могу блокирати (одвојено)"> -<!ENTITY docDomain.firstParty "(прва Ñтрана)"> -<!ENTITY tooltip.type.whitelisted "(на белој лиÑти)"> -<!ENTITY tooltip.filter.label "Коришћени филтер:"> +<!ENTITY detach.label "Раздвој"> +<!ENTITY whitelisted.label "Изузета Ñтраница"> +<!ENTITY context.disablefilteronsite.label "Онемогући филтер на ?1?"> +<!ENTITY detached.title "Adblock Plus: елементи који Ñе могу блокирати (раздвојени)"> +<!ENTITY docDomain.firstParty "(локални захтев)"> +<!ENTITY tooltip.type.whitelisted "(дозвољено)"> +<!ENTITY tooltip.filter.label "Примењени филтер:"> <!ENTITY tooltip.filter.disabled "(онемогућено)"> -<!ENTITY context.editfilter.label "Уреди коришћени филтер"> +<!ENTITY context.editfilter.label "Уреди примењени филтер"> <!ENTITY tooltip.type.blocked "(блокирано)"> <!ENTITY size.label "Величина"> -<!ENTITY context.whitelist.label "Додај изузетак за Ñтавку"> +<!ENTITY context.whitelist.label "Додај изузетак за елемент"> <!ENTITY context.selectAll.label "Изабери Ñве"> -<!ENTITY state.label "СтатуÑ"> +<!ENTITY state.label "Стање"> <!ENTITY docDomain.label "Извор документа"> <!ENTITY tooltip.address.label "ÐдреÑа:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sr/subscriptionSelection.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sr/subscriptionSelection.dtd index dd6291f..aa26afa 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sr/subscriptionSelection.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sr/subscriptionSelection.dtd @@ -1,12 +1,12 @@ -<!ENTITY addMain.label "Д&одај и претплату на филтер „?1?â€"> -<!ENTITY list.download.failed "Adblock Plus није уÑпео да набави нови ÑпиÑак претплата."> +<!ENTITY addMain.label "&Додај и пријаву „?1?“"> +<!ENTITY list.download.failed "Ðе могу да преузмем ÑпиÑак пријава."> <!ENTITY list.download.retry "Покушај поново"> -<!ENTITY title.label "&Ðазив претплате:"> -<!ENTITY list.download.website "Отвори веб Ñтраницу"> -<!ENTITY supplementMessage "Ова претплата на филтер је предвиђена за коришћење Ñа филтером „?1?†који још увек не кориÑтите."> +<!ENTITY title.label "&Ðазив пријаве:"> +<!ENTITY list.download.website "Отвори Ñајт"> +<!ENTITY supplementMessage "Ову пријаву је потребно да кориÑтите у комбинацији Ñа пријавом „?1?“."> <!ENTITY viewList.label "Погледај филтере"> -<!ENTITY visitHomepage.label "ПоÑети матичну Ñтраницу"> -<!ENTITY addSubscription.label "Додај претплату"> -<!ENTITY dialog.title "Претплата на филтере Adblock Plus-а"> +<!ENTITY visitHomepage.label "ПоÑети почетну Ñтраницу"> +<!ENTITY addSubscription.label "Додај пријаву"> +<!ENTITY dialog.title "Додавање пријаве за Adblock Plus"> <!ENTITY location.label "&Локација ÑпиÑка Ñа филтерима:"> -<!ENTITY fromWeb.description "Потврдите да желите додати претплату на овај филтер (можете променити назив или локацију претплате пре додавања)."> +<!ENTITY fromWeb.description "Потврдите да желите да Ñе пријавите на овај ÑпиÑак филтера. Имајте на уму да можете променити назив или локацију пријаве."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/composer.dtd index 3df34ed..12590e9 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/composer.dtd @@ -1,6 +1,6 @@ <!ENTITY anchor.end.label "I slutet av adressen"> <!ENTITY domainRestriction.label "Begränsa till domän:"> -<!ENTITY collapse.default.no.label "Standard (nej)"> +<!ENTITY collapse.default.no.label "Använd standard (nej)"> <!ENTITY firstParty.label "Endast &första part"> <!ENTITY preferences.label "Visa existerande filter…"> <!ENTITY pattern.label "Sök efter mönster"> @@ -12,7 +12,7 @@ <!ENTITY matchCase.label "S&kiftlägeskänslig"> <!ENTITY custom.pattern.label "&Eget:"> <!ENTITY unselectAllTypes.label "Markera ingen"> -<!ENTITY type.whitelist.label "Regel för &undantag"> +<!ENTITY type.whitelist.label "Regel för undantag"> <!ENTITY regexp.warning "Det mönster som du har angett kommer att tolkas som ett reguljärt uttryck vilket inte kan bearbetas effektivt av Adblock Plus och det kan göra din webbupplevelse lÃ¥ngsam. Om du inte tänkte använda ett reguljärt uttryck, lägg till en asterisk (*) i slutet av mönstret."> <!ENTITY dialog.title "Lägg till filterregel för Adblock Plus"> <!ENTITY basic.label "Standard"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/filters.dtd index 822ef32..677ce58 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "TillÃ¥t viss icke-störande reklam"> <!ENTITY addSubscriptionOther.label "Lägg till en ny prenumeration"> <!ENTITY close.label "Stäng"> +<!ENTITY findbar.caseSensitive "Matcha gemener/versaler"> <!ENTITY sort.none.label "&Osorterad"> <!ENTITY filter.actions.label "FilterÃ¥tgärder"> <!ENTITY filter.copy.label "Kopiera"> @@ -60,12 +61,17 @@ <!ENTITY find.label "Sö&k"> <!ENTITY subscription.moveDown.label "Flytta nedÃ¥t"> <!ENTITY subscription.lastDownload.connectionError "Fel vid hämtning"> +<!ENTITY findbar.statusWrappedStart "NÃ¥dde toppen, fortsätter frÃ¥n botten"> <!ENTITY subscription.lastDownload.success "Klart"> +<!ENTITY findbar.placeholder "Hitta filter"> <!ENTITY subscription.lastDownload.invalidData "Fel vid validering av filter"> +<!ENTITY findbar.close "Stäng sökfält"> <!ENTITY filter.paste.label "Klistra in"> <!ENTITY subscription.disabledFilters.enable "Aktivera inaktiverade filter"> <!ENTITY lasthit.column "Senaste t&räff"> +<!ENTITY findbar.statusWrappedEnd "NÃ¥dde botten, fortsätter frÃ¥n toppen"> <!ENTITY subscription.editTitle.label "Redigera rubrik"> +<!ENTITY findbar.statusNotFound "Fras hittades ej"> <!ENTITY subscription.disabledFilters.warning "Vissa filter i denna prenumeration är inaktiverade."> <!ENTITY filter.column "Filterregler"> <!ENTITY subscription.lastDownload.label "Senast hämtat:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/firstRun.properties index 2491bbd..86e2ddf 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Finns för Android och iOS +firstRun_abbButtonTitle=Skaffa Adblock Browser här +firstRun_abbPromotionHeadline=Har du en smartphone eller en surfplatta? firstRun_acceptableAdsExplanation=Vi vill uppmuntra webbplatser att använda enkel, diskret reklam. Det är därför vi har fastställt <a>strikta riktlinjer</a> för att identifiera acceptabla annonser, som visas under standardinställningar. Om du fortfarande vill blockera alla annonser kan du <a>inaktivera</a> detta inom ett par sekunder. firstRun_acceptableAdsHeadline=Irriterande annonser blockeras nu firstRun_contributor_credits=Tack till diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/global.properties index 45570b7..57324ce 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/global.properties @@ -5,6 +5,7 @@ type_label_script=skript filter_elemhide_nocriteria=Inga villkor för att gömma element har uppfyllts blockingGroup_title=Reklamblockeringsregler whitelisted_tooltip=Adblock Plus är pÃ¥, men inaktiverat för denna sida. +type_label_ping=pinga type_label_stylesheet=formatmall blocked_count_tooltip=?1? av ?2? type_label_font=teckensnitt @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus är inaktiverat för denna sida remove_group_warning=Vill du verkligen radera denna grupp? action1_tooltip=Klicka för att öppna/stänga listan med blockerbara objekt, mittenklicka för att slÃ¥ pÃ¥/av. type_label_xmlhttprequest=XML-förfrÃ¥gan +filter_invalid_regexp=Ogiltigt reguljärt uttryck active_tooltip=Adblock Plus är aktiverat, ?1? filterprenumeration(er) och ?2? egna filter används. type_label_document=dokument type_label_object_subrequest=objektunderförfrÃ¥gan @@ -25,11 +27,15 @@ type_label_object=objekt action2_tooltip=Klicka för att öppna inställningarna, mittenklicka för att slÃ¥ pÃ¥/av . type_label_subdocument=ram clearStats_warning=Detta kommer att Ã¥terställa all filterträffstatistik och inaktivera räkning av filterträffar. Vill du fortsätta? +filter_unknown_option=Okänt filteralternativ +type_label_genericblock=generella blockeringar notification_antiadblock_message=Denna webbplats har varit känt för att visa riktade budskap till Adblock Plus användare. Vill du Adblock Plus att dölja riktade budskap? blocked_count_addendum=(undantagna: ?1?, dolda: ?2?) subscription_invalid_location=Platsen du angivit är antingen ogiltig eller sÃ¥ har du angivit ett felaktigt filnamn. +type_label_websocket=websocket type_label_image=bild remove_subscription_warning=Vill du verkligen ta bort denna prenumeration? +type_label_generichide=dölj generellt type_label_other=annan mobile_menu_enable=ABP: Aktivera type_label_media=ljud/video @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Aktivera för ?1? type_label_elemhide=dold newGroup_title=Ny filtergrupp default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/overlay.dtd index 13c9213..538e036 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/sv-SE/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "Nej"> <!ENTITY sync.label "Syn&kronisera Adblock Plus inställningar"> <!ENTITY whitelist.site.label "Använd inte pÃ¥ ?1?"> +<!ENTITY notification.closing.button.hide "Stäng denna notifiering"> <!ENTITY filters.label "Filterinställningar"> <!ENTITY disable.label "Inaktivera för alla domäner"> <!ENTITY objecttab.title "Blockera"> @@ -10,13 +11,15 @@ <!ENTITY sendReport.label "Rapportera problem pÃ¥ denna sida"> <!ENTITY whitelist.page.label "Använd inte pÃ¥ denna sida"> <!ENTITY context.image.label "Adblock Plus: Blockera bild"> -<!ENTITY notification.button.yes "Jag"> +<!ENTITY notification.button.yes "Ja"> <!ENTITY opensidebar.label "Visa lista över blockerbara objekt"> -<!ENTITY notification.button.close "Sluta"> +<!ENTITY notification.button.close "Stäng"> +<!ENTITY shownotifications.label "Visa användbara notifieringar"> <!ENTITY contribute.label "Bidra till Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Blockera ram"> <!ENTITY blocked.tooltip "Blockerade objekt pÃ¥ denna sida:"> +<!ENTITY notification.closing.button.optout "Sluta visa notifieringar"> <!ENTITY counthits.label "Räkna an&talet filterträffar"> <!ENTITY showinstatusbar.label "Visa i statusfältet"> <!ENTITY sidebar.title "Blockerbara objekt pÃ¥ denna sida"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Visa i verktygs&fältet"> <!ENTITY status.tooltip "Status:"> <!ENTITY context.media.label "Adblock Plus: Blockera ljud/video"> -<!ENTITY subscription.update.label "Uppdatera filter"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/th/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/th/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/th/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/th/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/th/filters.dtd index 9e27ded..be6af2f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/th/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/th/filters.dtd @@ -44,6 +44,7 @@ <!ENTITY acceptableAds2.label "à¸à¸™à¸¸à¸&าตให้มีโฆษณาบางà¸à¸¢à¹ˆà¸²à¸‡à¸—ี่ไม่ต้à¸à¸‡à¸à¸²à¸£à¸£à¸šà¸à¸§à¸™"> <!ENTITY addSubscriptionOther.label "เพิ่มนามข้างท้าย"> <!ENTITY close.label "ปิด"> +<!ENTITY findbar.caseSensitive "จับคู่"> <!ENTITY sort.none.label "&ไม่จัดลำดับ"> <!ENTITY filter.actions.label "ดำเนินà¸à¸²à¸£à¸•ัวà¸à¸£à¸à¸‡"> <!ENTITY filter.copy.label "คัดลà¸à¸"> @@ -61,12 +62,17 @@ <!ENTITY find.label "ค้นห&า"> <!ENTITY subscription.moveDown.label "ย้ายลง"> <!ENTITY subscription.lastDownload.connectionError "ล้มเหลว à¸à¸²à¸£à¸”าวน์โหลดล้มเหลว"> +<!ENTITY findbar.statusWrappedStart "มาถึงด้านบนสุดà¹à¸¥à¹‰à¸§ ที่ต่à¸à¹€à¸™à¸·à¹ˆà¸à¸‡à¸ˆà¸²à¸à¸”้านล่าง"> <!ENTITY subscription.lastDownload.success "สำเร็จ"> +<!ENTITY findbar.placeholder "ค้นหาตัวà¸à¸£à¸à¸‡"> <!ENTITY subscription.lastDownload.invalidData "ล้มเหลว ไม่มีรายชื่à¸à¸•ัวà¸à¸£à¸à¸‡à¸—ี่ถูà¸à¸•้à¸à¸‡"> +<!ENTITY findbar.close "ปิดà¹à¸–บค้นหา"> <!ENTITY filter.paste.label "วาง"> <!ENTITY subscription.disabledFilters.enable "เปิดใช้งาน à¸à¸²à¸£à¸›à¸´à¸”ใช้งานตัวà¸à¸£à¸à¸‡"> <!ENTITY lasthit.column "à¸à¸”&ล่าสุด"> +<!ENTITY findbar.statusWrappedEnd "มาถึงด้านล่างสุดà¹à¸¥à¹‰à¸§ ที่ต่à¸à¹€à¸™à¸·à¹ˆà¸à¸‡à¸ˆà¸²à¸à¸”้านบน"> <!ENTITY subscription.editTitle.label "à¹à¸à¹‰à¹„ขชื่à¸à¹€à¸£à¸·à¹ˆà¸à¸‡"> +<!ENTITY findbar.statusNotFound "ไม่พบหน้านี้"> <!ENTITY subscription.disabledFilters.warning "บางตัวà¸à¸£à¸à¸‡à¹ƒà¸™à¸à¸²à¸£à¸šà¸à¸à¸£à¸±à¸šà¸ªà¸¡à¸²à¸Šà¸´à¸à¸™à¸µà¹‰à¸–ูà¸à¸›à¸´à¸”ใช้งาน"> <!ENTITY filter.column "à¸à¸Ž&ตัวà¸à¸£à¸à¸‡"> <!ENTITY subscription.lastDownload.label "ดาวน์โหลดล่าสุด:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/th/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/th/firstRun.properties index 3549c70..89df174 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/th/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/th/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=ใช้ได้สำหรับ Android à¹à¸¥à¸° iOS +firstRun_abbButtonTitle=รับ Adblock Browser ที่นี่ +firstRun_abbPromotionHeadline=ได้สมาร์ตโฟนหรืà¸à¹à¸—็บเล็ต? firstRun_acceptableAdsHeadline=โฆษณาที่น่ารำคาà¸à¸ˆà¸°à¸–ูà¸à¸›à¸´à¸”à¸à¸±à¹‰à¸™ firstRun_dataCorruptionWarning=ไม่ให้หน้านี้à¹à¸ªà¸”งà¸à¸µà¸à¸„รั้ง <a>คลิà¸à¸—ี่นี้</a> firstRun_donate=บริจาค @@ -13,8 +16,6 @@ firstRun_share=บà¸à¸à¹€à¸žà¸·à¹ˆà¸à¸™à¸‚à¸à¸‡à¸„ุณ firstRun_title=à¸à¸²à¸•ิดตั้ง Adblock Plus เสร็จสมบูรณ์ firstRun_toggle_off=ไม่ทำงาน firstRun_toggle_on=ทำงาน -firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move. -firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior. +firstRun_share_headline=<a>Give us a hand</a> in making the web a better place firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds. firstRun_contributor_credits=Contributor Credits -firstRun_share_headline=<a>Give us a hand</a> in making the web a better place diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/th/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/th/global.properties index c878f50..4d559fe 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/th/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/th/global.properties @@ -1,9 +1,11 @@ no_blocking_suggestions=ไม่มีรายà¸à¸²à¸£à¸—ี่บล็à¸à¸à¹„ด้ในหน้าล่าสุด action3_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸à¹€à¸›à¸´à¸”หรืà¸à¸›à¸´à¸”ใช้งาน Adblock Plus +notification_antiadblock_title=ซ่à¸à¸™à¸‚้à¸à¸„วามปลายทาง type_label_script=สคริปต์ filter_elemhide_nocriteria=ไม่มีเà¸à¸“ฑ์ที่ระบุที่จำวัตถุที่จะซ่à¸à¸™ blockingGroup_title=à¸à¸Žà¸à¸²à¸£à¸šà¸¥à¹‡à¸à¸à¹‚ฆษณา whitelisted_tooltip=Adblock Plus เปิดà¸à¸¢à¸¹à¹ˆà¹à¸•่ไม่ใช้à¸à¸±à¸šà¸«à¸™à¹‰à¸²à¸™à¸µà¹‰ +type_label_ping=ping type_label_stylesheet=รูปà¹à¸šà¸šà¹€à¸à¸à¸ªà¸²à¸£ blocked_count_tooltip=?1? จาภ?2? type_label_font=à¹à¸šà¸šà¸à¸±à¸à¸©à¸£ @@ -14,6 +16,7 @@ whitelisted_page=Adblock Plus ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹ƒà¸ remove_group_warning=คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸•้à¸à¸‡à¸à¸²à¸£à¸ˆà¸°à¸¥à¸šà¸à¸¥à¸¸à¹ˆà¸¡à¸™à¸µà¹‰? action1_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸à¹€à¸›à¸´à¸”หรืà¸à¸›à¸´à¸”สิ่งขà¸à¸‡ คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸à¹€à¸›à¸´à¸”หรืà¸à¸›à¸´à¸”ใช้งาน type_label_xmlhttprequest=คำร้à¸à¸‡à¸‚ภXML +filter_invalid_regexp=นิพจน์ทั่วไปที่ไม่ถูà¸à¸•้à¸à¸‡ active_tooltip=Adblock Plus เปิดใช้งานà¸à¸¢à¸¹à¹ˆ นามข้างท้ายตัวà¸à¸£à¸à¸‡ ?1? à¸à¸¢à¹ˆà¸²à¸‡ à¹à¸¥à¸°à¸•ัวà¸à¸£à¸à¸‡à¸à¸³à¸«à¸™à¸”เà¸à¸‡ ?2? ตัวเปิดใช้งานà¸à¸¢à¸¹à¹ˆ type_label_document=เà¸à¸à¸ªà¸²à¸£ type_label_object_subrequest=subrequest วัตถุ @@ -24,10 +27,15 @@ type_label_object=วัตถุ action2_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸à¹€à¸›à¸´à¸”à¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่ง คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸à¹€à¸›à¸´à¸”หรืà¸à¸›à¸´à¸”ใช้งาน type_label_subdocument=เฟรม clearStats_warning=สิ่งนี้จะตั้งค่าใหม่ทั้งหมดขà¸à¸‡à¸•ัวà¸à¸£à¸à¸‡à¸à¸²à¸£à¹€à¸‚้าชมสถิติà¹à¸¥à¸°à¸›à¸´à¸”ใช้งานà¸à¸²à¸£à¸•รวจนับปริมาณตัวà¸à¸£à¸à¸‡ คุณต้à¸à¸‡à¸”ำเนินà¸à¸²à¸£à¸•่à¸à¸«à¸£à¸·à¸à¹„ม่ +filter_unknown_option=ตัวเลืà¸à¸à¸•ัวà¸à¸£à¸à¸‡à¸—ี่ไม่รู้จัภ+type_label_genericblock=บล็à¸à¸à¸—ั่วไป +notification_antiadblock_message=ไซต์นี้ได้มีà¸à¸²à¸£à¹à¸ªà¸”งข้à¸à¸„วามปลายทางให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰ Adblock Plus คุณต้à¸à¸‡à¸à¸²à¸£à¹ƒà¸«à¹‰ Adblock Plus ซ่à¸à¸™à¸‚้à¸à¸„วามปลายทางหรืà¸à¹„ม่? blocked_count_addendum=(à¹à¸¥à¸°à¸¢à¸±à¸‡à¸¡à¸µà¸šà¸±à¸à¸Šà¸µà¸‚าว ?1? à¸à¸¢à¹ˆà¸²à¸‡ ซ่à¸à¸™à¸à¸¢à¸¹à¹ˆ ?2? à¸à¸¢à¹ˆà¸²à¸‡) subscription_invalid_location=ตำà¹à¸«à¸™à¹ˆà¸‡à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¸•ัวà¸à¸£à¸à¸‡à¹„ม่ใช่ทั้งยูà¸à¸²à¸£à¹Œà¹à¸à¸¥à¸—ี่ถูà¸à¸•้à¸à¸‡à¹à¸¥à¸°à¸Šà¸·à¹ˆà¸à¹„ฟล์ที่ถูà¸à¸•้à¸à¸‡ +type_label_websocket=websocket type_label_image=รูปภาพ remove_subscription_warning=คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸à¸§à¹ˆà¸²à¸•้à¸à¸‡à¸à¸²à¸£à¸¥à¸šà¸™à¸²à¸¡à¸‚้างท้ายนี้ +type_label_generichide=ซ่à¸à¸™à¸—ั่วไป type_label_other=à¸à¸·à¹ˆà¸™à¹† mobile_menu_enable=ABP: เปิดใช้งาน type_label_media=เสียง/ภาพ @@ -37,5 +45,4 @@ mobile_menu_enable_site=ABP: เปิดใช้งาน ?1? type_label_elemhide=ซ่à¸à¸™ newGroup_title=à¸à¸¥à¸¸à¹ˆà¸¡à¸•ัวà¸à¸£à¸à¸‡à¹ƒà¸«à¸¡à¹ˆ default_dialog_title=Adblock Plus -notification_antiadblock_title=Hide targeted messages? -notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages? +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/th/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/th/overlay.dtd index ac506d6..1b3d025 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/th/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/th/overlay.dtd @@ -1,5 +1,7 @@ +<!ENTITY notification.button.no "ไ&ม่ใช่"> <!ENTITY sync.label "เชื่à¸&มข้à¸à¸¡à¸¹à¸¥à¸à¸²à¸£à¸•ั้งค่า Adblock Plus"> <!ENTITY whitelist.site.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ ?1?"> +<!ENTITY notification.closing.button.hide "ปิดà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™à¸™à¸µà¹‰"> <!ENTITY filters.label "ตั้งค่าตัวà¸à¸£&à¸à¸‡"> <!ENTITY disable.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸—ุà¸à¸—ี่"> <!ENTITY objecttab.title "บล็à¸à¸"> @@ -9,11 +11,15 @@ <!ENTITY sendReport.label "&รายงานปัà¸à¸«à¸²à¸—ี่พบในหน้านี้"> <!ENTITY whitelist.page.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹€à¸‰à¸žà¸²à¸°à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰"> <!ENTITY context.image.label "Adblock รูปภาพ"> +<!ENTITY notification.button.yes "ใ&ช่"> <!ENTITY opensidebar.label "เปิดราย&à¸à¸²à¸£à¸—ี่บล็à¸à¸à¹„ด้"> +<!ENTITY notification.button.close "&ปิด"> +<!ENTITY shownotifications.label "à¹à¸ªà¸”งà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™à¸—ี่เป็นประโยชน์"> <!ENTITY contribute.label "เข้ามีส่วนร่วมà¸à¸±à¸š Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock เฟรม"> <!ENTITY blocked.tooltip "สิ่งที่บล็à¸à¸à¹ƒà¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰:"> +<!ENTITY notification.closing.button.optout "หยุดà¹à¸ªà¸”งà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™"> <!ENTITY counthits.label "นับจำนวนตัว&à¸à¸£à¸à¸‡à¸®à¸´à¸•"> <!ENTITY showinstatusbar.label "à¹&สดงในà¹à¸–บสถานะ"> <!ENTITY sidebar.title "รายà¸à¸²à¸£à¸—ี่บล็à¸à¸à¹„ด้ในหน้าล่าสุด"> @@ -25,7 +31,3 @@ <!ENTITY showintoolbar.label "à¹à¸ªà¸”งในà¹à¸–บเ&ครื่à¸à¸‡à¸¡à¸·à¸"> <!ENTITY status.tooltip "สถานะ:"> <!ENTITY context.media.label "Adblock Plus: บล็à¸à¸à¹€à¸ªà¸µà¸¢à¸‡/วีดิทัศน์"> -<!ENTITY notification.button.no "&No"> -<!ENTITY notification.button.yes "&Yes"> -<!ENTITY notification.button.close "&Close"> -<!ENTITY subscription.update.label "ปรับปรุงตัวà¸à¸£à¸à¸‡"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/th/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/th/sendReport.dtd index abddb2a..710766e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/th/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/th/sendReport.dtd @@ -3,6 +3,7 @@ <!ENTITY showData.label "à¹à¸ªà¸”งข้à¸à¸¡à¸¹à¸¥à¸£à¸²à¸¢à¸‡à¸²à¸™"> <!ENTITY typeSelector.falsePositive.label "Adblock Plus &มีà¸à¸²à¸£à¸šà¸¥à¹‡à¸à¸à¸¡à¸²à¸à¹€à¸à¸´à¸™à¹„ป"> <!ENTITY issues.change.description "à¸à¸²à¸£à¸•ั้งค่าเปลี่ยนà¹à¸›à¸¥à¸‡à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าเรียà¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆà¹€à¸žà¸·à¹ˆà¸à¸—ดสà¸à¸šà¸„วามเปลี่ยนà¹à¸›à¸¥à¸‡à¹à¸¥à¸°à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸–้าปัà¸à¸«à¸²à¸¢à¸±à¸‡à¹„ม่ได้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ข"> +<!ENTITY email.label "à¸à¸µà¹€&มล:"> <!ENTITY issues.openPreferences.label "เปิดà¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่งตัวà¸à¸£à¸à¸‡"> <!ENTITY sendPage.confirmation "รายงานได้รับà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¹à¸¥à¹‰à¸§ คุณเข้าดูได้ตามที่à¸à¸¢à¸¹à¹ˆà¸•่à¸à¹„ปนี้:"> <!ENTITY copyLink.label "&คัดลà¸à¸à¸¥à¸´à¸‡à¸à¹Œà¸£à¸²à¸¢à¸‡à¸²à¸™"> @@ -13,6 +14,7 @@ <!ENTITY typeWarning.override.label "ฉันเข้าใจà¹à¸¥à¸°à¸žà¸£à¹‰à¸à¸¡à¸ˆà¸°&ส่งรายงาน"> <!ENTITY issues.disabled.enable.label "เปิด Adblock Plus"> <!ENTITY update.fixed.description "ตัวà¸à¸£à¸à¸‡à¸‚à¸à¸‡à¸„ุณน่าจะมีà¸à¸²à¸£à¸à¸±à¸žà¹€à¸”ทà¸à¸²à¸£à¹à¸à¹‰à¹„ขปัà¸à¸«à¸²à¸—ี่คุณได้รายงานไว้à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰ à¸à¸£à¸¸à¸“าโหลดเว็บเพจà¹à¸¥à¸°à¸¥à¸à¸‡à¹ƒà¸«à¸¡à¹ˆà¸à¸µà¸à¸„รั้ง คุณสามารถดูรายงานขà¸à¸‡à¸„ุณได้à¸à¸µà¸à¸„รั้ง หาà¸à¸žà¸šà¸›à¸±à¸à¸«à¸²à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸à¸¢à¸¹à¹ˆ"> +<!ENTITY anonymous.label "ส่งโดยไม่ระบุตัวตน"> <!ENTITY reloadButton.label "&เรียà¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ"> <!ENTITY recentReports.clear.label "&ลบรายงานทั้งหมด"> <!ENTITY typeSelector.description "หน้าต่างนี้จะนำทางไปยังขั้นตà¸à¸™à¸—ี่ต้à¸à¸‡à¸à¸²à¸£à¹ƒà¸™à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸›à¸±à¸à¸«à¸²à¸‚à¸à¸‡ Adblock Plus à¸à¸£à¸¸à¸“าเลืà¸à¸à¸Šà¸™à¸´à¸”ขà¸à¸‡à¸›à¸±à¸à¸«à¸²à¸—ี่คุณพบในหน้านี้:"> @@ -31,6 +33,8 @@ <!ENTITY issues.nosubscriptions.description "คุณไม่ได้เขียนคำà¸à¸˜à¸´à¸šà¸²à¸¢à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¸•ัวà¸à¸£à¸à¸‡à¹„ว้ ซึ่งจะลบเนื้à¸à¸«à¸²à¸—ี่ไม่ต้à¸à¸‡à¸à¸²à¸£à¸à¸à¸à¸ˆà¸²à¸à¹€à¸§à¹‡à¸šà¹„ซต์à¸à¸±à¸•โนมัติ"> <!ENTITY typeSelector.falsePositive.description "เลืà¸à¸à¸•ัวเลืà¸à¸à¸™à¸µà¹‰ ถ้าหน้าเพจไม่มีเนื้à¸à¸«à¸²à¸—ี่สำคัภà¹à¸ªà¸”งผลผิดหรืà¸à¸—ำงานผิด คุณสามารถทดสà¸à¸šà¸§à¹ˆà¸² Adblock Plus เป็นต้นเหตุขà¸à¸‡à¸›à¸±à¸à¸«à¸²à¸«à¸£à¸·à¸à¹„ม่ โดยà¸à¸²à¸£à¸—ดลà¸à¸‡à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ว้ชั่วคราว"> <!ENTITY typeSelector.other.label "ปั&à¸à¸«à¸²à¸à¸·à¹ˆà¸™"> +<!ENTITY emailComment.label "เราà¸à¸£à¸°à¸•ุ้นให้คุณใช้ที่à¸à¸¢à¸¹à¹ˆà¸à¸µà¹€à¸¡à¸¥à¸—ี่ใช้งานได้จริง เพื่à¸à¸—ี่เราจะได้ติดต่à¸à¸„ุณเผื่à¸à¸¡à¸µà¸„ำถามในภายหลังเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™à¸‚à¸à¸‡à¸„ุณ + มันยังช่วยให้เราสามารถเข้าใจสิ่งที่คุณมีส่วนร่วมà¹à¸¥à¸°à¹ƒà¸«à¹‰à¸„วามสำคัà¸à¹€à¸›à¹‡à¸™à¸à¸¢à¹ˆà¸²à¸‡à¸ªà¸¹à¸‡"> <!ENTITY issues.whitelist.remove.label "เปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ Adblock Plus à¸à¸µà¸à¸„รั้งในหน้านี้"> <!ENTITY outdatedSubscriptions.description "รายà¸à¸²à¸£à¸•ัวà¸à¸£à¸à¸‡à¸•่à¸à¹„ปนี้ยังไม่ได้รับà¸à¸²à¸£à¸à¸±à¸žà¹€à¸”ทเป็นเวลาสà¸à¸‡à¸ªà¸±à¸›à¸”าห์à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าà¸à¸±à¸žà¹€à¸”ทรายà¸à¸²à¸£à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸à¹ˆà¸à¸™à¸—ี่จะส่งรายงานไป เพราะปัà¸à¸«à¸²à¸à¸²à¸ˆà¹„ด้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ขเรียบร้à¸à¸¢à¹à¸¥à¹‰à¸§à¸à¹‡à¹€à¸›à¹‡à¸™à¹„ด้"> <!ENTITY dataCollector.description "à¸à¸£à¸¸à¸“ารà¸à¸ªà¸±à¸à¸„รู่ระหว่างที่ Adblock Plus à¸à¸³à¸¥à¸±à¸‡à¸£à¸§à¸šà¸£à¸§à¸¡à¸‚้à¸à¸¡à¸¹à¸¥"> @@ -46,6 +50,7 @@ <!ENTITY issues.whitelist.description "Adblock Plus ไม่ได้เปิดใช้งานในหน้าเพจที่คุณรายงาน à¸à¸£à¸¸à¸“าเปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸µà¸à¸„รั้งà¹à¸¥à¸°à¹€à¸£à¸µà¸¢à¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆà¸à¹ˆà¸à¸™à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¹€à¸žà¸·à¹ˆà¸à¸Šà¹ˆà¸§à¸¢à¸ªà¸·à¸šà¸ªà¸§à¸™à¸›à¸±à¸à¸«à¸²à¸™à¸µà¹‰"> <!ENTITY typeSelector.falseNegative.label "Adblock Plus ไม่บล็à¸à¸à¹‚ฆ&ษณา"> <!ENTITY typeSelector.heading "เลืà¸à¸à¸Šà¸™à¸´à¸”ขà¸à¸‡à¸›à¸±à¸à¸«à¸²"> +<!ENTITY anonymity.warning "เราจะไม่ส่งà¸à¸¥à¸±à¸šà¸¡à¸²à¹ƒà¸«à¹‰à¸„ุณà¹à¸¥à¸°à¹ƒà¸«à¹‰à¸„วามสำคัà¸à¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™à¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¸‚ั้นต่ำ"> <!ENTITY wizard.title "รายงานปัà¸à¸«à¸²"> <!ENTITY issues.ownfilters.disable.label "ปิดใช้งานตัวà¸à¸£à¸à¸‡"> <!ENTITY commentPage.description "ช่à¸à¸‡à¸§à¹ˆà¸²à¸‡à¸™à¸µà¹‰à¹ƒà¸«à¹‰à¸„ุณใส่ความคิดเห็นเพื่à¸à¸Šà¹ˆà¸§à¸¢à¹ƒà¸«à¹‰à¹€à¸£à¸²à¹€à¸‚้าใจปัà¸à¸«à¸² ใส่หรืà¸à¹„ม่ใส่à¸à¹‡à¹„ด้ คุณสามารถทบทวนรายงานà¸à¸µà¸à¸„รั้งà¸à¹ˆà¸à¸™à¸ªà¹ˆà¸‡à¹„ด้"> @@ -59,8 +64,3 @@ <!ENTITY screenshot.mark.label "เ&น้นส่วนที่เป็นปัà¸à¸«à¸²"> <!ENTITY privacyPolicy.label "ความเป็นส่วนตัว"> <!ENTITY issues.description "Adblock Plus ตรวจพบปัà¸à¸«à¸²à¸à¸²à¸£à¸•ั้งค่าขà¸à¸‡à¸„ุณที่à¸à¸²à¸ˆà¸ˆà¸°à¹€à¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸›à¸±à¸à¸«à¸²à¸™à¸µà¹‰à¸«à¸£à¸·à¸à¸—ี่ทำให้à¸à¸²à¸£à¸ªà¸·à¸šà¸ªà¸§à¸™à¸£à¸²à¸¢à¸‡à¸²à¸™à¸¢à¸²à¸à¸‚ึ้น"> -<!ENTITY email.label "E&mail:"> -<!ENTITY anonymous.label "&Anonymous submission"> -<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions - about your report. It will also allow us to recognize your contributions and to prioritize them higher."> -<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/tr/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/tr/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/tr/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/tr/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/tr/filters.dtd index 8c7ac35..5289959 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/tr/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/tr/filters.dtd @@ -45,6 +45,7 @@ <!ENTITY acceptableAds2.label "Rahatsız etmeyen bazı reklamlara &izin ver"> <!ENTITY addSubscriptionOther.label "BaÅŸka abonelik ekle"> <!ENTITY close.label "Kapat"> +<!ENTITY findbar.caseSensitive "Büyük-küçük harfe duyarlı"> <!ENTITY sort.none.label "Sıralan&mamış"> <!ENTITY filter.actions.label "Süzgeç eylemleri"> <!ENTITY filter.copy.label "Kopyala"> @@ -62,12 +63,17 @@ <!ENTITY find.label "&Bul"> <!ENTITY subscription.moveDown.label "AÅŸağıya taşı"> <!ENTITY subscription.lastDownload.connectionError "Olmadı. İndirmede sorun var."> +<!ENTITY findbar.statusWrappedStart "En yukarıya ulaşıldı, en aÅŸağıdan devam ediliyor"> <!ENTITY subscription.lastDownload.success "EÅŸleme baÅŸarılı oldu."> +<!ENTITY findbar.placeholder "Süzgeç ekle"> <!ENTITY subscription.lastDownload.invalidData "Olmadı. Bu düzgün bir süzgeç listesi deÄŸil."> +<!ENTITY findbar.close "Arama çubuÄŸunu kapat"> <!ENTITY filter.paste.label "Yapıştır"> <!ENTITY subscription.disabledFilters.enable "Devre dışı süzgeçleri devreye sok"> <!ENTITY lasthit.column "Son isabet"> +<!ENTITY findbar.statusWrappedEnd "En aÅŸağıya ulaşıldı, en yukarıdan devam ediliyor"> <!ENTITY subscription.editTitle.label "BaÅŸlığı deÄŸiÅŸtir"> +<!ENTITY findbar.statusNotFound "İfade bulunamadı"> <!ENTITY subscription.disabledFilters.warning "Bu abonelikteki bazı süzgeçler devre dışı."> <!ENTITY filter.column "Süzgeç &kuralı"> <!ENTITY subscription.lastDownload.label "Son indirme zamanı:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/tr/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/tr/firstRun.properties index 83bc2ae..aaa7f1d 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/tr/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/tr/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Android ve iOS için mevcut +firstRun_abbButtonTitle=Buradan Adblock Browser edinin +firstRun_abbPromotionHeadline=Akıllı telefon veya tablet mi aldınız? firstRun_acceptableAdsExplanation=Siteleri basit ve rahatsız etmeyen reklamlar yayınlamaya teÅŸvik ediyoruz. Bu yüzden varsayılan ayarlar altında gösterilen, makul reklamları tanımlayan <a>sıkı kuralları</a> kabul ettik. Yine de tüm reklamları engellemek istiyorsanız <a>devre dışı bırakma</a> iÅŸini birkaç saniye içinde yapabilirsiniz. firstRun_acceptableAdsHeadline=Rahatsız edici reklamlar artık engellenecek firstRun_contributor_credits=EmeÄŸi Geçenler diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/tr/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/tr/global.properties index f0e12f8..94ac2b1 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/tr/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/tr/global.properties @@ -1,40 +1,47 @@ no_blocking_suggestions=Bakılan sayfada engellenebilecek bir öğe bulunmuyor action3_tooltip=Adblock Plus'ı etkinleÅŸtirmek ya da etkisizleÅŸtirmek için orta düğmeye tıklayın. -notification_antiadblock_title=İletileri gizlemek istiyor musunuz? +notification_antiadblock_title=Hedeflenen iletileri gizlemek istiyor musunuz? type_label_script=betik filter_elemhide_nocriteria=Gizlenecek bileÅŸeni anlamak için hiçbir ölçüt belirtilmedi -blockingGroup_title=Reklam Engelleme Kuralları +blockingGroup_title=Reklam engelleme kuralları whitelisted_tooltip=Adblock Plus etkin, ancak bu sayfada devre dışı. +type_label_ping=gecikme type_label_stylesheet=biçem yaprağı blocked_count_tooltip=toplamda ?1?, sayfada ?2? -type_label_font=yazı tipi +type_label_font=yazıtipi type_label_popup=açılır pencere -filter_regexp_tooltip=Süzgeç ya düzenli ifade ya da en iyileÅŸtirilmek için çok kısa. Bu süzgeçlerden çok fazlası, taramanızı yavaÅŸlatabilir. +filter_regexp_tooltip=Süzgeç ya düzenli ifade ya da en iyileÅŸtirmek için çok kısa. Bu süzgeçlerden çok fazlası, taramanızı yavaÅŸlatabilir. action0_tooltip=İçerik menüsünü açmak için tıklayın; etkinleÅŸtirmek ya da etkisizleÅŸtirmek için orta düğmeye tıklayın. whitelisted_page=Adblock Plus bakılan sayfa için devre dışı bırakıldı remove_group_warning=Bu grubu kaldırmayı gerçekten istiyor musunuz? action1_tooltip=Engellenebilir öğeleri açmak ya da kapatmak için tıklayın; etkinleÅŸtirmek ya da etkisizleÅŸtirmek için orta düğmeye tıklayın. type_label_xmlhttprequest=XML isteÄŸi +filter_invalid_regexp=Geçersiz düzenli ifade active_tooltip=Adblock Plus devrede ve ?1? süzgeç aboneliÄŸi ile ?2? özel süzgeç kullanıyor. type_label_document=belge type_label_object_subrequest=nesne alt isteÄŸi -whitelistGroup_title=Hariç Tutma Kuralları +whitelistGroup_title=Ayrıcalık kuralları disabled_tooltip=Adblock Plus etkin deÄŸil. filter_elemhide_duplicate_id=Gizlenecek sadece bir bileÅŸen kimliÄŸi belirtilebilir type_label_object=nesne +filter_elemhideemulation_nodomain=GeniÅŸletilmiÅŸ öğe gizleme filtresi için faal bir alan adı belirtilmedi action2_tooltip=Tercihler penceresini açmak için tıklayın; etkinleÅŸtirmek ya da etkisizleÅŸtirmek için orta düğmeye tıklayın. type_label_subdocument=çerçeve clearStats_warning=Bu hareket isabet istatistiklerinin sıfırlanması ve artık istatistik tutulmamasıyla sonuçlanacak. Devam etmek istiyor musunuz? -notification_antiadblock_message=Bu site Adblock Plus kullanıcılarına yönelik iletiler göstermesiyle bilinir. Adblock Plus'ın bu iletileri gizlemesini istiyor musunuz? +filter_unknown_option=Bilinmeyen süzme seçeneÄŸi +type_label_genericblock=genel engelleme +notification_antiadblock_message=Bu site Adblock Plus kullanıcılarını hedef alan iletiler göstermesiyle bilinir. Adblock Plus'ın hedeflenen iletileri gizlemesini istiyor musunuz? blocked_count_addendum=(ayrıca ?1? tane ak listede, ?2? tane gizli) subscription_invalid_location=Dosya listesi konumu ne düzgün bir URL ne de düzgün bir ada sahip. +type_label_websocket=web soketi type_label_image=resim remove_subscription_warning=Gerçekten abonelikten çıkmak istiyor musunuz? +type_label_generichide=genel gizleme type_label_other=diÄŸer mobile_menu_enable=ABP: EtkinleÅŸtir type_label_media=ses/görüntü mobile_menu_disable_site=ABP: ?1? sitesinde etkisizleÅŸtirilsin mi? -elemhideGroup_title=Öğe Gizleme Kuralları +elemhideGroup_title=Öğe gizleme kuralları mobile_menu_enable_site=ABP: ?1? sitesinde etkinleÅŸtirilsin mi? type_label_elemhide=gizli newGroup_title=Yeni süzgeç öbeÄŸi diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/tr/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/tr/overlay.dtd index a7364a4..7164266 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/tr/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/tr/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Hayır"> <!ENTITY sync.label "Adblock Plus ayarlarını &eÅŸitle"> <!ENTITY whitelist.site.label "?1? sitesinde devre dışı kal"> +<!ENTITY notification.closing.button.hide "B&u bildirimi kapat"> <!ENTITY filters.label "&Süzgeç tercihleri"> <!ENTITY disable.label "Her yerde devre dışı kal"> <!ENTITY objecttab.title "Engelle"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Evet"> <!ENTITY opensidebar.label "E&ngellenebilecek öğeleri göster"> <!ENTITY notification.button.close "&Kapat"> +<!ENTITY shownotifications.label "Yararlı &bildirimleri göster"> <!ENTITY contribute.label "Adblock Plus'a katkıda bulun"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Çerçeveyi engelle"> <!ENTITY blocked.tooltip "Bu sayfada engellenen öğeler:"> +<!ENTITY notification.closing.button.optout "Bildirim göstermeyi &durdur"> <!ENTITY counthits.label "Süzgeç isa&betini say"> <!ENTITY showinstatusbar.label "&Durum çubuÄŸunda göster"> <!ENTITY sidebar.title "Bu sayfadaki engellenebilecek öğeler"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "A&raç çubuÄŸunda göster"> <!ENTITY status.tooltip "Durum:"> <!ENTITY context.media.label "Adblock Plus: Ses/video engelle"> -<!ENTITY subscription.update.label "Süzgeçleri güncelle"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/tr/sendReport.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/tr/sendReport.dtd index c187ec1..f449190 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/tr/sendReport.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/tr/sendReport.dtd @@ -16,11 +16,11 @@ <!ENTITY update.fixed.description "Süzgeç aboneliklerinize yapılan güncellemeler muhtemelen bildirmek istediÄŸiniz sorunu giderdi. Sayfayı tekrar yükleyip bir daha deneyin, hâlâ sorun varsa bildirin."> <!ENTITY anonymous.label "&Anonim gönder"> <!ENTITY reloadButton.label "Sayfayı &tazele"> -<!ENTITY recentReports.clear.label "Tüm bildirimleri sil"> +<!ENTITY recentReports.clear.label "Tüm bildi&rimleri sil"> <!ENTITY typeSelector.description "Bu pencere Adblock Plus sorun bildirimi göndermek için gerekli adımların atılmasında size rehberlik edecek. Önce bu sayfada ne tür sorun yaÅŸadığınızı seçin:"> <!ENTITY screenshot.remove.label "Hassas &veriyi sil"> <!ENTITY issues.ownfilters.description "Bu sayfada uygulanan süzgeçlerin bazıları kullanıcı tarafından tanımlanmış. Lütfen soruna neden olmuÅŸ olabilecek süzgeçleri devre dışı bırakın:"> -<!ENTITY update.inProgress.description "Bu sorunun süzgeç güncellemesiyle giderilmesinin mümkün olup olmadığını tespit etmek için abonelikleriniz ÅŸimdi güncellenecektir. Lütfen bekleyin..."> +<!ENTITY update.inProgress.description "Bu sorunun süzgeç güncellemesiyle giderilmesinin mümkün olup olmadığını tespit etmek için abonelikleriniz ÅŸimdi güncellenecek. Lütfen bekleyin..."> <!ENTITY sendPage.retry.label "Yeniden gönder"> <!ENTITY data.label "Bildirim &verisi:"> <!ENTITY recentReports.label "Yakında gönderdiÄŸiniz bildirimler"> @@ -32,7 +32,7 @@ <!ENTITY issues.override.label "Yapılan&dırma doÄŸru, bildirime devam et"> <!ENTITY issues.nosubscriptions.description "Sitelerdeki istenmeyen içeriÄŸi yok eden önceden hazırlanmış süzgeç listelerinden herhangi birine abone olmuÅŸ deÄŸilsiniz."> <!ENTITY typeSelector.falsePositive.description "Sayfanın önemli içeriÄŸi hiç görünmüyorsa, yanlış görünüyorsa veya sayfa düzgün iÅŸlemiyorsa bu seçeneÄŸi seçin. Sorun kaynağının Adblock Plus olup olmadığını eklentiyi geçici olarak devre dışı bırakıp belirleyebilirsiniz."> -<!ENTITY typeSelector.other.label "BaÅŸka bir sorun"> +<!ENTITY typeSelector.other.label "&BaÅŸka bir sorun"> <!ENTITY emailComment.label "Sizi, raporunuz hakkında sorularımız olursa sizinle iletiÅŸime geçebilmemiz için geçerli bir e-posta adresi girmeye teÅŸvik ediyoruz. Bu aynı zamanda katılımlarınızı hatırlamamızı ve önceliklerini yüksek olarak ayarlamamızı saÄŸlar."> <!ENTITY issues.whitelist.remove.label "Adblock Plus'u bu sayfada devreye sok"> <!ENTITY outdatedSubscriptions.description "AÅŸağıdaki süzgeç abonelikleri en az 2 haftadır güncellenmedi. Bildirmeden önce lütfen bu abonelikleri güncelleyin, sorun çoktan giderilmiÅŸ olabilir."> @@ -47,7 +47,7 @@ <!ENTITY screenshot.description "Aynı sayfa farklı kiÅŸilerce farklı biçimde görülebilir. Bildirime ekran görüntüsü eklemeniz sorunu anlamamıza yardımcı olabilir. Hassas bilgilerin olduÄŸu bölümleri silebilirsiniz ve sorunun görünür olduÄŸu yerleri iÅŸaretleyebilirsiniz. Bunu yapmak için ilgili düğmeye basın ve resimde bir bölümü farenizle seçin."> <!ENTITY screenshot.attach.label "Bildirime say&fa resmi ekle"> <!ENTITY issues.whitelist.description "Adblock Plus bildirimde bulunduÄŸunuz sayfada devre dışı. Bu sorunun incelenmesine yardım etmek için bildirim göndermeden önce eklentiyi devreye sokun ve sayfayı yeniden yükleyin."> -<!ENTITY typeSelector.falseNegative.label "Adblock Plus reklamın birini engellemiyor"> +<!ENTITY typeSelector.falseNegative.label "Adblock Plus rekla&mın birini engellemiyor"> <!ENTITY typeSelector.heading "Sorun türünü seçin"> <!ENTITY anonymity.warning "Size geri dönemeyiz ve muhtemelen rapor önceliÄŸi düşük olarak ayarlanır."> <!ENTITY wizard.title "Sorun bildirici"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/uk/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/uk/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/uk/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/uk/composer.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/uk/composer.dtd index 68f86cb..4adb122 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/uk/composer.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/uk/composer.dtd @@ -1,18 +1,18 @@ <!ENTITY anchor.end.label "при &кінці адреÑи"> <!ENTITY domainRestriction.label "Об&межити доменом"> -<!ENTITY collapse.default.no.label "Як завжди (ні)"> +<!ENTITY collapse.default.no.label "ВикориÑтовувати завжди (ні)"> <!ENTITY firstParty.label "То&й же Ñайт"> -<!ENTITY preferences.label "Показати &Ñ–Ñнуючі фільтри…"> +<!ENTITY preferences.label "Показати Ñ–Ñнуючі фільтри…"> <!ENTITY pattern.label "Шукати шаблон"> <!ENTITY thirdParty.label "С&торонній Ñайт"> -<!ENTITY filter.label "Ðовий &фільтр:"> +<!ENTITY filter.label "Ðовий фільтр:"> <!ENTITY collapse.label "З&гортати заблоковане:"> <!ENTITY match.warning "Вказаний шаблон не відповідає адреÑÑ–, Ð´Ð»Ñ Ñкої ви Ñтворюєте правило, Ñ– ніÑк на неї не вплине."> <!ENTITY anchor.start.label "на &початку адреÑи"> -<!ENTITY matchCase.label "Ð’&раховувати регіÑтр"> +<!ENTITY matchCase.label "Враховувати регіÑтр"> <!ENTITY custom.pattern.label "І&нше"> -<!ENTITY unselectAllTypes.label "Скинути вÑе"> -<!ENTITY type.whitelist.label "Пра&вило винÑтку"> +<!ENTITY unselectAllTypes.label "Скинути виділеннÑ"> +<!ENTITY type.whitelist.label "Правило винÑтку"> <!ENTITY regexp.warning "Шаблон що ви ввели буде інтерпретовано Ñк регулÑрний вираз. Багато регулÑрних виразів можуть уповільнити переглÑд Ñторінок. Додайте * на кінець шаблону Ñкщо ви не збиралиÑÑŒ викориÑтовувати регулÑрний вираз."> <!ENTITY dialog.title "Додати правило Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Adblock Plus"> <!ENTITY basic.label "ПроÑтий виглÑд"> @@ -21,13 +21,13 @@ <!ENTITY shortpattern.warning "Шаблон що ви ввели закороткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·ÑƒÐ²Ð°Ð½Ð½Ñ, багато таких шаблонів можуть уповільнити переглÑд Ñторінок. Рекомендовано обрати довшу Ñтроку Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ фільтра"> <!ENTITY collapse.yes.label "Так"> <!ENTITY anchors.label "ЗаÑтоÑувати шаблон лише:"> -<!ENTITY collapse.default.yes.label "Як завжди (так)"> +<!ENTITY collapse.default.yes.label "ВикориÑтовувати завжди (так)"> <!ENTITY domainRestriction.help "Вкажіть один чи більше доменів, розділених Ñимволом „|“, фільтр буде заÑтоÑовано лише на них. Символ „~“ перед іменем домена вказує що фільтр на цей домен не розповÑюджуєтьÑÑ."> <!ENTITY accept.label "Додати фільтр"> <!ENTITY options.label "ÐалаштуваннÑ"> -<!ENTITY disabled.warning "Adblock Plus наразі вимкнений. Ви можете додавати фільтри, але вони не будуть заÑтоÑовуватиÑÑ, доки Ви не [link]увімкнете Adblock Plus[/link]."> +<!ENTITY disabled.warning "Adblock Plus наразі вимкнений. Тим не менш, Ви можете додавати фільтри, але вони не будуть заÑтоÑовуватиÑÑ, доки Ви не [link]увімкнете Adblock Plus[/link]."> <!ENTITY anchor.start.flexible.label "на &початку імені домена"> <!ENTITY collapse.no.label "ÐÑ–"> <!ENTITY selectAllTypes.label "Вибрати вÑе"> <!ENTITY advanced.label "Розширений виглÑд"> -<!ENTITY pattern.explanation "Шаблон може бути будь-Ñкою чаÑтиною адреÑи, Ñимвол * працює Ñк джокер. Фільтр буде заÑтоÑовано лише до Ð°Ð´Ñ€ÐµÑ Ñ‰Ð¾ відповідають шаблону."> +<!ENTITY pattern.explanation "ЗакономірніÑть може бути будь-Ñкою чаÑтиною адреÑи, Ñимвол (*) працює Ñк джокер. Фільтр буде заÑтоÑовано лише до адреÑ, що відповідають заданій закономірноÑті."> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/uk/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/uk/filters.dtd index 2d0b05b..4cc8e5c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/uk/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/uk/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "Дозволити деÑку ненав'Ñзливу &рекламу"> <!ENTITY addSubscriptionOther.label "Додати іншу підпиÑку"> <!ENTITY close.label "Закрити"> +<!ENTITY findbar.caseSensitive "Враховувати регіÑтр"> <!ENTITY sort.none.label "&ÐеÑортовано"> <!ENTITY filter.actions.label "Дії з фільтрами"> <!ENTITY filter.copy.label "Копіювати"> @@ -60,12 +61,17 @@ <!ENTITY find.label "З&найти фільтр"> <!ENTITY subscription.moveDown.label "ЗÑунути вниз"> <!ENTITY subscription.lastDownload.connectionError "Помилка, неможливо викачати"> +<!ENTITY findbar.statusWrappedStart "Знизу вгору"> <!ENTITY subscription.lastDownload.success "УÑпіх"> +<!ENTITY findbar.placeholder "Знайти фільтр"> <!ENTITY subscription.lastDownload.invalidData "Помилка, не правильний ÑпиÑок фільтрів"> +<!ENTITY findbar.close "Закрити панель пошуку"> <!ENTITY filter.paste.label "Ð’Ñтавити"> <!ENTITY subscription.disabledFilters.enable "Увімкнути вимкнені фільтри"> <!ENTITY lasthit.column "&ОÑтаннє попаданнÑ"> +<!ENTITY findbar.statusWrappedEnd "Згори в низ"> <!ENTITY subscription.editTitle.label "Редагувати назву"> +<!ENTITY findbar.statusNotFound "Фразу не знайдено"> <!ENTITY subscription.disabledFilters.warning "ДеÑкі фільтри у цій підпиÑці вимкнено."> <!ENTITY filter.column "Правило &фільтруваннÑ"> <!ENTITY subscription.lastDownload.label "ОÑтаннє оновленнÑ:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/uk/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/uk/firstRun.properties index abc6f01..685aa87 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/uk/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/uk/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=ДоÑтупно Ð´Ð»Ñ Android та iOS +firstRun_abbButtonTitle=Отримайте Adblock Browser тут +firstRun_abbPromotionHeadline=Маєте Ñмартфон чи планшет? firstRun_acceptableAdsExplanation=Ми хотіли б заохотити веб-Ñайти викориÑтовувати проÑту, ненав'Ñзливу рекламу. ОÑÑŒ чому ми Ñтворили <a>Ñуворі принципи</a> Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— прийнÑтної реклами, Ñкі по замовчуванню будуть показуватиÑÑŒ. Якщо Ви вÑе ж бажаєте заблокувати вÑÑŽ рекламу, то ви можете <a>вимкнути</a> це за декілька Ñекунд. firstRun_acceptableAdsHeadline=Ðадокучлива реклама буде надалі блокуватиÑÑ firstRun_contributor_credits=ВнеÑки учаÑників diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/uk/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/uk/global.properties index 8faed6d..e6e7385 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/uk/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/uk/global.properties @@ -5,6 +5,7 @@ type_label_script=Скрипт filter_elemhide_nocriteria=Ðе вказаний критерій за Ñким упізнати елемент, що буде приховано. blockingGroup_title=Правила Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ whitelisted_tooltip=Adblock Plus увімкнено, проте не Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки. +type_label_ping=пінг type_label_stylesheet=Стилі blocked_count_tooltip=?1? з ?2? type_label_font=шрифт @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus вимкнено Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки remove_group_warning=Ви дійÑно бажаєте видалити цю групу? action1_tooltip=Клацніть, щоб відкрити/закрити ÑпиÑок елементів. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл. type_label_xmlhttprequest=XML-запит +filter_invalid_regexp=Ðеправильний регулÑрний вираз active_tooltip=Adblock Plus увімкнено, задіÑно ?1? підпиÑок та ?2? влаÑних фільтрів. type_label_document=Документ type_label_object_subrequest=Запит об’єкта @@ -25,11 +27,15 @@ type_label_object=Об’єкт action2_tooltip=Клацніть, щоб відкрити вікно налаштувань. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл. type_label_subdocument=Фрейм clearStats_warning=Це Ñкине вÑÑŽ ÑтатиÑтику по фільтрам та вимкне Ñ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñ…Ñ–Ñ‚Ñ–Ð². Продовжити? +filter_unknown_option=Ðевідома Ð¾Ð¿Ñ†Ñ–Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð° +type_label_genericblock=Загальне Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ notification_antiadblock_message=Цей Ñайт відомий тим, що показує цільові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачам Adblock Plus. Ви хочете, щоб Adblock Plus приховав цільові повідомленнÑ? blocked_count_addendum=(також відкрито: ?1?, приховано: ?2?) subscription_invalid_location=Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ введену адреÑу ні Ñк інтернет адреÑу, ні Ñк шлÑÑ… до файлу. +type_label_websocket=websocket type_label_image=Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ remove_subscription_warning=Ви впевнені, що хочете вилучити цю підпиÑку? +type_label_generichide=Загальне приховане type_label_other=Інший mobile_menu_enable=ABP: Увімкнути type_label_media=аудіо/відео @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: Увімкнути на ?1? type_label_elemhide=Приховане newGroup_title=Ðова група фільтрів default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/uk/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/uk/overlay.dtd index 31e88f8..a3adce2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/uk/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/uk/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&ÐÑ–"> <!ENTITY sync.label "Синхроні&зувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ðдблоку"> <!ENTITY whitelist.site.label "Вимкнути: на ?1?"> +<!ENTITY notification.closing.button.hide "&Закрити це повідомленнÑ"> <!ENTITY filters.label "&ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð²"> <!ENTITY disable.label "Вимкнути вÑюди"> <!ENTITY objecttab.title "Заблокувати"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Так"> <!ENTITY opensidebar.label "Відкрити Ñ&пиÑок елементів"> <!ENTITY notification.button.close "&Закрити"> +<!ENTITY shownotifications.label "Показувати кориÑні &повідомленнÑ"> <!ENTITY contribute.label "Допомогти Ðдблоку"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: заблокувати фрейм"> <!ENTITY blocked.tooltip "Заблоковані елементи на цій Ñторінці:"> +<!ENTITY notification.closing.button.optout "З&аборонити показ повідомлень"> <!ENTITY counthits.label "&Рахувати хіти фільтрів"> <!ENTITY showinstatusbar.label "Показувати в Ñ€Ñдку &Ñтану"> <!ENTITY sidebar.title "Елементи відкритої Ñторінки"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "По&казувати в панелі інÑтрументів"> <!ENTITY status.tooltip "СтатуÑ:"> <!ENTITY context.media.label "Adblock Plus: Блокувати аудіо/відео"> -<!ENTITY subscription.update.label "Оновити фільтри"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/uk/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/uk/sidebar.dtd index 23725a0..adf33f5 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/uk/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/uk/sidebar.dtd @@ -1,4 +1,4 @@ -<!ENTITY context.flash.label "Рамка Ð´Ð»Ñ Flash об'єктів"> +<!ENTITY context.flash.label "Границі Flash елемента"> <!ENTITY address.label "ÐдреÑа"> <!ENTITY context.open.label "Відкрити в новій вкладці"> <!ENTITY type.label "Тип"> @@ -22,14 +22,14 @@ <!ENTITY context.disablefilteronsite.label "Вимкнути цей фільтр на ?1?"> <!ENTITY detached.title "Adblock Plus: елементи відкритої Ñторінки (від’єднані)"> <!ENTITY docDomain.firstParty "(запит з того ж Ñайта)"> -<!ENTITY tooltip.type.whitelisted "(дозволений)"> +<!ENTITY tooltip.type.whitelisted "(в білому ÑпиÑку)"> <!ENTITY tooltip.filter.label "ЗаÑтоÑований фільтр:"> <!ENTITY tooltip.filter.disabled "(вимкнено)"> <!ENTITY context.editfilter.label "Відредагувати заÑтоÑований фільтр"> <!ENTITY tooltip.type.blocked "(заблокований)"> <!ENTITY size.label "Розмір"> <!ENTITY context.whitelist.label "Вказати елемент Ñк винÑток"> -<!ENTITY context.selectAll.label "Вибрати вÑе"> +<!ENTITY context.selectAll.label "Вибрати вÑÑ–"> <!ENTITY state.label "СтатуÑ"> <!ENTITY docDomain.label "Джерело документа"> <!ENTITY tooltip.address.label "ÐдреÑа:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/vi/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/vi/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/vi/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/vi/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/vi/filters.dtd index 409f4a2..009fd3e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/vi/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/vi/filters.dtd @@ -1,18 +1,18 @@ <!ENTITY restore.custom.warning "Tất cả bá»™ lá»c tùy biến cá»§a bạn sẽ được thay thế bởi ná»™i dung cá»§a táºp tin được chá»n. Bạn có muốn thá»±c hiện?"> <!ENTITY slow.column "&Bá»™ lá»c cháºm"> <!ENTITY enabled.column "&Báºt"> -<!ENTITY subscription.lastDownload.checksumMismatch "Thất bại, mã băm không phù hợp"> +<!ENTITY subscription.lastDownload.checksumMismatch "Thất bại, mã kiểm tra không phù hợp"> <!ENTITY noFiltersInGroup.text "Nhóm được chá»n trống."> <!ENTITY subscription.actions.label "Hà nh động"> <!ENTITY filter.selectAll.label "Chá»n tất cả"> <!ENTITY backupButton.label "&Sao lưu và phục hồi"> -<!ENTITY restore.minVersion.warning "Cảnh báo: táºp tin đã được tạo bởi phiên bản Adblock Plus má»›i hÆ¡n. Bạn cần cáºp nháºp lên phiên bản má»›i nhất cá»§a Adblock Plus trước khi có thể khôi phục từ táºp tin nà y."> +<!ENTITY restore.minVersion.warning "Cảnh báo: táºp tin đã được tạo bởi phiên bản Adblock Plus má»›i hÆ¡n. Bạn cần cáºp nháºt lên phiên bản má»›i nhất cá»§a Adblock Plus trước khi có thể khôi phục từ táºp tin nà y."> <!ENTITY restore.error "Dữ liệu cá»§a táºp tin có thể không được xá» lý, có lẽ đây không phải là má»™t táºp tin sao lưu cá»§a Adblock Plus?"> <!ENTITY sort.ascending.label "Sắp xếp theo thứ tá»± &A > Z"> <!ENTITY sort.label "Sắp &xếp theo"> <!ENTITY subscription.source.label "Danh sách bá»™ lá»c"> <!ENTITY hitcount.column "&Số lần bấm"> -<!ENTITY noFilters.text "Bạn chưa có bá»™ lá»c tùy biến nà o."> +<!ENTITY noFilters.text "Bạn chưa có bá»™ lá»c cá nhân nà o ."> <!ENTITY backup.custom.title "Chỉ bá»™ lá»c tùy biến"> <!ENTITY subscription.external.label "ÄÆ°á»£c cáºp nháºp bởi ứng dụng khác"> <!ENTITY subscription.delete.label "Xóa"> @@ -29,43 +29,49 @@ <!ENTITY subscription.lastDownload.unknown "N/A"> <!ENTITY addSubscriptionCancel.label "Há»§y"> <!ENTITY subscription.enabled.label "Äã được báºt"> -<!ENTITY noSubscriptions.text "Bạn chưa chá»n bất kì bá»™ lá»c nà o ! AdBlock Plus không thể hoạt động nếu không có má»™t bá»™ lá»c, xin hãy sá» dụng "Äăng ký bá»™ lá»c" để thêm bá»™ lá»c cho mình ."> +<!ENTITY noSubscriptions.text "Bạn chưa chá»n bất kì bá»™ lá»c nà o ! Adblock Plus không thể hoạt động nếu không có má»™t bá»™ lá»c, xin hãy sá» dụng "Äăng ký bá»™ lá»c" để thêm bá»™ lá»c cho mình ."> <!ENTITY subscription.update.label "Cáºp nháºp bá»™ lá»c"> -<!ENTITY dialog.title "Tùy chá»n bá»™ lá»c AdBlock Plus"> +<!ENTITY dialog.title "Tùy chá»n bá»™ lá»c Adblock Plus"> <!ENTITY addFilter.label "&Thêm bá»™ lá»c"> -<!ENTITY subscription.minVersion.warning "Bá»™ lá»c nà y cần có phiên bản Adblock Plus má»›i hÆ¡n, bạn cần phải cáºp nháºp lên phiên bản má»›i nhất cá»§a AdBlock Plus ."> +<!ENTITY subscription.minVersion.warning "Bá»™ lá»c nà y cần có phiên bản Adblock Plus má»›i hÆ¡n, bạn cần phải cáºp nháºp lên phiên bản má»›i nhất cá»§a Adblock Plus ."> <!ENTITY subscription.lastDownload.invalidURL "Thất bại, không phải là địa chỉ hợp lệ"> <!ENTITY backup.error "Có vấn đỠkhi ghi bá»™ lá»c và o táºp tin. Hãy chắc chắn rằng táºp tin không bị bảo vệ ghi hoặc bị sá» dụng bởi má»™t ứng dụng khác."> <!ENTITY filter.moveUp.label "Di chuyển lên"> -<!ENTITY addGroup.label "Thêm &nhóm bá»™ lá»c"> +<!ENTITY addGroup.label "Thêm bá»™ lá»c và nhóm"> <!ENTITY filter.edit.label "Chỉnh sá»a"> -<!ENTITY subscription.showHideFilters.label "Hiện/ẩn bá»™ lá»c"> +<!ENTITY subscription.showHideFilters.label "Hiện/Ẩn bá»™ lá»c"> <!ENTITY acceptableAds2.label "Cho phép má»™t số quảng cáo không gây hại"> <!ENTITY addSubscriptionOther.label "Thêm bá»™ lá»c khác"> <!ENTITY close.label "Äóng"> +<!ENTITY findbar.caseSensitive "Phân biệt Hoa thưá»ng"> <!ENTITY sort.none.label "&Chưa sắp xếp"> <!ENTITY filter.actions.label "Hà nh động cho bá»™ lá»c"> -<!ENTITY filter.copy.label "Chép"> +<!ENTITY filter.copy.label "Sao chép"> <!ENTITY filter.moveDown.label "Di chuyển xuống"> -<!ENTITY filter.resetHitCounts.label "Cà i lại thống kê lượt bấm"> +<!ENTITY filter.resetHitCounts.label "Reset số lần hit"> <!ENTITY readMore.label "Äá»c thêm"> <!ENTITY subscription.moveUp.label "Chuyển lên trên"> <!ENTITY addSubscription.label "Thêm bá»™ lá»c"> <!ENTITY subscription.homepage.label "Trang chá»§"> -<!ENTITY backup.complete.title "Tất cả các bá»™ lá»c và mục đăng ký"> +<!ENTITY backup.complete.title "Tất cả phần tá» lá»c và bá»™ lá»c"> <!ENTITY restore.own.label "Khôi phục riêng"> <!ENTITY restore.complete.warning "Tất cả tùy chỉnh bá»™ lá»c cá»§a bạn sẽ được thay thế bởi ná»™i dung cá»§a táºp tin được chá»n. Bạn có muốn thá»±c hiện?"> -<!ENTITY filters.tab.label "Bá»™ lá»c tùy biến"> +<!ENTITY filters.tab.label "Bá»™ lá»c cá nhân"> <!ENTITY backup.label "Tạo sao lưu má»›i"> <!ENTITY find.label "&Tìm"> <!ENTITY subscription.moveDown.label "Chuyển xuống dưới"> <!ENTITY subscription.lastDownload.connectionError "Thất bại, tải xuống thất bại"> +<!ENTITY findbar.statusWrappedStart "Äã đạt đến đỉnh, tiếp tục từ dưới"> <!ENTITY subscription.lastDownload.success "Hoà n thà nh"> +<!ENTITY findbar.placeholder "Tìm bá»™ lá»c"> <!ENTITY subscription.lastDownload.invalidData "Thất bại, đây không phải là danh sách bá»™ lá»c hợp lệ"> +<!ENTITY findbar.close "Äóng thanh tìm kiếm"> <!ENTITY filter.paste.label "Dán"> <!ENTITY subscription.disabledFilters.enable "Báºt bá»™ lá»c đã bị vô hiệu hóa"> <!ENTITY lasthit.column "Lần bấm cuối"> +<!ENTITY findbar.statusWrappedEnd "Äã đạt đến dưới đỉnh, tiếp tục từ trên"> <!ENTITY subscription.editTitle.label "Sá»a tiêu Ä‘á»"> +<!ENTITY findbar.statusNotFound "Không tìm thấy cụm từ"> <!ENTITY subscription.disabledFilters.warning "Má»™t và i phần tá» trong bá»™ lá»c nà y đã bị vô hiệu hóa ."> <!ENTITY filter.column "&Quy luáºt lá»c"> <!ENTITY subscription.lastDownload.label "Lần tải cuối:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/vi/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/vi/firstRun.properties index f348260..f7e7c41 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/vi/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/vi/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=Há»— trợ Android và iOS +firstRun_abbButtonTitle=Hãy tải Adblock Browser tại đây +firstRun_abbPromotionHeadline=Có má»™t chiếc Ä‘iện thoại thông minh hoặc má»™t tablet? firstRun_acceptableAdsExplanation=Chúng tôi khuyến khÃch các trang mạng dùng những quảng cáo minh bạch, không phiá»n nhiá»…u. Äó là là do tại sao chúng tôi gây dá»±ng <a>hướng dẫn chặt chẽ</a> để xác định các quảng cáo được chấp nháºn, hiện dưới mức thiết láºp mặc định. Nếu bạn vẫn muốn chặn má»i quảng cáo, bạn có thể <a>vô hiệu</a> Ä‘iá»u nà y trong má»™t và i giây. firstRun_acceptableAdsHeadline=Những quảng cáo phiá»n phức sẽ bị chặn firstRun_contributor_credits=Äóng góp các khoản tÃn dụng diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/vi/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/vi/global.properties index 39cabf8..78e89da 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/vi/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/vi/global.properties @@ -5,6 +5,7 @@ type_label_script=văn lệnh filter_elemhide_nocriteria=Không có chuẩn để nháºn diện các phần tá» bị ẩn blockingGroup_title=Quy tắc chặn quảng cáo whitelisted_tooltip=Adblock Plus bị vô hiệu ở trang hiện tại. +type_label_ping=Äá»™ trá»… type_label_stylesheet=stylesheet blocked_count_tooltip=?1? trong ?2? type_label_font=phông @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus đã bị vô hiệu hóa cho trang hiện tại remove_group_warning=Bạn có tháºt sá»± muốn loại bá» nhóm nà y? action1_tooltip=Nhấn chuá»™t trái để mở/đóng các mục có thể chặn được, nhấn chuá»™t giữa để báºt/tắt. type_label_xmlhttprequest=yêu cầu XML +filter_invalid_regexp=Biểu hiện thưá»ng xuyên không hợp lệ active_tooltip=Adblock Plus đã kÃch hoạt, ?1? bá»™ lá»c trá»n gói và ?2? bá»™ lá»c tùy biến Ä‘ang được dùng. type_label_document=tà i liệu type_label_object_subrequest=yêu cầu con đối tượng @@ -25,11 +27,15 @@ type_label_object=đối tượng action2_tooltip=Nhấn chuá»™t trái để mở tùy chá»n, nhấn chuá»™t giữa để báºt/tắt. type_label_subdocument=khung clearStats_warning=Äiá»u nà y sẽ thiết láºp lại toà n bá»™ thông số lượt bấm và vô hiệu đếm lượt bấm. Bạn có muốn thá»±c hiện? +filter_unknown_option=Bá»™ lá»c tùy chá»n không rõ +type_label_genericblock=khối tổng quát notification_antiadblock_message=Trang nà y đã được biết là hiện tin nhắn mục tiêu cho ngưá»i dùng Adblock Plus. Bạn có muốn Adblock Plus ẩn tin nhắn mục tiêu? blocked_count_addendum=(trong danh sách trắng: ?1?, bị ẩn: ?2?) subscription_invalid_location=Äịa chỉ để tải bá»™ lá»c không phải là má»™t URL hay tên táºp tin hợp lệ. -type_label_image=ảnh +type_label_websocket=webSockets +type_label_image=hình ảnh remove_subscription_warning=Bạn có tháºt sá»± muốn xóa bá»™ trá»n gói nà y không? +type_label_generichide=ẩn phần lá»›n type_label_other=khác mobile_menu_enable=ABP: Báºt type_label_media=tiếng/phim @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP: KÃch hoạt trên ?1? type_label_elemhide=ẩn newGroup_title=Nhóm lá»c má»›i default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/vi/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/vi/overlay.dtd index 1609dc9..f1c8e57 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/vi/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/vi/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&Không"> <!ENTITY sync.label "Äồng bá»™ thiết láºp Adbl&ock Plus"> <!ENTITY whitelist.site.label "Vô hiệu hóa trên ?1?"> +<!ENTITY notification.closing.button.hide "Äóng thông báo nà y"> <!ENTITY filters.label "&Tùy chỉnh bá»™ lá»c"> <!ENTITY disable.label "Vô hiệu hóa ở má»i nÆ¡i"> <!ENTITY objecttab.title "Chặn"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&Có"> <!ENTITY opensidebar.label "&Mở các mục có thể chặn được"> <!ENTITY notification.button.close "Äó&ng"> +<!ENTITY shownotifications.label "Hiện thông báo hữu Ãch"> <!ENTITY contribute.label "Äóng góp cho Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plus: Chặn Khung"> <!ENTITY blocked.tooltip "Các mục bị chặn trong trang nà y:"> +<!ENTITY notification.closing.button.optout "Dừng hiện thông báo"> <!ENTITY counthits.label "Äếm lượt &bấm bá»™ lá»c"> <!ENTITY showinstatusbar.label "Hiện t&rong thanh trạng thái"> <!ENTITY sidebar.title "Các mục bị chặn trên trang hiện tại"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "Hiện trong thanh &công cụ"> <!ENTITY status.tooltip "Trạng thái:"> <!ENTITY context.media.label "Adblock Plus: Chặn nhạc/phim"> -<!ENTITY subscription.update.label "Cáºp nháºp bá»™ lá»c"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/filters.dtd index adb206e..87c647b 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/filters.dtd @@ -43,6 +43,7 @@ <!ENTITY acceptableAds2.label "å…许一些éžä¾µå…¥å¼å¹¿å‘Š (&i)"> <!ENTITY addSubscriptionOther.label "æ·»åŠ å…¶ä»–è¿‡æ»¤è§„åˆ™è®¢é˜…ç»„"> <!ENTITY close.label "å…³é—"> +<!ENTITY findbar.caseSensitive "匹é…大å°å†™"> <!ENTITY sort.none.label "ä¸æŽ’åº (&U)"> <!ENTITY filter.actions.label "过滤规则æ“作"> <!ENTITY filter.copy.label "å¤åˆ¶"> @@ -60,12 +61,17 @@ <!ENTITY find.label "查找 (&n)"> <!ENTITY subscription.moveDown.label "下移"> <!ENTITY subscription.lastDownload.connectionError "失败,下载失败"> +<!ENTITY findbar.statusWrappedStart "已达最顶,继ç»å°†ä»Žåº•éƒ¨å†æŸ¥"> <!ENTITY subscription.lastDownload.success "æˆåŠŸ"> +<!ENTITY findbar.placeholder "查找过滤规则"> <!ENTITY subscription.lastDownload.invalidData "å¤±è´¥ï¼Œä¸æ˜¯æœ‰æ•ˆçš„过滤规则列表"> +<!ENTITY findbar.close "关闿Ÿ¥æ‰¾æ "> <!ENTITY filter.paste.label "粘贴"> <!ENTITY subscription.disabledFilters.enable "å¯ç”¨å·²ç¦ç”¨çš„过滤规则"> <!ENTITY lasthit.column "最åŽç”Ÿæ•ˆæ—¶é—´ (&L)"> +<!ENTITY findbar.statusWrappedEnd "已达最底,继ç»å°†ä»Žé¡¶éƒ¨å†æŸ¥"> <!ENTITY subscription.editTitle.label "ç¼–è¾‘æ ‡é¢˜"> +<!ENTITY findbar.statusNotFound "未找到æ¤çŸè¯"> <!ENTITY subscription.disabledFilters.warning "该过滤规则订阅组ä¸çš„æŸäº›è¿‡æ»¤è§„åˆ™è¢«ç¦ç”¨ã€‚"> <!ENTITY filter.column "过滤规则 (&F)"> <!ENTITY subscription.lastDownload.label "最åŽä¸‹è½½äºŽ:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/firstRun.properties index 39f74a0..695a053 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=å¯ç”¨äºŽAndroidå’ŒiOS +firstRun_abbButtonTitle=在æ¤èŽ·å–Adblock Browser +firstRun_abbPromotionHeadline=有智能手机还是平æ¿ç”µè„‘? firstRun_acceptableAdsExplanation=我们想鼓励网站使用简å•ã€ä¸ä½¿äººå感的广告。这也是为什么我们建立了一个<a>ä¸¥æ ¼çš„æŒ‡å¯¼æ–¹é’ˆ</a>æ¥ç¡®å®šå¯æŽ¥å—çš„å¹¿å‘Šï¼Œå¹¶åœ¨é»˜è®¤è®¾ç½®ä¸‹å±•ç¤ºå®ƒä»¬ã€‚å¦‚æžœæ‚¨ä»æƒ³å±è”½æ‰€æœ‰å¹¿å‘Šï¼Œæ‚¨å¯ä»¥è½»æ¾åœ°<a>ç¦ç”¨</a>这项功能。 firstRun_acceptableAdsHeadline=æ¼äººçš„广告将被å±è”½ firstRun_contributor_credits=贡献者记录 diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/global.properties index 48387e9..4ca7e0e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/global.properties @@ -5,6 +5,7 @@ type_label_script=脚本 filter_elemhide_nocriteria=没有指定è¦éšè—å…ƒç´ çš„è¯†åˆ«æ ‡å‡† blockingGroup_title=广告å±è”½è§„则 whitelisted_tooltip=Adblock Plus 在当å‰é¡µç¦ç”¨ã€‚ +type_label_ping=ping type_label_stylesheet=æ ·å¼è¡¨ blocked_count_tooltip=第 ?1? 项,共 ?2? 项 type_label_font=å—体 @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus 在当å‰é¡µé¢å·²ç¦ç”¨ remove_group_warning=您希望移除该组å—? action1_tooltip=点击打开/å…³é—å¯è¿‡æ»¤é¡¹ç›®ï¼Œä¸é”®ç‚¹å‡»åˆ‡æ¢å¯ç”¨/ç¦ç”¨ã€‚ type_label_xmlhttprequest=XML 请求 +filter_invalid_regexp=æ— æ•ˆçš„æ£åˆ™è¡¨è¾¾å¼ active_tooltip=Adblock Plus 处于å¯ç”¨çжæ€ï¼Œæ£åœ¨ä½¿ç”¨ ?1? 过滤规则订阅组和 ?2? 自定义过滤规则。 type_label_document=文档 type_label_object_subrequest=对象å请求 @@ -23,13 +25,17 @@ disabled_tooltip=Adblock Plus å·²ç¦ç”¨ã€‚ filter_elemhide_duplicate_id=ä»…å¯ä»¥æŒ‡å®šä¸€ä¸ªè¦éšè—çš„å…ƒç´ ID type_label_object=对象 action2_tooltip=点击打开首选项,ä¸é”®ç‚¹å‡»åˆ‡æ¢å¯ç”¨/ç¦ç”¨ã€‚ -type_label_subdocument=帧 +type_label_subdocument=框架 clearStats_warning=æ¤æ“作将ç¦ç”¨å¹¶é‡ç½®æ‰€æœ‰è¿‡æ»¤è§„则生效次数统计。您确定è¦è¿™æ ·åšå—? +filter_unknown_option=未知的过滤规则 +type_label_genericblock=阻æ¢ï¼ˆå…¨å±€ï¼‰ notification_antiadblock_message=æ¤ç½‘站已知会对 Adblock Plus 用户显示针对性的信æ¯ã€‚您想让 Adblock Plus éšè—针对性的信æ¯å—? blocked_count_addendum=(白åå•: ?1?, éšè—: ?2?) subscription_invalid_location=过滤规则列表的ä½ç½®ä¸æ˜¯æœ‰æ•ˆçš„ URL 或有效的文件å。 +type_label_websocket=websocket type_label_image=图片 remove_subscription_warning=您确定è¦ç§»é™¤è¯¥è¿‡æ»¤è§„则订阅组å—? +type_label_generichide=éšè—(全局) type_label_other=å…¶ä»– mobile_menu_enable=ABP:å¯ç”¨ type_label_media=音频/视频 @@ -39,3 +45,4 @@ mobile_menu_enable_site=ABP:在 ?1? å¯ç”¨ type_label_elemhide=éšè— newGroup_title=新建过滤规则组 default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/overlay.dtd index 14deb7c..a803df0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "å¦(&N)"> <!ENTITY sync.label "åŒæ¥ Adblo&ck Plus 设置"> <!ENTITY whitelist.site.label "在 ?1? ç¦ç”¨ Adblock Plus"> +<!ENTITY notification.closing.button.hide "关闿¤é€šçŸ¥(&H)"> <!ENTITY filters.label "过滤规则首选项 (&F)"> <!ENTITY disable.label "完全ç¦ç”¨"> <!ENTITY objecttab.title "å±è”½"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "是(&Y)"> <!ENTITY opensidebar.label "打开å¯è¿‡æ»¤é¡¹ç›® (&b)"> <!ENTITY notification.button.close "å…³é—(&C)"> +<!ENTITY shownotifications.label "显示有益æç¤º(&N)"> <!ENTITY contribute.label "助力 Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> -<!ENTITY context.frame.label "过滤帧(Adblock Plus)"> +<!ENTITY context.frame.label "过滤框架(Adblock Plus)"> <!ENTITY blocked.tooltip "该页上已过滤的项目:"> +<!ENTITY notification.closing.button.optout "ä¸å†æ˜¾ç¤ºé€šçŸ¥(&S)"> <!ENTITY counthits.label "统计过滤规则生效次数 (&h)"> <!ENTITY showinstatusbar.label "åœ¨çŠ¶æ€æ 显示 (&s)"> <!ENTITY sidebar.title "本页å¯è¿‡æ»¤çš„项目"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "åœ¨å·¥å…·æ æ˜¾ç¤º (&b)"> <!ENTITY status.tooltip "状æ€:"> <!ENTITY context.media.label "过滤视频/音频(Adblock Plus)"> -<!ENTITY subscription.update.label "更新过滤规则"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/sidebar.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/sidebar.dtd index 3bda933..b007e58 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/sidebar.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-CN/sidebar.dtd @@ -9,7 +9,7 @@ <!ENTITY reattach.label "åˆä½“"> <!ENTITY search.label "æœç´¢ï¼š (&S)"> <!ENTITY docDomain.thirdParty "(第三方)"> -<!ENTITY filterSource.label "过滤规则æº"> +<!ENTITY filterSource.label "æºè¿‡æ»¤è§„则"> <!ENTITY tooltip.docDomain.label "文档æºï¼š"> <!ENTITY context.copy.label "å¤åˆ¶é¡¹ç›®åœ°å€"> <!ENTITY tooltip.type.label "类型:"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/common.properties b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/common.properties new file mode 100644 index 0000000..395711e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/common.properties @@ -0,0 +1,4 @@ +common_feature_anti_adblock_title=Hide Adblock Warning Messages +common_feature_malware_title=Block Malware +common_feature_privacy_title=Disable Tracking +common_feature_social_title=Remove Social Media Buttons diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/filters.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/filters.dtd index c953bc9..5521fe2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/filters.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/filters.dtd @@ -70,3 +70,9 @@ <!ENTITY filter.column "éŽæ¿¾æ¢ä»¶ (&F)"> <!ENTITY subscription.lastDownload.label "最後下載:"> <!ENTITY viewList.label "檢視æ¢ä»¶åˆ—表"> +<!ENTITY findbar.caseSensitive "Match Case"> +<!ENTITY findbar.statusWrappedStart "Reached top, continuing from bottom"> +<!ENTITY findbar.placeholder "Find filter"> +<!ENTITY findbar.close "Close find bar"> +<!ENTITY findbar.statusWrappedEnd "Reached bottom, continuing from top"> +<!ENTITY findbar.statusNotFound "Phrase not found"> diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/firstRun.properties b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/firstRun.properties index a845709..dc6608a 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/firstRun.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/firstRun.properties @@ -1,3 +1,6 @@ +firstRun_abbButtonSubtitle=é©ç”¨æ–¼ Android åŠ iOS +firstRun_abbButtonTitle=在這裡下載 Adblock Browser +firstRun_abbPromotionHeadline=有部智能手機或平版電腦? firstRun_acceptableAdsExplanation=我們想鼓勵網站改採簡樸且ä¸éŽæ–¼æ¶çœ¼çš„廣告。這也是我們之所以建立<a>åš´æ ¼çš„è¦ç¯„</a>來辨è˜éžä¾µå…¥å¼å»£å‘Šçš„åŽŸå› ï¼Œé€™ç¨®é¡žåž‹çš„å»£å‘Šé è¨æœƒé¡¯ç¤ºå‡ºä¾†ã€‚è‹¥æ‚¨ä»æƒ³é˜»æ“‹æ‰€æœ‰çš„廣告,å¯ä»¥è¼•鬆地<a>åœç”¨æ¤åŠŸèƒ½</a> 。 firstRun_acceptableAdsHeadline=從ç¾åœ¨èµ·ï¼Œç…©äººçš„廣告都將煙消雲散 firstRun_contributor_credits=è²¢ç»åå–® diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/global.properties b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/global.properties index aa2de1d..9b0161f 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/global.properties +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/global.properties @@ -5,6 +5,7 @@ type_label_script=程å¼ç¢¼ filter_elemhide_nocriteria=沒有指定欲隱è—å…ƒç´ çš„è¾¨è˜å稱 blockingGroup_title=廣告阻擋è¦å‰‡ whitelisted_tooltip=Adblock Plus 在目å‰é é¢åœç”¨ã€‚ +type_label_ping=ping type_label_stylesheet=樣å¼è¡¨ blocked_count_tooltip=?1? é …ï¼Œå…± ?2? é … type_label_font=å—é«” @@ -15,6 +16,7 @@ whitelisted_page=Adblock Plus 已在目å‰é é¢åœç”¨ remove_group_warning=您確定è¦ç§»é™¤æ¤æ¢ä»¶ç¾¤çµ„嗎? action1_tooltip=點擊開啟或關閉å¯é˜»æ“‹é …目清單,按ä¸éµå‰‡å¯å•Ÿç”¨/åœç”¨ Adblock Plus。 type_label_xmlhttprequest=XML 請求 +filter_invalid_regexp=無效的æ£è¦è¡¨ç¤ºæ³• active_tooltip=Adblock Plus 已啟用,?1? 份æ¢ä»¶é›†å·²è¨‚閱,?2? æ¢è‡ªè¨‚æ¢ä»¶å·²ä½¿ç”¨ã€‚ type_label_document=文件 type_label_object_subrequest=物件å請求 @@ -25,11 +27,14 @@ type_label_object=物件 action2_tooltip=點擊開啟å好è¨å®šè¦–窗,按ä¸éµå‰‡å¯å•Ÿç”¨æˆ–åœç”¨ Adblock Plus。 type_label_subdocument=é æ¡† clearStats_warning=這會é‡è¨æ‰€æœ‰çš„æ¢ä»¶å‘½ä¸çµ±è¨ˆä¸¦åœç”¨å‘½ä¸è¨ˆæ•¸å™¨ã€‚您確定è¦é€™éº¼åšï¼Ÿ +filter_unknown_option=未知的篩é¸å™¨é¸é … +type_label_genericblock=通用阻擋 notification_antiadblock_message=已知æ¤ç¶²ç«™æœƒå° Adblock Plus 用戶顯示é‡å°æ€§çš„訊æ¯ã€‚您希望 Adblock Plus éš±è—它們嗎? blocked_count_addendum=(以åŠç™½åå–®: ?1?, 已隱è—: ?2?) subscription_invalid_location=æ¢ä»¶é›†ç¶²å€æˆ–檔案å稱無效。 type_label_image=圖片 remove_subscription_warning=您確定è¦ç§»é™¤æ¤æ¢ä»¶é›†å—Žï¼Ÿ +type_label_generichide=ä¸€èˆ¬æ€§éš±è— type_label_other=å…¶ä»– mobile_menu_enable=ABP:啟用 type_label_media=音訊/影片 @@ -39,3 +44,5 @@ mobile_menu_enable_site=ABP:在 ?1? 啟用 type_label_elemhide=éš±è— newGroup_title=æ–°çš„æ¢ä»¶ç¾¤çµ„ default_dialog_title=Adblock Plus +filter_elemhideemulation_nodomain=No active domain specified for extended element hiding filter +type_label_websocket=websocket diff --git a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/overlay.dtd b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/overlay.dtd index 9f1a3b8..f63c2b2 100644 --- a/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/overlay.dtd +++ b/data/extensions/spyblock@gnu.org/chrome/locale/zh-TW/overlay.dtd @@ -1,6 +1,7 @@ <!ENTITY notification.button.no "&å–æ¶ˆ"> <!ENTITY sync.label "åŒæ¥ Adblo&ck Plus è¨å®šå€¼"> <!ENTITY whitelist.site.label "在 ?1? åœç”¨"> +<!ENTITY notification.closing.button.hide "關閉æ¤é€šçŸ¥"> <!ENTITY filters.label "æ¢ä»¶å好è¨å®š (&F)"> <!ENTITY disable.label "完全åœç”¨"> <!ENTITY objecttab.title "阻擋"> @@ -13,10 +14,12 @@ <!ENTITY notification.button.yes "&確定"> <!ENTITY opensidebar.label "開啟å¯é˜»æ“‹é …ç›® (&b)"> <!ENTITY notification.button.close "&關閉"> +<!ENTITY shownotifications.label "顯示有用的通知 (&n)"> <!ENTITY contribute.label "贊助 Adblock Plus"> <!ENTITY toolbarbutton.label "Adblock Plus"> <!ENTITY context.frame.label "Adblock Plusï¼šé˜»æ“‹é æ¡†"> <!ENTITY blocked.tooltip "æ¤é å·²é˜»æ“‹é …ç›®:"> +<!ENTITY notification.closing.button.optout "åœæ¢é¡¯ç¤ºé€šçŸ¥"> <!ENTITY counthits.label "計算æ¢ä»¶å‘½ä¸æ¬¡æ•¸ (&h)"> <!ENTITY showinstatusbar.label "在狀態列顯示 (&s)"> <!ENTITY sidebar.title "本é å¯é˜»æ“‹é …ç›®"> @@ -28,4 +31,3 @@ <!ENTITY showintoolbar.label "在工具列顯示 (&b)"> <!ENTITY status.tooltip "狀態:"> <!ENTITY context.media.label "Adblock Plus:阻擋音訊/影片"> -<!ENTITY subscription.update.label "æ›´æ–°éŽæ¿¾æ¢ä»¶"> diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-16.png b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-16.png Binary files differindex 27339c7..ee84da0 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-16.png +++ b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-16.png diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-32.png b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-32.png Binary files differindex 7d98d62..f41da4c 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-32.png +++ b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-32.png diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-48.png b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-48.png Binary files differnew file mode 100644 index 0000000..511a921 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-48.png diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-64.png b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-64.png Binary files differnew file mode 100644 index 0000000..3c8c67a --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status-64.png diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status.png b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status.png Binary files differindex e7ecf24..f5eae06 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/abp-status.png +++ b/data/extensions/spyblock@gnu.org/chrome/skin/abp-status.png diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/composer.css b/data/extensions/spyblock@gnu.org/chrome/skin/composer.css index d80eafe..6263eb1 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/composer.css +++ b/data/extensions/spyblock@gnu.org/chrome/skin/composer.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/filters.css b/data/extensions/spyblock@gnu.org/chrome/skin/filters.css index 3576315..f335ceb 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/filters.css +++ b/data/extensions/spyblock@gnu.org/chrome/skin/filters.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -153,10 +153,11 @@ tree * Force left-to-right for filter text but not comments */ treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-invalid), +treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-blocking), treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-whitelist), -treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-filterlist), treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhide), -treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhideexception) +treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhideexception), +treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhideemulation) { direction: ltr; text-align: end; @@ -173,7 +174,8 @@ treechildren::-moz-tree-cell-text(col-filter, type-elemhideexception, selected-f color: #008000; } -treechildren::-moz-tree-cell-text(col-filter, type-elemhide, selected-false) +treechildren::-moz-tree-cell-text(col-filter, type-elemhide, selected-false), +treechildren::-moz-tree-cell-text(col-filter, type-elemhideemulation, selected-false) { color: #000080; } @@ -215,7 +217,55 @@ treechildren::-moz-tree-image(col-slow, slow-true) list-style-image: url(slow.png); } -.findbar-highlight +/* Findbar */ + +#findbar { - display: none; + border-top: 1px solid #888; +} + +#findbar-closebutton +{ + list-style-image: url(close.png); + -moz-image-region: rect(0px, 14px, 14px, 0px); +} + +#findbar-closebutton:hover +{ + -moz-image-region: rect(0px, 28px, 14px, 14px); +} + +#findbar-closebutton:active +{ + -moz-image-region: rect(0px, 42px, 14px, 28px); +} + +#findbar[data-status="notFound"] > #findbar-textbox +{ + /* We cannot change background color because of -moz-appearance but a red */ + /* shadow works. */ + box-shadow: 0 0 1.5px 1px red; +} + +#findbar[data-status="notFound"] > #findbar-textbox[focused="true"] +{ + box-shadow: 0 0 2px 2px rgba(255, 0, 0, 0.4); +} + +#findbar[data-os="darwin"] > #findbar-case-sensitive[checked="true"] +{ + /* Firefox on Mac doesn't indicate checked buttons, do it ourselves */ + filter: brightness(70%); +} + +.findbar-status +{ + font-size: 80%; +} + +#findbar:not([data-status="wrappedStart"]) #findbar-status-wrappedStart, +#findbar:not([data-status="wrappedEnd"]) #findbar-status-wrappedEnd, +#findbar:not([data-status="notFound"]) #findbar-status-notFound +{ + visibility: hidden; } diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/overlay.css b/data/extensions/spyblock@gnu.org/chrome/skin/overlay.css index dca1b46..60ba812 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/overlay.css +++ b/data/extensions/spyblock@gnu.org/chrome/skin/overlay.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -26,10 +26,12 @@ toolbar[iconsize="small"] #abp-toolbarbutton, #PersonalToolbar #abp-toolbarbutton, #header-view-toolbar > #abp-toolbarbutton, -#abp-status { +#abp-status +{ list-style-image: url("abp-status-16.png"); -moz-image-region: rect(0px, 16px, 16px, 0px); } + toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="disabled"], #PersonalToolbar #abp-toolbarbutton[abpstate="disabled"], #header-view-toolbar > #abp-toolbarbutton[abpstate="disabled"], @@ -37,10 +39,59 @@ toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="disabled"], toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="whitelisted"], #PersonalToolbar #abp-toolbarbutton[abpstate="whitelisted"], #header-view-toolbar > #abp-toolbarbutton[abpstate="whitelisted"], -#abp-status[abpstate="whitelisted"] { +#abp-status[abpstate="whitelisted"] +{ -moz-image-region: rect(16px, 16px, 32px, 0px); } +@media screen and (min-resolution: 1.5dppx) +{ + toolbar[iconsize="small"] #abp-toolbarbutton, + #PersonalToolbar #abp-toolbarbutton, + #header-view-toolbar > #abp-toolbarbutton, + #abp-status + { + list-style-image: url("abp-status.png"); + -moz-image-region: rect(0px, 24px, 24px, 0px); + } + + toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="disabled"], + #PersonalToolbar #abp-toolbarbutton[abpstate="disabled"], + #header-view-toolbar > #abp-toolbarbutton[abpstate="disabled"], + #abp-status[abpstate="disabled"], + toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="whitelisted"], + #PersonalToolbar #abp-toolbarbutton[abpstate="whitelisted"], + #header-view-toolbar > #abp-toolbarbutton[abpstate="whitelisted"], + #abp-status[abpstate="whitelisted"] + { + -moz-image-region: rect(24px, 24px, 48px, 0px); + } +} + +@media screen and (min-resolution: 2dppx) +{ + toolbar[iconsize="small"] #abp-toolbarbutton, + #PersonalToolbar #abp-toolbarbutton, + #header-view-toolbar > #abp-toolbarbutton, + #abp-status + { + list-style-image: url("abp-status-32.png"); + -moz-image-region: rect(0px, 32px, 32px, 0px); + } + + toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="disabled"], + #PersonalToolbar #abp-toolbarbutton[abpstate="disabled"], + #header-view-toolbar > #abp-toolbarbutton[abpstate="disabled"], + #abp-status[abpstate="disabled"], + toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="whitelisted"], + #PersonalToolbar #abp-toolbarbutton[abpstate="whitelisted"], + #header-view-toolbar > #abp-toolbarbutton[abpstate="whitelisted"], + #abp-status[abpstate="whitelisted"] + { + -moz-image-region: rect(32px, 32px, 64px, 0px); + } +} + #abp-toolbarbutton[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #abp-toolbarbutton { @@ -56,6 +107,42 @@ toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="whitelisted"] -moz-image-region: rect(32px, 32px, 64px, 0px); } +@media screen and (min-resolution: 1.5dppx) +{ + #abp-toolbarbutton[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #abp-toolbarbutton + { + list-style-image: url("abp-status-48.png"); + -moz-image-region: rect(0px, 48px, 48px, 0px); + } + + #abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="disabled"], + toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="disabled"], + #abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="whitelisted"], + toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="whitelisted"] + { + -moz-image-region: rect(48px, 48px, 96px, 0px); + } +} + +@media screen and (min-resolution: 2dppx) +{ + #abp-toolbarbutton[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #abp-toolbarbutton + { + list-style-image: url("abp-status-64.png"); + -moz-image-region: rect(0px, 64px, 64px, 0px); + } + + #abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="disabled"], + toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="disabled"], + #abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="whitelisted"], + toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="whitelisted"] + { + -moz-image-region: rect(64px, 64px, 128px, 0px); + } +} + #abp-toolbar-popup { list-style-image: none; -moz-image-region: rect(0px, 0px, 0px, 0px); @@ -148,7 +235,9 @@ toolbar[mode="full"] #abp-toolbarbutton[type="menu"] visibility: visible !important; } -#abp-bottombar-close { +#abp-bottombar-close, +#abp-notification-close +{ padding: 4px 2px; border-style: none !important; -moz-user-focus: normal; @@ -157,11 +246,15 @@ toolbar[mode="full"] #abp-toolbarbutton[type="menu"] -moz-image-region: rect(0px, 14px, 14px, 0px); } -#abp-bottombar-close:hover { +#abp-bottombar-close:hover, +#abp-notification-close:hover +{ -moz-image-region: rect(0px, 28px, 14px, 14px); } -#abp-bottombar-close:hover:active { +#abp-bottombar-close:hover:active, +#abp-notification-close:hover:active +{ -moz-image-region: rect(0px, 42px, 14px, 28px); } @@ -224,3 +317,14 @@ toolbar[mode="full"] #abp-toolbarbutton[type="menu"] { text-decoration: underline; } + +#abp-notification.abp-closing #abp-notification-content, +#abp-notification:not(.abp-closing) #abp-notification-close-content +{ + display: none; +} + +#abp-notification-close-content toolbarbutton label +{ + text-align: left; +} diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/sendReport.css b/data/extensions/spyblock@gnu.org/chrome/skin/sendReport.css index 9410880..9a0d769 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/sendReport.css +++ b/data/extensions/spyblock@gnu.org/chrome/skin/sendReport.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -94,6 +94,11 @@ radio, checkbox, .topLabel, #dataDeck overflow-y: scroll; } +#anonymousCheckbox, #extensionsCheckbox +{ + margin-top: 0px; +} + #commentLengthWarning, #anonymityWarning { color: red; @@ -104,6 +109,11 @@ radio, checkbox, .topLabel, #dataDeck visibility: hidden; } +#data +{ + min-height: 50px; +} + /* * Force left-to-right everywhere where we are displaying addresses */ diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/sidebar.css b/data/extensions/spyblock@gnu.org/chrome/skin/sidebar.css index ba511d5..abacee7 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/sidebar.css +++ b/data/extensions/spyblock@gnu.org/chrome/skin/sidebar.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/chrome/skin/subscriptionSelection.css b/data/extensions/spyblock@gnu.org/chrome/skin/subscriptionSelection.css index 44c3080..234277e 100644 --- a/data/extensions/spyblock@gnu.org/chrome/skin/subscriptionSelection.css +++ b/data/extensions/spyblock@gnu.org/chrome/skin/subscriptionSelection.css @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/defaults/prefs.js b/data/extensions/spyblock@gnu.org/defaults/prefs.js deleted file mode 100644 index 655f714..0000000 --- a/data/extensions/spyblock@gnu.org/defaults/prefs.js +++ /dev/null @@ -1,39 +0,0 @@ -// For description of these values see http://adblockplus.org/en/preferences - -pref("extensions.adblockplus.currentVersion", "0.0"); -pref("extensions.adblockplus.enabled", true); -pref("extensions.adblockplus.frameobjects", true); -pref("extensions.adblockplus.fastcollapse", false); -pref("extensions.adblockplus.showinstatusbar", false); -pref("extensions.adblockplus.detachsidebar", false); -pref("extensions.adblockplus.defaulttoolbaraction", 0); -pref("extensions.adblockplus.defaultstatusbaraction", 0); -pref("extensions.adblockplus.sidebar_key", "Accel Shift V, Accel Shift U"); -pref("extensions.adblockplus.sendReport_key", ""); -pref("extensions.adblockplus.filters_key", "Accel Shift E, Accel Shift F, Accel Shift O"); -pref("extensions.adblockplus.enable_key", ""); -pref("extensions.adblockplus.flash_scrolltoitem", true); -pref("extensions.adblockplus.previewimages", true); -pref("extensions.adblockplus.data_directory", "adblockplus"); -pref("extensions.adblockplus.patternsbackups", 5); -pref("extensions.adblockplus.patternsbackupinterval", 24); -pref("extensions.adblockplus.whitelistschemes", "about chrome file irc moz-safe-about news resource snews x-jsd addbook cid imap mailbox nntp pop data javascript moz-icon"); -pref("extensions.adblockplus.subscriptions_autoupdate", true); -pref("extensions.adblockplus.subscriptions_listurl", "https://adblockplus.org/subscriptions2.xml"); -pref("extensions.adblockplus.subscriptions_fallbackurl", "https://adblockplus.org/getSubscription?version=%VERSION%&url=%SUBSCRIPTION%&downloadURL=%URL%&error=%ERROR%&channelStatus=%CHANNELSTATUS%&responseStatus=%RESPONSESTATUS%"); -pref("extensions.adblockplus.subscriptions_fallbackerrors", 5); -pref("extensions.adblockplus.subscriptions_exceptionsurl", "https://easylist-downloads.adblockplus.org/exceptionrules.txt"); -pref("extensions.adblockplus.subscriptions_exceptionscheckbox", true); -pref("extensions.adblockplus.documentation_link", "https://adblockplus.org/redirect?link=%LINK%&lang=%LANG%"); -pref("extensions.adblockplus.savestats", true); -pref("extensions.adblockplus.composer_default", 2); -pref("extensions.adblockplus.clearStatsOnHistoryPurge", true); -pref("extensions.adblockplus.report_submiturl", "https://reports.adblockplus.org/submitReport?version=1&guid=%GUID%&lang=%LANG%"); -pref("extensions.adblockplus.recentReports", []); -pref("extensions.adblockplus.hideContributeButton", false); -pref("extensions.adblockplus.blockableItemsSize", {width: 200, height: 200}); -pref("extensions.adblockplus.notificationurl", "https://notification.adblockplus.org/notification.json"); -pref("extensions.adblockplus.notificationdata", {}); -pref("extensions.adblockplus.subscriptions_antiadblockurl", "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt"); -pref("extensions.adblockplus.please_kill_startup_performance", false); -pref("extensions.adblockplus.suppress_first_run_page", false); diff --git a/data/extensions/spyblock@gnu.org/icon.png b/data/extensions/spyblock@gnu.org/icon.png Binary files differindex 4bb73bf..5f7fad3 100644 --- a/data/extensions/spyblock@gnu.org/icon.png +++ b/data/extensions/spyblock@gnu.org/icon.png diff --git a/data/extensions/spyblock@gnu.org/icon64.png b/data/extensions/spyblock@gnu.org/icon64.png Binary files differindex 5735fd3..d1a9354 100644 --- a/data/extensions/spyblock@gnu.org/icon64.png +++ b/data/extensions/spyblock@gnu.org/icon64.png diff --git a/data/extensions/spyblock@gnu.org/install.rdf b/data/extensions/spyblock@gnu.org/install.rdf index 41999d9..2d8e092 100644 --- a/data/extensions/spyblock@gnu.org/install.rdf +++ b/data/extensions/spyblock@gnu.org/install.rdf @@ -9,55 +9,63 @@ <Description about="urn:mozilla:install-manifest"> <em:id>spyblock@gnu.org</em:id> - <em:version>2.6.9.0</em:version> - <em:multiprocessCompatible>true</em:multiprocessCompatible> + <em:version>2.9.1</em:version> <em:name>SpyBlock</em:name> <em:description>Privacy blacklist filter</em:description> - <em:creator>Based on AdBlock Plus by Wladimir Palant</em:creator><em:contributor>Ruben Rodriguez</em:contributor><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor> + <em:creator>Wladimir Palant</em:creator><em:contributor>Ruben Rodriguez</em:contributor><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor> <em:homepageURL>https://www.gnu.org/software/gnuzilla/</em:homepageURL> <em:type>2</em:type> <em:bootstrap>true</em:bootstrap> + <em:multiprocessCompatible>true</em:multiprocessCompatible> + <em:hasEmbeddedWebExtension>true</em:hasEmbeddedWebExtension> <em:optionsURL>chrome://adblockplus/content/ui/settings.xul</em:optionsURL> <em:optionsType>2</em:optionsType> - + <em:targetApplication> + <Description> + <!-- adblockbrowser --> + <em:id>{55aba3ac-94d3-41a8-9e25-5c21fe874539}</em:id> + <em:minVersion>1.0</em:minVersion> + <em:maxVersion>1.0</em:maxVersion> + </Description> + </em:targetApplication> <em:targetApplication> <Description> <!-- fennec2 --> <em:id>{aa3c5121-dab2-40e2-81ca-7ea25febc110}</em:id> - <em:minVersion>22.0</em:minVersion> - <em:maxVersion>39.0</em:maxVersion> + <em:minVersion>51.0</em:minVersion> + <em:maxVersion>*</em:maxVersion> </Description> </em:targetApplication> <em:targetApplication> <Description> <!-- firefox --> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> - <em:minVersion>22.0</em:minVersion> - <em:maxVersion>39.0</em:maxVersion> + <em:minVersion>51.0</em:minVersion> + <em:maxVersion>*</em:maxVersion> </Description> </em:targetApplication> <em:targetApplication> <Description> <!-- seamonkey --> <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id> - <em:minVersion>2.19</em:minVersion> - <em:maxVersion>2.36</em:maxVersion> + <em:minVersion>2.48</em:minVersion> + <em:maxVersion>*</em:maxVersion> </Description> </em:targetApplication> <em:targetApplication> <Description> <!-- thunderbird --> <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id> - <em:minVersion>22.0</em:minVersion> - <em:maxVersion>39.0</em:maxVersion> + <em:minVersion>51.0</em:minVersion> + <em:maxVersion>54.0</em:maxVersion> </Description> </em:targetApplication> <em:targetApplication> <Description> <!-- toolkit --> <em:id>toolkit@mozilla.org</em:id> - <em:minVersion>22.0</em:minVersion> - <em:maxVersion>39.0</em:maxVersion> + <em:minVersion>51.0</em:minVersion> + <em:maxVersion>*</em:maxVersion> </Description> </em:targetApplication> </Description> diff --git a/data/extensions/spyblock@gnu.org/lib/Public.jsm b/data/extensions/spyblock@gnu.org/lib/Public.jsm index ddd2389..ecd7e95 100644 --- a/data/extensions/spyblock@gnu.org/lib/Public.jsm +++ b/data/extensions/spyblock@gnu.org/lib/Public.jsm @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/lib/antiadblockInit.js b/data/extensions/spyblock@gnu.org/lib/antiadblockInit.js index d4ef326..c5b845f 100644 --- a/data/extensions/spyblock@gnu.org/lib/antiadblockInit.js +++ b/data/extensions/spyblock@gnu.org/lib/antiadblockInit.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,23 +15,28 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ -Cu.import("resource://gre/modules/Services.jsm"); +"use strict"; -let {Utils} = require("utils"); -let {Prefs} = require("prefs"); -let {ActiveFilter} = require("filterClasses"); -let {FilterStorage} = require("filterStorage"); -let {FilterNotifier} = require("filterNotifier"); -let {Subscription} = require("subscriptionClasses"); -let {Notification} = require("notification"); +const {Prefs} = require("prefs"); +const {ActiveFilter} = require("filterClasses"); +const {FilterStorage} = require("filterStorage"); +const {FilterNotifier} = require("filterNotifier"); +const {Subscription} = require("subscriptionClasses"); +const {Notification} = require("notification"); + +let ext; +if (typeof window != "undefined" && window.ext) + ({ext} = window); +else + ext = require("ext_background"); exports.initAntiAdblockNotification = function initAntiAdblockNotification() { let notification = { id: "antiadblock", type: "question", - title: Utils.getString("notification_antiadblock_title"), - message: Utils.getString("notification_antiadblock_message"), + title: ext.i18n.getMessage("notification_antiadblock_title"), + message: ext.i18n.getMessage("notification_antiadblock_message"), urlFilters: [] }; @@ -51,8 +56,9 @@ exports.initAntiAdblockNotification = function initAntiAdblockNotification() { for (let domain in filter.domains) { - let urlFilter = "||" + domain + "^"; - if (domain && filter.domains[domain] && urlFilters.indexOf(urlFilter) == -1) + let urlFilter = "||" + domain + "^$document"; + if (domain && filter.domains[domain] && + urlFilters.indexOf(urlFilter) == -1) urlFilters.push(urlFilter); } } @@ -68,18 +74,25 @@ exports.initAntiAdblockNotification = function initAntiAdblockNotification() Notification.removeQuestionListener(notification.id, notificationListener); } - let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); - if (subscription.lastDownload && subscription.disabled) - addAntiAdblockNotification(subscription); + let antiAdblockSubscription = Subscription.fromURL( + Prefs.subscriptions_antiadblockurl + ); + if (antiAdblockSubscription.lastDownload && antiAdblockSubscription.disabled) + addAntiAdblockNotification(antiAdblockSubscription); - FilterNotifier.addListener(function(action, value, newItem, oldItem) + function onSubscriptionChange(subscription) { - if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.url != Prefs.subscriptions_antiadblockurl) + let url = Prefs.subscriptions_antiadblockurl; + if (url != subscription.url) return; - if (action == "subscription.updated") - addAntiAdblockNotification(value); - else if (action == "subscription.removed" || (action == "subscription.disabled" && !value.disabled)) + if (url in FilterStorage.knownSubscriptions && subscription.disabled) + addAntiAdblockNotification(subscription); + else removeAntiAdblockNotification(); - }); -} + } + + FilterNotifier.on("subscription.updated", onSubscriptionChange); + FilterNotifier.on("subscription.removed", onSubscriptionChange); + FilterNotifier.on("subscription.disabled", onSubscriptionChange); +}; diff --git a/data/extensions/spyblock@gnu.org/lib/appSupport.js b/data/extensions/spyblock@gnu.org/lib/appSupport.js index 992d568..ba8fdd1 100644 --- a/data/extensions/spyblock@gnu.org/lib/appSupport.js +++ b/data/extensions/spyblock@gnu.org/lib/appSupport.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -212,48 +212,6 @@ exports.removeBrowserLocationListeners = function removeBrowserLocationListeners progressListeners.delete(window); }; -/** - * Maps windows to a list of click listeners. - */ -let clickListeners = new WeakMap(); - -/** - * Makes sure that a function is called whenever the user clicks inside the - * browser's content area. - */ -exports.addBrowserClickListener = function addBrowserClickListener(/**Window*/ window, /**Function*/ callback) -{ - let browser = (exports.getBrowser ? exports.getBrowser(window) : null); - if (browser) - { - browser.addEventListener("click", callback, true); - - if (clickListeners.has(window)) - clickListeners.get(window).push(callback); - else - clickListeners.set(window, [callback]); - } -}; - -/** - * Removes all click listeners registered for a window, to be called on - * cleanup. - */ -exports.removeBrowserClickListeners = function removeBrowserClickListeners(/**Window*/ window) -{ - if (!clickListeners.has(window)) - return; - - let browser = (exports.getBrowser ? exports.getBrowser(window) : null); - if (browser) - { - let listeners = clickListeners.get(window); - for (let i = 0; i < listeners.length; i++) - browser.removeEventListener("click", listeners[i], true); - } - clickListeners.delete(window); -}; - let {application} = require("info"); switch (application) { @@ -269,7 +227,7 @@ switch (application) exports.addTab = function ff_addTab(window, url, event) { if (event) - window.openNewTabWith(url, exports.getBrowser(window).contentDocument, null, event, false); + window.openNewTabWith(url, null, null, event, false); else window.gBrowser.loadOneTab(url, {inBackground: false}); }; @@ -317,7 +275,7 @@ switch (application) exports.addTab = function sm_addTab(window, url, event) { if (event || !("gBrowser" in window)) - window.openNewTabWith(url, ("gBrowser" in window ? window.gBrowser.contentDocument : null), null, event, false); + window.openNewTabWith(url, null, null, event, false); else window.gBrowser.loadOneTab(url, {inBackground: false}); }; @@ -359,7 +317,7 @@ switch (application) return (browser ? browser.currentURI : null); } }; - + // for Seamonkey we have to ignore same document flag because of // bug #1035171 (https://bugzilla.mozilla.org/show_bug.cgi?id=1035171) let origAddBrowserLocationListener = exports.addBrowserLocationListener; @@ -617,40 +575,6 @@ switch (application) progressListeners.delete(window); }; - exports.addBrowserClickListener = function addBrowserClickListener(/**Window*/ window, /**Function*/ callback) - { - if (clickListeners.has(window)) - { - clickListeners.get(window).callbacks.push(callback); - return; - } - - let callbacks = [callback]; - let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser) - { - if (oldBrowser) - for (let i = 0; i < callbacks.length; i++) - oldBrowser.removeEventListener("click", callbacks[i], true); - if (newBrowser) - for (let i = 0; i < callbacks.length; i++) - newBrowser.addEventListener("click", callbacks[i], true); - }); - listener.callbacks = callbacks; - - clickListeners.set(window, listener); - }; - - exports.removeBrowserClickListeners = function removeBrowserClickListeners(/**Window*/ window) - { - if (!clickListeners.has(window)) - return; - - let listener = clickListeners.get(window); - listener.detach(); - - clickListeners.delete(window); - }; - // Make sure to close/reopen list of blockable items when the user changes tabs let {WindowObserver} = require("windowObserver"); new WindowObserver({ @@ -690,6 +614,7 @@ switch (application) } case "fennec2": + case "adblockbrowser": { exports.isKnownWindow = (window) => window.document.documentElement.id == "main-window"; @@ -805,40 +730,6 @@ switch (application) progressListeners.delete(window); }; - exports.addBrowserClickListener = function ffn_addBrowserClickListener(/**Window*/ window, /**Function*/ callback) - { - if (clickListeners.has(window)) - { - clickListeners.get(window).callbacks.push(callback); - return; - } - - let callbacks = [callback]; - let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser) - { - if (oldBrowser) - for (let i = 0; i < callbacks.length; i++) - oldBrowser.removeEventListener("click", callbacks[i], true); - if (newBrowser) - for (let i = 0; i < callbacks.length; i++) - newBrowser.addEventListener("click", callbacks[i], true); - }); - listener.callbacks = callbacks; - - clickListeners.set(window, listener); - }; - - exports.removeBrowserClickListeners = function ffn_removeBrowserClickListeners(/**Window*/ window) - { - if (!clickListeners.has(window)) - return; - - let listener = clickListeners.get(window); - listener.detach(); - - clickListeners.delete(window); - }; - let {Filter} = require("filterClasses"); let {Prefs} = require("prefs"); let {Policy} = require("contentPolicy"); @@ -876,7 +767,7 @@ switch (application) onShutdown.add(function() { let window = null; - for (window in UI.applicationWindows) + for (window of UI.applicationWindows) break; if (window && menuItem) diff --git a/data/extensions/spyblock@gnu.org/lib/child/bootstrap.js b/data/extensions/spyblock@gnu.org/lib/child/bootstrap.js new file mode 100644 index 0000000..477ca44 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/bootstrap.js @@ -0,0 +1,97 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +(function() +{ + const Cc = Components.classes; + const Ci = Components.interfaces; + const Cr = Components.results; + const Cu = Components.utils; + + let {Loader, main, unload} = Cu.import("resource://gre/modules/commonjs/toolkit/loader.js", {}); + let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + + Cu.importGlobalProperties(["atob", "btoa", "File", "URL", "URLSearchParams", + "TextDecoder", "TextEncoder"]); + + let shutdownHandlers = []; + let onShutdown = + { + done: false, + add: function(handler) + { + if (shutdownHandlers.indexOf(handler) < 0) + shutdownHandlers.push(handler); + }, + remove: function(handler) + { + let index = shutdownHandlers.indexOf(handler); + if (index >= 0) + shutdownHandlers.splice(index, 1); + } + }; + + function init() + { + let url = new URL(Components.stack.filename); + let params = new URLSearchParams(url.search.substr(1)); + let info = JSON.parse(params.get("info")); + + let loader = Loader({ + paths: { + "": info.addonRoot + "lib/" + }, + globals: { + Components, Cc, Ci, Cu, Cr, atob, btoa, File, URL, URLSearchParams, + TextDecoder, TextEncoder, onShutdown + }, + modules: {"info": info, "messageManager": this}, + id: info.addonID + }); + onShutdown.add(() => unload(loader, "disable")) + + main(loader, "child/main"); + } + + function shutdown(message) + { + if (message.data == Components.stack.filename) + { + onShutdown.done = true; + for (let i = shutdownHandlers.length - 1; i >= 0; i --) + { + try + { + shutdownHandlers[i](); + } + catch (e) + { + Cu.reportError(e); + } + } + shutdownHandlers = null; + } + } + + addMessageListener("AdblockPlus:Shutdown", shutdown); + onShutdown.add(() => + { + removeMessageListener("AdblockPlus:Shutdown", shutdown); + }); + + init(); +})(); diff --git a/data/extensions/spyblock@gnu.org/lib/child/contentPolicy.js b/data/extensions/spyblock@gnu.org/lib/child/contentPolicy.js new file mode 100644 index 0000000..97ea7b1 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/contentPolicy.js @@ -0,0 +1,518 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview Content policy implementation, responsible for blocking things. + */ + +"use strict"; + +try +{ + // Hack: SDK loader masks our Components object with a getter. + let proto = Object.getPrototypeOf(this); + let property = Object.getOwnPropertyDescriptor(proto, "Components"); + if (property && property.get) + delete proto.Components; +} +catch (e) +{ + Cu.reportError(e); +} + +let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + +let {port} = require("messaging"); +let {Utils} = require("utils"); +let {getFrames, isPrivate, getRequestWindow} = require("child/utils"); +let {objectMouseEventHander} = require("child/objectTabs"); +let {RequestNotifier} = require("child/requestNotifier"); + +/** + * Randomly generated class name, to be applied to collapsed nodes. + * @type Promise.<string> + */ +let collapsedClass = port.emitWithResponse("getCollapsedClass"); + +/** + * Maps numerical content type IDs to strings. + * @type Map.<number,string> + */ +let types = new Map(); + +/** + * Contains nodes stored by storeNodes() mapped by their IDs. + * @type Map.<string,DOMNode[]> + */ +let storedNodes = new Map(); + +/** + * Process-dependent prefix to be used for unique nodes identifiers returned + * by storeNodes(). + * @type string + */ +let nodesIDPrefix = Services.appinfo.processID + " "; + +/** + * Counter used to generate unique nodes identifiers in storeNodes(). + * @type number + */ +let maxNodesID = 0; + +port.on("deleteNodes", onDeleteNodes); +port.on("refilterNodes", onRefilterNodes); + +/** + * Processes parent's response to the ShouldAllow message. + * @param {nsIDOMWindow} window window that the request is associated with + * @param {nsIDOMElement} node DOM element that the request is associated with + * @param {Object|undefined} response object received as response + * @return {Boolean} false if the request should be blocked + */ +function processPolicyResponse(window, node, response) +{ + if (typeof response == "undefined") + return true; + + let {allow, collapse, hits} = response; + let isObject = false; + for (let hit of hits) + { + if (hit.contentType == "OBJECT") + isObject = true; + + let context = node; + if (typeof hit.frameIndex == "number") + { + context = window; + for (let i = 0; i < hit.frameIndex; i++) + context = context.parent; + context = context.document; + } + RequestNotifier.addNodeData(context, window.top, hit); + } + + if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) + { + // Track mouse events for objects + if (allow && isObject) + { + node.addEventListener("mouseover", objectMouseEventHander, true); + node.addEventListener("mouseout", objectMouseEventHander, true); + } + + if (collapse) + schedulePostProcess(node); + } + return allow; +} + +/** + * Checks whether a request should be allowed, hides it if necessary + * @param {nsIDOMWindow} window + * @param {nsIDOMElement} node + * @param {String} contentType + * @param {String} location location of the request, filter key if contentType is ELEMHIDE + * @return {Boolean} false if the request should be blocked + */ +let shouldAllow = exports.shouldAllow = function(window, node, contentType, location) +{ + return processPolicyResponse(window, node, port.emitSync("shouldAllow", { + contentType, + location, + frames: getFrames(window), + isPrivate: isPrivate(window) + })); +}; + +/** + * Asynchronously checks whether a request should be allowed. + * @param {nsIDOMWindow} window + * @param {nsIDOMElement} node + * @param {String} contentType + * @param {String} location location of the request, filter key if contentType is ELEMHIDE + * @param {Function} callback callback to be called with a boolean value, if + * false the request should be blocked + */ +let shouldAllowAsync = exports.shouldAllowAsync = function(window, node, contentType, location, callback) +{ + port.emitWithResponse("shouldAllow", { + contentType, + location, + frames: getFrames(window), + isPrivate: isPrivate(window) + }).then(response => + { + callback(processPolicyResponse(window, node, response)); + }); +}; + +/** + * Stores nodes and generates a unique ID for them that can be used for + * Policy.refilterNodes() later. It's important that Policy.deleteNodes() is + * called later, otherwise the nodes will be leaked. + * @param {DOMNode[]} nodes list of nodes to be stored + * @return {string} unique ID for the nodes + */ +let storeNodes = exports.storeNodes = function(nodes) +{ + let id = nodesIDPrefix + (++maxNodesID); + storedNodes.set(id, nodes); + return id; +}; + +/** + * Called via message whenever Policy.deleteNodes() is called in the parent. + */ +function onDeleteNodes(id, sender) +{ + storedNodes.delete(id); +} + +/** + * Called via message whenever Policy.refilterNodes() is called in the parent. + */ +function onRefilterNodes({nodesID, entry}, sender) +{ + let nodes = storedNodes.get(nodesID); + if (nodes) + for (let node of nodes) + if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) + Utils.runAsync(refilterNode.bind(this, node, entry)); +} + +/** + * Re-checks filters on an element. + */ +function refilterNode(/**Node*/ node, /**Object*/ entry) +{ + let wnd = Utils.getWindow(node); + if (!wnd || wnd.closed) + return; + + if (entry.type == "OBJECT") + { + node.removeEventListener("mouseover", objectMouseEventHander, true); + node.removeEventListener("mouseout", objectMouseEventHander, true); + } + + shouldAllow(wnd, node, entry.type, entry.location, (allow) => { + // Force node to be collapsed + if (!allow) + schedulePostProcess(node) + }); +} + +/** + * Actual nsIContentPolicy and nsIChannelEventSink implementation + * @class + */ +var PolicyImplementation = +{ + classDescription: "Adblock Plus content policy", + classID: Components.ID("cfeaabe6-1dd1-11b2-a0c6-cb5c268894c9"), + contractID: "@adblockplus.org/abp/policy;1", + xpcom_categories: ["content-policy", "net-channel-event-sinks"], + + /** + * Registers the content policy on startup. + */ + init: function() + { + // Populate types map + let iface = Ci.nsIContentPolicy; + for (let name in iface) + if (name.indexOf("TYPE_") == 0 && name != "TYPE_DATAREQUEST") + types.set(iface[name], name.substr(5)); + + let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); + registrar.registerFactory(this.classID, this.classDescription, this.contractID, this); + + let catMan = Utils.categoryManager; + for (let category of this.xpcom_categories) + catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true); + + Services.obs.addObserver(this, "document-element-inserted", true); + + onShutdown.add(() => + { + Services.obs.removeObserver(this, "document-element-inserted"); + + for (let category of this.xpcom_categories) + catMan.deleteCategoryEntry(category, this.contractID, false); + + registrar.unregisterFactory(this.classID, this); + }); + }, + + // + // nsISupports interface implementation + // + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy, Ci.nsIObserver, + Ci.nsIChannelEventSink, Ci.nsIFactory, Ci.nsISupportsWeakReference]), + + // + // nsIContentPolicy interface implementation + // + + shouldLoad: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra) + { + // Ignore requests without context and top-level documents + if (!node || contentType == Ci.nsIContentPolicy.TYPE_DOCUMENT) + return Ci.nsIContentPolicy.ACCEPT; + + // Bail out early for chrome: an resource: URLs, this is a work-around for + // https://bugzil.la/1127744 and https://bugzil.la/1247640 + let location = Utils.unwrapURL(contentLocation); + if (location.schemeIs("chrome") || location.schemeIs("resource")) + return Ci.nsIContentPolicy.ACCEPT; + + // Ignore standalone objects + if (contentType == Ci.nsIContentPolicy.TYPE_OBJECT && node.ownerDocument && !/^text\/|[+\/]xml$/.test(node.ownerDocument.contentType)) + return Ci.nsIContentPolicy.ACCEPT; + + let wnd = Utils.getWindow(node); + if (!wnd) + return Ci.nsIContentPolicy.ACCEPT; + + // Data loaded by plugins should be associated with the document + if (contentType == Ci.nsIContentPolicy.TYPE_OBJECT_SUBREQUEST && node instanceof Ci.nsIDOMElement) + node = node.ownerDocument; + + // Fix type for objects misrepresented as frames or images + if (contentType != Ci.nsIContentPolicy.TYPE_OBJECT && (node instanceof Ci.nsIDOMHTMLObjectElement || node instanceof Ci.nsIDOMHTMLEmbedElement)) + contentType = Ci.nsIContentPolicy.TYPE_OBJECT; + + let result = shouldAllow(wnd, node, types.get(contentType), location.spec); + return (result ? Ci.nsIContentPolicy.ACCEPT : Ci.nsIContentPolicy.REJECT_REQUEST); + }, + + shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) + { + return Ci.nsIContentPolicy.ACCEPT; + }, + + // + // nsIObserver interface implementation + // + _openers: new WeakMap(), + _alreadyLoaded: Symbol(), + + observe: function(subject, topic, data, uri) + { + switch (topic) + { + case "document-element-inserted": + { + let window = subject.defaultView; + if (!window) + return; + + let type = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShellTreeItem) + .itemType; + if (type != Ci.nsIDocShellTreeItem.typeContent) + return; + + let opener = this._openers.get(window); + if (opener == this._alreadyLoaded) + { + // This window has loaded already, ignore it regardless of whether + // window.opener is still set. + return; + } + + if (opener && Cu.isDeadWrapper(opener)) + opener = null; + + if (!opener) + { + // We don't know the opener for this window yet, try to find it + opener = window.opener; + if (!opener) + return; + + // The opener might be an intermediate window, get the real one + while (opener.location == "about:blank" && opener.opener) + opener = opener.opener; + + this._openers.set(window, opener); + + let forgetPopup = event => + { + subject.removeEventListener("DOMContentLoaded", forgetPopup); + this._openers.set(window, this._alreadyLoaded); + }; + subject.addEventListener("DOMContentLoaded", forgetPopup); + } + + if (!uri) + uri = window.location.href; + if (!shouldAllow(opener, opener.document, "POPUP", uri)) + { + window.stop(); + Utils.runAsync(() => window.close()); + } + else if (uri == "about:blank") + { + // An about:blank pop-up most likely means that a load will be + // initiated asynchronously. Wait for that. + Utils.runAsync(() => + { + let channel = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDocShell) + .QueryInterface(Ci.nsIDocumentLoader) + .documentChannel; + if (channel) + this.observe(subject, topic, data, channel.URI.spec); + }); + } + break; + } + } + }, + + // + // nsIChannelEventSink interface implementation + // + + asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) + { + let async = false; + try + { + // nsILoadInfo.contentPolicyType was introduced in Gecko 35, then + // renamed to nsILoadInfo.externalContentPolicyType in Gecko 44. + let loadInfo = oldChannel.loadInfo; + let contentType = ("externalContentPolicyType" in loadInfo ? + loadInfo.externalContentPolicyType : loadInfo.contentPolicyType); + if (!contentType) + return; + + let wnd = getRequestWindow(newChannel); + if (!wnd) + return; + + if (contentType == Ci.nsIContentPolicy.TYPE_DOCUMENT) + { + if (wnd.history.length <= 1 && wnd.opener) + { + // Special treatment for pop-up windows - this will close the window + // rather than preventing the redirect. Note that we might not have + // seen the original channel yet because the redirect happened before + // the async code in observe() had a chance to run. + this.observe(wnd.document, "document-element-inserted", null, oldChannel.URI.spec); + this.observe(wnd.document, "document-element-inserted", null, newChannel.URI.spec); + } + return; + } + + shouldAllowAsync(wnd, wnd.document, types.get(contentType), newChannel.URI.spec, function(allow) + { + callback.onRedirectVerifyCallback(allow ? Cr.NS_OK : Cr.NS_BINDING_ABORTED); + }); + async = true; + } + catch (e) + { + // We shouldn't throw exceptions here - this will prevent the redirect. + Cu.reportError(e); + } + finally + { + if (!async) + callback.onRedirectVerifyCallback(Cr.NS_OK); + } + }, + + // + // nsIFactory interface implementation + // + + createInstance: function(outer, iid) + { + if (outer) + throw Cr.NS_ERROR_NO_AGGREGATION; + return this.QueryInterface(iid); + } +}; +PolicyImplementation.init(); + +/** + * Nodes scheduled for post-processing (might be null). + * @type Node[] + */ +let scheduledNodes = null; + +/** + * Schedules a node for post-processing. + */ +function schedulePostProcess(/**Element*/ node) +{ + if (scheduledNodes) + scheduledNodes.push(node); + else + { + scheduledNodes = [node]; + Utils.runAsync(postProcessNodes); + } +} + +/** + * Processes nodes scheduled for post-processing (typically hides them). + */ +function postProcessNodes() +{ + collapsedClass.then(cls => + { + let nodes = scheduledNodes; + scheduledNodes = null; + + // Resolving class is async initially so the nodes might have already been + // processed in the meantime. + if (!nodes) + return; + + for (let node of nodes) + { + // adjust frameset's cols/rows for frames + let parentNode = node.parentNode; + if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement) + { + let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0); + let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0); + if ((hasCols || hasRows) && !(hasCols && hasRows)) + { + let index = -1; + for (let frame = node; frame; frame = frame.previousSibling) + if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof Ci.nsIDOMHTMLFrameSetElement) + index++; + + let property = (hasCols ? "cols" : "rows"); + let weights = parentNode[property].split(","); + weights[index] = "0"; + parentNode[property] = weights.join(","); + } + } + else + node.classList.add(cls); + } + }); +} diff --git a/data/extensions/spyblock@gnu.org/lib/child/contextMenu.js b/data/extensions/spyblock@gnu.org/lib/child/contextMenu.js new file mode 100644 index 0000000..297ef3e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/contextMenu.js @@ -0,0 +1,137 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); +let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); + +let {Utils} = require("utils"); +let {RequestNotifier} = require("child/requestNotifier"); +let {storeNodes} = require("child/contentPolicy"); + +/** + * Determines the context menu entries to be shown for a contextmenu event. + * @param {Event} event + * @return {Array} + */ +function getContextInfo(event) +{ + let items = []; + let target = event.target; + if (target.localName == "menupopup" && target.triggerNode) + { + // SeaMonkey gives us the context menu's popupshowing event + target = target.triggerNode; + } + if (target instanceof Ci.nsIDOMHTMLMapElement || target instanceof Ci.nsIDOMHTMLAreaElement) + { + // HTML image maps will usually receive events when the mouse pointer is + // over a different element, get the real event target. + let rect = target.getClientRects()[0]; + target = target.ownerDocument.elementFromPoint(Math.max(rect.left, 0), Math.max(rect.top, 0)); + } + + if (!target) + return items; + + let addMenuItem = function([node, nodeData]) + { + let nodeID = null; + if (node && node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) + nodeID = storeNodes([node]); + items.push([nodeID, nodeData]); + }.bind(this); + + // Look up data that we have for the node + let data = RequestNotifier.getDataForNode(target); + let hadImage = false; + if (data && !data[1].filter) + { + addMenuItem(data); + hadImage = (data[1].type == "IMAGE"); + } + + // Look for frame data + let wnd = Utils.getWindow(target); + if (wnd.frameElement) + { + let data = RequestNotifier.getDataForNode(wnd.frameElement, true); + if (data && !data[1].filter) + addMenuItem(data); + } + + // Look for a background image + if (!hadImage) + { + let extractImageURL = function(computedStyle, property) + { + let value = computedStyle.getPropertyCSSValue(property); + // CSSValueList + if ("length" in value && value.length >= 1) + value = value[0]; + // CSSValuePrimitiveType + if ("primitiveType" in value && value.primitiveType == value.CSS_URI) + return Utils.unwrapURL(value.getStringValue()).spec; + + return null; + }; + + let node = target; + while (node) + { + if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) + { + let style = wnd.getComputedStyle(node, ""); + let bgImage = extractImageURL(style, "background-image") || extractImageURL(style, "list-style-image"); + if (bgImage) + { + let data = RequestNotifier.getDataForNode(wnd.document, true, "IMAGE", bgImage); + if (data && !data[1].filter) + { + addMenuItem(data); + break; + } + } + } + + node = node.parentNode; + } + } + + return items; +}; + +let ContextMenuObserver = +{ + observe: function(subject, topic, data) + { + if (subject.wrappedJSObject) + subject = subject.wrappedJSObject; + + if (subject.addonInfo) + subject.addonInfo.adblockplus = getContextInfo(subject.event); + }, + QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) +}; + +Services.obs.addObserver(ContextMenuObserver, "content-contextmenu", true); +Services.obs.addObserver(ContextMenuObserver, "AdblockPlus:content-contextmenu", true); +onShutdown.add(() => { + Services.obs.removeObserver(ContextMenuObserver, "content-contextmenu"); + Services.obs.removeObserver(ContextMenuObserver, "AdblockPlus:content-contextmenu"); +}); diff --git a/data/extensions/spyblock@gnu.org/lib/child/dataCollector.js b/data/extensions/spyblock@gnu.org/lib/child/dataCollector.js new file mode 100644 index 0000000..09c334a --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/dataCollector.js @@ -0,0 +1,108 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview Collects some data for a content window, to be attached to + * issue reports. + */ + +"use strict"; + +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); +let {Task} = Cu.import("resource://gre/modules/Task.jsm", {}); +let {PrivateBrowsingUtils} = Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm", {}); + +let {port} = require("messaging"); +let {Utils} = require("utils"); + +port.on("collectData", onCollectData); + +function onCollectData({outerWindowID, screenshotWidth}, sender) +{ + let window = Services.wm.getOuterWindowWithId(outerWindowID); + if (window) + { + return Task.spawn(function*() + { + let data = {}; + data.isPrivate = PrivateBrowsingUtils.isContentWindowPrivate(window); + data.opener = window.opener ? window.opener.location.href : null; + data.referrer = window.document.referrer; + data.frames = yield scanFrames(window); + data.screenshot = yield createScreenshot(window, screenshotWidth); + return data; + }); + } +} + +function scanFrames(window) +{ + let frames = []; + for (let i = 0; i < window.frames.length; i++) + { + let frame = window.frames[i]; + frames.push({ + url: frame.location.href, + frames: scanFrames(frame) + }); + } + return frames; +} + +function* createScreenshot(window, screenshotWidth) +{ + let canvas = window.document.createElement("canvas"); + canvas.width = screenshotWidth; + + let context = canvas.getContext("2d"); + let wndWidth = window.document.documentElement.scrollWidth; + let wndHeight = window.document.documentElement.scrollHeight; + + // Copy scaled screenshot of the webpage, according to the specified width. + + // Gecko doesn't like sizes more than 64k, restrict to 30k to be on the safe side. + // Also, make sure height is at most five times the width to keep image size down. + let copyWidth = Math.min(wndWidth, 30000); + let copyHeight = Math.min(wndHeight, 30000, copyWidth * 5); + let copyX = Math.max(Math.min(window.scrollX - copyWidth / 2, wndWidth - copyWidth), 0); + let copyY = Math.max(Math.min(window.scrollY - copyHeight / 2, wndHeight - copyHeight), 0); + + let scalingFactor = screenshotWidth / copyWidth; + canvas.height = copyHeight * scalingFactor; + + context.save(); + context.scale(scalingFactor, scalingFactor); + context.drawWindow(window, copyX, copyY, copyWidth, copyHeight, "rgb(255,255,255)"); + context.restore(); + + // Reduce colors + let pixelData = context.getImageData(0, 0, canvas.width, canvas.height); + let data = pixelData.data; + let mapping = [0x00, 0x55, 0xAA, 0xFF]; + for (let i = 0; i < data.length; i++) + { + data[i] = mapping[data[i] >> 6]; + + if (i % 5000 == 0) + { + // Take a break every 5000 bytes to prevent browser hangs + yield new Promise((resolve, reject) => Utils.runAsync(resolve)); + } + } + + return pixelData; +} diff --git a/data/extensions/spyblock@gnu.org/lib/child/elemHide.js b/data/extensions/spyblock@gnu.org/lib/child/elemHide.js new file mode 100644 index 0000000..988adee --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/elemHide.js @@ -0,0 +1,403 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview Serves CSS for element hiding and processes hits. + */ + +try +{ + // Hack: SDK loader masks our Components object with a getter. + let proto = Object.getPrototypeOf(this); + let property = Object.getOwnPropertyDescriptor(proto, "Components"); + if (property && property.get) + delete proto.Components; +} +catch (e) +{ + Cu.reportError(e); +} + +let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + +let {shouldAllowAsync} = require("child/contentPolicy"); +let {getFrames, isPrivate, getRequestWindow} = require("child/utils"); +let {RequestNotifier} = require("child/requestNotifier"); +let {port} = require("messaging"); +let {Utils} = require("utils"); + +const notImplemented = () => Cr.NS_ERROR_NOT_IMPLEMENTED; + +/** + * about: URL module used to count hits. + * @class + */ +let AboutHandler = +{ + classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"), + classDescription: "Element hiding hit registration protocol handler", + aboutPrefix: "abp-elemhide", + + /** + * Registers handler on startup. + */ + init: function() + { + let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); + registrar.registerFactory(this.classID, this.classDescription, + "@mozilla.org/network/protocol/about;1?what=" + this.aboutPrefix, this); + onShutdown.add(function() + { + registrar.unregisterFactory(this.classID, this); + }.bind(this)); + }, + + // + // Factory implementation + // + + createInstance: function(outer, iid) + { + if (outer != null) + throw Cr.NS_ERROR_NO_AGGREGATION; + + return this.QueryInterface(iid); + }, + + // + // About module implementation + // + + getURIFlags: function(uri) + { + return Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT; + }, + + newChannel: function(uri, loadInfo) + { + let match = /\?hit(\d+)$/.exec(uri.path); + if (match) + return new HitRegistrationChannel(uri, loadInfo, match[1]); + + match = /\?css(?:=(.*?))?(&specificonly)?$/.exec(uri.path); + if (match) + { + return new StyleDataChannel(uri, loadInfo, + match[1] ? decodeURIComponent(match[1]) : null, !!match[2]); + } + + throw Cr.NS_ERROR_FAILURE; + }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, Ci.nsIAboutModule]) +}; +AboutHandler.init(); + +/** + * Base class for channel implementations, subclasses usually only need to + * override BaseChannel._getResponse() method. + * @constructor + */ +function BaseChannel(uri, loadInfo) +{ + this.URI = this.originalURI = uri; + this.loadInfo = loadInfo; +} +BaseChannel.prototype = { + URI: null, + originalURI: null, + contentCharset: "utf-8", + contentLength: 0, + contentType: null, + owner: Utils.systemPrincipal, + securityInfo: null, + notificationCallbacks: null, + loadFlags: 0, + loadGroup: null, + name: null, + status: Cr.NS_OK, + + _getResponse: notImplemented, + + _checkSecurity: function() + { + if (!this.loadInfo.triggeringPrincipal.equals(Utils.systemPrincipal)) + throw Cr.NS_ERROR_FAILURE; + }, + + asyncOpen: function(listener, context) + { + Promise.resolve(this._getResponse()).then(data => + { + let stream = Cc["@mozilla.org/io/string-input-stream;1"] + .createInstance(Ci.nsIStringInputStream); + stream.setData(data, data.length); + + try + { + listener.onStartRequest(this, context); + } + catch(e) + { + // Listener failing isn't our problem + } + + try + { + listener.onDataAvailable(this, context, stream, 0, stream.available()); + } + catch(e) + { + // Listener failing isn't our problem + } + + try + { + listener.onStopRequest(this, context, Cr.NS_OK); + } + catch(e) + { + // Listener failing isn't our problem + } + }); + }, + + asyncOpen2: function(listener) + { + this._checkSecurity(); + this.asyncOpen(listener, null); + }, + + open: function() + { + let data = this._getResponse(); + if (typeof data.then == "function") + throw Cr.NS_ERROR_NOT_IMPLEMENTED; + + let stream = Cc["@mozilla.org/io/string-input-stream;1"] + .createInstance(Ci.nsIStringInputStream); + stream.setData(data, data.length); + return stream; + }, + + open2: function() + { + this._checkSecurity(); + return this.open(); + }, + + isPending: () => false, + cancel: notImplemented, + suspend: notImplemented, + resume: notImplemented, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannel, Ci.nsIRequest]) +}; + +/** + * Channel returning CSS data for the global as well as site-specific stylesheet. + * @constructor + */ +function StyleDataChannel(uri, loadInfo, domain, specificOnly) +{ + BaseChannel.call(this, uri, loadInfo); + this._domain = domain; + this._specificOnly = specificOnly; +} +StyleDataChannel.prototype = { + __proto__: BaseChannel.prototype, + contentType: "text/css", + _domain: null, + + _getResponse: function() + { + function escapeChar(match) + { + return "\\" + match.charCodeAt(0).toString(16) + " "; + } + + // Would be great to avoid sync messaging here but nsIStyleSheetService + // insists on opening channels synchronously. + let [selectors, keys] = (this._domain ? + port.emitSync("getSelectorsForDomain", [this._domain, this._specificOnly]) : + port.emitSync("getUnconditionalSelectors")); + + let cssPrefix = "{-moz-binding: url(about:abp-elemhide?hit"; + let cssSuffix = "#dummy) !important;}\n"; + let result = []; + + for (let i = 0; i < selectors.length; i++) + { + let selector = selectors[i]; + let key = keys[i]; + result.push(selector.replace(/[^\x01-\x7F]/g, escapeChar), + cssPrefix, key, cssSuffix); + } + + return result.join(""); + } +}; + +/** + * Channel returning data for element hiding hits. + * @constructor + */ +function HitRegistrationChannel(uri, loadInfo, key) +{ + BaseChannel.call(this, uri, loadInfo); + this.key = key; +} +HitRegistrationChannel.prototype = { + __proto__: BaseChannel.prototype, + key: null, + contentType: "text/xml", + + _getResponse: function() + { + let window = getRequestWindow(this); + port.emitWithResponse("registerElemHideHit", { + key: this.key, + frames: getFrames(window), + isPrivate: isPrivate(window) + }).then(hit => + { + if (hit) + RequestNotifier.addNodeData(window.document, window.top, hit); + }); + return "<bindings xmlns='http://www.mozilla.org/xbl'/>"; + } +}; + +let observer = { + QueryInterface: XPCOMUtils.generateQI([ + Ci.nsIObserver, Ci.nsISupportsWeakReference + ]), + + topic: "document-element-inserted", + styleURL: Utils.makeURI("about:abp-elemhide?css"), + sheet: null, + + init: function() + { + Services.obs.addObserver(this, this.topic, true); + onShutdown.add(() => + { + Services.obs.removeObserver(this, this.topic); + }); + + port.on("elemhideupdate", () => + { + this.sheet = null; + }); + }, + + observe: function(subject, topic, data) + { + if (topic != this.topic) + return; + + let window = subject.defaultView; + if (!window) + { + // This is typically XBL bindings and SVG images, but also real + // documents occasionally - probably due to speculative loading? + return; + } + let type = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShellTreeItem) + .itemType; + if (type != Ci.nsIDocShellTreeItem.typeContent) + return; + + port.emitWithResponse("elemhideEnabled", { + frames: getFrames(window), + isPrivate: isPrivate(window) + }).then(({ + enabled, contentType, docDomain, thirdParty, location, filter, + filterType + }) => + { + if (Cu.isDeadWrapper(window)) + { + // We are too late, the window is gone already. + return; + } + + if (enabled) + { + let utils = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils); + + // If we have a filter hit at this point then it must be a $generichide + // filter - apply only specific element hiding filters. + let specificOnly = !!filter; + if (!specificOnly) + { + if (!this.sheet) + { + this.sheet = Utils.styleService.preloadSheet(this.styleURL, + Ci.nsIStyleSheetService.USER_SHEET); + } + + try + { + utils.addSheet(this.sheet, Ci.nsIStyleSheetService.USER_SHEET); + } + catch (e) + { + // Ignore NS_ERROR_ILLEGAL_VALUE - it will be thrown if we try to add + // the stylesheet multiple times to the same document (the observer + // will be notified twice for some documents). + if (e.result != Cr.NS_ERROR_ILLEGAL_VALUE) + throw e; + } + } + + let host = window.location.hostname; + if (host) + { + try + { + let suffix = "=" + encodeURIComponent(host); + if (specificOnly) + suffix += "&specificonly"; + utils.loadSheetUsingURIString(this.styleURL.spec + suffix, + Ci.nsIStyleSheetService.USER_SHEET); + } + catch (e) + { + // Ignore NS_ERROR_ILLEGAL_VALUE - it will be thrown if we try to add + // the stylesheet multiple times to the same document (the observer + // will be notified twice for some documents). + if (e.result != Cr.NS_ERROR_ILLEGAL_VALUE) + throw e; + } + } + } + + if (filter) + { + RequestNotifier.addNodeData(window.document, window.top, { + contentType, docDomain, thirdParty, location, filter, filterType + }); + } + }); + } +}; +observer.init(); diff --git a/data/extensions/spyblock@gnu.org/lib/child/elemHideEmulation.js b/data/extensions/spyblock@gnu.org/lib/child/elemHideEmulation.js new file mode 100644 index 0000000..7c4ee17 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/elemHideEmulation.js @@ -0,0 +1,118 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +(function() +{ + let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + + let {port} = require("messaging"); + let {getFrames, isPrivate} = require("child/utils"); + let {RequestNotifier} = require("child/requestNotifier"); + + function getFilters(window, callback) + { + let message = { + frames: getFrames(window), + payload: { + type: "filters.get", + what: "elemhideemulation" + } + }; + port.emitWithResponse("ext_message", message).then(callback); + } + + function addUserCSS(window, cssCode) + { + let uri = Services.io.newURI("data:text/css," + encodeURIComponent(cssCode), + null, null); + let utils = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils); + utils.loadSheet(uri, Ci.nsIDOMWindowUtils.USER_SHEET); + } + + function initElemHideEmulation() + { + let scope = Object.assign({}, require("common")); + Services.scriptloader.loadSubScript( + "chrome://adblockplus/content/elemHideEmulation.js", scope); + + let onContentWindow = (subject, topic, data) => + { + if (!(subject instanceof Ci.nsIDOMWindow)) + return; + + let onReady = event => + { + subject.removeEventListener("load", onReady); + let handler = new scope.ElemHideEmulation( + subject, getFilters.bind(null, subject), (selectors, filters) => + { + if (selectors.length == 0) + return; + + addUserCSS(subject, selectors.map( + selector => selector + "{display: none !important;}" + ).join("\n")); + + if (!isPrivate(subject)) + port.emit("addHits", filters); + + let docDomain = null; + try + { + // We are calling getFrames() here because it will consider + // "inheritance" for about:blank and data: frames. + docDomain = new URL(getFrames(subject)[0].location).hostname; + } + catch (e) + { + // Invalid URL? + } + + for (let i = 0; i < filters.length; i++) + { + RequestNotifier.addNodeData(subject.document, subject.top, { + contentType: "ELEMHIDE", + docDomain: docDomain, + thirdParty: false, + location: "##" + selectors[i], + filter: filters[i], + filterType: "elemhideemulation" + }); + } + } + ); + + handler.apply(); + }; + + subject.addEventListener("load", onReady); + }; + + Services.obs.addObserver(onContentWindow, "content-document-global-created", + false); + onShutdown.add(() => + { + Services.obs.removeObserver(onContentWindow, + "content-document-global-created"); + }); + } + + initElemHideEmulation(); +})(); diff --git a/data/extensions/spyblock@gnu.org/lib/child/flasher.js b/data/extensions/spyblock@gnu.org/lib/child/flasher.js new file mode 100644 index 0000000..492f4e0 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/flasher.js @@ -0,0 +1,99 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview Draws a blinking border for a list of matching elements. + */ + +function Flasher(elements, scrollToItem) +{ + if (scrollToItem && elements[0].ownerDocument) + { + // Ensure that at least one element is visible when flashing + elements[0].scrollIntoView(); + } + + this.elements = elements; + this.count = 0; + + this.doFlash(); + +} +Flasher.prototype = +{ + elements: null, + count: 0, + timer: null, + + doFlash: function() + { + if (this.count >= 12) + { + this.stop(); + return; + } + + if (this.count % 2) + this.switchOff(); + else + this.switchOn(); + + this.count++; + + this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); + this.timer.initWithCallback(() => this.doFlash(), 300, Ci.nsITimer.TYPE_ONE_SHOT); + }, + + stop: function() + { + if (this.timer) + { + this.timer.cancel(); + this.timer = null; + } + + if (this.elements) + { + this.switchOff(); + this.elements = null; + } + }, + + setOutline: function(outline, offset) + { + for (let element of this.elements) + { + if (!Cu.isDeadWrapper(element) && "style" in element) + { + element.style.outline = outline; + element.style.outlineOffset = offset; + } + } + }, + + switchOn: function() + { + this.setOutline("#CC0000 dotted 2px", "-2px"); + }, + + switchOff: function() + { + this.setOutline("", ""); + } +}; + +exports.Flasher = Flasher; diff --git a/data/extensions/spyblock@gnu.org/lib/child/main.js b/data/extensions/spyblock@gnu.org/lib/child/main.js new file mode 100644 index 0000000..bc21e9a --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/main.js @@ -0,0 +1,31 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +let {port} = require("messaging"); + +// Only initialize after receiving a "response" to a dummy message - this makes +// sure that on update the old version has enough time to receive and process +// the shutdown message. +port.emitWithResponse("ping").then(() => +{ + require("child/elemHide"); + require("child/contentPolicy"); + require("child/contextMenu"); + require("child/dataCollector"); + require("child/elemHideEmulation"); + require("child/subscribeLinks"); +}).catch(e => Cu.reportError(e)); diff --git a/data/extensions/spyblock@gnu.org/lib/child/objectTabs.js b/data/extensions/spyblock@gnu.org/lib/child/objectTabs.js new file mode 100644 index 0000000..74e7387 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/objectTabs.js @@ -0,0 +1,405 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview Code responsible for showing and hiding object tabs. + */ + +let {port} = require("messaging"); + +/** + * Class responsible for showing and hiding object tabs. + * @class + */ +var objTabs = +{ + /** + * Number of milliseconds to wait until hiding tab after the mouse moves away. + * @type Integer + */ + HIDE_DELAY: 1000, + + /** + * Document element the object tab is currently being displayed for. + * @type Element + */ + currentElement: null, + + /** + * Windows that the window event handler is currently registered for. + * @type Window[] + */ + windowListeners: null, + + /** + * Panel element currently used as object tab. + * @type Element + */ + objtabElement: null, + + /** + * Time of previous position update. + * @type Integer + */ + prevPositionUpdate: 0, + + /** + * Timer used to update position of the object tab. + * @type nsITimer + */ + positionTimer: null, + + /** + * Timer used to delay hiding of the object tab. + * @type nsITimer + */ + hideTimer: null, + + /** + * Used when hideTimer is running, time when the tab should be hidden. + * @type Integer + */ + hideTargetTime: 0, + + /** + * Localized texts and class names to be used for the tab. This will be set + * when showTabFor is called for the first time. + * @type Object + */ + texts: null, + + /** + * Called to show object tab for an element. + */ + showTabFor: function(/**Element*/ element) + { + // Object tabs aren't usable in Fennec + let {application} = require("info"); + if (application == "fennec" || application == "fennec2" || + application == "adblockbrowser") + return; + + if (!this.texts) + this.texts = port.emitWithResponse("getObjectTabsTexts"); + Promise.all([port.emitWithResponse("getObjectTabsStatus"), this.texts]) + .then(([status, texts]) => + { + this.texts = texts; + if (!status) + return; + + if (this.hideTimer) + { + this.hideTimer.cancel(); + this.hideTimer = null; + } + + if (this.objtabElement) + this.objtabElement.style.setProperty("opacity", "1", "important"); + + if (this.currentElement != element) + { + this._hideTab(); + + let {RequestNotifier} = require("child/requestNotifier"); + let data = RequestNotifier.getDataForNode(element, true, "OBJECT"); + if (data) + this._showTab(element, data[1]); + } + }); + }, + + /** + * Called to hide object tab for an element (actual hiding happens delayed). + */ + hideTabFor: function(/**Element*/ element) + { + if (element != this.currentElement || this.hideTimer) + return; + + this.hideTargetTime = Date.now() + this.HIDE_DELAY; + this.hideTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); + this.hideTimer.init(this, 40, Ci.nsITimer.TYPE_REPEATING_SLACK); + }, + + /** + * Makes the tab element visible. + * @param {Element} element + * @param {RequestEntry} data + */ + _showTab: function(element, data) + { + let doc = element.ownerDocument.defaultView.top.document; + + this.objtabElement = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"); + this.objtabElement.textContent = this.texts.label; + this.objtabElement.setAttribute("title", this.texts.tooltip); + this.objtabElement.setAttribute("href", data.location); + this.objtabElement.setAttribute("class", this.texts.classHidden); + this.objtabElement.style.setProperty("opacity", "1", "important"); + this.objtabElement.nodeData = data; + + this.currentElement = element; + + // Register paint listeners for the relevant windows + this.windowListeners = []; + let wnd = element.ownerDocument.defaultView; + while (wnd) + { + wnd.addEventListener("MozAfterPaint", objectWindowEventHandler, false); + this.windowListeners.push(wnd); + wnd = (wnd.parent != wnd ? wnd.parent : null); + } + + // Register mouse listeners on the object tab + this.objtabElement.addEventListener("mouseover", objectTabEventHander, false); + this.objtabElement.addEventListener("mouseout", objectTabEventHander, false); + this.objtabElement.addEventListener("click", objectTabEventHander, true); + + // Insert the tab into the document and adjust its position + doc.documentElement.appendChild(this.objtabElement); + if (!this.positionTimer) + { + this.positionTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); + this.positionTimer.init(this, 200, Ci.nsITimer.TYPE_REPEATING_SLACK); + } + this._positionTab(); + }, + + /** + * Hides the tab element. + */ + _hideTab: function() + { + if (this.objtabElement) + { + // Prevent recursive calls via popuphidden handler + let objtab = this.objtabElement; + this.objtabElement = null; + this.currentElement = null; + + if (this.hideTimer) + { + this.hideTimer.cancel(); + this.hideTimer = null; + } + + if (this.positionTimer) + { + this.positionTimer.cancel(); + this.positionTimer = null; + } + + try { + objtab.parentNode.removeChild(objtab); + } catch (e) {} + objtab.removeEventListener("mouseover", objectTabEventHander, false); + objtab.removeEventListener("mouseout", objectTabEventHander, false); + objtab.nodeData = null; + + for (let wnd of this.windowListeners) + wnd.removeEventListener("MozAfterPaint", objectWindowEventHandler, false); + this.windowListeners = null; + } + }, + + /** + * Updates position of the tab element. + */ + _positionTab: function() + { + // Test whether element is still in document + let elementDoc = null; + try + { + elementDoc = this.currentElement.ownerDocument; + } catch (e) {} // Ignore "can't access dead object" error + if (!elementDoc || !this.currentElement.offsetWidth || !this.currentElement.offsetHeight || + !elementDoc.defaultView || !elementDoc.documentElement) + { + this._hideTab(); + return; + } + + let objRect = this._getElementPosition(this.currentElement); + + let className = this.texts.classVisibleTop; + let left = objRect.right - this.objtabElement.offsetWidth; + let top = objRect.top - this.objtabElement.offsetHeight; + if (top < 0) + { + top = objRect.bottom; + className = this.texts.classVisibleBottom; + } + + if (this.objtabElement.style.left != left + "px") + this.objtabElement.style.setProperty("left", left + "px", "important"); + if (this.objtabElement.style.top != top + "px") + this.objtabElement.style.setProperty("top", top + "px", "important"); + + if (this.objtabElement.getAttribute("class") != className) + this.objtabElement.setAttribute("class", className); + + this.prevPositionUpdate = Date.now(); + }, + + /** + * Calculates element's position relative to the top frame and considering + * clipping due to scrolling. + * @return {{left: Number, top: Number, right: Number, bottom: Number}} + */ + _getElementPosition: function(/**Element*/ element) + { + // Restrict rectangle coordinates by the boundaries of a window's client area + function intersectRect(rect, wnd) + { + // Cannot use wnd.innerWidth/Height because they won't account for scrollbars + let doc = wnd.document; + let wndWidth = doc.documentElement.clientWidth; + let wndHeight = doc.documentElement.clientHeight; + if (doc.compatMode == "BackCompat") // clientHeight will be bogus in quirks mode + wndHeight = Math.max(doc.documentElement.offsetHeight, doc.body.offsetHeight) - wnd.scrollMaxY - 1; + + rect.left = Math.max(rect.left, 0); + rect.top = Math.max(rect.top, 0); + rect.right = Math.min(rect.right, wndWidth); + rect.bottom = Math.min(rect.bottom, wndHeight); + } + + let rect = element.getBoundingClientRect(); + let wnd = element.ownerDocument.defaultView; + + let style = wnd.getComputedStyle(element, null); + let offsets = [ + parseFloat(style.borderLeftWidth) + parseFloat(style.paddingLeft), + parseFloat(style.borderTopWidth) + parseFloat(style.paddingTop), + parseFloat(style.borderRightWidth) + parseFloat(style.paddingRight), + parseFloat(style.borderBottomWidth) + parseFloat(style.paddingBottom) + ]; + + rect = {left: rect.left + offsets[0], top: rect.top + offsets[1], + right: rect.right - offsets[2], bottom: rect.bottom - offsets[3]}; + while (true) + { + intersectRect(rect, wnd); + + if (!wnd.frameElement) + break; + + // Recalculate coordinates to be relative to frame's parent window + let frameElement = wnd.frameElement; + wnd = frameElement.ownerDocument.defaultView; + + let frameRect = frameElement.getBoundingClientRect(); + let frameStyle = wnd.getComputedStyle(frameElement, null); + let relLeft = frameRect.left + parseFloat(frameStyle.borderLeftWidth) + parseFloat(frameStyle.paddingLeft); + let relTop = frameRect.top + parseFloat(frameStyle.borderTopWidth) + parseFloat(frameStyle.paddingTop); + + rect.left += relLeft; + rect.right += relLeft; + rect.top += relTop; + rect.bottom += relTop; + } + + return rect; + }, + + doBlock: function() + { + let {storeNodes} = require("child/contentPolicy"); + let nodesID = storeNodes([this.currentElement]); + port.emit("blockItem", { + request: this.objtabElement.nodeData, + nodesID + }); + }, + + /** + * Called whenever a timer fires. + * @param {nsISupport} subject + * @param {string} topic + * @param {string} data + */ + observe: function(subject, topic, data) + { + if (subject == this.positionTimer) + { + // Don't update position if it was already updated recently (via MozAfterPaint) + if (Date.now() - this.prevPositionUpdate > 100) + this._positionTab(); + } + else if (subject == this.hideTimer) + { + let now = Date.now(); + if (now >= this.hideTargetTime) + this._hideTab(); + else if (this.hideTargetTime - now < this.HIDE_DELAY / 2) + this.objtabElement.style.setProperty("opacity", (this.hideTargetTime - now) * 2 / this.HIDE_DELAY, "important"); + } + } +}; + +onShutdown.add(objTabs._hideTab.bind(objTabs)); + +/** + * Function called whenever the mouse enters or leaves an object. + */ +function objectMouseEventHander(/**Event*/ event) +{ + if (!event.isTrusted) + return; + + if (event.type == "mouseover") + objTabs.showTabFor(event.target); + else if (event.type == "mouseout") + objTabs.hideTabFor(event.target); +} + +/** + * Function called for paint events of the object tab window. + */ +function objectWindowEventHandler(/**Event*/ event) +{ + if (!event.isTrusted) + return; + + // Don't trigger update too often, avoid overusing CPU on frequent page updates + if (event.type == "MozAfterPaint" && Date.now() - objTabs.prevPositionUpdate > 20) + objTabs._positionTab(); +} + +/** + * Function called whenever the mouse enters or leaves an object tab. + */ +function objectTabEventHander(/**Event*/ event) +{ + if (onShutdown.done || !event.isTrusted) + return; + + if (event.type == "click" && event.button == 0) + { + event.preventDefault(); + event.stopPropagation(); + + objTabs.doBlock(); + } + else if (event.type == "mouseover") + objTabs.showTabFor(objTabs.currentElement); + else if (event.type == "mouseout") + objTabs.hideTabFor(objTabs.currentElement); +} +exports.objectMouseEventHander = objectMouseEventHander; diff --git a/data/extensions/spyblock@gnu.org/lib/child/requestNotifier.js b/data/extensions/spyblock@gnu.org/lib/child/requestNotifier.js new file mode 100644 index 0000000..fc6d314 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/requestNotifier.js @@ -0,0 +1,444 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview Stores Adblock Plus data to be attached to a window. + */ +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + +let {port} = require("messaging"); +let {Utils} = require("utils"); +let {Flasher} = require("child/flasher"); + +let nodeData = new WeakMap(); +let windowStats = new WeakMap(); +let windowData = new WeakMap(); +let requestEntryMaxId = 0; + +/** + * Active RequestNotifier instances by their ID + * @type Map.<number,RequestNotifier> + */ +let notifiers = new Map(); + +port.on("startWindowScan", onStartScan); +port.on("shutdownNotifier", onNotifierShutdown); +port.on("flashNodes", onFlashNodes); +port.on("retrieveNodeSize", onRetrieveNodeSize); +port.on("storeNodesForEntries", onStoreNodes); +port.on("retrieveWindowStats", onRetrieveWindowStats); +port.on("storeWindowData", onStoreWindowData); +port.on("retrieveWindowData", onRetrieveWindowData); + +function onStartScan({notifierID, outerWindowID}) +{ + let window = Services.wm.getOuterWindowWithId(outerWindowID); + if (window) + new RequestNotifier(window, notifierID); +} + +function onNotifierShutdown(notifierID) +{ + let notifier = notifiers.get(notifierID); + if (notifier) + notifier.shutdown(); +} + +function onFlashNodes({notifierID, requests, scrollToItem}) +{ + let notifier = notifiers.get(notifierID); + if (notifier) + notifier.flashNodes(requests, scrollToItem); +} + +function onRetrieveNodeSize({notifierID, requests}) +{ + let notifier = notifiers.get(notifierID); + if (notifier) + return notifier.retrieveNodeSize(requests); +} + +function onStoreNodes({notifierID, requests}) +{ + let notifier = notifiers.get(notifierID); + if (notifier) + return notifier.storeNodesForEntries(requests); +} + +function onRetrieveWindowStats(outerWindowID) +{ + let window = Services.wm.getOuterWindowWithId(outerWindowID); + if (window) + return RequestNotifier.getWindowStatistics(window); +} + +function onStoreWindowData({outerWindowID, data}) +{ + let window = Services.wm.getOuterWindowWithId(outerWindowID); + if (window) + windowData.set(window.document, data); +}; + +function onRetrieveWindowData(outerWindowID) +{ + let window = Services.wm.getOuterWindowWithId(outerWindowID); + if (window) + return windowData.get(window.document) || null; +}; + +/** + * Creates a notifier object for a particular window. After creation the window + * will first be scanned for previously saved requests. Once that scan is + * complete only new requests for this window will be reported. + * @param {Window} window window to attach the notifier to + * @param {Integer} notifierID Parent notifier ID to be messaged + */ +function RequestNotifier(window, notifierID) +{ + this.window = window; + this.id = notifierID; + notifiers.set(this.id, this); + this.nodes = new Map(); + this.startScan(window); +} +exports.RequestNotifier = RequestNotifier; + +RequestNotifier.prototype = +{ + /** + * Parent notifier ID to be messaged + * @type Integer + */ + id: null, + + /** + * The window this notifier is associated with. + * @type Window + */ + window: null, + + /** + * Nodes associated with a particular request ID. + * @type Map.<number,Node> + */ + nodes: null, + + /** + * Shuts down the notifier once it is no longer used. The listener + * will no longer be called after that. + */ + shutdown: function() + { + delete this.window; + delete this.nodes; + this.stopFlashing(); + notifiers.delete(this.id); + }, + + /** + * Notifies the parent about a new request. + * @param {Node} node DOM node that the request is associated with + * @param {Object} entry + */ + notifyListener: function(node, entry) + { + if (this.nodes) + this.nodes.set(entry.id, node); + port.emit("foundNodeData", { + notifierID: this.id, + data: entry + }); + }, + + onComplete: function() + { + port.emit("scanComplete", this.id); + }, + + /** + * Number of currently posted scan events (will be 0 when the scan finishes + * running). + */ + eventsPosted: 0, + + /** + * Starts the initial scan of the window (will recurse into frames). + * @param {Window} wnd the window to be scanned + */ + startScan: function(wnd) + { + let doc = wnd.document; + let walker = doc.createTreeWalker(doc, Ci.nsIDOMNodeFilter.SHOW_ELEMENT, null, false); + + let process = function() + { + // Don't do anything if the notifier was shut down already. + if (!this.window) + return; + + let node = walker.currentNode; + let data = nodeData.get(node); + if (typeof data != "undefined") + for (let k in data) + this.notifyListener(node, data[k]); + + if (walker.nextNode()) + Utils.runAsync(process); + else + { + // Done with the current window, start the scan for its frames + for (let i = 0; i < wnd.frames.length; i++) + this.startScan(wnd.frames[i]); + + this.eventsPosted--; + if (!this.eventsPosted) + { + this.scanComplete = true; + this.onComplete(); + } + } + }.bind(this); + + // Process each node in a separate event to allow other events to process + this.eventsPosted++; + Utils.runAsync(process); + }, + + /** + * Makes the nodes associated with the given requests blink. + * @param {number[]} requests list of request IDs that were previously + * reported by this notifier. + * @param {boolean} scrollToItem if true, scroll to first node + */ + flashNodes: function(requests, scrollToItem) + { + this.stopFlashing(); + + let nodes = []; + for (let id of requests) + { + if (!this.nodes.has(id)) + continue; + + let node = this.nodes.get(id); + if (Cu.isDeadWrapper(node)) + this.nodes.delete(node); + else if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) + nodes.push(node); + } + if (nodes.length) + this.flasher = new Flasher(nodes, scrollToItem); + }, + + /** + * Stops flashing nodes after a previous flashNodes() call. + */ + stopFlashing: function() + { + if (this.flasher) + this.flasher.stop(); + this.flasher = null; + }, + + /** + * Attempts to calculate the size of the nodes associated with the requests. + * @param {number[]} requests list of request IDs that were previously + * reported by this notifier. + * @return {number[]|null} either an array containing width and height or + * null if the size could not be calculated. + */ + retrieveNodeSize: function(requests) + { + function getNodeSize(node) + { + if (node instanceof Ci.nsIDOMHTMLImageElement && (node.naturalWidth || node.naturalHeight)) + return [node.naturalWidth, node.naturalHeight]; + else if (node instanceof Ci.nsIDOMHTMLElement && (node.offsetWidth || node.offsetHeight)) + return [node.offsetWidth, node.offsetHeight]; + else + return null; + } + + let size = null; + for (let id of requests) + { + if (!this.nodes.has(id)) + continue; + + let node = this.nodes.get(id); + if (Cu.isDeadWrapper(node)) + this.nodes.delete(node); + else + { + size = getNodeSize(node); + if (size) + break; + } + } + return size; + }, + + /** + * Stores the nodes associated with the requests and generates a unique ID + * for them that can be used with Policy.refilterNodes(). + * @param {number[]} requests list of request IDs that were previously + * reported by this notifier. + * @return {string} unique identifiers associated with the nodes. + */ + storeNodesForEntries: function(requests) + { + let nodes = []; + for (let id of requests) + { + if (!this.nodes.has(id)) + continue; + + let node = this.nodes.get(id); + if (Cu.isDeadWrapper(node)) + this.nodes.delete(node); + else + nodes.push(node); + } + + let {storeNodes} = require("child/contentPolicy"); + return storeNodes(nodes); + } +}; + +/** + * Attaches request data to a DOM node. + * @param {Node} node node to attach data to + * @param {Window} topWnd top-level window the node belongs to + * @param {Object} hitData + * @param {String} hitData.contentType request type, e.g. "IMAGE" + * @param {String} hitData.docDomain domain of the document that initiated the request + * @param {Boolean} hitData.thirdParty will be true if a third-party server has been requested + * @param {String} hitData.location the address that has been requested + * @param {String} hitData.filter filter applied to the request or null if none + * @param {String} hitData.filterType type of filter applied to the request + */ +RequestNotifier.addNodeData = function(node, topWnd, {contentType, docDomain, thirdParty, location, filter, filterType}) +{ + let entry = { + id: ++requestEntryMaxId, + type: contentType, + docDomain, thirdParty, location, filter + }; + + let existingData = nodeData.get(node); + if (typeof existingData == "undefined") + { + existingData = {}; + nodeData.set(node, existingData); + } + + // Add this request to the node data + existingData[contentType + " " + location] = entry; + + // Update window statistics + if (!windowStats.has(topWnd.document)) + { + windowStats.set(topWnd.document, { + items: 0, + hidden: 0, + blocked: 0, + whitelisted: 0, + filters: {} + }); + } + + let stats = windowStats.get(topWnd.document); + if (filterType != "elemhide" && filterType != "elemhideexception" && filterType != "elemhideemulation") + stats.items++; + if (filter) + { + if (filterType == "blocking") + stats.blocked++; + else if (filterType == "whitelist" || filterType == "elemhideexception") + stats.whitelisted++; + else if (filterType == "elemhide" || filterType == "elemhideemulation") + stats.hidden++; + + if (filter in stats.filters) + stats.filters[filter]++; + else + stats.filters[filter] = 1; + } + + // Notify listeners + for (let notifier of notifiers.values()) + if (!notifier.window || notifier.window == topWnd) + notifier.notifyListener(node, entry); +} + +/** + * Retrieves the statistics for a window. + * @return {Object} Object with the properties items, blocked, whitelisted, hidden, filters containing statistics for the window (might be null) + */ +RequestNotifier.getWindowStatistics = function(/**Window*/ wnd) +{ + if (windowStats.has(wnd.document)) + return windowStats.get(wnd.document); + else + return null; +} + +/** + * Retrieves the request data associated with a DOM node. + * @param {Node} node + * @param {Boolean} noParent if missing or false, the search will extend to the parent nodes until one is found that has data associated with it + * @param {Integer} [type] request type to be looking for + * @param {String} [location] request location to be looking for + * @result {[Node, Object]} + * @static + */ +RequestNotifier.getDataForNode = function(node, noParent, type, location) +{ + while (node) + { + let data = nodeData.get(node); + if (typeof data != "undefined") + { + let entry = null; + // Look for matching entry + for (let k in data) + { + if ((!entry || entry.id < data[k].id) && + (typeof type == "undefined" || data[k].type == type) && + (typeof location == "undefined" || data[k].location == location)) + { + entry = data[k]; + } + } + if (entry) + return [node, entry]; + } + + // If we don't have any match on this node then maybe its parent will do + if ((typeof noParent != "boolean" || !noParent) && + node.parentNode instanceof Ci.nsIDOMElement) + { + node = node.parentNode; + } + else + { + node = null; + } + } + + return null; +}; diff --git a/data/extensions/spyblock@gnu.org/lib/child/subscribeLinks.js b/data/extensions/spyblock@gnu.org/lib/child/subscribeLinks.js new file mode 100644 index 0000000..a2e729d --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/subscribeLinks.js @@ -0,0 +1,118 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + +let {port} = require("messaging"); + +Services.obs.addObserver(onContentWindow, "content-document-global-created", + false); +onShutdown.add(() => +{ + Services.obs.removeObserver(onContentWindow, + "content-document-global-created"); +}); + +function onContentWindow(subject, topic, data) +{ + if (subject instanceof Ci.nsIDOMWindow && subject.top == subject) + { + let eventTarget = subject.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell) + .chromeEventHandler; + if (eventTarget) + eventTarget.addEventListener("click", onClick, true); + } +} + +function onClick(event) +{ + if (onShutdown.done) + return; + + // Ignore right-clicks + if (event.button == 2) + return; + + // Search the link associated with the click + let link = event.target; + while (!(link instanceof Ci.nsIDOMHTMLAnchorElement)) + { + link = link.parentNode; + + if (!link) + return; + } + + let queryString = null; + if (link.protocol == "http:" || link.protocol == "https:") + { + if (link.host == "subscribe.adblockplus.org" && link.pathname == "/") + queryString = link.search.substr(1); + } + else + { + // Firefox doesn't populate the "search" property for links with + // non-standard URL schemes so we need to extract the query string + // manually + let match = /^abp:\/*subscribe\/*\?(.*)/i.exec(link.href); + if (match) + queryString = match[1]; + } + + if (!queryString) + return; + + // This is our link - make sure the browser doesn't handle it + event.preventDefault(); + event.stopPropagation(); + + // Decode URL parameters + let title = null; + let url = null; + let mainSubscriptionTitle = null; + let mainSubscriptionURL = null; + for (let param of queryString.split("&")) + { + let parts = param.split("=", 2); + if (parts.length != 2 || !/\S/.test(parts[1])) + continue; + switch (parts[0]) + { + case "title": + title = decodeURIComponent(parts[1]); + break; + case "location": + url = decodeURIComponent(parts[1]); + break; + case "requiresTitle": + mainSubscriptionTitle = decodeURIComponent(parts[1]); + break; + case "requiresLocation": + mainSubscriptionURL = decodeURIComponent(parts[1]); + break; + } + } + + port.emit("subscribeLinkClick", { + title: title, + url: url, + mainSubscriptionTitle: mainSubscriptionTitle, + mainSubscriptionURL: mainSubscriptionURL + }); +} diff --git a/data/extensions/spyblock@gnu.org/lib/child/utils.js b/data/extensions/spyblock@gnu.org/lib/child/utils.js new file mode 100644 index 0000000..fde649f --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/child/utils.js @@ -0,0 +1,141 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +let {PrivateBrowsingUtils} = Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm", {}); + +let {Utils} = require("utils"); + +/** + * Retrieves the effective location of a window. + */ +let getWindowLocation = exports.getWindowLocation = function(/**Window*/ window) /**String*/ +{ + let result = null; + + // Crazy Thunderbird stuff + if ("name" in window && window.name == "messagepane") + { + try + { + let mailWnd = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShellTreeItem) + .rootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); + + // Typically we get a wrapped mail window here, need to unwrap + try + { + mailWnd = mailWnd.wrappedJSObject; + } catch(e) {} + + if ("currentHeaderData" in mailWnd && "content-base" in mailWnd.currentHeaderData) + { + result = mailWnd.currentHeaderData["content-base"].headerValue; + } + else if ("currentHeaderData" in mailWnd && "from" in mailWnd.currentHeaderData) + { + let emailAddress = Utils.headerParser.extractHeaderAddressMailboxes(mailWnd.currentHeaderData.from.headerValue); + if (emailAddress) + result = 'mailto:' + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, '%20'); + } + } catch(e) {} + } + + // Sane branch + if (!result) + result = window.location.href; + + // Remove the anchor if any + let index = result.indexOf("#"); + if (index >= 0) + result = result.substring(0, index); + + return result; +} + +/** + * Retrieves the frame hierarchy for a window. Returns an array containing + * the information for all frames, starting with the window itself up to its + * top-level window. Each entry has a location and a sitekey entry. + * @return {Array} + */ +let getFrames = exports.getFrames = function(/**Window*/ window) +{ + let frames = []; + while (window) + { + let frame = { + location: getWindowLocation(window), + sitekey: null + }; + + let documentElement = window.document && window.document.documentElement; + if (documentElement) + frame.sitekey = documentElement.getAttribute("data-adblockkey") + + frames.push(frame); + window = (window != window.parent ? window.parent : null); + } + + // URLs like about:blank inherit their security context from upper-level + // frames, resolve their URLs accordingly. + for (let i = frames.length - 2; i >= 0; i--) + { + let frame = frames[i]; + if (frame.location == "about:blank" || frame.location == "moz-safe-about:blank" || + frame.location == "about:srcdoc" || + Utils.netUtils.URIChainHasFlags(Utils.makeURI(frame.location), Ci.nsIProtocolHandler.URI_INHERITS_SECURITY_CONTEXT)) + { + frame.location = frames[i + 1].location; + } + } + + return frames; +}; + +/** + * Checks whether Private Browsing mode is enabled for a content window. + * @return {Boolean} + */ +let isPrivate = exports.isPrivate = function(/**Window*/ window) +{ + return PrivateBrowsingUtils.isContentWindowPrivate(window); +}; + +/** + * Gets the DOM window associated with a particular request (if any). + */ +let getRequestWindow = exports.getRequestWindow = function(/**nsIChannel*/ channel) /**nsIDOMWindow*/ +{ + try + { + if (channel.notificationCallbacks) + return channel.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow; + } catch(e) {} + + try + { + if (channel.loadGroup && channel.loadGroup.notificationCallbacks) + return channel.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow; + } catch(e) {} + + return null; +}; diff --git a/data/extensions/spyblock@gnu.org/lib/common.js b/data/extensions/spyblock@gnu.org/lib/common.js new file mode 100644 index 0000000..e2c2db5 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/common.js @@ -0,0 +1,53 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +// We are currently limited to ECMAScript 5 in this file, because it is being +// used in the browser tests. See https://issues.adblockplus.org/ticket/4796 + +/** + * Converts filter text into regular expression string + * @param {string} text as in Filter() + * @return {string} regular expression representation of filter text + */ +function filterToRegExp(text) +{ + return text + // remove multiple wildcards + .replace(/\*+/g, "*") + // remove anchors following separator placeholder + .replace(/\^\|$/, "^") + // escape special symbols + .replace(/\W/g, "\\$&") + // replace wildcards by .* + .replace(/\\\*/g, ".*") + // process separator placeholders (all ANSI characters but alphanumeric + // characters and _%.-) + .replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)") + // process extended anchor at expression start + .replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?") + // process anchor at expression start + .replace(/^\\\|/, "^") + // process anchor at expression end + .replace(/\\\|$/, "$") + // remove leading wildcards + .replace(/^(\.\*)/, "") + // remove trailing wildcards + .replace(/(\.\*)$/, ""); +} + +if (typeof exports != "undefined") + exports.filterToRegExp = filterToRegExp; diff --git a/data/extensions/spyblock@gnu.org/lib/contentPolicy.js b/data/extensions/spyblock@gnu.org/lib/contentPolicy.js index 4f2247e..ad36655 100644 --- a/data/extensions/spyblock@gnu.org/lib/contentPolicy.js +++ b/data/extensions/spyblock@gnu.org/lib/contentPolicy.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -19,115 +19,90 @@ * @fileOverview Content policy implementation, responsible for blocking things. */ -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); +"use strict"; + +let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); let {Utils} = require("utils"); +let {port} = require("messaging"); let {Prefs} = require("prefs"); let {FilterStorage} = require("filterStorage"); -let {BlockingFilter, WhitelistFilter} = require("filterClasses"); +let {BlockingFilter, WhitelistFilter, RegExpFilter} = require("filterClasses"); let {defaultMatcher} = require("matcher"); -let {objectMouseEventHander} = require("objectTabs"); -let {RequestNotifier} = require("requestNotifier"); -let {ElemHide} = require("elemHide"); - -/** - * List of explicitly supported content types - * @type Array of String - */ -let contentTypes = ["OTHER", "SCRIPT", "IMAGE", "STYLESHEET", "OBJECT", "SUBDOCUMENT", "DOCUMENT", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT", "MEDIA"]; - -/** - * List of content types that aren't associated with a visual document area - * @type Array of String - */ -let nonVisualTypes = ["SCRIPT", "STYLESHEET", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT"]; - -/** - * Randomly generated class name, to be applied to collapsed nodes. - */ -let collapsedClass = ""; /** * Public policy checking functions and auxiliary objects * @class */ -let Policy = exports.Policy = +var Policy = exports.Policy = { /** - * Map of content type identifiers by their name. - * @type Object - */ - type: {}, - - /** - * Map of content type names by their identifiers (reverse of type map). - * @type Object - */ - typeDescr: {}, - - /** - * Map of localized content type names by their identifiers. - * @type Object + * Map of content types reported by Firefox to the respecitve content types + * used by Adblock Plus. Other content types are simply mapped to OTHER. + * @type Map.<string,string> */ - localizedDescr: {}, + contentTypes: new Map(function* () + { + // Treat navigator.sendBeacon() the same as <a ping>, + // it's essentially the same concept - merely generalized. + yield ["BEACON", "PING"]; + + // Treat <img srcset> and <picture> the same as other images. + yield ["IMAGESET", "IMAGE"]; + + // Treat fetch() the same as XMLHttpRequest, + // it's essentially the same - merely a more modern API. + yield ["FETCH", "XMLHTTPREQUEST"]; + + // Everything else is mapped to itself + for (let contentType of ["OTHER", "SCRIPT", "IMAGE", "STYLESHEET", "OBJECT", + "SUBDOCUMENT", "DOCUMENT", "XMLHTTPREQUEST", + "OBJECT_SUBREQUEST", "FONT", "MEDIA", "PING", + "WEBSOCKET", "ELEMHIDE", "POPUP", "GENERICHIDE", + "GENERICBLOCK"]) + yield [contentType, contentType]; + }()), /** - * Lists the non-visual content types. - * @type Object + * Set of content types that aren't associated with a visual document area + * @type Set.<string> */ - nonVisual: {}, + nonVisualTypes: new Set([ + "SCRIPT", "STYLESHEET", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT", + "PING", "WEBSOCKET", "ELEMHIDE", "POPUP", "GENERICHIDE", "GENERICBLOCK" + ]), /** * Map containing all schemes that should be ignored by content policy. - * @type Object + * @type Set.<string> */ - whitelistSchemes: {}, + whitelistSchemes: new Set(), /** * Called on module startup, initializes various exported properties. */ init: function() { - // type constant by type description and type description by type constant - let iface = Ci.nsIContentPolicy; - for (let typeName of contentTypes) - { - if ("TYPE_" + typeName in iface) - { - let id = iface["TYPE_" + typeName]; - this.type[typeName] = id; - this.typeDescr[id] = typeName; - this.localizedDescr[id] = Utils.getString("type_label_" + typeName.toLowerCase()); - } - } - - this.type.ELEMHIDE = 0xFFFD; - this.typeDescr[0xFFFD] = "ELEMHIDE"; - this.localizedDescr[0xFFFD] = Utils.getString("type_label_elemhide"); - - this.type.POPUP = 0xFFFE; - this.typeDescr[0xFFFE] = "POPUP"; - this.localizedDescr[0xFFFE] = Utils.getString("type_label_popup"); - - for (let type of nonVisualTypes) - this.nonVisual[this.type[type]] = true; - // whitelisted URL schemes for (let scheme of Prefs.whitelistschemes.toLowerCase().split(" ")) - this.whitelistSchemes[scheme] = true; + this.whitelistSchemes.add(scheme); - // Generate class identifier used to collapse node and register corresponding - // stylesheet. + port.on("shouldAllow", (message, sender) => this.shouldAllow(message)); + + // Generate class identifier used to collapse nodes and register + // corresponding stylesheet. + let collapsedClass = ""; let offset = "a".charCodeAt(0); for (let i = 0; i < 20; i++) collapsedClass += String.fromCharCode(offset + Math.random() * 26); + port.on("getCollapsedClass", (message, sender) => collapsedClass); let collapseStyle = Services.io.newURI("data:text/css," + encodeURIComponent("." + collapsedClass + "{-moz-binding: url(chrome://global/content/bindings/general.xml#foobarbazdummy) !important;}"), null, null); Utils.styleService.loadAndRegisterSheet(collapseStyle, Ci.nsIStyleSheetService.USER_SHEET); - onShutdown.add(function() + onShutdown.add(() => { Utils.styleService.unregisterSheet(collapseStyle, Ci.nsIStyleSheetService.USER_SHEET); }); @@ -135,525 +110,197 @@ let Policy = exports.Policy = /** * Checks whether a node should be blocked, hides it if necessary - * @param wnd {nsIDOMWindow} - * @param node {nsIDOMElement} - * @param contentType {String} - * @param location {nsIURI} - * @param collapse {Boolean} true to force hiding of the node - * @return {Boolean} false if the node should be blocked + * @param {Object} data request data + * @param {String} data.contentType + * @param {String} data.location location of the request + * @param {Object[]} data.frames + * @param {Boolean} data.isPrivate true if the request belongs to a private browsing window + * @return {Object} An object containing properties allow, collapse and hits + * indicating how this request should be handled. */ - processNode: function(wnd, node, contentType, location, collapse) + shouldAllow: function({contentType, location, frames, isPrivate}) { - let topWnd = wnd.top; - if (!topWnd || !topWnd.location || !topWnd.location.href) - return true; - - let privatenode=false; - Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); - if (PrivateBrowsingUtils.isContentWindowPrivate(wnd)) - privatenode=true; + let hits = []; - let originWindow = Utils.getOriginWindow(wnd); - let wndLocation = originWindow.location.href; - let docDomain = getHostname(wndLocation); - let match = null; - let [sitekey, sitekeyWnd] = getSitekey(wnd); - if (!match && Prefs.enabled) + function addHit(frameIndex, contentType, docDomain, thirdParty, location, filter) { - let testWnd = wnd; - let testSitekey = sitekey; - let testSitekeyWnd = sitekeyWnd; - let parentWndLocation = getWindowLocation(testWnd); - while (true) - { - let testWndLocation = parentWndLocation; - parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWindowLocation(testWnd.parent)); - match = Policy.isWhitelisted(testWndLocation, parentWndLocation, testSitekey); + if (filter && !isPrivate) + FilterStorage.increaseHitCount(filter); + hits.push({ + frameIndex, contentType, docDomain, thirdParty, location, + filter: filter ? filter.text : null, + filterType: filter ? filter.type : null + }); + } - if (match instanceof WhitelistFilter) - { - FilterStorage.increaseHitCount(match, wnd); - RequestNotifier.addNodeData(testWnd.document, topWnd, Policy.type.DOCUMENT, getHostname(parentWndLocation), false, testWndLocation, match); - return true; - } - - if (testWnd.parent == testWnd) - break; - - if (testWnd == testSitekeyWnd) - [testSitekey, testSitekeyWnd] = getSitekey(testWnd.parent); - testWnd = testWnd.parent; - } + function response(allow, collapse) + { + return {allow, collapse, hits}; } - // Data loaded by plugins should be attached to the document - if (contentType == Policy.type.OBJECT_SUBREQUEST && node instanceof Ci.nsIDOMElement) - node = node.ownerDocument; + // Ignore whitelisted schemes + if (contentType != "POPUP" && !this.isBlockableScheme(location)) + return response(true, false); - // Fix type for objects misrepresented as frames or images - if (contentType != Policy.type.OBJECT && (node instanceof Ci.nsIDOMHTMLObjectElement || node instanceof Ci.nsIDOMHTMLEmbedElement)) - contentType = Policy.type.OBJECT; + // Interpret unknown types as "other" + contentType = this.contentTypes.get(contentType) || "OTHER"; - let locationText = location.spec; - if (!match && contentType == Policy.type.ELEMHIDE) + let nogeneric = false; + if (Prefs.enabled) { - let testWnd = wnd; - let parentWndLocation = getWindowLocation(testWnd); - while (true) + let whitelistHit = + this.isFrameWhitelisted(frames, false); + if (whitelistHit) { - let testWndLocation = parentWndLocation; - parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWindowLocation(testWnd.parent)); - let parentDocDomain = getHostname(parentWndLocation); - match = defaultMatcher.matchesAny(testWndLocation, "ELEMHIDE", parentDocDomain, false, sitekey); - if (match instanceof WhitelistFilter) - { - FilterStorage.increaseHitCount(match, wnd); - RequestNotifier.addNodeData(testWnd.document, topWnd, contentType, parentDocDomain, false, testWndLocation, match); - return true; - } - - if (testWnd.parent == testWnd) - break; + let [frameIndex, matchType, docDomain, thirdParty, location, filter] = whitelistHit; + addHit(frameIndex, matchType, docDomain, thirdParty, location, filter); + if (matchType == "DOCUMENT") + return response(true, false); else - testWnd = testWnd.parent; - } - - match = location; - locationText = match.text.replace(/^.*?#/, '#'); - location = locationText; - - if (!match.isActiveOnDomain(docDomain)) - return true; - - let exception = ElemHide.getException(match, docDomain); - if (exception) - { - FilterStorage.increaseHitCount(exception, wnd); - RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, false, locationText, exception); - return true; + nogeneric = true; } } - let thirdParty = (contentType == Policy.type.ELEMHIDE ? false : isThirdParty(location, docDomain)); + let match = null; + let wndLocation = frames[0].location; + let docDomain = getHostname(wndLocation); + let [sitekey, sitekeyFrame] = getSitekey(frames); + + let thirdParty = isThirdParty(location, docDomain); + let collapse = false; - if (!match && Prefs.enabled) + if (!match && Prefs.enabled && RegExpFilter.typeMap.hasOwnProperty(contentType)) { - match = defaultMatcher.matchesAny(locationText, Policy.typeDescr[contentType] || "", docDomain, thirdParty, sitekey, privatenode); - if (match instanceof BlockingFilter && node.ownerDocument && !(contentType in Policy.nonVisual)) - { - let prefCollapse = (match.collapse != null ? match.collapse : !Prefs.fastcollapse); - if (collapse || prefCollapse) - schedulePostProcess(node); - } - - // Track mouse events for objects - if (!match && contentType == Policy.type.OBJECT && node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) - { - node.addEventListener("mouseover", objectMouseEventHander, true); - node.addEventListener("mouseout", objectMouseEventHander, true); - } + match = defaultMatcher.matchesAny(location, RegExpFilter.typeMap[contentType], + docDomain, thirdParty, sitekey, nogeneric, isPrivate); + if (match instanceof BlockingFilter && !this.nonVisualTypes.has(contentType)) + collapse = (match.collapse != null ? match.collapse : !Prefs.fastcollapse); } + addHit(null, contentType, docDomain, thirdParty, location, match); - // Store node data - RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdParty, locationText, match); - if (match) - FilterStorage.increaseHitCount(match, wnd); - - return !match || match instanceof WhitelistFilter; + return response(!match || match instanceof WhitelistFilter, collapse); }, /** * Checks whether the location's scheme is blockable. - * @param location {nsIURI} + * @param location {nsIURI|String} * @return {Boolean} */ isBlockableScheme: function(location) { - return !(location.scheme in Policy.whitelistSchemes); + let scheme; + if (typeof location == "string") + { + let match = /^([\w\-]+):/.exec(location); + scheme = match ? match[1] : null; + } + else + scheme = location.scheme; + return !this.whitelistSchemes.has(scheme); }, /** - * Checks whether a page is whitelisted. + * Checks whether a top-level window is whitelisted. * @param {String} url - * @param {String} [parentUrl] location of the parent page - * @param {String} [sitekey] public key provided on the page - * @return {Filter} filter that matched the URL or null if not whitelisted + * URL of the document loaded into the window + * @return {?WhitelistFilter} + * exception rule that matched the URL if any */ - isWhitelisted: function(url, parentUrl, sitekey) + isWhitelisted: function(url) { if (!url) return null; // Do not apply exception rules to schemes on our whitelistschemes list. - let match = /^([\w\-]+):/.exec(url); - if (match && match[1] in Policy.whitelistSchemes) + if (!this.isBlockableScheme(url)) return null; - if (!parentUrl) - parentUrl = url; - // Ignore fragment identifier let index = url.indexOf("#"); if (index >= 0) url = url.substring(0, index); - let result = defaultMatcher.matchesAny(url, "DOCUMENT", getHostname(parentUrl), false, sitekey); + let result = defaultMatcher.matchesAny(url, RegExpFilter.typeMap.DOCUMENT, + getHostname(url), false, null); return (result instanceof WhitelistFilter ? result : null); }, /** - * Checks whether the page loaded in a window is whitelisted for indication in the UI. - * @param wnd {nsIDOMWindow} - * @return {Filter} matching exception rule or null if not whitelisted - */ - isWindowWhitelisted: function(wnd) - { - return Policy.isWhitelisted(getWindowLocation(wnd)); - }, - - /** - * Asynchronously re-checks filters for given nodes. - * @param {Node[]} nodes - * @param {RequestEntry} entry - */ - refilterNodes: function(nodes, entry) - { - // Ignore nodes that have been blocked already - if (entry.filter && !(entry.filter instanceof WhitelistFilter)) - return; - - for (let node of nodes) - Utils.runAsync(refilterNode, this, node, entry); - } -}; -Policy.init(); - -/** - * Actual nsIContentPolicy and nsIChannelEventSink implementation - * @class - */ -let PolicyImplementation = -{ - classDescription: "Adblock Plus content policy", - classID: Components.ID("cfeaabe6-1dd1-11b2-a0c6-cb5c268894c9"), - contractID: "@adblockplus.org/abp/policy;1", - xpcom_categories: ["content-policy", "net-channel-event-sinks"], - - /** - * Registers the content policy on startup. + * Checks whether a frame is whitelisted. + * @param {Array} frames + * frame structure as returned by getFrames() in child/utils module. + * @param {boolean} isElemHide + * true if element hiding whitelisting should be considered + * @return {?Array} + * An array with the hit parameters: frameIndex, contentType, docDomain, + * thirdParty, location, filter. Note that the filter could be a + * genericblock/generichide exception rule. If nothing matched null is + * returned. */ - init: function() - { - let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); - try - { - registrar.registerFactory(this.classID, this.classDescription, this.contractID, this); - } - catch (e if e.result == Cr.NS_ERROR_FACTORY_EXISTS) - { - // See bug 924340 - it might be too early to init now, the old version - // we are replacing didn't finish removing itself yet. - Utils.runAsync(this.init.bind(this)); - return; - } - - let catMan = Utils.categoryManager; - for (let category of this.xpcom_categories) - catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true); - - // http-on-opening-request is new in Gecko 18, http-on-modify-request can - // be used in earlier releases. - let httpTopic = "http-on-opening-request"; - if (Services.vc.compare(Utils.platformVersion, "18.0") < 0) - httpTopic = "http-on-modify-request"; - - Services.obs.addObserver(this, httpTopic, true); - Services.obs.addObserver(this, "content-document-global-created", true); - Services.obs.addObserver(this, "xpcom-category-entry-removed", true); - Services.obs.addObserver(this, "xpcom-category-cleared", true); - - onShutdown.add(function() - { - // Our category observers should be removed before changing category - // memberships, just in case. - Services.obs.removeObserver(this, httpTopic); - Services.obs.removeObserver(this, "content-document-global-created"); - Services.obs.removeObserver(this, "xpcom-category-entry-removed"); - Services.obs.removeObserver(this, "xpcom-category-cleared"); - - for (let category of this.xpcom_categories) - catMan.deleteCategoryEntry(category, this.contractID, false); - - // This needs to run asynchronously, see bug 753687 - Utils.runAsync(function() - { - registrar.unregisterFactory(this.classID, this); - }.bind(this)); - - this.previousRequest = null; - }.bind(this)); - }, - - // - // nsISupports interface implementation - // - - QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy, Ci.nsIObserver, - Ci.nsIChannelEventSink, Ci.nsIFactory, Ci.nsISupportsWeakReference]), - - // - // nsIContentPolicy interface implementation - // - - shouldLoad: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra) - { - // Ignore requests without context and top-level documents - if (!node || contentType == Policy.type.DOCUMENT) - return Ci.nsIContentPolicy.ACCEPT; - - // Ignore standalone objects - if (contentType == Policy.type.OBJECT && node.ownerDocument && !/^text\/|[+\/]xml$/.test(node.ownerDocument.contentType)) - return Ci.nsIContentPolicy.ACCEPT; - - let wnd = Utils.getWindow(node); - if (!wnd) - return Ci.nsIContentPolicy.ACCEPT; - - // Ignore whitelisted schemes - let location = Utils.unwrapURL(contentLocation); - if (!Policy.isBlockableScheme(location)) - return Ci.nsIContentPolicy.ACCEPT; - - // Interpret unknown types as "other" - if (!(contentType in Policy.typeDescr)) - contentType = Policy.type.OTHER; - - let result = Policy.processNode(wnd, node, contentType, location, false); - if (result) - { - // We didn't block this request so we will probably see it again in - // http-on-opening-request. Keep it so that we can associate it with the - // channel there - will be needed in case of redirect. - this.previousRequest = [location, contentType]; - } - return (result ? Ci.nsIContentPolicy.ACCEPT : Ci.nsIContentPolicy.REJECT_REQUEST); - }, - - shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) + isFrameWhitelisted: function(frames, isElemHide) { - return Ci.nsIContentPolicy.ACCEPT; - }, - - // - // nsIObserver interface implementation - // - observe: function(subject, topic, data, additional) - { - switch (topic) - { - case "content-document-global-created": - { - if (!(subject instanceof Ci.nsIDOMWindow) || !subject.opener) - return; - - let uri = additional || Utils.makeURI(subject.location.href); - if (!Policy.processNode(subject.opener, subject.opener.document, Policy.type.POPUP, uri, false)) - { - subject.stop(); - Utils.runAsync(subject.close, subject); - } - else if (uri.spec == "about:blank") - { - // An about:blank pop-up most likely means that a load will be - // initiated synchronously. Set a flag for our "http-on-opening-request" - // handler. - this.expectingPopupLoad = true; - Utils.runAsync(function() - { - this.expectingPopupLoad = false; - }); - } - break; - } - case "http-on-opening-request": - case "http-on-modify-request": - { - if (!(subject instanceof Ci.nsIHttpChannel)) - return; - - if (this.previousRequest && subject.URI == this.previousRequest[0] && - subject instanceof Ci.nsIWritablePropertyBag) - { - // We just handled a content policy call for this request - associate - // the data with the channel so that we can find it in case of a redirect. - subject.setProperty("abpRequestType", this.previousRequest[1]); - this.previousRequest = null; - } - - if (this.expectingPopupLoad) - { - let wnd = Utils.getRequestWindow(subject); - if (wnd && wnd.opener && wnd.location.href == "about:blank") - { - this.observe(wnd, "content-document-global-created", null, subject.URI); - if (subject instanceof Ci.nsIWritablePropertyBag) - subject.setProperty("abpRequestType", Policy.type.POPUP); - } - } - - break; - } - case "xpcom-category-entry-removed": - case "xpcom-category-cleared": - { - let category = data; - if (this.xpcom_categories.indexOf(category) < 0) - return; - - if (topic == "xpcom-category-entry-removed" && - subject instanceof Ci.nsISupportsCString && - subject.data != this.contractID) - { - return; - } - - // Our category entry was removed, make sure to add it back - let catMan = Utils.categoryManager; - catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true); - break; - } - } - }, + let [sitekey, sitekeyFrame] = getSitekey(frames); + let nogenericHit = null; - // - // nsIChannelEventSink interface implementation - // + let typeMap = RegExpFilter.typeMap.DOCUMENT; + if (isElemHide) + typeMap = typeMap | RegExpFilter.typeMap.ELEMHIDE; + let genericType = (isElemHide ? "GENERICHIDE" : "GENERICBLOCK"); - asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) - { - let result = Cr.NS_OK; - try + for (let i = 0; i < frames.length; i++) { - // Try to retrieve previously stored request data from the channel - let contentType; - if (oldChannel instanceof Ci.nsIWritablePropertyBag) - { - try - { - contentType = oldChannel.getProperty("abpRequestType"); - } - catch(e) - { - // No data attached, ignore this redirect - return; - } - } + let frame = frames[i]; + let wndLocation = frame.location; + let parentWndLocation = frames[Math.min(i + 1, frames.length - 1)].location; + let parentDocDomain = getHostname(parentWndLocation); - let newLocation = null; - try - { - newLocation = newChannel.URI; - } catch(e2) {} - if (!newLocation) - return; - - let wnd = Utils.getRequestWindow(newChannel); - if (!wnd) - return; - - if (contentType == Policy.type.SUBDOCUMENT && wnd.parent == wnd.top && wnd.opener) + let match = defaultMatcher.matchesAny(wndLocation, typeMap, parentDocDomain, false, sitekey); + if (match instanceof WhitelistFilter) { - // This is a window opened in a new tab miscategorized as frame load, - // see bug 467514. Get the frame as context to be at least consistent. - wnd = wnd.opener; + let whitelistType = (match.contentType & RegExpFilter.typeMap.DOCUMENT) ? "DOCUMENT" : "ELEMHIDE"; + return [i, whitelistType, parentDocDomain, false, wndLocation, match]; } - if (contentType == Policy.type.POPUP && wnd.opener) + if (!nogenericHit) { - // Popups are initiated by their opener, not their own window. - wnd = wnd.opener; + match = defaultMatcher.matchesAny(wndLocation, + RegExpFilter.typeMap[genericType], parentDocDomain, false, sitekey); + if (match instanceof WhitelistFilter) + nogenericHit = [i, genericType, parentDocDomain, false, wndLocation, match]; } - if (!Policy.processNode(wnd, wnd.document, contentType, newLocation, false)) - result = Cr.NS_BINDING_ABORTED; + if (frame == sitekeyFrame) + [sitekey, sitekeyFrame] = getSitekey(frames.slice(i + 1)); } - catch (e) - { - // We shouldn't throw exceptions here - this will prevent the redirect. - Cu.reportError(e); - } - finally - { - callback.onRedirectVerifyCallback(result); - } - }, - - // - // nsIFactory interface implementation - // - createInstance: function(outer, iid) - { - if (outer) - throw Cr.NS_ERROR_NO_AGGREGATION; - return this.QueryInterface(iid); - } -}; -PolicyImplementation.init(); - -/** - * Nodes scheduled for post-processing (might be null). - * @type Array of Node - */ -let scheduledNodes = null; + return nogenericHit; + }, -/** - * Schedules a node for post-processing. - */ -function schedulePostProcess(/**Element*/ node) -{ - if (scheduledNodes) - scheduledNodes.push(node); - else + /** + * Deletes nodes that were previously stored with a + * RequestNotifier.storeNodesForEntries() call or similar. + * @param {string} id unique ID of the nodes + */ + deleteNodes: function(id) { - scheduledNodes = [node]; - Utils.runAsync(postProcessNodes); - } -} - -/** - * Processes nodes scheduled for post-processing (typically hides them). - */ -function postProcessNodes() -{ - let nodes = scheduledNodes; - scheduledNodes = null; + port.emit("deleteNodes", id); + }, - for (let node of nodes) + /** + * Asynchronously re-checks filters for nodes given by an ID previously + * returned by a RequestNotifier.storeNodesForEntries() call or similar. + * @param {string} id unique ID of the nodes + * @param {RequestEntry} entry + */ + refilterNodes: function(id, entry) { - // adjust frameset's cols/rows for frames - let parentNode = node.parentNode; - if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement) - { - let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0); - let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0); - if ((hasCols || hasRows) && !(hasCols && hasRows)) - { - let index = -1; - for (let frame = node; frame; frame = frame.previousSibling) - if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof Ci.nsIDOMHTMLFrameSetElement) - index++; - - let property = (hasCols ? "cols" : "rows"); - let weights = parentNode[property].split(","); - weights[index] = "0"; - parentNode[property] = weights.join(","); - } - } - else - node.classList.add(collapsedClass); + port.emit("refilterNodes", { + nodesID: id, + entry: entry + }); } -} +}; +Policy.init(); /** * Extracts the hostname from a URL (might return null). @@ -671,44 +318,33 @@ function getHostname(/**String*/ url) /**String*/ } /** - * Retrieves the sitekey of a window. + * Retrieves and validates the sitekey for a frame structure. */ -function getSitekey(wnd) +function getSitekey(frames) { - let sitekey = null; - - while (true) + for (let frame of frames) { - if (wnd.document && wnd.document.documentElement) + if (frame.sitekey && frame.sitekey.indexOf("_") >= 0) { - let keydata = wnd.document.documentElement.getAttribute("data-adblockkey"); - if (keydata && keydata.indexOf("_") >= 0) - { - let [key, signature] = keydata.split("_", 2); - key = key.replace(/=/g, ""); - - // Website specifies a key but is the signature valid? - let uri = Services.io.newURI(getWindowLocation(wnd), null, null); - let host = uri.asciiHost; - if (uri.port > 0) - host += ":" + uri.port; - let params = [ - uri.path.replace(/#.*/, ""), // REQUEST_URI - host, // HTTP_HOST - Utils.httpProtocol.userAgent // HTTP_USER_AGENT - ]; - if (Utils.verifySignature(key, signature, params.join("\0"))) - return [key, wnd]; - } + let [key, signature] = frame.sitekey.split("_", 2); + key = key.replace(/=/g, ""); + + // Website specifies a key but is the signature valid? + let uri = Services.io.newURI(frame.location, null, null); + let host = uri.asciiHost; + if (uri.port > 0) + host += ":" + uri.port; + let params = [ + uri.path.replace(/#.*/, ""), // REQUEST_URI + host, // HTTP_HOST + Utils.httpProtocol.userAgent // HTTP_USER_AGENT + ]; + if (Utils.verifySignature(key, signature, params.join("\0"))) + return [key, frame]; } - - if (wnd === wnd.parent) - break; - - wnd = wnd.parent; } - return [sitekey, wnd]; + return [null, null]; } /** @@ -756,14 +392,15 @@ function getWindowLocation(wnd) /** * Checks whether the location's origin is different from document's origin. */ -function isThirdParty(/**nsIURI*/location, /**String*/ docDomain) /**Boolean*/ +function isThirdParty(/**String*/location, /**String*/ docDomain) /**Boolean*/ { if (!location || !docDomain) return true; + let uri = Utils.makeURI(location); try { - return Utils.effectiveTLD.getBaseDomain(location) != Utils.effectiveTLD.getBaseDomainFromHost(docDomain); + return Utils.effectiveTLD.getBaseDomain(uri) != Utils.effectiveTLD.getBaseDomainFromHost(docDomain); } catch (e) { @@ -771,25 +408,8 @@ function isThirdParty(/**nsIURI*/location, /**String*/ docDomain) /**Boolean*/ let host = ""; try { - host = location.host; + host = uri.host; } catch (e) {} return host != docDomain; } } - -/** - * Re-checks filters on an element. - */ -function refilterNode(/**Node*/ node, /**RequestEntry*/ entry) -{ - let wnd = Utils.getWindow(node); - if (!wnd || wnd.closed) - return; - - if (entry.type == Policy.type.OBJECT) - { - node.removeEventListener("mouseover", objectMouseEventHander, true); - node.removeEventListener("mouseout", objectMouseEventHander, true); - } - Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true); -} diff --git a/data/extensions/spyblock@gnu.org/lib/coreUtils.js b/data/extensions/spyblock@gnu.org/lib/coreUtils.js new file mode 100644 index 0000000..98a1331 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/coreUtils.js @@ -0,0 +1,36 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +function desc(properties) +{ + let descriptor = {}; + let keys = Object.keys(properties); + + for (let key of keys) + descriptor[key] = Object.getOwnPropertyDescriptor(properties, key); + + return descriptor; +} +exports.desc = desc; + +function extend(cls, properties) +{ + return Object.create(cls.prototype, desc(properties)); +} +exports.extend = extend; diff --git a/data/extensions/spyblock@gnu.org/lib/customizableUI.js b/data/extensions/spyblock@gnu.org/lib/customizableUI.js index ee250fa..3874256 100644 --- a/data/extensions/spyblock@gnu.org/lib/customizableUI.js +++ b/data/extensions/spyblock@gnu.org/lib/customizableUI.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -26,7 +26,7 @@ let {Utils} = require("utils"); // UI module has to be referenced lazily to avoid circular references XPCOMUtils.defineLazyGetter(this, "UI", () => require("ui").UI); -let widgets = Map(); +let widgets = new Map(); function getToolbox(/**Window*/ window, /**Widget*/ widget) /**Element*/ { diff --git a/data/extensions/spyblock@gnu.org/lib/downloader.js b/data/extensions/spyblock@gnu.org/lib/downloader.js index 320a754..fd760a7 100644 --- a/data/extensions/spyblock@gnu.org/lib/downloader.js +++ b/data/extensions/spyblock@gnu.org/lib/downloader.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,40 +15,46 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** * @fileOverview Downloads a set of URLs in regular time intervals. */ -let {Utils} = require("utils"); +const {Utils} = require("utils"); -let MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000; -let MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; -let MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; -let MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; +const MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000; +const MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; +const MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; +const MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; +let Downloader = /** * Creates a new downloader instance. - * @param {Function} dataSource Function that will yield downloadable objects on each check - * @param {Integer} initialDelay Number of milliseconds to wait before the first check - * @param {Integer} checkInterval Interval between the checks + * @param {Function} dataSource + * Function that will yield downloadable objects on each check + * @param {number} initialDelay + * Number of milliseconds to wait before the first check + * @param {number} checkInterval + * Interval between the checks * @constructor */ -let Downloader = exports.Downloader = function Downloader(dataSource, initialDelay, checkInterval) +exports.Downloader = function(dataSource, initialDelay, checkInterval) { this.dataSource = dataSource; this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); - this._timer.initWithCallback(function() + this._timer.initWithCallback(() => { this._timer.delay = checkInterval; this._doCheck(); - }.bind(this), initialDelay, Ci.nsITimer.TYPE_REPEATING_SLACK); + }, initialDelay, Ci.nsITimer.TYPE_REPEATING_SLACK); this._downloading = Object.create(null); -} +}; Downloader.prototype = { /** * Timer triggering the downloads. - * @type nsITimer + * @type {nsITimer} */ _timer: null, @@ -59,74 +65,75 @@ Downloader.prototype = /** * Function that will yield downloadable objects on each check. - * @type Function + * @type {Function} */ dataSource: null, /** * Maximal time interval that the checks can be left out until the soft * expiration interval increases. - * @type Integer + * @type {number} */ maxAbsenceInterval: 1 * MILLIS_IN_DAY, /** * Minimal time interval before retrying a download after an error. - * @type Integer + * @type {number} */ minRetryInterval: 1 * MILLIS_IN_DAY, /** * Maximal allowed expiration interval, larger expiration intervals will be * corrected. - * @type Integer + * @type {number} */ maxExpirationInterval: 14 * MILLIS_IN_DAY, /** * Maximal number of redirects before the download is considered as failed. - * @type Integer + * @type {number} */ maxRedirects: 5, /** * Called whenever expiration intervals for an object need to be adapted. - * @type Function + * @type {Function} */ onExpirationChange: null, /** * Callback to be triggered whenever a download starts. - * @type Function + * @type {Function} */ onDownloadStarted: null, /** * Callback to be triggered whenever a download finishes successfully. The * callback can return an error code to indicate that the data is wrong. - * @type Function + * @type {Function} */ onDownloadSuccess: null, /** * Callback to be triggered whenever a download fails. - * @type Function + * @type {Function} */ onDownloadError: null, /** * Checks whether anything needs downloading. */ - _doCheck: function() + _doCheck() { let now = Date.now(); for (let downloadable of this.dataSource()) { - if (downloadable.lastCheck && now - downloadable.lastCheck > this.maxAbsenceInterval) + if (downloadable.lastCheck && + now - downloadable.lastCheck > this.maxAbsenceInterval) { - // No checks for a long time interval - user must have been offline, e.g. - // during a weekend. Increase soft expiration to prevent load peaks on the - // server. + // No checks for a long time interval - user must have been offline, + // e.g. during a weekend. Increase soft expiration to prevent load + // peaks on the server. downloadable.softExpiration += now - downloadable.lastCheck; } downloadable.lastCheck = now; @@ -143,12 +150,18 @@ Downloader.prototype = this.onExpirationChange(downloadable); // Does that object need downloading? - if (downloadable.softExpiration > now && downloadable.hardExpiration > now) + if (downloadable.softExpiration > now && + downloadable.hardExpiration > now) + { continue; + } // Do not retry downloads too often - if (downloadable.lastError && now - downloadable.lastError < this.minRetryInterval) + if (downloadable.lastError && + now - downloadable.lastError < this.minRetryInterval) + { continue; + } this._download(downloadable, 0); } @@ -157,23 +170,26 @@ Downloader.prototype = /** * Stops the periodic checks. */ - cancel: function() + cancel() { this._timer.cancel(); }, /** * Checks whether an address is currently being downloaded. + * @param {string} url + * @return {boolean} */ - isDownloading: function(/**String*/ url) /**Boolean*/ + isDownloading(url) { return url in this._downloading; }, /** * Starts downloading for an object. + * @param {Downloadable} downloadable */ - download: function(/**Downloadable*/ downloadable) + download(downloadable) { // Make sure to detach download from the current execution context Utils.runAsync(this._download.bind(this, downloadable, 0)); @@ -182,17 +198,20 @@ Downloader.prototype = /** * Generates the real download URL for an object by appending various * parameters. + * @param {Downloadable} downloadable + * @return {string} */ - getDownloadUrl: function(/**Downloadable*/ downloadable) /** String*/ + getDownloadUrl(downloadable) { - let {addonName, addonVersion, application, applicationVersion, platform, platformVersion} = require("info"); + const {addonName, addonVersion, application, applicationVersion, + platform, platformVersion} = require("info"); let url = downloadable.redirectURL || downloadable.url; if (url.indexOf("?") >= 0) url += "&"; else url += "?"; // We limit the download count to 4+ to keep the request anonymized - let downloadCount = downloadable.downloadCount; + let {downloadCount} = downloadable; if (downloadCount > 4) downloadCount = "4+"; url += "addonName=" + encodeURIComponent(addonName) + @@ -206,7 +225,7 @@ Downloader.prototype = return url; }, - _download: function(downloadable, redirects) + _download(downloadable, redirects) { if (this.isDownloading(downloadable.url)) return; @@ -220,11 +239,13 @@ Downloader.prototype = try { channelStatus = request.channel.status; - } catch (e) {} + } + catch (e) {} let responseStatus = request.status; - Cu.reportError("Adblock Plus: Downloading URL " + downloadable.url + " failed (" + error + ")\n" + + Cu.reportError("Adblock Plus: Downloading URL " + downloadable.url + + " failed (" + error + ")\n" + "Download address: " + downloadUrl + "\n" + "Channel status: " + channelStatus + "\n" + "Server response: " + responseStatus); @@ -235,14 +256,15 @@ Downloader.prototype = let redirectCallback = null; if (redirects <= this.maxRedirects) { - redirectCallback = function redirectCallback(url) + redirectCallback = url => { downloadable.redirectURL = url; this._download(downloadable, redirects + 1); - }.bind(this); + }; } - this.onDownloadError(downloadable, downloadUrl, error, channelStatus, responseStatus, redirectCallback); + this.onDownloadError(downloadable, downloadUrl, error, channelStatus, + responseStatus, redirectCallback); } }.bind(this); @@ -258,7 +280,8 @@ Downloader.prototype = return; } - try { + try + { request.overrideMimeType("text/plain"); request.channel.loadFlags = request.channel.loadFlags | request.channel.INHIBIT_CACHING | @@ -270,19 +293,19 @@ Downloader.prototype = } catch (e) { - Cu.reportError(e) + Cu.reportError(e); } - request.addEventListener("error", function(event) + request.addEventListener("error", event => { if (onShutdown.done) return; delete this._downloading[downloadable.url]; errorCallback("synchronize_connection_error"); - }.bind(this), false); + }, false); - request.addEventListener("load", function(event) + request.addEventListener("load", event => { if (onShutdown.done) return; @@ -298,17 +321,20 @@ Downloader.prototype = downloadable.downloadCount++; - this.onDownloadSuccess(downloadable, request.responseText, errorCallback, function redirectCallback(url) - { - if (redirects >= this.maxRedirects) - errorCallback("synchronize_connection_error"); - else + this.onDownloadSuccess( + downloadable, request.responseText, errorCallback, + url => { - downloadable.redirectURL = url; - this._download(downloadable, redirects + 1); + if (redirects >= this.maxRedirects) + errorCallback("synchronize_connection_error"); + else + { + downloadable.redirectURL = url; + this._download(downloadable, redirects + 1); + } } - }.bind(this)); - }.bind(this), false); + ); + }); request.send(null); @@ -320,9 +346,10 @@ Downloader.prototype = /** * Produces a soft and a hard expiration interval for a given supplied * expiration interval. + * @param {number} interval * @return {Array} soft and hard expiration interval */ - processExpirationInterval: function(/**Integer*/ interval) + processExpirationInterval(interval) { interval = Math.min(Math.max(interval, 0), this.maxExpirationInterval); let soft = Math.round(interval * (Math.random() * 0.4 + 0.8)); @@ -334,61 +361,61 @@ Downloader.prototype = /** * An object that can be downloaded by the downloadable - * @param {String} url URL that has to be requested for the object + * @param {string} url URL that has to be requested for the object * @constructor */ let Downloadable = exports.Downloadable = function Downloadable(url) { this.url = url; -} +}; Downloadable.prototype = { /** * URL that has to be requested for the object. - * @type String + * @type {string} */ url: null, /** * URL that the download was redirected to if any. - * @type String + * @type {string} */ redirectURL: null, /** * Time of last download error or 0 if the last download was successful. - * @type Integer + * @type {number} */ lastError: 0, /** * Time of last check whether the object needs downloading. - * @type Integer + * @type {number} */ lastCheck: 0, /** * Object version corresponding to the last successful download. - * @type Integer + * @type {number} */ lastVersion: 0, /** * Soft expiration interval, will increase if no checks are performed for a * while. - * @type Integer + * @type {number} */ softExpiration: 0, /** * Hard expiration interval, this is fixed. - * @type Integer + * @type {number} */ hardExpiration: 0, - + /** * Number indicating how often the object was downloaded. - * @type Integer + * @type {number} */ - downloadCount: 0, + downloadCount: 0 }; diff --git a/data/extensions/spyblock@gnu.org/lib/elemHide.js b/data/extensions/spyblock@gnu.org/lib/elemHide.js index b762040..a91f1d4 100644 --- a/data/extensions/spyblock@gnu.org/lib/elemHide.js +++ b/data/extensions/spyblock@gnu.org/lib/elemHide.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,115 +15,135 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** * @fileOverview Element hiding implementation. */ -Cu.import("resource://gre/modules/Services.jsm"); - -let {Utils} = require("utils"); -let {IO} = require("io"); -let {Prefs} = require("prefs"); -let {ElemHideException} = require("filterClasses"); -let {FilterNotifier} = require("filterNotifier"); -let {AboutHandler} = require("elemHideHitRegistration"); +const {ElemHideException} = require("filterClasses"); +const {FilterNotifier} = require("filterNotifier"); /** * Lookup table, filters by their associated key - * @type Object + * @type {Object} */ -let filterByKey = Object.create(null); +let filterByKey = []; /** * Lookup table, keys of the filters by filter text - * @type Object + * @type {Object} */ let keyByFilter = Object.create(null); /** - * Lookup table, keys are known element hiding exceptions - * @type Object + * Nested lookup table, filter (or false if inactive) by filter key by domain. + * (Only contains filters that aren't unconditionally matched for all domains.) + * @type {Object} */ -let knownExceptions = Object.create(null); +let filtersByDomain = Object.create(null); /** - * Lookup table, lists of element hiding exceptions by selector - * @type Object + * Lookup table, filter key by selector. (Only used for selectors that are + * unconditionally matched for all domains.) */ -let exceptions = Object.create(null); +let filterKeyBySelector = Object.create(null); /** - * Currently applied stylesheet URL - * @type nsIURI + * This array caches the keys of filterKeyBySelector table (selectors which + * unconditionally apply on all domains). It will be null if the cache needs to + * be rebuilt. */ -let styleURL = null; +let unconditionalSelectors = null; /** - * Element hiding component - * @class + * This array caches the values of filterKeyBySelector table (filterIds for + * selectors which unconditionally apply on all domains). It will be null if the + * cache needs to be rebuilt. */ -let ElemHide = exports.ElemHide = -{ - /** - * Indicates whether filters have been added or removed since the last apply() call. - * @type Boolean - */ - isDirty: false, +let unconditionalFilterKeys = null; - /** - * Inidicates whether the element hiding stylesheet is currently applied. - * @type Boolean - */ - applied: false, +/** + * Object to be used instead when a filter has a blank domains property. + */ +let defaultDomains = Object.create(null); +defaultDomains[""] = true; - /** - * Called on module startup. - */ - init: function() - { - Prefs.addListener(function(name) - { - if (name == "enabled") - ElemHide.apply(); - }); - onShutdown.add(function() - { - ElemHide.unapply(); - }); +/** + * Lookup table, keys are known element hiding exceptions + * @type {Object} + */ +let knownExceptions = Object.create(null); - let styleFile = IO.resolveFilePath(Prefs.data_directory); - styleFile.append("elemhide.css"); - styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); - }, +/** + * Lookup table, lists of element hiding exceptions by selector + * @type {Object} + */ +let exceptions = Object.create(null); +/** + * Container for element hiding filters + * @class + */ +let ElemHide = exports.ElemHide = { /** * Removes all known filters */ - clear: function() + clear() { - filterByKey = Object.create(null); + filterByKey = []; keyByFilter = Object.create(null); + filtersByDomain = Object.create(null); + filterKeyBySelector = Object.create(null); + unconditionalSelectors = unconditionalFilterKeys = null; knownExceptions = Object.create(null); exceptions = Object.create(null); - ElemHide.isDirty = false; - ElemHide.unapply(); + FilterNotifier.emit("elemhideupdate"); + }, + + _addToFiltersByDomain(key, filter) + { + let domains = filter.domains || defaultDomains; + for (let domain in domains) + { + let filters = filtersByDomain[domain]; + if (!filters) + filters = filtersByDomain[domain] = Object.create(null); + + if (domains[domain]) + filters[key] = filter; + else + filters[key] = false; + } }, /** * Add a new element hiding filter * @param {ElemHideFilter} filter */ - add: function(filter) + add(filter) { if (filter instanceof ElemHideException) { if (filter.text in knownExceptions) return; - let selector = filter.selector; + let {selector} = filter; if (!(selector in exceptions)) exceptions[selector] = []; exceptions[selector].push(filter); + + // If this is the first exception for a previously unconditionally + // applied element hiding selector we need to take care to update the + // lookups. + let filterKey = filterKeyBySelector[selector]; + if (typeof filterKey != "undefined") + { + this._addToFiltersByDomain(filterKey, filterByKey[filterKey]); + delete filterKeyBySelector[selector]; + unconditionalSelectors = unconditionalFilterKeys = null; + } + knownExceptions[filter.text] = true; } else @@ -131,14 +151,42 @@ let ElemHide = exports.ElemHide = if (filter.text in keyByFilter) return; - let key; - do { - key = Math.random().toFixed(15).substr(5); - } while (key in filterByKey); - - filterByKey[key] = filter; + let key = filterByKey.push(filter) - 1; keyByFilter[filter.text] = key; - ElemHide.isDirty = true; + + if (!(filter.domains || filter.selector in exceptions)) + { + // The new filter's selector is unconditionally applied to all domains + filterKeyBySelector[filter.selector] = key; + unconditionalSelectors = unconditionalFilterKeys = null; + } + else + { + // The new filter's selector only applies to some domains + this._addToFiltersByDomain(key, filter); + } + } + + FilterNotifier.emit("elemhideupdate"); + }, + + _removeFilterKey(key, filter) + { + if (filterKeyBySelector[filter.selector] == key) + { + delete filterKeyBySelector[filter.selector]; + unconditionalSelectors = unconditionalFilterKeys = null; + return; + } + + // We haven't found this filter in unconditional filters, look in + // filtersByDomain. + let domains = filter.domains || defaultDomains; + for (let domain in domains) + { + let filters = filtersByDomain[domain]; + if (filters) + delete filters[key]; } }, @@ -146,7 +194,7 @@ let ElemHide = exports.ElemHide = * Removes an element hiding filter * @param {ElemHideFilter} filter */ - remove: function(filter) + remove(filter) { if (filter instanceof ElemHideException) { @@ -167,226 +215,182 @@ let ElemHide = exports.ElemHide = let key = keyByFilter[filter.text]; delete filterByKey[key]; delete keyByFilter[filter.text]; - ElemHide.isDirty = true; + this._removeFilterKey(key, filter); } + + FilterNotifier.emit("elemhideupdate"); }, /** * Checks whether an exception rule is registered for a filter on a particular * domain. + * @param {Filter} filter + * @param {string} docDomain + * @return {ElemHideException} */ - getException: function(/**Filter*/ filter, /**String*/ docDomain) /**ElemHideException*/ + getException(filter, docDomain) { if (!(filter.selector in exceptions)) return null; let list = exceptions[filter.selector]; for (let i = list.length - 1; i >= 0; i--) + { if (list[i].isActiveOnDomain(docDomain)) return list[i]; + } return null; }, /** - * Will be set to true if apply() is running (reentrance protection). - * @type Boolean - */ - _applying: false, - - /** - * Will be set to true if an apply() call arrives while apply() is already - * running (delayed execution). - * @type Boolean - */ - _needsApply: false, - - /** - * Generates stylesheet URL and applies it globally + * Retrieves an element hiding filter by the corresponding protocol key + * @param {number} key + * @return {Filter} */ - apply: function() + getFilterByKey(key) { - if (this._applying) - { - this._needsApply = true; - return; - } - - if (!ElemHide.isDirty || !Prefs.enabled) - { - // Nothing changed, looks like we merely got enabled/disabled - if (Prefs.enabled && !ElemHide.applied) - { - try - { - Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); - ElemHide.applied = true; - } - catch (e) - { - Cu.reportError(e); - } - } - else if (!Prefs.enabled && ElemHide.applied) - { - ElemHide.unapply(); - } - - return; - } - - IO.writeToFile(styleURL.file, this._generateCSSContent(), function(e) - { - this._applying = false; - - // _generateCSSContent is throwing NS_ERROR_NOT_AVAILABLE to indicate that - // there are no filters. If that exception is passed through XPCOM we will - // see a proper exception here, otherwise a number. - let noFilters = (e == Cr.NS_ERROR_NOT_AVAILABLE || (e && e.result == Cr.NS_ERROR_NOT_AVAILABLE)); - if (noFilters) - { - e = null; - IO.removeFile(styleURL.file, function(e) {}); - } - else if (e) - Cu.reportError(e); - - if (this._needsApply) - { - this._needsApply = false; - this.apply(); - } - else if (!e) - { - ElemHide.isDirty = false; - - ElemHide.unapply(); - - if (!noFilters) - { - try - { - Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); - ElemHide.applied = true; - } - catch (e) - { - Cu.reportError(e); - } - } - - FilterNotifier.triggerListeners("elemhideupdate"); - } - }.bind(this)); - - this._applying = true; + return (key in filterByKey ? filterByKey[key] : null); }, - _generateCSSContent: function() + /** + * Returns a list of all selectors as a nested map. On first level, the keys + * are all values of `ElemHideBase.selectorDomain` (domains on which these + * selectors should apply, ignoring exceptions). The values are maps again, + * with the keys being selectors and values the corresponding filter keys. + * @returns {Map.<String,Map<String,String>>} + */ + getSelectors() { - // Grouping selectors by domains - let domains = Object.create(null); - let hasFilters = false; + let domains = new Map(); for (let key in filterByKey) { let filter = filterByKey[key]; - let domain = filter.selectorDomain || ""; - - let list; - if (domain in domains) - list = domains[domain]; - else - { - list = Object.create(null); - domains[domain] = list; - } - list[filter.selector] = key; - hasFilters = true; - } + if (!filter.selector) + continue; - if (!hasFilters) - throw Cr.NS_ERROR_NOT_AVAILABLE; + let domain = filter.selectorDomain || ""; - function escapeChar(match) - { - return "\\" + match.charCodeAt(0).toString(16) + " "; + if (!domains.has(domain)) + domains.set(domain, new Map()); + domains.get(domain).set(filter.selector, key); } - // Return CSS data - let cssTemplate = "-moz-binding: url(about:" + AboutHandler.aboutPrefix + "?%ID%#dummy) !important;"; - for (let domain in domains) - { - let rules = []; - let list = domains[domain]; - - if (domain) - yield ('@-moz-document domain("' + domain.split(",").join('"),domain("') + '"){').replace(/[^\x01-\x7F]/g, escapeChar); - else - { - // Only allow unqualified rules on a few protocols to prevent them from blocking chrome - yield '@-moz-document url-prefix("http://"),url-prefix("https://"),' - + 'url-prefix("mailbox://"),url-prefix("imap://"),' - + 'url-prefix("news://"),url-prefix("snews://"){'; - } + return domains; + }, - for (let selector in list) - yield selector.replace(/[^\x01-\x7F]/g, escapeChar) + "{" + cssTemplate.replace("%ID%", list[selector]) + "}"; - yield '}'; - } + /** + * Returns a list of selectors that apply on each website unconditionally. + * @returns {string[]} + */ + getUnconditionalSelectors() + { + if (!unconditionalSelectors) + unconditionalSelectors = Object.keys(filterKeyBySelector); + return unconditionalSelectors.slice(); }, /** - * Unapplies current stylesheet URL + * Returns a list of filter keys for selectors which apply to all websites + * without exception. + * @returns {number[]} */ - unapply: function() + getUnconditionalFilterKeys() { - if (ElemHide.applied) + if (!unconditionalFilterKeys) { - try - { - Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); - } - catch (e) - { - Cu.reportError(e); - } - ElemHide.applied = false; + let selectors = this.getUnconditionalSelectors(); + unconditionalFilterKeys = []; + for (let selector of selectors) + unconditionalFilterKeys.push(filterKeyBySelector[selector]); } + return unconditionalFilterKeys.slice(); }, + /** - * Retrieves the currently applied stylesheet URL - * @type String + * Constant used by getSelectorsForDomain to return all selectors applying to + * a particular hostname. */ - get styleURL() - { - return ElemHide.applied ? styleURL.spec : null; - }, + ALL_MATCHING: 0, /** - * Retrieves an element hiding filter by the corresponding protocol key + * Constant used by getSelectorsForDomain to exclude selectors which apply to + * all websites without exception. */ - getFilterByKey: function(/**String*/ key) /**Filter*/ - { - return (key in filterByKey ? filterByKey[key] : null); - }, + NO_UNCONDITIONAL: 1, /** - * Returns a list of all selectors active on a particular domain (currently - * used only in Chrome, Opera and Safari). + * Constant used by getSelectorsForDomain to return only selectors for filters + * which specifically match the given host name. */ - getSelectorsForDomain: function(/**String*/ domain, /**Boolean*/ specificOnly) + SPECIFIC_ONLY: 2, + + /** + * Determines from the current filter list which selectors should be applied + * on a particular host name. Optionally returns the corresponding filter + * keys. + * @param {string} domain + * @param {number} [criteria] + * One of the following: ElemHide.ALL_MATCHING, ElemHide.NO_UNCONDITIONAL or + * ElemHide.SPECIFIC_ONLY. + * @param {boolean} [provideFilterKeys] + * If true, the function will return a list of corresponding filter keys in + * addition to selectors. + * @returns {string[]|Array.<string[]>} + * List of selectors or an array with two elements (list of selectors and + * list of corresponding keys) if provideFilterKeys is true. + */ + getSelectorsForDomain(domain, criteria, provideFilterKeys) { - let result = []; - for (let key in filterByKey) + let filterKeys = []; + let selectors = []; + + if (typeof criteria == "undefined") + criteria = ElemHide.ALL_MATCHING; + if (criteria < ElemHide.NO_UNCONDITIONAL) { - let filter = filterByKey[key]; - if (specificOnly && (!filter.domains || filter.domains[""])) - continue; + selectors = this.getUnconditionalSelectors(); + if (provideFilterKeys) + filterKeys = this.getUnconditionalFilterKeys(); + } + + let specificOnly = (criteria >= ElemHide.SPECIFIC_ONLY); + let seenFilters = Object.create(null); + let currentDomain = domain ? domain.toUpperCase() : ""; + while (true) + { + if (specificOnly && currentDomain == "") + break; - if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain)) - result.push(filter.selector); + let filters = filtersByDomain[currentDomain]; + if (filters) + { + for (let filterKey in filters) + { + if (filterKey in seenFilters) + continue; + seenFilters[filterKey] = true; + + let filter = filters[filterKey]; + if (filter && !this.getException(filter, domain)) + { + selectors.push(filter.selector); + // It is faster to always push the key, even if not required. + filterKeys.push(filterKey); + } + } + } + + if (currentDomain == "") + break; + + let nextDot = currentDomain.indexOf("."); + currentDomain = nextDot == -1 ? "" : currentDomain.substr(nextDot + 1); } - return result; + + if (provideFilterKeys) + return [selectors, filterKeys]; + return selectors; } }; diff --git a/data/extensions/spyblock@gnu.org/lib/elemHideEmulation.js b/data/extensions/spyblock@gnu.org/lib/elemHideEmulation.js new file mode 100644 index 0000000..edf2082 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/elemHideEmulation.js @@ -0,0 +1,81 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +/** + * @fileOverview Element hiding emulation implementation. + */ + +const {ElemHide} = require("elemHide"); +const {Filter} = require("filterClasses"); + +let filters = Object.create(null); + +/** + * Container for element hiding emulation filters + * @class + */ +let ElemHideEmulation = { + /** + * Removes all known filters + */ + clear() + { + filters = Object.create(null); + }, + + /** + * Add a new element hiding emulation filter + * @param {ElemHideEmulationFilter} filter + */ + add(filter) + { + filters[filter.text] = true; + }, + + /** + * Removes an element hiding emulation filter + * @param {ElemHideEmulationFilter} filter + */ + remove(filter) + { + delete filters[filter.text]; + }, + + /** + * Returns a list of all rules active on a particular domain + * @param {string} domain + * @return {ElemHideEmulationFilter[]} + */ + getRulesForDomain(domain) + { + let result = []; + let keys = Object.getOwnPropertyNames(filters); + for (let key of keys) + { + let filter = Filter.fromText(key); + if (filter.isActiveOnDomain(domain) && + !ElemHide.getException(filter, domain)) + { + result.push(filter); + } + } + return result; + } +}; +exports.ElemHideEmulation = ElemHideEmulation; diff --git a/data/extensions/spyblock@gnu.org/lib/elemHideFF.js b/data/extensions/spyblock@gnu.org/lib/elemHideFF.js new file mode 100644 index 0000000..fe42e11 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/elemHideFF.js @@ -0,0 +1,106 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + +let {port} = require("messaging"); +let {ElemHide} = require("elemHide"); +let {FilterNotifier} = require("filterNotifier"); +let {FilterStorage} = require("filterStorage"); +let {Prefs} = require("prefs"); +let {Policy} = require("contentPolicy"); +let {Utils} = require("utils"); + +let isDirty = false; +FilterNotifier.on("elemhideupdate", () => +{ + // Notify content process asynchronously, only one message per update batch. + if (!isDirty) + { + isDirty = true; + Utils.runAsync(() => { + isDirty = false; + port.emit("elemhideupdate") + }); + } +}); + +port.on("getUnconditionalSelectors", () => +{ + return [ + ElemHide.getUnconditionalSelectors(), + ElemHide.getUnconditionalFilterKeys() + ]; +}); + +port.on("getSelectorsForDomain", ([domain, specificOnly]) => +{ + let type = specificOnly ? ElemHide.SPECIFIC_ONLY : ElemHide.NO_UNCONDITIONAL; + return ElemHide.getSelectorsForDomain(domain, type, true); +}); + +port.on("elemhideEnabled", ({frames, isPrivate}) => +{ + if (!Prefs.enabled || !Policy.isBlockableScheme(frames[0].location)) + return {enabled: false}; + + let hit = Policy.isFrameWhitelisted(frames, true); + if (hit) + { + let [frameIndex, contentType, docDomain, thirdParty, location, filter] = hit; + if (!isPrivate) + FilterStorage.increaseHitCount(filter); + return { + enabled: contentType == "GENERICHIDE", + contentType, docDomain, thirdParty, location, + filter: filter.text, filterType: filter.type + }; + } + + return {enabled: true}; +}); + +port.on("registerElemHideHit", ({key, frames, isPrivate}) => +{ + let filter = ElemHide.getFilterByKey(key); + if (!filter) + return null; + + if (!isPrivate) + FilterStorage.increaseHitCount(filter); + + let docDomain; + try + { + docDomain = Utils.unwrapURL(frames[0].location).host; + } + catch(e) + { + docDomain = null; + } + + return { + contentType: "ELEMHIDE", + docDomain, + thirdParty: false, + location: filter.text.replace(/^.*?#/, '#'), + filter: filter.text, + filterType: filter.type + }; +}); diff --git a/data/extensions/spyblock@gnu.org/lib/elemHideHitRegistration.js b/data/extensions/spyblock@gnu.org/lib/elemHideHitRegistration.js deleted file mode 100644 index 74661a9..0000000 --- a/data/extensions/spyblock@gnu.org/lib/elemHideHitRegistration.js +++ /dev/null @@ -1,164 +0,0 @@ -/* - * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH - * - * Adblock Plus is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * Adblock Plus is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. - */ - -/** - * @fileOverview Hit counts for element hiding. - */ - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); - -let {Utils} = require("utils"); - -/** - * about: URL module used to count hits. - * @class - */ -let AboutHandler = exports.AboutHandler = -{ - classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"), - classDescription: "Element hiding hit registration protocol handler", - aboutPrefix: "abp-elemhidehit", - - /** - * Registers handler on startup. - */ - init: function() - { - let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); - registrar.registerFactory(this.classID, this.classDescription, - "@mozilla.org/network/protocol/about;1?what=" + this.aboutPrefix, this); - onShutdown.add(function() - { - registrar.unregisterFactory(this.classID, this); - }.bind(this)); - }, - - // - // Factory implementation - // - - createInstance: function(outer, iid) - { - if (outer != null) - throw Cr.NS_ERROR_NO_AGGREGATION; - - return this.QueryInterface(iid); - }, - - // - // About module implementation - // - - getURIFlags: function(uri) - { - return ("HIDE_FROM_ABOUTABOUT" in Ci.nsIAboutModule ? Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT : 0); - }, - - newChannel: function(uri) - { - let match = /\?(\d+)/.exec(uri.path); - if (!match) - throw Cr.NS_ERROR_FAILURE; - - return new HitRegistrationChannel(uri, match[1]); - }, - - QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, Ci.nsIAboutModule]) -}; -AboutHandler.init(); - -/** - * Channel returning data for element hiding hits. - * @constructor - */ -function HitRegistrationChannel(uri, key) -{ - this.key = key; - this.URI = this.originalURI = uri; -} -HitRegistrationChannel.prototype = { - key: null, - URI: null, - originalURI: null, - contentCharset: "utf-8", - contentLength: 0, - contentType: "text/xml", - owner: Utils.systemPrincipal, - securityInfo: null, - notificationCallbacks: null, - loadFlags: 0, - loadGroup: null, - name: null, - status: Cr.NS_OK, - - asyncOpen: function(listener, context) - { - let stream = this.open(); - Utils.runAsync(function() - { - try { - listener.onStartRequest(this, context); - } catch(e) {} - try { - listener.onDataAvailable(this, context, stream, 0, stream.available()); - } catch(e) {} - try { - listener.onStopRequest(this, context, Cr.NS_OK); - } catch(e) {} - }, this); - }, - - open: function() - { - let {Policy} = require("contentPolicy"); - let {ElemHide} = require("elemHide"); - - // This dummy binding below won't have any effect on the element. For - // elements that should be hidden however we don't return any binding at - // all, this makes Gecko stop constructing the node - it cannot be shown. - let data = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dummy' bindToUntrustedContent='true'/></bindings>"; - let filter = ElemHide.getFilterByKey(this.key); - if (filter) - { - let wnd = Utils.getRequestWindow(this); - if (wnd && wnd.document && !Policy.processNode(wnd, wnd.document, Policy.type.ELEMHIDE, filter)) - data = "<bindings xmlns='http://www.mozilla.org/xbl'/>"; - } - - let stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); - stream.setData(data, data.length); - return stream; - }, - isPending: function() - { - return false; - }, - cancel: function() - { - throw Cr.NS_ERROR_NOT_IMPLEMENTED; - }, - suspend: function() - { - throw Cr.NS_ERROR_NOT_IMPLEMENTED; - }, - resume: function() - { - throw Cr.NS_ERROR_NOT_IMPLEMENTED; - }, - - QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannel, Ci.nsIRequest]) -}; diff --git a/data/extensions/spyblock@gnu.org/lib/events.js b/data/extensions/spyblock@gnu.org/lib/events.js new file mode 100644 index 0000000..8d11f7c --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/events.js @@ -0,0 +1,106 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +/** + * Registers and emits named events. + * + * @constructor + */ +exports.EventEmitter = function() +{ + this._listeners = Object.create(null); +}; + +exports.EventEmitter.prototype = { + /** + * Adds a listener for the specified event name. + * + * @param {string} name + * @param {function} listener + */ + on(name, listener) + { + if (name in this._listeners) + this._listeners[name].push(listener); + else + this._listeners[name] = [listener]; + }, + + /** + * Removes a listener for the specified event name. + * + * @param {string} name + * @param {function} listener + */ + off(name, listener) + { + let listeners = this._listeners[name]; + if (listeners) + { + let idx = listeners.indexOf(listener); + if (idx != -1) + listeners.splice(idx, 1); + } + }, + + /** + * Adds a one time listener and returns a promise that + * is resolved the next time the specified event is emitted. + * @param {string} name + * @return {Promise} + */ + once(name) + { + return new Promise(resolve => + { + let listener = () => + { + this.off(name, listener); + resolve(); + }; + + this.on(name, listener); + }); + }, + + /** + * Returns a copy of the array of listeners for the specified event. + * + * @param {string} name + * @return {function[]} + */ + listeners(name) + { + let listeners = this._listeners[name]; + return listeners ? listeners.slice() : []; + }, + + /** + * Calls all previously added listeners for the given event name. + * + * @param {string} name + * @param {...*} [arg] + */ + emit(name, ...args) + { + let listeners = this.listeners(name); + for (let listener of listeners) + listener(...args); + } +}; diff --git a/data/extensions/spyblock@gnu.org/lib/ext_background.js b/data/extensions/spyblock@gnu.org/lib/ext_background.js index 2a50142..b57f96c 100644 --- a/data/extensions/spyblock@gnu.org/lib/ext_background.js +++ b/data/extensions/spyblock@gnu.org/lib/ext_background.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -17,31 +17,21 @@ let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", null); let {Services} = Cu.import("resource://gre/modules/Services.jsm", null); -let { - _MessageProxy: MessageProxy, - _EventTarget: EventTarget, - _getSender: getSender -} = require("ext_common"); -exports.onMessage = new EventTarget(); -let messageProxy = new MessageProxy( - Cc["@mozilla.org/globalmessagemanager;1"] - .getService(Ci.nsIMessageListenerManager), - exports.onMessage); -onShutdown.add(function() -{ - messageProxy._disconnect(); -}); +let {_EventTarget: EventTarget, i18n} = require("ext_common"); +let {port} = require("messaging"); + +exports.onMessage = new EventTarget(port); +exports.i18n = i18n; -function Page(sender) +function Page(windowID) { - this._sender = sender; + this._windowID = windowID; } Page.prototype = { - sendMessage: function(message) + sendMessage: function(payload) { - if (this._sender) - this._sender.sendAsyncMessage("AdblockPlus:Message", {payload: message}); + port.emit("ext_message", {targetID: this._windowID, payload}); } }; exports.Page = Page; @@ -50,48 +40,35 @@ function PageMap() { this._map = new Map(); - Services.obs.addObserver(this, "message-manager-disconnect", true); - onShutdown.add(function() - { - Services.obs.removeObserver(this, "message-manager-disconnect"); - }.bind(this)); + port.on("ext_disconnect", windowID => this._map.delete(windowID)); } PageMap.prototype = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]), - - observe: function(subject, topic, data) - { - if (topic == "message-manager-disconnect") - this._map.delete(subject); - }, - keys: function() { let result = []; - for (let sender of this._map.keys()) - result.push(new Page(sender)); + for (let windowID of this._map.keys()) + result.push(new Page(windowID)); return result; }, get: function(page) { - return this._map.get(page._sender); + return this._map.get(page._windowID); }, set: function(page, value) { - if (page._sender) - this._map.set(page._sender, value); + this._map.set(page._windowID, value); }, has: function(page) { - return this._map.has(page._sender); + return this._map.has(page._windowID); }, delete: function(page) { - this._map.delete(page._sender); + return this._map.delete(page._windowID); } }; exports.PageMap = PageMap; diff --git a/data/extensions/spyblock@gnu.org/lib/ext_common.js b/data/extensions/spyblock@gnu.org/lib/ext_common.js index 129f232..296c00f 100644 --- a/data/extensions/spyblock@gnu.org/lib/ext_common.js +++ b/data/extensions/spyblock@gnu.org/lib/ext_common.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -17,140 +17,105 @@ (function(global) { - const Ci = Components.interfaces; + const Cu = Components.utils; + + let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); if (!global.ext) global.ext = {}; - var holder = { - get Page() - { - delete this.Page; - this.Page = (typeof require == "function" ? - require("ext_background").Page : - function() {}); - return this.Page; - } - }; + var wrapperSymbol = Symbol("ext-wrapper"); - var getSender = global.ext._getSender = function(origin) + function wrapFrames(frames) { - if (origin instanceof Ci.nsIDOMXULElement) - return origin.messageManager; - else if (origin instanceof Ci.nsIMessageSender) - return origin; - else + if (!frames.length) return null; - }; - var MessageProxy = global.ext._MessageProxy = function(messageManager, messageTarget) - { - this._messageManager = messageManager; - this._messageTarget = messageTarget; - this._callbacks = new Map(); - this._responseCallbackCounter = 0; + // We have frames as an array, non-Firefox code expects url and parent + // properties however. + Object.defineProperty(frames, "url", { + enumerable: true, + get: () => new URL(frames[0].location) + }); - this._handleRequest = this._handleRequest.bind(this); - this._handleResponse = this._handleResponse.bind(this); - this._messageManager.addMessageListener("AdblockPlus:Message", this._handleRequest); - this._messageManager.addMessageListener("AdblockPlus:Response", this._handleResponse); - }; - MessageProxy.prototype = { - _disconnect: function() - { - this._messageManager.removeMessageListener("AdblockPlus:Message", this._handleRequest); - this._messageManager.removeMessageListener("AdblockPlus:Response", this._handleResponse); - }, + Object.defineProperty(frames, "parent", { + enumerable: true, + get: () => wrapFrames(frames.slice(1)) + }); - _sendResponse: function(sender, callbackId, message) - { - var response = { - callbackId: callbackId - }; - if (typeof response != "undefined") - response.payload = message; - sender.sendAsyncMessage("AdblockPlus:Response", response); - }, + return frames; + } - _handleRequest: function(message) + var EventTarget = global.ext._EventTarget = function(port, windowID) + { + this._port = port; + this._windowID = windowID; + this.addListener((payload, sender, resolve) => { - var sender = getSender(message.target); - var request = message.data; - - var sent = false; - var sendResponse; - if (sender && "callbackId" in request) + if (payload.type) { - sendResponse = function(message) - { - this._sendResponse(sender, request.callbackId, message); - sent = true; - }.bind(this); + let result = this._port._dispatch(payload.type, payload, sender); + if (typeof result != "undefined") + resolve(result); } - else - sendResponse = function() {}; - - var results = this._messageTarget._dispatch(request.payload, { - page: new holder.Page(sender) - }, sendResponse); - if (!sent && results.indexOf(true) == -1) - sendResponse(undefined); - }, - - _handleResponse: function(message) + }); + }; + EventTarget.prototype = { + addListener: function(listener) { - var response = message.data; - var callback = this._callbacks.get(response.callbackId); - if (callback) + var wrapper = (message, sender) => { - this._callbacks.delete(response.callbackId); - if ("payload" in response) - callback(response.payload); - } - }, + if (this._windowID && this._windowID != message.targetID) + return undefined; - sendMessage: function(message, responseCallback) - { - if (!(this._messageManager instanceof Ci.nsIMessageSender)) - throw new Error("Not implemented"); - - var request = { - payload: message + return new Promise((resolve, reject) => + { + var sender = {}; + if (message.senderID) + { + // We will only get here on the background side so we can access + // the Page object. + const Page = require("ext_background").Page; + sender.page = new Page(message.senderID); + } + if (message.frames) + sender.frame = wrapFrames(message.frames); + if (!listener(message.payload, sender, resolve)) + resolve(undefined); + }); }; - if (responseCallback) - { - request.callbackId = ++this._responseCallbackCounter; - this._callbacks.set(request.callbackId, responseCallback); - } + listener[wrapperSymbol] = wrapper; + this._port.on("ext_message", wrapper); + }, - this._messageManager.sendAsyncMessage("AdblockPlus:Message", request); + removeListener: function(listener) + { + if (listener[wrapperSymbol]) + this._port.off("ext_message", listener[wrapperSymbol]); } }; - var EventTarget = global.ext._EventTarget = function() - { - this._listeners = []; - }; - EventTarget.prototype = { - addListener: function(listener) - { - if (this._listeners.indexOf(listener) == -1) - this._listeners.push(listener); - }, - removeListener: function(listener) - { - var idx = this._listeners.indexOf(listener); - if (idx != -1) - this._listeners.splice(idx, 1); - }, - _dispatch: function() - { - var results = []; + let pageName = "global"; + if (typeof location !== "undefined") + pageName = location.pathname.replace(/.*\//, "").replace(/\..*?$/, ""); - for (var i = 0; i < this._listeners.length; i++) - results.push(this._listeners[i].apply(null, arguments)); + let stringBundle = Services.strings.createBundle( + "chrome://adblockplus/locale/" + pageName + ".properties?" + Math.random()); - return results; + global.ext.i18n = { + getMessage(key, args) + { + try { + return stringBundle.GetStringFromName(key); + } + catch(e) + { + // Don't report errors for special strings, these are expected to be + // missing. + if (key[0] != "@") + Cu.reportError(e); + return ""; + } } }; diff --git a/data/extensions/spyblock@gnu.org/lib/filterClasses.js b/data/extensions/spyblock@gnu.org/lib/filterClasses.js index a0dfaf0..3612728 100644 --- a/data/extensions/spyblock@gnu.org/lib/filterClasses.js +++ b/data/extensions/spyblock@gnu.org/lib/filterClasses.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,16 +15,20 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** * @fileOverview Definition of Filter class and its subclasses. */ -let {FilterNotifier} = require("filterNotifier"); +const {FilterNotifier} = require("filterNotifier"); +const {extend} = require("coreUtils"); +const {filterToRegExp} = require("common"); /** * Abstract base class for filters * - * @param {String} text string representation of the filter + * @param {string} text string representation of the filter * @constructor */ function Filter(text) @@ -38,27 +42,36 @@ Filter.prototype = { /** * String representation of the filter - * @type String + * @type {string} */ text: null, /** * Filter subscriptions the filter belongs to - * @type Array of Subscription + * @type {Subscription[]} */ subscriptions: null, /** + * Filter type as a string, e.g. "blocking". + * @type {string} + */ + get type() + { + throw new Error("Please define filter type in the subclass"); + }, + + /** * Serializes the filter to an array of strings for writing out on the disk. - * @param {Array of String} buffer buffer to push the serialization results into + * @param {string[]} buffer buffer to push the serialization results into */ - serialize: function(buffer) + serialize(buffer) { buffer.push("[Filter]"); buffer.push("text=" + this.text); }, - toString: function() + toString() { return this.text; } @@ -66,31 +79,31 @@ Filter.prototype = /** * Cache for known filters, maps string representation to filter objects. - * @type Object + * @type {Object} */ Filter.knownFilters = Object.create(null); /** * Regular expression that element hiding filters should match - * @type RegExp + * @type {RegExp} */ -Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; +Filter.elemhideRegExp = /^([^/*|@"!]*?)#(@)?(?:([\w-]+|\*)((?:\([\w-]+(?:[$^*]?=[^()"]*)?\))*)|#(.+))$/; /** * Regular expression that RegExp filters specified as RegExps should match - * @type RegExp + * @type {RegExp} */ -Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; +Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w-]+(?:=[^,\s]+)?(?:,~?[\w-]+(?:=[^,\s]+)?)*)?$/; /** * Regular expression that options on a RegExp filter should match - * @type RegExp + * @type {RegExp} */ -Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; +Filter.optionsRegExp = /\$(~?[\w-]+(?:=[^,\s]+)?(?:,~?[\w-]+(?:=[^,\s]+)?)*)$/; /** - * Creates a filter of correct type from its text representation - does the basic parsing and - * calls the right constructor then. + * Creates a filter of correct type from its text representation - does the + * basic parsing and calls the right constructor then. * - * @param {String} text as in Filter() + * @param {string} text as in Filter() * @return {Filter} */ Filter.fromText = function(text) @@ -99,9 +112,13 @@ Filter.fromText = function(text) return Filter.knownFilters[text]; let ret; - let match = (text.indexOf("#") >= 0 ? Filter.elemhideRegExp.exec(text) : null); + let match = (text.includes("#") ? Filter.elemhideRegExp.exec(text) : null); if (match) - ret = ElemHideBase.fromText(text, match[1], match[2], match[3], match[4], match[5]); + { + ret = ElemHideBase.fromText( + text, match[1], !!match[2], match[3], match[4], match[5] + ); + } else if (text[0] == "!") ret = new CommentFilter(text); else @@ -125,9 +142,9 @@ Filter.fromObject = function(obj) if ("disabled" in obj) ret._disabled = (obj.disabled == "true"); if ("hitCount" in obj) - ret._hitCount = parseInt(obj.hitCount) || 0; + ret._hitCount = parseInt(obj.hitCount, 10) || 0; if ("lastHit" in obj) - ret._lastHit = parseInt(obj.lastHit) || 0; + ret._lastHit = parseInt(obj.lastHit, 10) || 0; } return ret; }; @@ -135,8 +152,10 @@ Filter.fromObject = function(obj) /** * Removes unnecessary whitespaces from filter text, will only return null if * the input parameter is null. + * @param {string} text + * @return {string} */ -Filter.normalize = function(/**String*/ text) /**String*/ +Filter.normalize = function(text) { if (!text) return text; @@ -151,18 +170,23 @@ Filter.normalize = function(/**String*/ text) /**String*/ } else if (Filter.elemhideRegExp.test(text)) { - // Special treatment for element hiding filters, right side is allowed to contain spaces - let [, domain, separator, selector] = /^(.*?)(#\@?#?)(.*)$/.exec(text); + // Special treatment for element hiding filters, right side is allowed to + // contain spaces + let [, domain, separator, selector] = /^(.*?)(#@?#?)(.*)$/.exec(text); return domain.replace(/\s/g, "") + separator + selector.trim(); } - else - return text.replace(/\s/g, ""); + return text.replace(/\s/g, ""); }; /** + * @see filterToRegExp + */ +Filter.toRegExp = filterToRegExp; + +/** * Class for invalid filters - * @param {String} text see Filter() - * @param {String} reason Reason why this filter is invalid + * @param {string} text see Filter() + * @param {string} reason Reason why this filter is invalid * @constructor * @augments Filter */ @@ -174,25 +198,25 @@ function InvalidFilter(text, reason) } exports.InvalidFilter = InvalidFilter; -InvalidFilter.prototype = -{ - __proto__: Filter.prototype, +InvalidFilter.prototype = extend(Filter, { + type: "invalid", /** * Reason why this filter is invalid - * @type String + * @type {string} */ reason: null, /** * See Filter.serialize() + * @inheritdoc */ - serialize: function(buffer) {} -}; + serialize(buffer) {} +}); /** * Class for comments - * @param {String} text see Filter() + * @param {string} text see Filter() * @constructor * @augments Filter */ @@ -202,20 +226,23 @@ function CommentFilter(text) } exports.CommentFilter = CommentFilter; -CommentFilter.prototype = -{ - __proto__: Filter.prototype, +CommentFilter.prototype = extend(Filter, { + type: "comment", /** * See Filter.serialize() + * @inheritdoc */ - serialize: function(buffer) {} -}; + serialize(buffer) {} +}); /** * Abstract base class for filters that can get hits - * @param {String} text see Filter() - * @param {String} [domains] Domains that the filter is restricted to separated by domainSeparator e.g. "foo.com|bar.com|~baz.com" + * @param {string} text + * see Filter() + * @param {string} [domains] + * Domains that the filter is restricted to separated by domainSeparator + * e.g. "foo.com|bar.com|~baz.com" * @constructor * @augments Filter */ @@ -227,17 +254,14 @@ function ActiveFilter(text, domains) } exports.ActiveFilter = ActiveFilter; -ActiveFilter.prototype = -{ - __proto__: Filter.prototype, - +ActiveFilter.prototype = extend(Filter, { _disabled: false, _hitCount: 0, _lastHit: 0, /** * Defines whether the filter is disabled - * @type Boolean + * @type {boolean} */ get disabled() { @@ -256,7 +280,7 @@ ActiveFilter.prototype = /** * Number of hits on the filter since the last reset - * @type Number + * @type {number} */ get hitCount() { @@ -274,8 +298,9 @@ ActiveFilter.prototype = }, /** - * Last time the filter had a hit (in milliseconds since the beginning of the epoch) - * @type Number + * Last time the filter had a hit (in milliseconds since the beginning of the + * epoch) + * @type {number} */ get lastHit() { @@ -294,33 +319,35 @@ ActiveFilter.prototype = /** * String that the domains property should be generated from - * @type String + * @type {string} */ domainSource: null, /** - * Separator character used in domainSource property, must be overridden by subclasses - * @type String + * Separator character used in domainSource property, must be + * overridden by subclasses + * @type {string} */ domainSeparator: null, /** * Determines whether the trailing dot in domain names isn't important and * should be ignored, must be overridden by subclasses. - * @type Boolean + * @type {boolean} */ ignoreTrailingDot: true, /** * Determines whether domainSource is already upper-case, * can be overridden by subclasses. - * @type Boolean + * @type {boolean} */ domainSourceIsUpperCase: false, /** - * Map containing domains that this filter should match on/not match on or null if the filter should match on all domains - * @type Object + * Map containing domains that this filter should match on/not match + * on or null if the filter should match on all domains + * @type {Object} */ get domains() { @@ -335,7 +362,8 @@ ActiveFilter.prototype = if (this.domainSource) { let source = this.domainSource; - if (!this.domainSourceIsUpperCase) { + if (!this.domainSourceIsUpperCase) + { // RegExpFilter already have uppercase domains source = source.toUpperCase(); } @@ -343,7 +371,8 @@ ActiveFilter.prototype = if (list.length == 1 && list[0][0] != "~") { // Fast track for the common one-domain scenario - domains = {__proto__: null, "": false}; + domains = Object.create(null); + domains[""] = false; if (this.ignoreTrailingDot) list[0] = list[0].replace(/\.+$/, ""); domains[list[0]] = true; @@ -376,7 +405,8 @@ ActiveFilter.prototype = domains[domain] = include; } - domains[""] = !hasIncludes; + if (domains) + domains[""] = !hasIncludes; } this.domainSource = null; @@ -388,28 +418,33 @@ ActiveFilter.prototype = /** * Array containing public keys of websites that this filter should apply to - * @type Array of String + * @type {string[]} */ sitekeys: null, /** * Checks whether this filter is active on a domain. - * @param {String} docDomain domain name of the document that loads the URL - * @param {String} [sitekey] public key provided by the document - * @return {Boolean} true in case of the filter being active + * @param {string} docDomain domain name of the document that loads the URL + * @param {string} [sitekey] public key provided by the document + * @return {boolean} true in case of the filter being active */ - isActiveOnDomain: function(docDomain, sitekey) + isActiveOnDomain(docDomain, sitekey) { - // Sitekeys are case-sensitive so we shouldn't convert them to upper-case to avoid false - // positives here. Instead we need to change the way filter options are parsed. - if (this.sitekeys && (!sitekey || this.sitekeys.indexOf(sitekey.toUpperCase()) < 0)) + // Sitekeys are case-sensitive so we shouldn't convert them to + // upper-case to avoid false positives here. Instead we need to + // change the way filter options are parsed. + if (this.sitekeys && + (!sitekey || this.sitekeys.indexOf(sitekey.toUpperCase()) < 0)) + { return false; + } // If no domains are set the rule matches everywhere if (!this.domains) return true; - // If the document has no host name, match only if the filter isn't restricted to specific domains + // If the document has no host name, match only if the filter + // isn't restricted to specific domains if (!docDomain) return this.domains[""]; @@ -432,8 +467,10 @@ ActiveFilter.prototype = /** * Checks whether this filter is active only on a domain and its subdomains. + * @param {string} docDomain + * @return {boolean} */ - isActiveOnlyOnDomain: function(/**String*/ docDomain) /**Boolean*/ + isActiveOnlyOnDomain(docDomain) { if (!docDomain || !this.domains || this.domains[""]) return false; @@ -443,16 +480,35 @@ ActiveFilter.prototype = docDomain = docDomain.toUpperCase(); for (let domain in this.domains) - if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) - return false; + { + if (this.domains[domain] && domain != docDomain) + { + if (domain.length <= docDomain.length) + return false; + + if (!domain.endsWith("." + docDomain)) + return false; + } + } return true; }, /** + * Checks whether this filter is generic or specific + * @return {boolean} + */ + isGeneric() + { + return !(this.sitekeys && this.sitekeys.length) && + (!this.domains || this.domains[""]); + }, + + /** * See Filter.serialize() + * @inheritdoc */ - serialize: function(buffer) + serialize(buffer) { if (this._disabled || this._hitCount || this._lastHit) { @@ -465,21 +521,31 @@ ActiveFilter.prototype = buffer.push("lastHit=" + this._lastHit); } } -}; +}); /** * Abstract base class for RegExp-based filters - * @param {String} text see Filter() - * @param {String} regexpSource filter part that the regular expression should be build from - * @param {Number} [contentType] Content types the filter applies to, combination of values from RegExpFilter.typeMap - * @param {Boolean} [matchCase] Defines whether the filter should distinguish between lower and upper case letters - * @param {String} [domains] Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com" - * @param {Boolean} [thirdParty] Defines whether the filter should apply to third-party or first-party content only - * @param {String} [sitekeys] Public keys of websites that this filter should apply to + * @param {string} text see Filter() + * @param {string} regexpSource + * filter part that the regular expression should be build from + * @param {number} [contentType] + * Content types the filter applies to, combination of values from + * RegExpFilter.typeMap + * @param {boolean} [matchCase] + * Defines whether the filter should distinguish between lower and upper case + * letters + * @param {string} [domains] + * Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com" + * @param {boolean} [thirdParty] + * Defines whether the filter should apply to third-party or first-party + * content only + * @param {string} [sitekeys] + * Public keys of websites that this filter should apply to * @constructor * @augments ActiveFilter */ -function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +function RegExpFilter(text, regexpSource, contentType, matchCase, domains, + thirdParty, sitekeys) { ActiveFilter.call(this, text, domains, sitekeys); @@ -492,10 +558,14 @@ function RegExpFilter(text, regexpSource, contentType, matchCase, domains, third if (sitekeys != null) this.sitekeySource = sitekeys; - if (regexpSource.length >= 2 && regexpSource[0] == "/" && regexpSource[regexpSource.length - 1] == "/") + if (regexpSource.length >= 2 && + regexpSource[0] == "/" && + regexpSource[regexpSource.length - 1] == "/") { - // The filter is a regular expression - convert it immediately to catch syntax errors - let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); + // The filter is a regular expression - convert it immediately to + // catch syntax errors + let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), + this.matchCase ? "" : "i"); Object.defineProperty(this, "regexp", {value: regexp}); } else @@ -506,18 +576,16 @@ function RegExpFilter(text, regexpSource, contentType, matchCase, domains, third } exports.RegExpFilter = RegExpFilter; -RegExpFilter.prototype = -{ - __proto__: ActiveFilter.prototype, - +RegExpFilter.prototype = extend(ActiveFilter, { /** * @see ActiveFilter.domainSourceIsUpperCase */ domainSourceIsUpperCase: true, /** - * Number of filters contained, will always be 1 (required to optimize Matcher). - * @type Integer + * Number of filters contained, will always be 1 (required to + * optimize Matcher). + * @type {number} */ length: 1, @@ -527,13 +595,14 @@ RegExpFilter.prototype = domainSeparator: "|", /** - * Expression from which a regular expression should be generated - for delayed creation of the regexp property - * @type String + * Expression from which a regular expression should be generated - + * for delayed creation of the regexp property + * @type {string} */ regexpSource: null, /** * Regular expression to be used when testing against this filter - * @type RegExp + * @type {RegExp} */ get regexp() { @@ -543,49 +612,39 @@ RegExpFilter.prototype = if (prop) return prop.value; - // Remove multiple wildcards - let source = this.regexpSource - .replace(/\*+/g, "*") // remove multiple wildcards - .replace(/\^\|$/, "^") // remove anchors following separator placeholder - .replace(/\W/g, "\\$&") // escape special symbols - .replace(/\\\*/g, ".*") // replace wildcards by .* - // process separator placeholders (all ANSI characters but alphanumeric characters and _%.-) - .replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)") - .replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?") // process extended anchor at expression start - .replace(/^\\\|/, "^") // process anchor at expression start - .replace(/\\\|$/, "$") // process anchor at expression end - .replace(/^(\.\*)/, "") // remove leading wildcards - .replace(/(\.\*)$/, ""); // remove trailing wildcards - + let source = Filter.toRegExp(this.regexpSource); let regexp = new RegExp(source, this.matchCase ? "" : "i"); Object.defineProperty(this, "regexp", {value: regexp}); return regexp; }, /** - * Content types the filter applies to, combination of values from RegExpFilter.typeMap - * @type Number + * Content types the filter applies to, combination of values from + * RegExpFilter.typeMap + * @type {number} */ contentType: 0x7FFFFFFF, /** - * Defines whether the filter should distinguish between lower and upper case letters - * @type Boolean + * Defines whether the filter should distinguish between lower and + * upper case letters + * @type {boolean} */ matchCase: false, /** - * Defines whether the filter should apply to third-party or first-party content only. Can be null (apply to all content). - * @type Boolean + * Defines whether the filter should apply to third-party or + * first-party content only. Can be null (apply to all content). + * @type {boolean} */ thirdParty: null, /** * String that the sitekey property should be generated from - * @type String + * @type {string} */ sitekeySource: null, /** * Array containing public keys of websites that this filter should apply to - * @type Array of String + * @type {string[]} */ get sitekeys() { @@ -603,47 +662,48 @@ RegExpFilter.prototype = this.sitekeySource = null; } - Object.defineProperty(this, "sitekeys", {value: sitekeys, enumerable: true}); + Object.defineProperty( + this, "sitekeys", {value: sitekeys, enumerable: true} + ); return this.sitekeys; }, /** * Tests whether the URL matches this filter - * @param {String} location URL to be tested - * @param {String} contentType content type identifier of the URL - * @param {String} docDomain domain name of the document that loads the URL - * @param {Boolean} thirdParty should be true if the URL is a third-party request - * @param {String} sitekey public key provided by the document - * @return {Boolean} true in case of a match - */ - matches: function(location, contentType, docDomain, thirdParty, sitekey, privatenode) + * @param {string} location URL to be tested + * @param {number} typeMask bitmask of content / request types to match + * @param {string} docDomain domain name of the document that loads the URL + * @param {boolean} thirdParty should be true if the URL is a third-party + * request + * @param {string} sitekey public key provided by the document + * @return {boolean} true in case of a match + */ + matches(location, typeMask, docDomain, thirdParty, sitekey, privatenode) { - if(this.subscriptions[0]) if (this.subscriptions[0].privateMode) if (privatenode==false) return false; - if ((RegExpFilter.typeMap[contentType] & this.contentType) != 0 && + if (this.contentType & typeMask && (this.thirdParty == null || this.thirdParty == thirdParty) && this.isActiveOnDomain(docDomain, sitekey) && this.regexp.test(location)) { return true; } - return false; } -}; +}); // Required to optimize Matcher, see also RegExpFilter.prototype.length -Object.defineProperty(RegExpFilter.prototype, "0", -{ - get: function() { return this; } +Object.defineProperty(RegExpFilter.prototype, "0", { + get() { return this; } }); /** * Creates a RegExp filter from its text representation - * @param {String} text same as in Filter() + * @param {string} text same as in Filter() + * @return {Filter} */ RegExpFilter.fromText = function(text) { @@ -686,7 +746,7 @@ RegExpFilter.fromText = function(text) else if (option[0] == "~" && option.substr(1) in RegExpFilter.typeMap) { if (contentType == null) - contentType = RegExpFilter.prototype.contentType; + ({contentType} = RegExpFilter.prototype); contentType &= ~RegExpFilter.typeMap[option.substr(1)]; } else if (option == "MATCH_CASE") @@ -706,29 +766,23 @@ RegExpFilter.fromText = function(text) else if (option == "SITEKEY" && typeof value != "undefined") sitekeys = value; else - return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()); + return new InvalidFilter(origText, "filter_unknown_option"); } } - if (!blocking && (contentType == null || (contentType & RegExpFilter.typeMap.DOCUMENT)) && - (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) - { - // Exception filters shouldn't apply to pages by default unless they start with a protocol name - if (contentType == null) - contentType = RegExpFilter.prototype.contentType; - contentType &= ~RegExpFilter.typeMap.DOCUMENT; - } - try { if (blocking) - return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); - else - return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys); + { + return new BlockingFilter(origText, text, contentType, matchCase, domains, + thirdParty, sitekeys, collapse); + } + return new WhitelistFilter(origText, text, contentType, matchCase, domains, + thirdParty, sitekeys); } catch (e) { - return new InvalidFilter(origText, e); + return new InvalidFilter(origText, "filter_invalid_regexp"); } }; @@ -743,8 +797,10 @@ RegExpFilter.typeMap = { OBJECT: 16, SUBDOCUMENT: 32, DOCUMENT: 64, + WEBSOCKET: 128, + WEBRTC: 256, XBL: 1, - PING: 1, + PING: 1024, XMLHTTPREQUEST: 2048, OBJECT_SUBREQUEST: 4096, DTD: 1, @@ -754,72 +810,85 @@ RegExpFilter.typeMap = { BACKGROUND: 4, // Backwards compat, same as IMAGE POPUP: 0x10000000, - ELEMHIDE: 0x40000000 + GENERICBLOCK: 0x20000000, + ELEMHIDE: 0x40000000, + GENERICHIDE: 0x80000000 }; -// ELEMHIDE, POPUP option shouldn't be there by default -RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); +// DOCUMENT, ELEMHIDE, POPUP, GENERICHIDE and GENERICBLOCK options shouldn't +// be there by default +RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.DOCUMENT | + RegExpFilter.typeMap.ELEMHIDE | + RegExpFilter.typeMap.POPUP | + RegExpFilter.typeMap.GENERICHIDE | + RegExpFilter.typeMap.GENERICBLOCK); /** * Class for blocking filters - * @param {String} text see Filter() - * @param {String} regexpSource see RegExpFilter() - * @param {Number} contentType see RegExpFilter() - * @param {Boolean} matchCase see RegExpFilter() - * @param {String} domains see RegExpFilter() - * @param {Boolean} thirdParty see RegExpFilter() - * @param {String} sitekeys see RegExpFilter() - * @param {Boolean} collapse defines whether the filter should collapse blocked content, can be null + * @param {string} text see Filter() + * @param {string} regexpSource see RegExpFilter() + * @param {number} contentType see RegExpFilter() + * @param {boolean} matchCase see RegExpFilter() + * @param {string} domains see RegExpFilter() + * @param {boolean} thirdParty see RegExpFilter() + * @param {string} sitekeys see RegExpFilter() + * @param {boolean} collapse + * defines whether the filter should collapse blocked content, can be null * @constructor * @augments RegExpFilter */ -function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse) +function BlockingFilter(text, regexpSource, contentType, matchCase, domains, + thirdParty, sitekeys, collapse) { - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, + thirdParty, sitekeys); this.collapse = collapse; } exports.BlockingFilter = BlockingFilter; -BlockingFilter.prototype = -{ - __proto__: RegExpFilter.prototype, +BlockingFilter.prototype = extend(RegExpFilter, { + type: "blocking", /** - * Defines whether the filter should collapse blocked content. Can be null (use the global preference). - * @type Boolean + * Defines whether the filter should collapse blocked content. + * Can be null (use the global preference). + * @type {boolean} */ collapse: null -}; +}); /** * Class for whitelist filters - * @param {String} text see Filter() - * @param {String} regexpSource see RegExpFilter() - * @param {Number} contentType see RegExpFilter() - * @param {Boolean} matchCase see RegExpFilter() - * @param {String} domains see RegExpFilter() - * @param {Boolean} thirdParty see RegExpFilter() - * @param {String} sitekeys see RegExpFilter() + * @param {string} text see Filter() + * @param {string} regexpSource see RegExpFilter() + * @param {number} contentType see RegExpFilter() + * @param {boolean} matchCase see RegExpFilter() + * @param {string} domains see RegExpFilter() + * @param {boolean} thirdParty see RegExpFilter() + * @param {string} sitekeys see RegExpFilter() * @constructor * @augments RegExpFilter */ -function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, + thirdParty, sitekeys) { - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, + thirdParty, sitekeys); } exports.WhitelistFilter = WhitelistFilter; -WhitelistFilter.prototype = -{ - __proto__: RegExpFilter.prototype -}; +WhitelistFilter.prototype = extend(RegExpFilter, { + type: "whitelist" +}); /** * Base class for element hiding filters - * @param {String} text see Filter() - * @param {String} [domains] Host names or domains the filter should be restricted to - * @param {String} selector CSS selector for the HTML elements that should be hidden + * @param {string} text see Filter() + * @param {string} [domains] Host names or domains the filter should be + * restricted to + * @param {string} selector CSS selector for the HTML elements that should be + * hidden * @constructor * @augments ActiveFilter */ @@ -828,15 +897,17 @@ function ElemHideBase(text, domains, selector) ActiveFilter.call(this, text, domains || null); if (domains) - this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/, "").toLowerCase(); - this.selector = selector; + { + this.selectorDomain = domains.replace(/,~[^,]+/g, "") + .replace(/^~[^,]+,?/, "").toLowerCase(); + } + + // Braces are being escaped to prevent CSS rule injection. + this.selector = selector.replace("{", "\\x7B ").replace("}", "\\x7D "); } exports.ElemHideBase = ElemHideBase; -ElemHideBase.prototype = -{ - __proto__: ActiveFilter.prototype, - +ElemHideBase.prototype = extend(ActiveFilter, { /** * @see ActiveFilter.domainSeparator */ @@ -848,28 +919,33 @@ ElemHideBase.prototype = ignoreTrailingDot: false, /** - * Host name or domain the filter should be restricted to (can be null for no restriction) - * @type String + * Host name or domain the filter should be restricted to (can be null for + * no restriction) + * @type {string} */ selectorDomain: null, /** * CSS selector for the HTML elements that should be hidden - * @type String + * @type {string} */ selector: null -}; +}); /** * Creates an element hiding filter from a pre-parsed text representation * - * @param {String} text same as in Filter() - * @param {String} domain domain part of the text representation (can be empty) - * @param {String} tagName tag name part (can be empty) - * @param {String} attrRules attribute matching rules (can be empty) - * @param {String} selector raw CSS selector (can be empty) - * @return {ElemHideFilter|ElemHideException|InvalidFilter} + * @param {string} text same as in Filter() + * @param {string} domain + * domain part of the text representation (can be empty) + * @param {boolean} isException exception rule indicator + * @param {string} tagName tag name part (can be empty) + * @param {string} attrRules attribute matching rules (can be empty) + * @param {string} selector raw CSS selector (can be empty) + * @return {ElemHideFilter|ElemHideException| + * ElemHideEmulationFilter|InvalidFilter} */ -ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, selector) +ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, + selector) { if (!selector) { @@ -878,48 +954,63 @@ ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, let id = null; let additional = ""; - if (attrRules) { - attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g); - for (let rule of attrRules) { + if (attrRules) + { + attrRules = attrRules.match(/\([\w-]+(?:[$^*]?=[^()"]*)?\)/g); + for (let rule of attrRules) + { rule = rule.substr(1, rule.length - 2); let separatorPos = rule.indexOf("="); - if (separatorPos > 0) { + if (separatorPos > 0) + { rule = rule.replace(/=/, '="') + '"'; additional += "[" + rule + "]"; } - else { + else + { if (id) - { - let {Utils} = require("utils"); - return new InvalidFilter(text, Utils.getString("filter_elemhide_duplicate_id")); - } - else - id = rule; + return new InvalidFilter(text, "filter_elemhide_duplicate_id"); + + id = rule; } } } if (id) - selector = tagName + "." + id + additional + "," + tagName + "#" + id + additional; + selector = `${tagName}.${id}${additional},${tagName}#${id}${additional}`; else if (tagName || additional) selector = tagName + additional; else - { - let {Utils} = require("utils"); - return new InvalidFilter(text, Utils.getString("filter_elemhide_nocriteria")); - } + return new InvalidFilter(text, "filter_elemhide_nocriteria"); } + + // We don't allow ElemHide filters which have any empty domains. + // Note: The ElemHide.prototype.domainSeparator is duplicated here, if that + // changes this must be changed too. + if (domain && /(^|,)~?(,|$)/.test(domain)) + return new InvalidFilter(text, "filter_invalid_domain"); + if (isException) return new ElemHideException(text, domain, selector); - else - return new ElemHideFilter(text, domain, selector); + + if (selector.indexOf("[-abp-properties=") != -1) + { + // Element hiding emulation filters are inefficient so we need to make sure + // that they're only applied if they specify active domains + if (!/,[^~][^,.]*\.[^,]/.test("," + domain)) + return new InvalidFilter(text, "filter_elemhideemulation_nodomain"); + + return new ElemHideEmulationFilter(text, domain, selector); + } + + return new ElemHideFilter(text, domain, selector); }; /** * Class for element hiding filters - * @param {String} text see Filter() - * @param {String} domains see ElemHideBase() - * @param {String} selector see ElemHideBase() + * @param {string} text see Filter() + * @param {string} domains see ElemHideBase() + * @param {string} selector see ElemHideBase() * @constructor * @augments ElemHideBase */ @@ -929,16 +1020,15 @@ function ElemHideFilter(text, domains, selector) } exports.ElemHideFilter = ElemHideFilter; -ElemHideFilter.prototype = -{ - __proto__: ElemHideBase.prototype -}; +ElemHideFilter.prototype = extend(ElemHideBase, { + type: "elemhide" +}); /** * Class for element hiding exceptions - * @param {String} text see Filter() - * @param {String} domains see ElemHideBase() - * @param {String} selector see ElemHideBase() + * @param {string} text see Filter() + * @param {string} domains see ElemHideBase() + * @param {string} selector see ElemHideBase() * @constructor * @augments ElemHideBase */ @@ -948,7 +1038,24 @@ function ElemHideException(text, domains, selector) } exports.ElemHideException = ElemHideException; -ElemHideException.prototype = +ElemHideException.prototype = extend(ElemHideBase, { + type: "elemhideexception" +}); + +/** + * Class for element hiding emulation filters + * @param {string} text see Filter() + * @param {string} domains see ElemHideBase() + * @param {string} selector see ElemHideBase() + * @constructor + * @augments ElemHideBase + */ +function ElemHideEmulationFilter(text, domains, selector) { - __proto__: ElemHideBase.prototype -}; + ElemHideBase.call(this, text, domains, selector); +} +exports.ElemHideEmulationFilter = ElemHideEmulationFilter; + +ElemHideEmulationFilter.prototype = extend(ElemHideBase, { + type: "elemhideemulation" +}); diff --git a/data/extensions/spyblock@gnu.org/lib/filterListener.js b/data/extensions/spyblock@gnu.org/lib/filterListener.js index e993a44..8700602 100644 --- a/data/extensions/spyblock@gnu.org/lib/filterListener.js +++ b/data/extensions/spyblock@gnu.org/lib/filterListener.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,29 +15,28 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** - * @fileOverview Component synchronizing filter storage with Matcher instances and ElemHide. + * @fileOverview Component synchronizing filter storage with Matcher + * instances and ElemHide. */ -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); - -let {FilterStorage} = require("filterStorage"); -let {FilterNotifier} = require("filterNotifier"); -let {ElemHide} = require("elemHide"); -let {defaultMatcher} = require("matcher"); -let {ActiveFilter, RegExpFilter, ElemHideBase} = require("filterClasses"); -let {Prefs} = require("prefs"); +const {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); +const {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); -/** - * Value of the FilterListener.batchMode property. - * @type Boolean - */ -let batchMode = false; +const {FilterStorage} = require("filterStorage"); +const {FilterNotifier} = require("filterNotifier"); +const {ElemHide} = require("elemHide"); +const {ElemHideEmulation} = require("elemHideEmulation"); +const {defaultMatcher} = require("matcher"); +const {ActiveFilter, RegExpFilter, + ElemHideBase, ElemHideEmulationFilter} = require("filterClasses"); +const {Prefs} = require("prefs"); /** * Increases on filter changes, filters will be saved if it exceeds 1. - * @type Integer + * @type {number} */ let isDirty = 0; @@ -45,36 +44,26 @@ let isDirty = 0; * This object can be used to change properties of the filter change listeners. * @class */ -let FilterListener = -{ - /** - * Set to true when executing many changes, changes will only be fully applied after this variable is set to false again. - * @type Boolean - */ - get batchMode() - { - return batchMode; - }, - set batchMode(value) - { - batchMode = value; - flushElemHide(); - }, - +let FilterListener = { /** - * Increases "dirty factor" of the filters and calls FilterStorage.saveToDisk() - * if it becomes 1 or more. Save is executed delayed to prevent multiple - * subsequent calls. If the parameter is 0 it forces saving filters if any - * changes were recorded after the previous save. + * Increases "dirty factor" of the filters and calls + * FilterStorage.saveToDisk() if it becomes 1 or more. Save is + * executed delayed to prevent multiple subsequent calls. If the + * parameter is 0 it forces saving filters if any changes were + * recorded after the previous save. + * @param {number} factor */ - setDirty: function(/**Integer*/ factor) + setDirty(factor) { if (factor == 0 && isDirty > 0) isDirty = 1; else isDirty += factor; if (isDirty >= 1) + { + isDirty = 0; FilterStorage.saveToDisk(); + } } }; @@ -82,11 +71,11 @@ let FilterListener = * Observer listening to history purge actions. * @class */ -let HistoryPurgeObserver = -{ - observe: function(subject, topic, data) +let HistoryPurgeObserver = { + observe(subject, topic, data) { - if (topic == "browser:purge-session-history" && Prefs.clearStatsOnHistoryPurge) + if (topic == "browser:purge-session-history" && + Prefs.clearStatsOnHistoryPurge) { FilterStorage.resetHitCounts(); FilterListener.setDirty(0); // Force saving to disk @@ -94,7 +83,9 @@ let HistoryPurgeObserver = Prefs.recentReports = []; } }, - QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) + QueryInterface: XPCOMUtils.generateQI( + [Ci.nsISupportsWeakReference, Ci.nsIObserver] + ) }; /** @@ -102,41 +93,41 @@ let HistoryPurgeObserver = */ function init() { - FilterNotifier.addListener(function(action, item, newValue, oldValue) - { - let match = /^(\w+)\.(.*)/.exec(action); - if (match && match[1] == "filter") - onFilterChange(match[2], item, newValue, oldValue); - else if (match && match[1] == "subscription") - onSubscriptionChange(match[2], item, newValue, oldValue); - else - onGenericChange(action, item); - }); + FilterNotifier.on("filter.hitCount", onFilterHitCount); + FilterNotifier.on("filter.lastHit", onFilterLastHit); + FilterNotifier.on("filter.added", onFilterAdded); + FilterNotifier.on("filter.removed", onFilterRemoved); + FilterNotifier.on("filter.disabled", onFilterDisabled); + FilterNotifier.on("filter.moved", onGenericChange); + + FilterNotifier.on("subscription.added", onSubscriptionAdded); + FilterNotifier.on("subscription.removed", onSubscriptionRemoved); + FilterNotifier.on("subscription.disabled", onSubscriptionDisabled); + FilterNotifier.on("subscription.updated", onSubscriptionUpdated); + FilterNotifier.on("subscription.moved", onGenericChange); + FilterNotifier.on("subscription.title", onGenericChange); + FilterNotifier.on("subscription.fixedTitle", onGenericChange); + FilterNotifier.on("subscription.homepage", onGenericChange); + FilterNotifier.on("subscription.downloadStatus", onGenericChange); + FilterNotifier.on("subscription.lastCheck", onGenericChange); + FilterNotifier.on("subscription.errors", onGenericChange); + + FilterNotifier.on("load", onLoad); + FilterNotifier.on("save", onSave); - if ("nsIStyleSheetService" in Ci) - ElemHide.init(); - else - flushElemHide = function() {}; // No global stylesheet in Chrome & Co. FilterStorage.loadFromDisk(); - Services.obs.addObserver(HistoryPurgeObserver, "browser:purge-session-history", true); - onShutdown.add(function() + Services.obs.addObserver(HistoryPurgeObserver, + "browser:purge-session-history", true); + onShutdown.add(() => { - Services.obs.removeObserver(HistoryPurgeObserver, "browser:purge-session-history"); + Services.obs.removeObserver(HistoryPurgeObserver, + "browser:purge-session-history"); }); } init(); /** - * Calls ElemHide.apply() if necessary. - */ -function flushElemHide() -{ - if (!batchMode && ElemHide.isDirty) - ElemHide.apply(); -} - -/** * Notifies Matcher instances or ElemHide object about a new filter * if necessary. * @param {Filter} filter filter that has been added @@ -148,15 +139,22 @@ function addFilter(filter) let hasEnabled = false; for (let i = 0; i < filter.subscriptions.length; i++) + { if (!filter.subscriptions[i].disabled) hasEnabled = true; + } if (!hasEnabled) return; if (filter instanceof RegExpFilter) defaultMatcher.add(filter); else if (filter instanceof ElemHideBase) - ElemHide.add(filter); + { + if (filter instanceof ElemHideEmulationFilter) + ElemHideEmulation.add(filter); + else + ElemHide.add(filter); + } } /** @@ -173,8 +171,10 @@ function removeFilter(filter) { let hasEnabled = false; for (let i = 0; i < filter.subscriptions.length; i++) + { if (!filter.subscriptions[i].disabled) hasEnabled = true; + } if (hasEnabled) return; } @@ -182,93 +182,139 @@ function removeFilter(filter) if (filter instanceof RegExpFilter) defaultMatcher.remove(filter); else if (filter instanceof ElemHideBase) - ElemHide.remove(filter); + { + if (filter instanceof ElemHideEmulationFilter) + ElemHideEmulation.remove(filter); + else + ElemHide.remove(filter); + } } -/** - * Subscription change listener - */ -function onSubscriptionChange(action, subscription, newValue, oldValue) -{ - FilterListener.setDirty(1); +const primes = [101, 109, 131, 149, 163, 179, 193, 211, 229, 241]; - if (action != "added" && action != "removed" && action != "disabled" && action != "updated") +function addFilters(filters) +{ + // We add filters using pseudo-random ordering. Reason is that ElemHide will + // assign consecutive filter IDs that might be visible to the website. The + // randomization makes sure that no conclusion can be made about the actual + // filters applying there. We have ten prime numbers to use as iteration step, + // any of those can be chosen as long as the array length isn't divisible by + // it. + let len = filters.length; + if (!len) return; - if (action != "removed" && !(subscription.url in FilterStorage.knownSubscriptions)) + let current = (Math.random() * len) | 0; + let step; + do { - // Ignore updates for subscriptions not in the list - return; - } + step = primes[(Math.random() * primes.length) | 0]; + } while (len % step == 0); - if ((action == "added" || action == "removed" || action == "updated") && subscription.disabled) - { - // Ignore adding/removing/updating of disabled subscriptions - return; - } + for (let i = 0; i < len; i++, current = (current + step) % len) + addFilter(filters[current]); +} + +function onSubscriptionAdded(subscription) +{ + FilterListener.setDirty(1); + + if (!subscription.disabled) + addFilters(subscription.filters); +} + +function onSubscriptionRemoved(subscription) +{ + FilterListener.setDirty(1); + + if (!subscription.disabled) + subscription.filters.forEach(removeFilter); +} + +function onSubscriptionDisabled(subscription, newValue) +{ + FilterListener.setDirty(1); - if (action == "added" || action == "removed" || action == "disabled") + if (subscription.url in FilterStorage.knownSubscriptions) { - let method = (action == "added" || (action == "disabled" && newValue == false) ? addFilter : removeFilter); - if (subscription.filters) - subscription.filters.forEach(method); + if (newValue == false) + addFilters(subscription.filters); + else + subscription.filters.forEach(removeFilter); } - else if (action == "updated") +} + +function onSubscriptionUpdated(subscription) +{ + FilterListener.setDirty(1); + + if (subscription.url in FilterStorage.knownSubscriptions && + !subscription.disabled) { subscription.oldFilters.forEach(removeFilter); - subscription.filters.forEach(addFilter); + addFilters(subscription.filters); } - - flushElemHide(); } -/** - * Filter change listener - */ -function onFilterChange(action, filter, newValue, oldValue) +function onFilterHitCount(filter, newValue) { - if (action == "hitCount" && newValue == 0) - { - // Filter hits are being reset, make sure these changes are saved. + if (newValue == 0) FilterListener.setDirty(0); - } - else if (action == "hitCount" || action == "lastHit") - FilterListener.setDirty(0.002); else - FilterListener.setDirty(1); + FilterListener.setDirty(0.002); +} - if (action != "added" && action != "removed" && action != "disabled") - return; +function onFilterLastHit() +{ + FilterListener.setDirty(0.002); +} - if ((action == "added" || action == "removed") && filter.disabled) - { - // Ignore adding/removing of disabled filters - return; - } +function onFilterAdded(filter) +{ + FilterListener.setDirty(1); + + if (!filter.disabled) + addFilter(filter); +} + +function onFilterRemoved(filter) +{ + FilterListener.setDirty(1); + + if (!filter.disabled) + removeFilter(filter); +} - if (action == "added" || (action == "disabled" && newValue == false)) +function onFilterDisabled(filter, newValue) +{ + FilterListener.setDirty(1); + + if (newValue == false) addFilter(filter); else removeFilter(filter); - flushElemHide(); } -/** - * Generic notification listener - */ -function onGenericChange(action) +function onGenericChange() { - if (action == "load") + FilterListener.setDirty(1); +} + +function onLoad() +{ + isDirty = 0; + + defaultMatcher.clear(); + ElemHide.clear(); + ElemHideEmulation.clear(); + for (let subscription of FilterStorage.subscriptions) { - isDirty = 0; - - defaultMatcher.clear(); - ElemHide.clear(); - for (let subscription of FilterStorage.subscriptions) - if (!subscription.disabled) - subscription.filters.forEach(addFilter); - flushElemHide(); + if (!subscription.disabled) + addFilters(subscription.filters); } - else if (action == "save") - isDirty = 0; +} + +function onSave() +{ + isDirty = 0; } diff --git a/data/extensions/spyblock@gnu.org/lib/filterNotifier.js b/data/extensions/spyblock@gnu.org/lib/filterNotifier.js index 80d6769..66697cc 100644 --- a/data/extensions/spyblock@gnu.org/lib/filterNotifier.js +++ b/data/extensions/spyblock@gnu.org/lib/filterNotifier.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,47 +15,57 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** * @fileOverview This component manages listeners and calls them to distributes * messages about filter changes. */ +const {EventEmitter} = require("events"); +const {desc} = require("coreUtils"); + +const CATCH_ALL = "__all"; + /** - * List of registered listeners - * @type Array of function(action, item, newValue, oldValue) + * @callback FilterNotifierCatchAllListener + * @param {string} action + * @param {Subscription|Filter} item + * @param {...*} additionalInfo */ -let listeners = []; /** * This class allows registering and triggering listeners for filter events. * @class */ -let FilterNotifier = exports.FilterNotifier = -{ +exports.FilterNotifier = Object.create(new EventEmitter(), desc({ /** * Adds a listener + * + * @deprecated use FilterNotifier.on(action, callback) + * @param {FilterNotifierCatchAllListener} listener */ - addListener: function(/**function(action, item, newValue, oldValue)*/ listener) + addListener(listener) { - if (listeners.indexOf(listener) >= 0) - return; - - listeners.push(listener); + let listeners = this._listeners[CATCH_ALL]; + if (!listeners || listeners.indexOf(listener) == -1) + this.on(CATCH_ALL, listener); }, /** * Removes a listener that was previosly added via addListener + * + * @deprecated use FilterNotifier.off(action, callback) + * @param {FilterNotifierCatchAllListener} listener */ - removeListener: function(/**function(action, item, newValue, oldValue)*/ listener) + removeListener(listener) { - let index = listeners.indexOf(listener); - if (index >= 0) - listeners.splice(index, 1); + this.off(CATCH_ALL, listener); }, /** * Notifies listeners about an event - * @param {String} action event code ("load", "save", "elemhideupdate", + * @param {string} action event code ("load", "save", "elemhideupdate", * "subscription.added", "subscription.removed", * "subscription.disabled", "subscription.title", * "subscription.lastDownload", "subscription.downloadStatus", @@ -63,11 +73,14 @@ let FilterNotifier = exports.FilterNotifier = * "filter.added", "filter.removed", "filter.moved", * "filter.disabled", "filter.hitCount", "filter.lastHit") * @param {Subscription|Filter} item item that the change applies to + * @param {*} param1 + * @param {*} param2 + * @param {*} param3 + * @deprecated use FilterNotifier.emit(action) */ - triggerListeners: function(action, item, param1, param2, param3) + triggerListeners(action, item, param1, param2, param3) { - let list = listeners.slice(); - for (let listener of list) - listener(action, item, param1, param2, param3); + this.emit(action, item, param1, param2, param3); + this.emit(CATCH_ALL, action, item, param1, param2, param3); } -}; +})); diff --git a/data/extensions/spyblock@gnu.org/lib/filterStorage.js b/data/extensions/spyblock@gnu.org/lib/filterStorage.js index dd8aea7..5bbf76c 100644 --- a/data/extensions/spyblock@gnu.org/lib/filterStorage.js +++ b/data/extensions/spyblock@gnu.org/lib/filterStorage.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,36 +15,42 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** - * @fileOverview FilterStorage class responsible for managing user's subscriptions and filters. + * @fileOverview FilterStorage class responsible for managing user's + * subscriptions and filters. */ -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/FileUtils.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); - -let {IO} = require("io"); -let {Prefs} = require("prefs"); -let {Filter, ActiveFilter} = require("filterClasses"); -let {Subscription, SpecialSubscription, ExternalSubscription} = require("subscriptionClasses"); -let {FilterNotifier} = require("filterNotifier"); -let {Utils} = require("utils"); +const {IO} = require("io"); +const {Prefs} = require("prefs"); +const {Filter, ActiveFilter} = require("filterClasses"); +const {Subscription, SpecialSubscription, + ExternalSubscription} = require("subscriptionClasses"); +const {FilterNotifier} = require("filterNotifier"); /** * Version number of the filter storage file format. - * @type Integer + * @type {number} */ -let formatVersion = 4; +let formatVersion = 5; /** - * This class reads user's filters from disk, manages them in memory and writes them back. + * This class reads user's filters from disk, manages them in memory + * and writes them back. * @class */ let FilterStorage = exports.FilterStorage = { /** + * Will be set to true after the initial loadFromDisk() call completes. + * @type {boolean} + */ + initialized: false, + + /** * Version number of the patterns.ini format used. - * @type Integer + * @type {number} */ get formatVersion() { @@ -52,46 +58,17 @@ let FilterStorage = exports.FilterStorage = }, /** - * File that the filter list has been loaded from and should be saved to - * @type nsIFile + * File containing the filter list + * @type {string} */ get sourceFile() { - let file = null; - if (Prefs.patternsfile) - { - // Override in place, use it instead of placing the file in the regular data dir - file = IO.resolveFilePath(Prefs.patternsfile); - } - if (!file) - { - // Place the file in the data dir - file = IO.resolveFilePath(Prefs.data_directory); - if (file) - file.append("patterns.ini"); - } - if (!file) - { - // Data directory pref misconfigured? Try the default value - try - { - file = IO.resolveFilePath(Services.prefs.getDefaultBranch("extensions.adblockplus.").getCharPref("data_directory")); - if (file) - file.append("patterns.ini"); - } catch(e) {} - } - - if (!file) - Cu.reportError("Adblock Plus: Failed to resolve filter file location from extensions.adblockplus.patternsfile preference"); - - // Property is configurable because of the test suite. - Object.defineProperty(this, "sourceFile", {value: file, configurable: true}); - return file; + return "patterns.ini"; }, /** * Will be set to true if no patterns.ini file exists. - * @type Boolean + * @type {boolean} */ firstRun: false, @@ -103,21 +80,23 @@ let FilterStorage = exports.FilterStorage = /** * List of filter subscriptions containing all filters - * @type Array of Subscription + * @type {Subscription[]} */ subscriptions: [], /** * Map of subscriptions already on the list, by their URL/identifier - * @type Object + * @type {Object} */ knownSubscriptions: Object.create(null), /** * Finds the filter group that a filter should be added to by default. Will * return null if this group doesn't exist yet. + * @param {Filter} filter + * @return {?SpecialSubscription} */ - getGroupForFilter: function(/**Filter*/ filter) /**SpecialSubscription*/ + getGroupForFilter(filter) { let generalSubscription = null; for (let subscription of FilterStorage.subscriptions) @@ -129,8 +108,11 @@ let FilterStorage = exports.FilterStorage = return subscription; // If this is a general subscription - store it as fallback - if (!generalSubscription && (!subscription.defaults || !subscription.defaults.length)) + if (!generalSubscription && + (!subscription.defaults || !subscription.defaults.length)) + { generalSubscription = subscription; + } } } return generalSubscription; @@ -139,9 +121,8 @@ let FilterStorage = exports.FilterStorage = /** * Adds a filter subscription to the list * @param {Subscription} subscription filter subscription to be added - * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded) */ - addSubscription: function(subscription, silent) + addSubscription(subscription) { if (subscription.url in FilterStorage.knownSubscriptions) return; @@ -150,16 +131,14 @@ let FilterStorage = exports.FilterStorage = FilterStorage.knownSubscriptions[subscription.url] = subscription; addSubscriptionFilters(subscription); - if (!silent) - FilterNotifier.triggerListeners("subscription.added", subscription); + FilterNotifier.triggerListeners("subscription.added", subscription); }, /** * Removes a filter subscription from the list * @param {Subscription} subscription filter subscription to be removed - * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded) */ - removeSubscription: function(subscription, silent) + removeSubscription(subscription) { for (let i = 0; i < FilterStorage.subscriptions.length; i++) { @@ -169,8 +148,7 @@ let FilterStorage = exports.FilterStorage = FilterStorage.subscriptions.splice(i--, 1); delete FilterStorage.knownSubscriptions[subscription.url]; - if (!silent) - FilterNotifier.triggerListeners("subscription.removed", subscription); + FilterNotifier.triggerListeners("subscription.removed", subscription); return; } } @@ -182,13 +160,16 @@ let FilterStorage = exports.FilterStorage = * @param {Subscription} [insertBefore] filter subscription to insert before * (if omitted the subscription will be put at the end of the list) */ - moveSubscription: function(subscription, insertBefore) + moveSubscription(subscription, insertBefore) { let currentPos = FilterStorage.subscriptions.indexOf(subscription); if (currentPos < 0) return; - let newPos = insertBefore ? FilterStorage.subscriptions.indexOf(insertBefore) : -1; + let newPos = -1; + if (insertBefore) + newPos = FilterStorage.subscriptions.indexOf(insertBefore); + if (newPos < 0) newPos = FilterStorage.subscriptions.length; @@ -205,9 +186,9 @@ let FilterStorage = exports.FilterStorage = /** * Replaces the list of filters in a subscription by a new list * @param {Subscription} subscription filter subscription to be updated - * @param {Array of Filter} filters new filter lsit + * @param {Filter[]} filters new filter list */ - updateSubscriptionFilters: function(subscription, filters) + updateSubscriptionFilters(subscription, filters) { removeSubscriptionFilters(subscription); subscription.oldFilters = subscription.filters; @@ -220,16 +201,20 @@ let FilterStorage = exports.FilterStorage = /** * Adds a user-defined filter to the list * @param {Filter} filter - * @param {SpecialSubscription} [subscription] particular group that the filter should be added to - * @param {Integer} [position] position within the subscription at which the filter should be added - * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded) + * @param {SpecialSubscription} [subscription] + * particular group that the filter should be added to + * @param {number} [position] + * position within the subscription at which the filter should be added */ - addFilter: function(filter, subscription, position, silent) + addFilter(filter, subscription, position) { if (!subscription) { - if (filter.subscriptions.some(s => s instanceof SpecialSubscription && !s.disabled)) + if (filter.subscriptions.some(s => s instanceof SpecialSubscription && + !s.disabled)) + { return; // No need to add + } subscription = FilterStorage.getGroupForFilter(filter); } if (!subscription) @@ -246,25 +231,28 @@ let FilterStorage = exports.FilterStorage = if (filter.subscriptions.indexOf(subscription) < 0) filter.subscriptions.push(subscription); subscription.filters.splice(position, 0, filter); - if (!silent) - FilterNotifier.triggerListeners("filter.added", filter, subscription, position); + FilterNotifier.triggerListeners("filter.added", filter, subscription, + position); }, /** * Removes a user-defined filter from the list * @param {Filter} filter * @param {SpecialSubscription} [subscription] a particular filter group that - * the filter should be removed from (if ommited will be removed from all subscriptions) - * @param {Integer} [position] position inside the filter group at which the + * the filter should be removed from (if ommited will be removed from all + * subscriptions) + * @param {number} [position] position inside the filter group at which the * filter should be removed (if ommited all instances will be removed) */ - removeFilter: function(filter, subscription, position) + removeFilter(filter, subscription, position) { - let subscriptions = (subscription ? [subscription] : filter.subscriptions.slice()); + let subscriptions = ( + subscription ? [subscription] : filter.subscriptions.slice() + ); for (let i = 0; i < subscriptions.length; i++) { - let subscription = subscriptions[i]; - if (subscription instanceof SpecialSubscription) + let currentSubscription = subscriptions[i]; + if (currentSubscription instanceof SpecialSubscription) { let positions = []; if (typeof position == "undefined") @@ -272,7 +260,7 @@ let FilterStorage = exports.FilterStorage = let index = -1; do { - index = subscription.filters.indexOf(filter, index + 1); + index = currentSubscription.filters.indexOf(filter, index + 1); if (index >= 0) positions.push(index); } while (index >= 0); @@ -282,17 +270,19 @@ let FilterStorage = exports.FilterStorage = for (let j = positions.length - 1; j >= 0; j--) { - let position = positions[j]; - if (subscription.filters[position] == filter) + let currentPosition = positions[j]; + if (currentSubscription.filters[currentPosition] == filter) { - subscription.filters.splice(position, 1); - if (subscription.filters.indexOf(filter) < 0) + currentSubscription.filters.splice(currentPosition, 1); + if (currentSubscription.filters.indexOf(filter) < 0) { - let index = filter.subscriptions.indexOf(subscription); + let index = filter.subscriptions.indexOf(currentSubscription); if (index >= 0) filter.subscriptions.splice(index, 1); } - FilterNotifier.triggerListeners("filter.removed", filter, subscription, position); + FilterNotifier.triggerListeners( + "filter.removed", filter, currentSubscription, currentPosition + ); } } } @@ -302,37 +292,38 @@ let FilterStorage = exports.FilterStorage = /** * Moves a user-defined filter to a new position * @param {Filter} filter - * @param {SpecialSubscription} subscription filter group where the filter is located - * @param {Integer} oldPosition current position of the filter - * @param {Integer} newPosition new position of the filter + * @param {SpecialSubscription} subscription filter group where the filter is + * located + * @param {number} oldPosition current position of the filter + * @param {number} newPosition new position of the filter */ - moveFilter: function(filter, subscription, oldPosition, newPosition) + moveFilter(filter, subscription, oldPosition, newPosition) { - if (!(subscription instanceof SpecialSubscription) || subscription.filters[oldPosition] != filter) + if (!(subscription instanceof SpecialSubscription) || + subscription.filters[oldPosition] != filter) + { return; + } - newPosition = Math.min(Math.max(newPosition, 0), subscription.filters.length - 1); + newPosition = Math.min(Math.max(newPosition, 0), + subscription.filters.length - 1); if (oldPosition == newPosition) return; subscription.filters.splice(oldPosition, 1); subscription.filters.splice(newPosition, 0, filter); - FilterNotifier.triggerListeners("filter.moved", filter, subscription, oldPosition, newPosition); + FilterNotifier.triggerListeners("filter.moved", filter, subscription, + oldPosition, newPosition); }, /** * Increases the hit count for a filter by one * @param {Filter} filter - * @param {Window} window Window that the match originated in (required - * to recognize private browsing mode) */ - increaseHitCount: function(filter, wnd) + increaseHitCount(filter) { - if (!Prefs.savestats || PrivateBrowsing.enabledForWindow(wnd) || - PrivateBrowsing.enabled || !(filter instanceof ActiveFilter)) - { + if (!Prefs.savestats || !(filter instanceof ActiveFilter)) return; - } filter.hitCount++; filter.lastHit = Date.now(); @@ -340,9 +331,10 @@ let FilterStorage = exports.FilterStorage = /** * Resets hit count for some filters - * @param {Array of Filter} filters filters to be reset, if null all filters will be reset + * @param {Filter[]} filters filters to be reset, if null all filters will + * be reset */ - resetHitCounts: function(filters) + resetHitCounts(filters) { if (!filters) { @@ -357,316 +349,316 @@ let FilterStorage = exports.FilterStorage = } }, - _loading: false, + /** + * @callback TextSink + * @param {string?} line + */ /** - * Loads all subscriptions from the disk - * @param {nsIFile} [sourceFile] File to read from + * Allows importing previously serialized filter data. + * @param {boolean} silent + * If true, no "load" notification will be sent out. + * @return {TextSink} + * Function to be called for each line of data. Calling it with null as + * parameter finalizes the import and replaces existing data. No changes + * will be applied before finalization, so import can be "aborted" by + * forgetting this callback. */ - loadFromDisk: function(sourceFile) + importData(silent) { - if (this._loading) - return; - - this._loading = true; - - let readFile = function(sourceFile, backupIndex) + let parser = new INIParser(); + return line => { - let parser = new INIParser(); - IO.readFromFile(sourceFile, parser, function(e) + parser.process(line); + if (line === null) { - if (!e && parser.subscriptions.length == 0) - { - // No filter subscriptions in the file, this isn't right. - e = new Error("No data in the file"); - } + let knownSubscriptions = Object.create(null); + for (let subscription of parser.subscriptions) + knownSubscriptions[subscription.url] = subscription; - if (e) - Cu.reportError(e); + this.fileProperties = parser.fileProperties; + this.subscriptions = parser.subscriptions; + this.knownSubscriptions = knownSubscriptions; + Filter.knownFilters = parser.knownFilters; + Subscription.knownSubscriptions = parser.knownSubscriptions; - if (e && !explicitFile) - { - // Attempt to load a backup - sourceFile = this.sourceFile; - if (sourceFile) - { - let [, part1, part2] = /^(.*)(\.\w+)$/.exec(sourceFile.leafName) || [null, sourceFile.leafName, ""]; - - sourceFile = sourceFile.clone(); - sourceFile.leafName = part1 + "-backup" + (++backupIndex) + part2; + if (!silent) + FilterNotifier.triggerListeners("load"); + } + }; + }, - IO.statFile(sourceFile, function(e, statData) - { - if (!e && statData.exists) - readFile(sourceFile, backupIndex); - else - doneReading(parser); - }); - return; - } - } - doneReading(parser); - }.bind(this)); - }.bind(this); + /** + * Loads all subscriptions from the disk. + * @return {Promise} promise resolved or rejected when loading is complete + */ + loadFromDisk() + { + let tryBackup = backupIndex => + { + return this.restoreBackup(backupIndex, true).then(() => + { + if (this.subscriptions.length == 0) + return tryBackup(backupIndex + 1); + }).catch(error => + { + // Give up + }); + }; - var doneReading = function(parser) + return IO.statFile(this.sourceFile).then(statData => { - // Old special groups might have been converted, remove them if they are empty - let specialMap = {"~il~": true, "~wl~": true, "~fl~": true, "~eh~": true}; - let knownSubscriptions = Object.create(null); - for (let i = 0; i < parser.subscriptions.length; i++) + if (!statData.exists) { - let subscription = parser.subscriptions[i]; - if (subscription instanceof SpecialSubscription && subscription.filters.length == 0 && subscription.url in specialMap) - parser.subscriptions.splice(i--, 1); - else - knownSubscriptions[subscription.url] = subscription; + this.firstRun = true; + return; } - this.fileProperties = parser.fileProperties; - this.subscriptions = parser.subscriptions; - this.knownSubscriptions = knownSubscriptions; - Filter.knownFilters = parser.knownFilters; - Subscription.knownSubscriptions = parser.knownSubscriptions; - - if (parser.userFilters) + let parser = this.importData(true); + return IO.readFromFile(this.sourceFile, parser).then(() => { - for (let i = 0; i < parser.userFilters.length; i++) + parser(null); + if (this.subscriptions.length == 0) { - let filter = Filter.fromText(parser.userFilters[i]); - this.addFilter(filter, null, undefined, true); + // No filter subscriptions in the file, this isn't right. + throw new Error("No data in the file"); } - } - - this._loading = false; - FilterNotifier.triggerListeners("load"); - - if (sourceFile != this.sourceFile) - this.saveToDisk(); - - }.bind(this); - - let explicitFile; - if (sourceFile) + }); + }).catch(error => { - explicitFile = true; - readFile(sourceFile, 0); - } - else + Cu.reportError(error); + return tryBackup(1); + }).then(() => { - explicitFile = false; - sourceFile = FilterStorage.sourceFile; + this.initialized = true; + FilterNotifier.triggerListeners("load"); + }); + }, - let callback = function(e, statData) - { - if (e || !statData.exists) - { - this.firstRun = true; - this._loading = false; - FilterNotifier.triggerListeners("load"); - } - else - readFile(sourceFile, 0); - }.bind(this); + /** + * Constructs the file name for a patterns.ini backup. + * @param {number} backupIndex + * number of the backup file (1 being the most recent) + * @return {string} backup file name + */ + getBackupName(backupIndex) + { + let [name, extension] = this.sourceFile.split(".", 2); + return (name + "-backup" + backupIndex + "." + extension); + }, - if (sourceFile) - IO.statFile(sourceFile, callback); - else - callback(true); - } + /** + * Restores an automatically created backup. + * @param {number} backupIndex + * number of the backup to restore (1 being the most recent) + * @param {boolean} silent + * If true, no "load" notification will be sent out. + * @return {Promise} promise resolved or rejected when restoring is complete + */ + restoreBackup(backupIndex, silent) + { + let backupFile = this.getBackupName(backupIndex); + let parser = this.importData(silent); + return IO.readFromFile(backupFile, parser).then(() => + { + parser(null); + return this.saveToDisk(); + }); }, - _generateFilterData: function(subscriptions) + /** + * Generator serializing filter data and yielding it line by line. + */ + *exportData() { + // Do not persist external subscriptions + let subscriptions = this.subscriptions.filter( + s => !(s instanceof ExternalSubscription) + ); + yield "# Adblock Plus preferences"; yield "version=" + formatVersion; - let saved = Object.create(null); + let saved = new Set(); let buf = []; - // Save filter data - for (let i = 0; i < subscriptions.length; i++) - { - let subscription = subscriptions[i]; - for (let j = 0; j < subscription.filters.length; j++) - { - let filter = subscription.filters[j]; - if (!(filter.text in saved)) - { - filter.serialize(buf); - saved[filter.text] = filter; - for (let k = 0; k < buf.length; k++) - yield buf[k]; - buf.splice(0); - } - } - } - // Save subscriptions - for (let i = 0; i < subscriptions.length; i++) + for (let subscription of subscriptions) { - let subscription = subscriptions[i]; - yield ""; subscription.serialize(buf); if (subscription.filters.length) { - buf.push("", "[Subscription filters]") + buf.push("", "[Subscription filters]"); subscription.serializeFilters(buf); } - for (let k = 0; k < buf.length; k++) - yield buf[k]; + for (let line of buf) + yield line; buf.splice(0); } + + // Save filter data + for (let subscription of subscriptions) + { + for (let filter of subscription.filters) + { + if (!saved.has(filter.text)) + { + filter.serialize(buf); + saved.add(filter.text); + for (let line of buf) + yield line; + buf.splice(0); + } + } + } }, /** * Will be set to true if saveToDisk() is running (reentrance protection). - * @type Boolean + * @type {boolean} */ _saving: false, /** * Will be set to true if a saveToDisk() call arrives while saveToDisk() is * already running (delayed execution). - * @type Boolean + * @type {boolean} */ _needsSave: false, /** * Saves all subscriptions back to disk - * @param {nsIFile} [targetFile] File to be written + * @return {Promise} promise resolved or rejected when saving is complete */ - saveToDisk: function(targetFile) + saveToDisk() { - let explicitFile = true; - if (!targetFile) - { - targetFile = FilterStorage.sourceFile; - explicitFile = false; - } - if (!targetFile) - return; - - if (!explicitFile && this._saving) + if (this._saving) { this._needsSave = true; return; } - // Make sure the file's parent directory exists - try { - targetFile.parent.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY); - } catch (e) {} + this._saving = true; - let writeFilters = function() + return Promise.resolve().then(() => { - IO.writeToFile(targetFile, this._generateFilterData(subscriptions), function(e) - { - if (!explicitFile) - this._saving = false; - - if (e) - Cu.reportError(e); - - if (!explicitFile && this._needsSave) - { - this._needsSave = false; - this.saveToDisk(); - } - else - FilterNotifier.triggerListeners("save"); - }.bind(this)); - }.bind(this); + // First check whether we need to create a backup + if (Prefs.patternsbackups <= 0) + return false; - let checkBackupRequired = function(callbackNotRequired, callbackRequired) - { - if (explicitFile || Prefs.patternsbackups <= 0) - callbackNotRequired(); - else + return IO.statFile(this.sourceFile).then(statData => { - IO.statFile(targetFile, function(e, statData) + if (!statData.exists) + return false; + + return IO.statFile(this.getBackupName(1)).then(backupStatData => { - if (e || !statData.exists) - callbackNotRequired(); - else + if (backupStatData.exists && + (Date.now() - backupStatData.lastModified) / 3600000 < + Prefs.patternsbackupinterval) { - let [, part1, part2] = /^(.*)(\.\w+)$/.exec(targetFile.leafName) || [null, targetFile.leafName, ""]; - let newestBackup = targetFile.clone(); - newestBackup.leafName = part1 + "-backup1" + part2; - IO.statFile(newestBackup, function(e, statData) - { - if (!e && (!statData.exists || (Date.now() - statData.lastModified) / 3600000 >= Prefs.patternsbackupinterval)) - callbackRequired(part1, part2) - else - callbackNotRequired(); - }); + return false; } + return true; }); - } - }.bind(this); - - let removeLastBackup = function(part1, part2) + }); + }).then(backupRequired => { - let file = targetFile.clone(); - file.leafName = part1 + "-backup" + Prefs.patternsbackups + part2; - IO.removeFile(file, (e) => renameBackup(part1, part2, Prefs.patternsbackups - 1)); - }.bind(this); + if (!backupRequired) + return; - let renameBackup = function(part1, part2, index) - { - if (index > 0) + let ignoreErrors = error => { - let fromFile = targetFile.clone(); - fromFile.leafName = part1 + "-backup" + index + part2; - - let toName = part1 + "-backup" + (index + 1) + part2; + // Expected error, backup file doesn't exist. + }; - IO.renameFile(fromFile, toName, (e) => renameBackup(part1, part2, index - 1)); - } - else + let renameBackup = index => { - let toFile = targetFile.clone(); - toFile.leafName = part1 + "-backup" + (index + 1) + part2; - - IO.copyFile(targetFile, toFile, writeFilters); - } - }.bind(this); + if (index > 0) + { + return IO.renameFile(this.getBackupName(index), + this.getBackupName(index + 1)) + .catch(ignoreErrors) + .then(() => renameBackup(index - 1)); + } - // Do not persist external subscriptions - let subscriptions = this.subscriptions.filter((s) => !(s instanceof ExternalSubscription)); - if (!explicitFile) - this._saving = true; + return IO.renameFile(this.sourceFile, this.getBackupName(1)) + .catch(ignoreErrors); + }; - checkBackupRequired(writeFilters, removeLastBackup); + // Rename existing files + return renameBackup(Prefs.patternsbackups - 1); + }).catch(error => + { + // Errors during backup creation shouldn't prevent writing filters. + Cu.reportError(error); + }).then(() => + { + return IO.writeToFile(this.sourceFile, this.exportData()); + }).then(() => + { + FilterNotifier.triggerListeners("save"); + }).catch(error => + { + // If saving failed, report error but continue - we still have to process + // flags. + Cu.reportError(error); + }).then(() => + { + this._saving = false; + if (this._needsSave) + { + this._needsSave = false; + this.saveToDisk(); + } + }); }, /** - * Returns the list of existing backup files. + * @typedef FileInfo + * @type {object} + * @property {nsIFile} file + * @property {number} lastModified */ - getBackupFiles: function() /**nsIFile[]*/ + + /** + * Returns a promise resolving in a list of existing backup files. + * @return {Promise.<FileInfo[]>} + */ + getBackupFiles() { - // TODO: This method should be asynchronous - let result = []; + let backups = []; - let [, part1, part2] = /^(.*)(\.\w+)$/.exec(FilterStorage.sourceFile.leafName) || [null, FilterStorage.sourceFile.leafName, ""]; - for (let i = 1; ; i++) + let checkBackupFile = index => { - let file = FilterStorage.sourceFile.clone(); - file.leafName = part1 + "-backup" + i + part2; - if (file.exists()) - result.push(file); - else - break; - } - return result; + return IO.statFile(this.getBackupName(index)).then(statData => + { + if (!statData.exists) + return backups; + + backups.push({ + index, + lastModified: statData.lastModified + }); + return checkBackupFile(index + 1); + }).catch(error => + { + // Something went wrong, return whatever data we got so far. + Cu.reportError(error); + return backups; + }); + }; + + return checkBackupFile(1); } }; /** * Joins subscription's filters to the subscription without any notifications. - * @param {Subscription} subscription filter subscription that should be connected to its filters + * @param {Subscription} subscription + * filter subscription that should be connected to its filters */ function addSubscriptionFilters(subscription) { @@ -678,7 +670,8 @@ function addSubscriptionFilters(subscription) } /** - * Removes subscription's filters from the subscription without any notifications. + * Removes subscription's filters from the subscription without any + * notifications. * @param {Subscription} subscription filter subscription to be removed */ function removeSubscriptionFilters(subscription) @@ -695,74 +688,7 @@ function removeSubscriptionFilters(subscription) } /** - * Observer listening to private browsing mode changes. - * @class - */ -let PrivateBrowsing = exports.PrivateBrowsing = -{ - /** - * Will be set to true when the private browsing mode is switched on globally. - * @type Boolean - */ - enabled: false, - - /** - * Checks whether private browsing is enabled for a particular window. - */ - enabledForWindow: function(/**Window*/ wnd) /**Boolean*/ - { - try - { - return wnd.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsILoadContext) - .usePrivateBrowsing; - } - catch (e) - { - // Gecko 19 and below will throw NS_NOINTERFACE, this is expected - if (e.result != Cr.NS_NOINTERFACE) - Cu.reportError(e); - return false; - } - }, - - init: function() - { - if ("@mozilla.org/privatebrowsing;1" in Cc) - { - try - { - this.enabled = Cc["@mozilla.org/privatebrowsing;1"].getService(Ci.nsIPrivateBrowsingService).privateBrowsingEnabled; - Services.obs.addObserver(this, "private-browsing", true); - onShutdown.add(function() - { - Services.obs.removeObserver(this, "private-browsing"); - }.bind(this)); - } - catch(e) - { - Cu.reportError(e); - } - } - }, - - observe: function(subject, topic, data) - { - if (topic == "private-browsing") - { - if (data == "enter") - this.enabled = true; - else if (data == "exit") - this.enabled = false; - } - }, - - QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) -}; -PrivateBrowsing.init(); - -/** - * IO.readFromFile() listener to parse filter data. + * Listener returned by FilterStorage.importData(), parses filter data. * @constructor */ function INIParser() @@ -777,14 +703,13 @@ INIParser.prototype = linesProcessed: 0, subscriptions: null, knownFilters: null, - knownSubscriptions : null, + knownSubscriptions: null, wantObj: true, fileProperties: null, curObj: null, curSection: null, - userFilters: null, - process: function(val) + process(val) { let origKnownFilters = Filter.knownFilters; Filter.knownFilters = this.knownFilters; @@ -803,20 +728,21 @@ INIParser.prototype = switch (this.curSection) { case "filter": - case "pattern": if ("text" in this.curObj) Filter.fromObject(this.curObj); break; - case "subscription": + case "subscription": { let subscription = Subscription.fromObject(this.curObj); if (subscription) this.subscriptions.push(subscription); break; + } case "subscription filters": - case "subscription patterns": if (this.subscriptions.length) { - let subscription = this.subscriptions[this.subscriptions.length - 1]; + let subscription = this.subscriptions[ + this.subscriptions.length - 1 + ]; for (let text of this.curObj) { let filter = Filter.fromText(text); @@ -825,9 +751,6 @@ INIParser.prototype = } } break; - case "user patterns": - this.userFilters = this.curObj; - break; } } @@ -838,14 +761,11 @@ INIParser.prototype = switch (this.curSection) { case "filter": - case "pattern": case "subscription": this.wantObj = true; this.curObj = {}; break; case "subscription filters": - case "subscription patterns": - case "user patterns": this.wantObj = false; this.curObj = []; break; @@ -862,11 +782,5 @@ INIParser.prototype = Filter.knownFilters = origKnownFilters; Subscription.knownSubscriptions = origKnownSubscriptions; } - - // Allow events to be processed every now and then. - // Note: IO.readFromFile() will deal with the potential reentrance here. - this.linesProcessed++; - if (this.linesProcessed % 1000 == 0) - Utils.yield(); } }; diff --git a/data/extensions/spyblock@gnu.org/lib/io.js b/data/extensions/spyblock@gnu.org/lib/io.js index 5e60b54..0a22513 100644 --- a/data/extensions/spyblock@gnu.org/lib/io.js +++ b/data/extensions/spyblock@gnu.org/lib/io.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,318 +15,265 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ -/** - * @fileOverview Module containing file I/O helpers. - */ - -let {Services} = Cu.import("resource://gre/modules/Services.jsm", null); -let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", null); -let {OS} = Cu.import("resource://gre/modules/osfile.jsm", null); -let {Task} = Cu.import("resource://gre/modules/Task.jsm", null); +"use strict"; -let {Prefs} = require("prefs"); +let {IO: LegacyIO} = require("legacyIO"); let {Utils} = require("utils"); -let firstRead = true; -const BUFFER_SIZE = 0x80000; // 512kB +let webextension = require("webextension"); +let messageID = 0; +let messageCallbacks = new Map(); -let IO = exports.IO = +webextension.then(port => { - /** - * Retrieves the platform-dependent line break string. - */ - get lineBreak() + port.onMessage.addListener(message => { - let lineBreak = (Services.appinfo.OS == "WINNT" ? "\r\n" : "\n"); - Object.defineProperty(this, "lineBreak", {value: lineBreak}); - return lineBreak; - }, - - /** - * Tries to interpret a file path as an absolute path or a path relative to - * user's profile. Returns a file or null on failure. - */ - resolveFilePath: function(/**String*/ path) /**nsIFile*/ - { - if (!path) - return null; - - try { - // Assume an absolute path first - return new FileUtils.File(path); - } catch (e) {} - - try { - // Try relative path now - return FileUtils.getFile("ProfD", path.split("/")); - } catch (e) {} + let {id} = message; + let callbacks = messageCallbacks.get(id); + if (callbacks) + { + messageCallbacks.delete(id); - return null; - }, + if (message.success) + callbacks.resolve(message.result); + else + callbacks.reject(message.result); + } + }); +}); - /** - * Reads strings from a file asynchronously, calls listener.process() with - * each line read and with a null parameter once the read operation is done. - * The callback will be called when the operation is done. - */ - readFromFile: function(/**nsIFile*/ file, /**Object*/ listener, /**Function*/ callback) +function callWebExt(method, ...args) +{ + return webextension.then(port => { - try + return new Promise((resolve, reject) => { - let processing = false; - let buffer = ""; - let loaded = false; - let error = null; + let id = ++messageID; + messageCallbacks.set(id, {resolve, reject}); + port.postMessage({id, method, args}); + }); + }); +} - let onProgress = function(data) - { - let index = (processing ? -1 : Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r"))); - if (index >= 0) - { - // Protect against reentrance in case the listener processes events. - processing = true; - try - { - let oldBuffer = buffer; - buffer = data.substr(index + 1); - data = data.substr(0, index + 1); - let lines = data.split(/[\r\n]+/); - lines.pop(); - lines[0] = oldBuffer + lines[0]; - for (let i = 0; i < lines.length; i++) - listener.process(lines[i]); - } - finally - { - processing = false; - data = buffer; - buffer = ""; - onProgress(data); +function callLegacy(method, ...args) +{ + return new Promise((resolve, reject) => + { + LegacyIO[method](...args, (error, result) => + { + if (error) + reject(error); + else + resolve(result); + }); + }); +} - if (loaded) - { - loaded = false; - onSuccess(); - } +function legacyFile(fileName) +{ + let file = LegacyIO.resolveFilePath("adblockplus"); + file.append(fileName); + return file; +} - if (error) - { - let param = error; - error = null; - onError(param); - } - } - } - else - buffer += data; - }; +function ensureDirExists(file) +{ + if (!file.exists()) + { + ensureDirExists(file.parent); + file.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755); + } +} - let onSuccess = function() +let fallback = { + readFromFile(fileName, listener) + { + let wrapper = { + process(line) { - if (processing) - { - // Still processing data, delay processing this event. - loaded = true; - return; - } - - if (buffer !== "") - listener.process(buffer); - listener.process(null); + if (line !== null) + listener(line); + } + }; + return callLegacy("readFromFile", legacyFile(fileName), wrapper); + }, - callback(null); - }; + writeToFile(fileName, data) + { + let file = legacyFile(fileName); + ensureDirExists(file.parent); + return callLegacy("writeToFile", file, data); + }, - let onError = function(e) - { - if (processing) - { - // Still processing data, delay processing this event. - error = e; - return; - } + copyFile(fromFile, toFile) + { + return callLegacy("copyFile", legacyFile(fromFile), legacyFile(toFile)); + }, - callback(e); - }; + renameFile(fromFile, newName) + { + return callLegacy("renameFile", legacyFile(fromFile), newName); + }, - let decoder = new TextDecoder(); - Task.spawn(function() - { - if (firstRead && Services.vc.compare(Utils.platformVersion, "23.0a1") <= 0) - { - // See https://issues.adblockplus.org/ticket/530 - the first file - // opened cannot be closed due to Gecko bug 858723. Make sure that - // our patterns.ini file doesn't stay locked by opening a dummy file - // first. - try - { - let dummyPath = IO.resolveFilePath(Prefs.data_directory + "/dummy").path; - let dummy = yield OS.File.open(dummyPath, {write: true, truncate: true}); - yield dummy.close(); - } - catch (e) - { - // Dummy might be locked already, we don't care - } - } - firstRead = false; + removeFile(fileName) + { + return callLegacy("removeFile", legacyFile(fileName)); + }, - let f = yield OS.File.open(file.path, {read: true}); - while (true) - { - let array = yield f.read(BUFFER_SIZE); - if (!array.length) - break; + statFile(fileName) + { + return callLegacy("statFile", legacyFile(fileName)); + } +}; - let data = decoder.decode(array, {stream: true}); - onProgress(data); - } - yield f.close(); - }.bind(this)).then(onSuccess, onError); - } - catch (e) - { - callback(e); - } - }, +exports.IO = +{ + /** + * @callback TextSink + * @param {string} line + */ /** - * Writes string data to a file in UTF-8 format asynchronously. The callback - * will be called when the write operation is done. + * Reads text lines from a file. + * @param {string} fileName + * Name of the file to be read + * @param {TextSink} listener + * Function that will be called for each line in the file + * @return {Promise} + * Promise to be resolved or rejected once the operation is completed */ - writeToFile: function(/**nsIFile*/ file, /**Iterator*/ data, /**Function*/ callback) + readFromFile(fileName, listener) { - try + return callWebExt("readFromFile", fileName).then(contents => { - let encoder = new TextEncoder(); - - Task.spawn(function() + return new Promise((resolve, reject) => { - // This mimics OS.File.writeAtomic() but writes in chunks. - let tmpPath = file.path + ".tmp"; - let f = yield OS.File.open(tmpPath, {write: true, truncate: true}); + let lineIndex = 0; - let buf = []; - let bufLen = 0; - let lineBreak = this.lineBreak; - - function writeChunk() - { - let array = encoder.encode(buf.join(lineBreak) + lineBreak); - buf = []; - bufLen = 0; - return f.write(array); - } - - for (let line in data) + function processBatch() { - buf.push(line); - bufLen += line.length; - if (bufLen >= BUFFER_SIZE) - yield writeChunk(); + while (lineIndex < contents.length) + { + listener(contents[lineIndex++]); + if (lineIndex % 1000 == 0) + { + Utils.runAsync(processBatch); + return; + } + } + resolve(); } - if (bufLen) - yield writeChunk(); + processBatch(); + }); + }); + }, - // OS.File.flush() isn't exposed prior to Gecko 27, see bug 912457. - if (typeof f.flush == "function") - yield f.flush(); - yield f.close(); - yield OS.File.move(tmpPath, file.path, {noCopy: true}); - }.bind(this)).then(callback.bind(null, null), callback); - } - catch (e) - { - callback(e); - } + /** + * Writes text lines to a file. + * @param {string} fileName + * Name of the file to be written + * @param {Iterable.<string>} data + * An array-like or iterable object containing the lines (without line + * endings) + * @return {Promise} + * Promise to be resolved or rejected once the operation is completed + */ + writeToFile(fileName, data) + { + return callWebExt("writeToFile", fileName, Array.from(data)); }, /** - * Copies a file asynchronously. The callback will be called when the copy - * operation is done. + * Copies a file. + * @param {string} fromFile + * Name of the file to be copied + * @param {string} toFile + * Name of the file to be written, will be overwritten if exists + * @return {Promise} + * Promise to be resolved or rejected once the operation is completed */ - copyFile: function(/**nsIFile*/ fromFile, /**nsIFile*/ toFile, /**Function*/ callback) + copyFile(fromFile, toFile) { - try - { - let promise = OS.File.copy(fromFile.path, toFile.path); - promise.then(callback.bind(null, null), callback); - } - catch (e) - { - callback(e); - } + return callWebExt("copyFile", fromFile, toFile); }, /** - * Renames a file within the same directory, will call callback when done. + * Renames a file. + * @param {string} fromFile + * Name of the file to be renamed + * @param {string} newName + * New file name, will be overwritten if exists + * @return {Promise} + * Promise to be resolved or rejected once the operation is completed */ - renameFile: function(/**nsIFile*/ fromFile, /**String*/ newName, /**Function*/ callback) + renameFile(fromFile, newName) { - try - { - toFile = fromFile.clone(); - toFile.leafName = newName; - let promise = OS.File.move(fromFile.path, toFile.path); - promise.then(callback.bind(null, null), callback); - } - catch(e) - { - callback(e); - } + return callWebExt("renameFile", fromFile, newName); }, /** - * Removes a file, will call callback when done. + * Removes a file. + * @param {string} fileName + * Name of the file to be removed + * @return {Promise} + * Promise to be resolved or rejected once the operation is completed */ - removeFile: function(/**nsIFile*/ file, /**Function*/ callback) + removeFile(fileName) { - try - { - let promise = OS.File.remove(file.path); - promise.then(callback.bind(null, null), callback); - } - catch(e) - { - callback(e); - } + return callWebExt("removeFile", fileName); }, /** - * Gets file information such as whether the file exists. + * @typedef StatData + * @type {object} + * @property {boolean} exists + * true if the file exists + * @property {number} lastModified + * file modification time in milliseconds */ - statFile: function(/**nsIFile*/ file, /**Function*/ callback) + + /** + * Retrieves file metadata. + * @param {string} fileName + * Name of the file to be looked up + * @return {Promise.<StatData>} + * Promise to be resolved with file metadata once the operation is + * completed + */ + statFile(fileName) + { + return callWebExt("statFile", fileName); + } +}; + +let {application} = require("info"); +if (application != "firefox" && application != "fennec2") +{ + // Currently, only Firefox has a working WebExtensions implementation, other + // applications should just use the fallback. + exports.IO = fallback; +} +else +{ + // Add fallbacks to IO methods - fall back to legacy I/O if file wasn't found. + for (let name of Object.getOwnPropertyNames(exports.IO)) { - try + // No fallback for writeToFile method, new data should always be stored to + // new storage only. + if (name == "writeToFile") + continue; + + let method = exports.IO[name]; + let fallbackMethod = fallback[name]; + exports.IO[name] = (...args) => { - let promise = OS.File.stat(file.path); - promise.then(function onSuccess(info) - { - callback(null, { - exists: true, - isDirectory: info.isDir, - isFile: !info.isDir, - lastModified: info.lastModificationDate.getTime() - }); - }, function onError(e) + return method(...args).catch(error => { - if (e.becauseNoSuchFile) - { - callback(null, { - exists: false, - isDirectory: false, - isFile: false, - lastModified: 0 - }); - } - else - callback(e); + if (error == "NoSuchFile") + return fallbackMethod(...args); + throw error; }); - } - catch(e) - { - callback(e); - } + }; } } diff --git a/data/extensions/spyblock@gnu.org/lib/keySelector.js b/data/extensions/spyblock@gnu.org/lib/keySelector.js index 01d9cd0..151f50d 100644 --- a/data/extensions/spyblock@gnu.org/lib/keySelector.js +++ b/data/extensions/spyblock@gnu.org/lib/keySelector.js @@ -4,16 +4,26 @@ Cu.import("resource://gre/modules/Services.jsm"); -let validModifiers = +let validModifiers = Object.create(null); +validModifiers.ACCEL = null; +validModifiers.CTRL = "control"; +validModifiers.CONTROL = "control"; +validModifiers.SHIFT = "shift"; +validModifiers.ALT = "alt"; +validModifiers.META = "meta"; + +let bindingsKeys = null; +(function() { - ACCEL: null, - CTRL: "control", - CONTROL: "control", - SHIFT: "shift", - ALT: "alt", - META: "meta", - __proto__: null -}; + let request = new XMLHttpRequest(); + request.open("GET", "chrome://global/content/platformHTMLBindings.xml"); + request.addEventListener("load", () => + { + bindingsKeys = request.responseXML.getElementsByTagName("handler"); + }); + request.send(); +})(); + /** * Sets the correct value of validModifiers.ACCEL. @@ -66,9 +76,11 @@ KeySelector.prototype = if (!validModifiers.ACCEL) initAccelKey(); - this._existingShortcuts = {__proto__: null}; + this._existingShortcuts = Object.create(null); - let keys = window.document.getElementsByTagName("key"); + let keys = Array.prototype.slice.apply(window.document.getElementsByTagName("key")); + if (bindingsKeys) + keys.push.apply(keys, bindingsKeys); for (let i = 0; i < keys.length; i++) { let key = keys[i]; @@ -95,7 +107,7 @@ KeySelector.prototype = let keyModifiers = key.getAttribute("modifiers"); if (keyModifiers) - for each (let modifier in keyModifiers.toUpperCase().match(/\w+/g)) + for (let modifier of keyModifiers.toUpperCase().match(/\w+/g)) if (modifier in validModifiers) keyData[validModifiers[modifier]] = true; @@ -110,7 +122,7 @@ KeySelector.prototype = */ selectKey: function(/**String*/ variants) /**Object*/ { - for each (let variant in variants.split(/\s*,\s*/)) + for (let variant of variants.split(/\s*,\s*/)) { if (!variant) continue; @@ -125,7 +137,7 @@ KeySelector.prototype = code: null, codeName: null }; - for each (let part in variant.toUpperCase().split(/\s+/)) + for (let part of variant.toUpperCase().split(/\s+/)) { if (part in validModifiers) keyData[validModifiers[part]] = true; diff --git a/data/extensions/spyblock@gnu.org/lib/legacyIO.js b/data/extensions/spyblock@gnu.org/lib/legacyIO.js new file mode 100644 index 0000000..5549d96 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/legacyIO.js @@ -0,0 +1,335 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview Module containing file I/O helpers. + */ + +let {Services} = Cu.import("resource://gre/modules/Services.jsm", null); +let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", null); +let {OS} = Cu.import("resource://gre/modules/osfile.jsm", null); +let {Task} = Cu.import("resource://gre/modules/Task.jsm", null); + +let {Prefs} = require("prefs"); +let {Utils} = require("utils"); + +let firstRead = true; +const BUFFER_SIZE = 0x80000; // 512kB + +let IO = exports.IO = +{ + /** + * Retrieves the platform-dependent line break string. + */ + get lineBreak() + { + let lineBreak = (Services.appinfo.OS == "WINNT" ? "\r\n" : "\n"); + Object.defineProperty(this, "lineBreak", {value: lineBreak}); + return lineBreak; + }, + + /** + * Tries to interpret a file path as an absolute path or a path relative to + * user's profile. Returns a file or null on failure. + */ + resolveFilePath: function(/**String*/ path) /**nsIFile*/ + { + if (!path) + return null; + + try { + // Assume an absolute path first + return new FileUtils.File(path); + } catch (e) {} + + try { + // Try relative path now + return FileUtils.getFile("ProfD", path.split("/")); + } catch (e) {} + + return null; + }, + + /** + * Reads strings from a file asynchronously, calls listener.process() with + * each line read and with a null parameter once the read operation is done. + * The callback will be called when the operation is done. + */ + readFromFile: function(/**nsIFile*/ file, /**Object*/ listener, /**Function*/ callback) + { + try + { + let processing = false; + let buffer = ""; + let loaded = false; + let error = null; + + let onProgress = function*(data) + { + let index = (processing ? -1 : Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r"))); + if (index >= 0) + { + // Protect against reentrance in case the listener processes events. + processing = true; + try + { + let oldBuffer = buffer; + buffer = data.substr(index + 1); + data = data.substr(0, index + 1); + let lines = data.split(/[\r\n]+/); + lines.pop(); + lines[0] = oldBuffer + lines[0]; + for (let i = 0; i < lines.length; i++) + listener.process(lines[i]); + } + finally + { + processing = false; + data = buffer; + buffer = ""; + yield* onProgress(data); + + if (loaded) + { + loaded = false; + onSuccess(); + } + + if (error) + { + let param = error; + error = null; + onError(param); + } + } + } + else + buffer += data; + }; + + let onSuccess = function() + { + if (processing) + { + // Still processing data, delay processing this event. + loaded = true; + return; + } + + // We are ignoring return value of listener.process() here because + // turning this callback into a generator would be complicated, and + // delaying isn't really necessary for the last two calls. + if (buffer !== "") + listener.process(buffer); + listener.process(null); + + callback(null); + }; + + let onError = function(e) + { + if (processing) + { + // Still processing data, delay processing this event. + error = e; + return; + } + + callback(e); + }; + + let decoder = new TextDecoder(); + Task.spawn(function*() + { + if (firstRead && Services.vc.compare(Utils.platformVersion, "23.0a1") <= 0) + { + // See https://issues.adblockplus.org/ticket/530 - the first file + // opened cannot be closed due to Gecko bug 858723. Make sure that + // our patterns.ini file doesn't stay locked by opening a dummy file + // first. + try + { + let dummyPath = IO.resolveFilePath(Prefs.data_directory + "/dummy").path; + let dummy = yield OS.File.open(dummyPath, {write: true, truncate: true}); + yield dummy.close(); + } + catch (e) + { + // Dummy might be locked already, we don't care + } + } + firstRead = false; + + let f = yield OS.File.open(file.path, {read: true}); + while (true) + { + let array = yield f.read(BUFFER_SIZE); + if (!array.length) + break; + + let data = decoder.decode(array, {stream: true}); + yield* onProgress(data); + } + yield f.close(); + }.bind(this)).then(onSuccess, onError); + } + catch (e) + { + callback(e); + } + }, + + /** + * Writes string data to a file in UTF-8 format asynchronously. The callback + * will be called when the write operation is done. + */ + writeToFile: function(/**nsIFile*/ file, /**Iterator*/ data, /**Function*/ callback) + { + try + { + let encoder = new TextEncoder(); + + Task.spawn(function*() + { + // This mimics OS.File.writeAtomic() but writes in chunks. + let tmpPath = file.path + ".tmp"; + let f = yield OS.File.open(tmpPath, {write: true, truncate: true}); + + let buf = []; + let bufLen = 0; + let lineBreak = this.lineBreak; + + function writeChunk() + { + let array = encoder.encode(buf.join(lineBreak) + lineBreak); + buf = []; + bufLen = 0; + return f.write(array); + } + + for (let line of data) + { + buf.push(line); + bufLen += line.length; + if (bufLen >= BUFFER_SIZE) + yield writeChunk(); + } + + if (bufLen) + yield writeChunk(); + + // OS.File.flush() isn't exposed prior to Gecko 27, see bug 912457. + if (typeof f.flush == "function") + yield f.flush(); + yield f.close(); + yield OS.File.move(tmpPath, file.path, {noCopy: true}); + }.bind(this)).then(callback.bind(null, null), callback); + } + catch (e) + { + callback(e); + } + }, + + /** + * Copies a file asynchronously. The callback will be called when the copy + * operation is done. + */ + copyFile: function(/**nsIFile*/ fromFile, /**nsIFile*/ toFile, /**Function*/ callback) + { + try + { + let promise = OS.File.copy(fromFile.path, toFile.path); + promise.then(callback.bind(null, null), callback); + } + catch (e) + { + callback(e); + } + }, + + /** + * Renames a file within the same directory, will call callback when done. + */ + renameFile: function(/**nsIFile*/ fromFile, /**String*/ newName, /**Function*/ callback) + { + try + { + let toFile = fromFile.clone(); + toFile.leafName = newName; + let promise = OS.File.move(fromFile.path, toFile.path); + promise.then(callback.bind(null, null), callback); + } + catch(e) + { + callback(e); + } + }, + + /** + * Removes a file, will call callback when done. + */ + removeFile: function(/**nsIFile*/ file, /**Function*/ callback) + { + try + { + let promise = OS.File.remove(file.path); + promise.then(callback.bind(null, null), callback); + } + catch(e) + { + callback(e); + } + }, + + /** + * Gets file information such as whether the file exists. + */ + statFile: function(/**nsIFile*/ file, /**Function*/ callback) + { + try + { + let promise = OS.File.stat(file.path); + promise.then(function onSuccess(info) + { + callback(null, { + exists: true, + isDirectory: info.isDir, + isFile: !info.isDir, + lastModified: info.lastModificationDate.getTime() + }); + }, function onError(e) + { + if (e.becauseNoSuchFile) + { + callback(null, { + exists: false, + isDirectory: false, + isFile: false, + lastModified: 0 + }); + } + else + callback(e); + }); + } + catch(e) + { + callback(e); + } + } +} diff --git a/data/extensions/spyblock@gnu.org/lib/main.js b/data/extensions/spyblock@gnu.org/lib/main.js index fa84d9e..c0d4733 100644 --- a/data/extensions/spyblock@gnu.org/lib/main.js +++ b/data/extensions/spyblock@gnu.org/lib/main.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -22,6 +22,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); +bootstrapChildProcesses(); registerPublicAPI(); require("filterListener"); require("contentPolicy"); @@ -30,6 +31,26 @@ require("notification"); require("sync"); require("messageResponder"); require("ui"); +require("objectTabs"); +require("elemHideFF"); +require("elemHideEmulation"); + +function bootstrapChildProcesses() +{ + let info = require("info"); + + let processScript = info.addonRoot + "lib/child/bootstrap.js?" + + Math.random() + "&info=" + encodeURIComponent(JSON.stringify(info)); + let messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] + .getService(Ci.nsIProcessScriptLoader) + .QueryInterface(Ci.nsIMessageBroadcaster); + messageManager.loadProcessScript(processScript, true); + + onShutdown.add(() => { + messageManager.broadcastAsyncMessage("AdblockPlus:Shutdown", processScript); + messageManager.removeDelayedProcessScript(processScript); + }); +} function registerPublicAPI() { diff --git a/data/extensions/spyblock@gnu.org/lib/matcher.js b/data/extensions/spyblock@gnu.org/lib/matcher.js index 59ef1e7..02573bd 100644 --- a/data/extensions/spyblock@gnu.org/lib/matcher.js +++ b/data/extensions/spyblock@gnu.org/lib/matcher.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,11 +15,14 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** - * @fileOverview Matcher class implementing matching addresses against a list of filters. + * @fileOverview Matcher class implementing matching addresses against + * a list of filters. */ -let {Filter, RegExpFilter, WhitelistFilter} = require("filterClasses"); +const {Filter, WhitelistFilter} = require("filterClasses"); /** * Blacklist/whitelist filter matching @@ -34,20 +37,20 @@ exports.Matcher = Matcher; Matcher.prototype = { /** * Lookup table for filters by their associated keyword - * @type Object + * @type {Object} */ filterByKeyword: null, /** * Lookup table for keywords by the filter text - * @type Object + * @type {Object} */ keywordByFilter: null, /** * Removes all known filters */ - clear: function() + clear() { this.filterByKeyword = Object.create(null); this.keywordByFilter = Object.create(null); @@ -57,7 +60,7 @@ Matcher.prototype = { * Adds a filter to the matcher * @param {RegExpFilter} filter */ - add: function(filter) + add(filter) { if (filter.text in this.keywordByFilter) return; @@ -78,7 +81,7 @@ Matcher.prototype = { * Removes a filter from the matcher * @param {RegExpFilter} filter */ - remove: function(filter) + remove(filter) { if (!(filter.text in this.keywordByFilter)) return; @@ -103,13 +106,13 @@ Matcher.prototype = { /** * Chooses a keyword to be associated with the filter - * @param {String} text text representation of the filter - * @return {String} keyword (might be empty string) + * @param {Filter} filter + * @return {string} keyword or an empty string if no keyword could be found */ - findKeyword: function(filter) + findKeyword(filter) { let result = ""; - let text = filter.text; + let {text} = filter; if (Filter.regexpRegExp.test(text)) return result; @@ -122,7 +125,9 @@ Matcher.prototype = { if (text.substr(0, 2) == "@@") text = text.substr(2); - let candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); + let candidates = text.toLowerCase().match( + /[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g + ); if (!candidates) return result; @@ -133,7 +138,8 @@ Matcher.prototype = { { let candidate = candidates[i].substr(1); let count = (candidate in hash ? hash[candidate].length : 0); - if (count < resultCount || (count == resultCount && candidate.length > resultLength)) + if (count < resultCount || + (count == resultCount && candidate.length > resultLength)) { result = candidate; resultCount = count; @@ -145,33 +151,50 @@ Matcher.prototype = { /** * Checks whether a particular filter is being matched against. + * @param {RegExpFilter} filter + * @return {boolean} */ - hasFilter: function(/**RegExpFilter*/ filter) /**Boolean*/ + hasFilter(filter) { return (filter.text in this.keywordByFilter); }, /** * Returns the keyword used for a filter, null for unknown filters. + * @param {RegExpFilter} filter + * @return {string} */ - getKeywordForFilter: function(/**RegExpFilter*/ filter) /**String*/ + getKeywordForFilter(filter) { if (filter.text in this.keywordByFilter) return this.keywordByFilter[filter.text]; - else - return null; + return null; }, /** * Checks whether the entries for a particular keyword match a URL + * @param {string} keyword + * @param {string} location + * @param {number} typeMask + * @param {string} docDomain + * @param {boolean} thirdParty + * @param {string} sitekey + * @param {boolean} specificOnly + * @return {?Filter} */ - _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey, privatenode) + _checkEntryMatch(keyword, location, typeMask, docDomain, thirdParty, sitekey, + specificOnly, privatenode) { let list = this.filterByKeyword[keyword]; for (let i = 0; i < list.length; i++) { let filter = list[i]; - if (filter.matches(location, contentType, docDomain, thirdParty, sitekey, privatenode)) + + if (specificOnly && filter.isGeneric() && + !(filter instanceof WhitelistFilter)) + continue; + + if (filter.matches(location, typeMask, docDomain, thirdParty, sitekey, privatenode)) return filter; } return null; @@ -179,14 +202,22 @@ Matcher.prototype = { /** * Tests whether the URL matches any of the known filters - * @param {String} location URL to be tested - * @param {String} contentType content type identifier of the URL - * @param {String} docDomain domain name of the document that loads the URL - * @param {Boolean} thirdParty should be true if the URL is a third-party request - * @param {String} sitekey public key provided by the document - * @return {RegExpFilter} matching filter or null + * @param {string} location + * URL to be tested + * @param {number} typeMask + * bitmask of content / request types to match + * @param {string} docDomain + * domain name of the document that loads the URL + * @param {boolean} thirdParty + * should be true if the URL is a third-party request + * @param {string} sitekey + * public key provided by the document + * @param {boolean} specificOnly + * should be true if generic matches should be ignored + * @return {?RegExpFilter} + * matching filter or null */ - matchesAny: function(location, contentType, docDomain, thirdParty, sitekey) + matchesAny(location, typeMask, docDomain, thirdParty, sitekey, specificOnly) { let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); if (candidates === null) @@ -197,7 +228,9 @@ Matcher.prototype = { let substr = candidates[i]; if (substr in this.filterByKeyword) { - let result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + let result = this._checkEntryMatch(substr, location, typeMask, + docDomain, thirdParty, sitekey, + specificOnly); if (result) return result; } @@ -211,6 +244,7 @@ Matcher.prototype = { * Combines a matcher for blocking and exception rules, automatically sorts * rules into two Matcher instances. * @constructor + * @augments Matcher */ function CombinedMatcher() { @@ -222,7 +256,7 @@ exports.CombinedMatcher = CombinedMatcher; /** * Maximal number of matching cache entries to be kept - * @type Number + * @type {number} */ CombinedMatcher.maxCacheEntries = 1000; @@ -230,32 +264,32 @@ CombinedMatcher.prototype = { /** * Matcher for blocking rules. - * @type Matcher + * @type {Matcher} */ blacklist: null, /** * Matcher for exception rules. - * @type Matcher + * @type {Matcher} */ whitelist: null, /** * Lookup table of previous matchesAny results - * @type Object + * @type {Object} */ resultCache: null, /** * Number of entries in resultCache - * @type Number + * @type {number} */ cacheEntries: 0, /** * @see Matcher#clear */ - clear: function() + clear() { this.blacklist.clear(); this.whitelist.clear(); @@ -265,8 +299,9 @@ CombinedMatcher.prototype = /** * @see Matcher#add + * @param {Filter} filter */ - add: function(filter) + add(filter) { if (filter instanceof WhitelistFilter) this.whitelist.add(filter); @@ -282,8 +317,9 @@ CombinedMatcher.prototype = /** * @see Matcher#remove + * @param {Filter} filter */ - remove: function(filter) + remove(filter) { if (filter instanceof WhitelistFilter) this.whitelist.remove(filter); @@ -299,55 +335,63 @@ CombinedMatcher.prototype = /** * @see Matcher#findKeyword + * @param {Filter} filter + * @return {string} keyword */ - findKeyword: function(filter) + findKeyword(filter) { if (filter instanceof WhitelistFilter) return this.whitelist.findKeyword(filter); - else - return this.blacklist.findKeyword(filter); + return this.blacklist.findKeyword(filter); }, /** * @see Matcher#hasFilter + * @param {Filter} filter + * @return {boolean} */ - hasFilter: function(filter) + hasFilter(filter) { if (filter instanceof WhitelistFilter) return this.whitelist.hasFilter(filter); - else - return this.blacklist.hasFilter(filter); + return this.blacklist.hasFilter(filter); }, /** * @see Matcher#getKeywordForFilter + * @param {Filter} filter + * @return {string} keyword */ - getKeywordForFilter: function(filter) + getKeywordForFilter(filter) { if (filter instanceof WhitelistFilter) return this.whitelist.getKeywordForFilter(filter); - else - return this.blacklist.getKeywordForFilter(filter); + return this.blacklist.getKeywordForFilter(filter); }, /** * Checks whether a particular filter is slow + * @param {RegExpFilter} filter + * @return {boolean} */ - isSlowFilter: function(/**RegExpFilter*/ filter) /**Boolean*/ + isSlowFilter(filter) { - let matcher = (filter instanceof WhitelistFilter ? this.whitelist : this.blacklist); + let matcher = ( + filter instanceof WhitelistFilter ? this.whitelist : this.blacklist + ); if (matcher.hasFilter(filter)) return !matcher.getKeywordForFilter(filter); - else - return !matcher.findKeyword(filter); + return !matcher.findKeyword(filter); }, /** * Optimized filter matching testing both whitelist and blacklist matchers * simultaneously. For parameters see Matcher.matchesAny(). * @see Matcher#matchesAny + * @inheritdoc */ - matchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey, privatenode) + matchesAnyInternal(location, typeMask, docDomain, thirdParty, sitekey, + specificOnly, privatenode) { let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); if (candidates === null) @@ -360,28 +404,37 @@ CombinedMatcher.prototype = let substr = candidates[i]; if (substr in this.whitelist.filterByKeyword) { - let result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey, privatenode); + let result = this.whitelist._checkEntryMatch( + substr, location, typeMask, docDomain, thirdParty, sitekey, privatenode + ); if (result) return result; } if (substr in this.blacklist.filterByKeyword && blacklistHit === null) - blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey, privatenode); + { + blacklistHit = this.blacklist._checkEntryMatch( + substr, location, typeMask, docDomain, thirdParty, sitekey, + specificOnly, privatenode + ); + } } return blacklistHit; }, /** * @see Matcher#matchesAny + * @inheritdoc */ - matchesAny: function(location, contentType, docDomain, thirdParty, sitekey, privatenode) + matchesAny(location, typeMask, docDomain, thirdParty, sitekey, specificOnly, privatenode) { - let key = location + " " + contentType + " " + docDomain + " " + thirdParty + " " + sitekey; - if (!privatenode){ + let key = location + " " + typeMask + " " + docDomain + " " + thirdParty + + " " + sitekey + " " + specificOnly; + if (!privatenode) if (key in this.resultCache) return this.resultCache[key]; - } - let result = this.matchesAnyInternal(location, contentType, docDomain, thirdParty, sitekey, privatenode); + let result = this.matchesAnyInternal(location, typeMask, docDomain, + thirdParty, sitekey, specificOnly, privatenode); if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) { @@ -396,10 +449,10 @@ CombinedMatcher.prototype = return result; } -} +}; /** * Shared CombinedMatcher instance that should usually be used. - * @type CombinedMatcher + * @type {CombinedMatcher} */ -let defaultMatcher = exports.defaultMatcher = new CombinedMatcher(); +exports.defaultMatcher = new CombinedMatcher(); diff --git a/data/extensions/spyblock@gnu.org/lib/messageResponder.js b/data/extensions/spyblock@gnu.org/lib/messageResponder.js index 0f5ff0e..5dfc2e9 100644 --- a/data/extensions/spyblock@gnu.org/lib/messageResponder.js +++ b/data/extensions/spyblock@gnu.org/lib/messageResponder.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,166 +15,417 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +/* globals require */ + +"use strict"; + (function(global) { - if (!global.ext) - global.ext = require("ext_background"); - - var Utils = require("utils").Utils; - var FilterStorage = require("filterStorage").FilterStorage; - var FilterNotifier = require("filterNotifier").FilterNotifier; - var defaultMatcher = require("matcher").defaultMatcher; - var BlockingFilter = require("filterClasses").BlockingFilter; - var Synchronizer = require("synchronizer").Synchronizer; - - var subscriptionClasses = require("subscriptionClasses"); - var Subscription = subscriptionClasses.Subscription; - var DownloadableSubscription = subscriptionClasses.DownloadableSubscription; - var SpecialSubscription = subscriptionClasses.SpecialSubscription; - - var subscriptionKeys = ["disabled", "homepage", "lastSuccess", "title", "url", "downloadStatus"]; - function convertSubscription(subscription) - { - var result = {}; - for (var i = 0; i < subscriptionKeys.length; i++) - result[subscriptionKeys[i]] = subscription[subscriptionKeys[i]] - return result; - } + let ext = global.ext || require("ext_background"); + + const {port} = require("messaging"); + const {Prefs} = require("prefs"); + const {Utils} = require("utils"); + const {FilterStorage} = require("filterStorage"); + const {FilterNotifier} = require("filterNotifier"); + const {defaultMatcher} = require("matcher"); + const {ElemHideEmulation} = require("elemHideEmulation"); + const {Notification: NotificationStorage} = require("notification"); + + const {Filter, BlockingFilter, RegExpFilter} = require("filterClasses"); + const {Synchronizer} = require("synchronizer"); - var changeListeners = null; - var messageTypes = { - "app": "app.listen", - "filter": "filters.listen", - "subscription": "subscriptions.listen" - }; + const info = require("info"); + const {Subscription, + DownloadableSubscription, + SpecialSubscription} = require("subscriptionClasses"); - function onFilterChange(action) + // Some modules doesn't exist on Firefox. Moreover, + // require() throws an exception on Firefox in that case. + // However, try/catch causes the whole function to to be + // deoptimized on V8. So we wrap it into another function. + function tryRequire(module) { - var parts = action.split(".", 2); - var type; - if (parts.length == 1) + try { - type = "app"; - action = parts[0]; + return require(module); } - else + catch (e) + { + return null; + } + } + + function convertObject(keys, obj) + { + let result = {}; + for (let key of keys) { - type = parts[0]; - action = parts[1]; + if (key in obj) + result[key] = obj[key]; } + return result; + } + + function convertSubscription(subscription) + { + let obj = convertObject(["disabled", "downloadStatus", "homepage", + "lastDownload", "title", "url"], subscription); + obj.isDownloading = Synchronizer.isExecuting(subscription.url); + return obj; + } - if (!messageTypes.hasOwnProperty(type)) + let convertFilter = convertObject.bind(null, ["text"]); + + let changeListeners = new ext.PageMap(); + let listenedPreferences = Object.create(null); + let listenedFilterChanges = Object.create(null); + let messageTypes = new Map([ + ["app", "app.respond"], + ["filter", "filters.respond"], + ["pref", "prefs.respond"], + ["subscription", "subscriptions.respond"] + ]); + + function sendMessage(type, action, ...args) + { + let pages = changeListeners.keys(); + if (pages.length == 0) return; - var args = Array.prototype.slice.call(arguments, 1).map(function(arg) + let convertedArgs = []; + for (let arg of args) { if (arg instanceof Subscription) - return convertSubscription(arg); + convertedArgs.push(convertSubscription(arg)); + else if (arg instanceof Filter) + convertedArgs.push(convertFilter(arg)); else - return arg; - }); + convertedArgs.push(arg); + } - var pages = changeListeners.keys(); - for (var i = 0; i < pages.length; i++) + for (let page of pages) { - var filters = changeListeners.get(pages[i]); - if (filters[type] && filters[type].indexOf(action) >= 0) + let filters = changeListeners.get(page); + let actions = filters[type]; + if (actions && actions.indexOf(action) != -1) { - pages[i].sendMessage({ - type: messageTypes[type], - action: action, - args: args + page.sendMessage({ + type: messageTypes.get(type), + action, + args: convertedArgs }); } } - }; + } - global.ext.onMessage.addListener(function(message, sender, callback) + function addFilterListeners(type, actions) { - switch (message.type) + for (let action of actions) { - case "app.get": - if (message.what == "issues") - { - var info = require("info"); - callback({ - seenDataCorruption: "seenDataCorruption" in global ? global.seenDataCorruption : false, - filterlistsReinitialized: "filterlistsReinitialized" in global ? global.filterlistsReinitialized : false, - legacySafariVersion: (info.platform == "safari" && ( - Services.vc.compare(info.platformVersion, "6.0") < 0 || // beforeload breaks websites in Safari 5 - Services.vc.compare(info.platformVersion, "6.1") == 0 || // extensions are broken in 6.1 and 7.0 - Services.vc.compare(info.platformVersion, "7.0") == 0)) - }); - } - else if (message.what == "doclink") - callback(Utils.getDocLink(message.link)); - else if (message.what == "localeInfo") - { - var bidiDir; - if ("chromeRegistry" in Utils) - bidiDir = Utils.chromeRegistry.isLocaleRTL("adblockplus") ? "rtl" : "ltr"; - else - bidiDir = ext.i18n.getMessage("@@bidi_dir"); - - callback({locale: Utils.appLocale, bidiDir: bidiDir}); - } - else - callback(null); - break; - case "app.open": - if (message.what == "options") - ext.showOptions(); - break; - case "subscriptions.get": - var subscriptions = FilterStorage.subscriptions.filter(function(s) + let name; + if (type == "filter" && action == "loaded") + name = "load"; + else + name = type + "." + action; + + if (!(name in listenedFilterChanges)) + { + listenedFilterChanges[name] = null; + FilterNotifier.on(name, (...args) => { - if (message.ignoreDisabled && s.disabled) - return false; - if (s instanceof DownloadableSubscription && message.downloadable) - return true; - if (s instanceof SpecialSubscription && message.special) - return true; - return false; + sendMessage(type, action, ...args); }); - callback(subscriptions.map(convertSubscription)); - break; - case "filters.blocked": - var filter = defaultMatcher.matchesAny(message.url, message.requestType, message.docDomain, message.thirdParty); - callback(filter instanceof BlockingFilter); - break; - case "subscriptions.toggle": - var subscription = Subscription.fromURL(message.url); - if (subscription.url in FilterStorage.knownSubscriptions && !subscription.disabled) - FilterStorage.removeSubscription(subscription); - else - { - subscription.disabled = false; - subscription.title = message.title; - subscription.homepage = message.homepage; - FilterStorage.addSubscription(subscription); - if (!subscription.lastDownload) - Synchronizer.execute(subscription); - } - break; - case "subscriptions.listen": - if (!changeListeners) + } + } + } + + function getListenerFilters(page) + { + let listenerFilters = changeListeners.get(page); + if (!listenerFilters) + { + listenerFilters = Object.create(null); + changeListeners.set(page, listenerFilters); + } + return listenerFilters; + } + + port.on("app.get", (message, sender) => + { + if (message.what == "issues") + { + let subscriptionInit = tryRequire("subscriptionInit"); + let result = subscriptionInit ? subscriptionInit.reinitialized : false; + return {filterlistsReinitialized: result}; + } + + if (message.what == "doclink") + return Utils.getDocLink(message.link); + + if (message.what == "localeInfo") + { + let bidiDir; + if ("chromeRegistry" in Utils) + { + let isRtl = Utils.chromeRegistry.isLocaleRTL("adblockplus"); + bidiDir = isRtl ? "rtl" : "ltr"; + } + else + bidiDir = ext.i18n.getMessage("@@bidi_dir"); + + return {locale: Utils.appLocale, bidiDir}; + } + + if (message.what == "features") + { + return { + devToolsPanel: info.platform == "chromium" + }; + } + + return info[message.what]; + }); + + port.on("app.listen", (message, sender) => + { + getListenerFilters(sender.page).app = message.filter; + }); + + port.on("app.open", (message, sender) => + { + if (message.what == "options") + ext.showOptions(); + }); + + port.on("filters.add", (message, sender) => + { + let result = require("filterValidation").parseFilter(message.text); + let errors = []; + if (result.error) + errors.push(result.error.toString()); + else if (result.filter) + FilterStorage.addFilter(result.filter); + + return errors; + }); + + port.on("filters.blocked", (message, sender) => + { + let filter = defaultMatcher.matchesAny(message.url, + RegExpFilter.typeMap[message.requestType], message.docDomain, + message.thirdParty); + + return filter instanceof BlockingFilter; + }); + + port.on("filters.get", (message, sender) => + { + if (message.what == "elemhideemulation") + { + let filters = []; + const {checkWhitelisted} = require("whitelisting"); + + if (Prefs.enabled && !checkWhitelisted(sender.page, sender.frame, + RegExpFilter.typeMap.DOCUMENT | + RegExpFilter.typeMap.ELEMHIDE)) + { + let {hostname} = sender.frame.url; + filters = ElemHideEmulation.getRulesForDomain(hostname); + filters = filters.map((filter) => { - changeListeners = new global.ext.PageMap(); - FilterNotifier.addListener(onFilterChange); - } + return { + selector: filter.selector, + text: filter.text + }; + }); + } + return filters; + } - var filters = changeListeners.get(sender.page); - if (!filters) + let subscription = Subscription.fromURL(message.subscriptionUrl); + if (!subscription) + return []; + + return subscription.filters.map(convertFilter); + }); + + port.on("filters.importRaw", (message, sender) => + { + let result = require("filterValidation").parseFilters(message.text); + let errors = []; + for (let error of result.errors) + { + if (error.type != "unexpected-filter-list-header") + errors.push(error.toString()); + } + + if (errors.length > 0) + return errors; + + let seenFilter = Object.create(null); + for (let filter of result.filters) + { + FilterStorage.addFilter(filter); + seenFilter[filter.text] = null; + } + + if (!message.removeExisting) + return errors; + + for (let subscription of FilterStorage.subscriptions) + { + if (!(subscription instanceof SpecialSubscription)) + continue; + + for (let j = subscription.filters.length - 1; j >= 0; j--) + { + let filter = subscription.filters[j]; + if (/^@@\|\|([^/:]+)\^\$document$/.test(filter.text)) + continue; + + if (!(filter.text in seenFilter)) + FilterStorage.removeFilter(filter); + } + } + + return errors; + }); + + port.on("filters.listen", (message, sender) => + { + getListenerFilters(sender.page).filter = message.filter; + addFilterListeners("filter", message.filter); + }); + + port.on("filters.remove", (message, sender) => + { + let filter = Filter.fromText(message.text); + let subscription = null; + if (message.subscriptionUrl) + subscription = Subscription.fromURL(message.subscriptionUrl); + + if (!subscription) + FilterStorage.removeFilter(filter); + else + FilterStorage.removeFilter(filter, subscription, message.index); + }); + + port.on("prefs.get", (message, sender) => + { + return Prefs[message.key]; + }); + + port.on("prefs.listen", (message, sender) => + { + getListenerFilters(sender.page).pref = message.filter; + for (let preference of message.filter) + { + if (!(preference in listenedPreferences)) + { + listenedPreferences[preference] = null; + Prefs.on(preference, () => { - filters = Object.create(null); - changeListeners.set(sender.page, filters); - } - - if (message.filter) - filters.subscription = message.filter; - else - delete filters.subscription; - break; + sendMessage("pref", preference, Prefs[preference]); + }); + } + } + }); + + port.on("prefs.toggle", (message, sender) => + { + if (message.key == "notifications_ignoredcategories") + NotificationStorage.toggleIgnoreCategory("*"); + else + Prefs[message.key] = !Prefs[message.key]; + }); + + port.on("subscriptions.add", (message, sender) => + { + let subscription = Subscription.fromURL(message.url); + if ("title" in message) + subscription.title = message.title; + if ("homepage" in message) + subscription.homepage = message.homepage; + + if (message.confirm) + { + ext.showOptions(() => + { + sendMessage("app", "addSubscription", subscription); + }); + } + else + { + subscription.disabled = false; + FilterStorage.addSubscription(subscription); + + if (subscription instanceof DownloadableSubscription && + !subscription.lastDownload) + Synchronizer.execute(subscription); + } + }); + + port.on("subscriptions.get", (message, sender) => + { + let subscriptions = FilterStorage.subscriptions.filter((s) => + { + if (message.ignoreDisabled && s.disabled) + return false; + if (s instanceof DownloadableSubscription && message.downloadable) + return true; + if (s instanceof SpecialSubscription && message.special) + return true; + return false; + }); + + return subscriptions.map(convertSubscription); + }); + + port.on("subscriptions.listen", (message, sender) => + { + getListenerFilters(sender.page).subscription = message.filter; + addFilterListeners("subscription", message.filter); + }); + + port.on("subscriptions.remove", (message, sender) => + { + let subscription = Subscription.fromURL(message.url); + if (subscription.url in FilterStorage.knownSubscriptions) + FilterStorage.removeSubscription(subscription); + }); + + port.on("subscriptions.toggle", (message, sender) => + { + let subscription = Subscription.fromURL(message.url); + if (subscription.url in FilterStorage.knownSubscriptions) + { + if (subscription.disabled || message.keepInstalled) + subscription.disabled = !subscription.disabled; + else + FilterStorage.removeSubscription(subscription); + } + else + { + subscription.disabled = false; + subscription.title = message.title; + subscription.homepage = message.homepage; + FilterStorage.addSubscription(subscription); + if (!subscription.lastDownload) + Synchronizer.execute(subscription); + } + }); + + port.on("subscriptions.update", (message, sender) => + { + let {subscriptions} = FilterStorage; + if (message.url) + subscriptions = [Subscription.fromURL(message.url)]; + + for (let subscription of subscriptions) + { + if (subscription instanceof DownloadableSubscription) + Synchronizer.execute(subscription, true); } }); })(this); diff --git a/data/extensions/spyblock@gnu.org/lib/messaging.js b/data/extensions/spyblock@gnu.org/lib/messaging.js new file mode 100644 index 0000000..63d061e --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/messaging.js @@ -0,0 +1,316 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +let {EventEmitter} = require("events"); + +const MESSAGE_NAME = "AdblockPlus:Message"; +const RESPONSE_NAME = "AdblockPlus:Response"; + +function isPromise(value) +{ + // value instanceof Promise won't work - there can be different Promise + // classes (e.g. in different contexts) and there can also be promise-like + // classes (e.g. Task). + return (value && typeof value.then == "function"); +} + +function sendMessage(messageManager, messageName, payload, callbackID) +{ + let request = {messageName, payload, callbackID}; + if (messageManager instanceof Ci.nsIMessageSender) + { + messageManager.sendAsyncMessage(MESSAGE_NAME, request); + return 1; + } + else if (messageManager instanceof Ci.nsIMessageBroadcaster) + { + messageManager.broadcastAsyncMessage(MESSAGE_NAME, request); + return messageManager.childCount; + } + else + { + Cu.reportError("Unexpected message manager, impossible to send message"); + return 0; + } +} + +function sendSyncMessage(messageManager, messageName, payload) +{ + let request = {messageName, payload}; + let responses = messageManager.sendRpcMessage(MESSAGE_NAME, request); + let processor = new ResponseProcessor(messageName); + for (let response of responses) + processor.add(response); + return processor.value; +} + +function ResponseProcessor(messageName) +{ + this.value = undefined; + this.add = function(response) + { + if (typeof response == "undefined") + return; + + if (typeof this.value == "undefined") + this.value = response; + else + Cu.reportError("Got multiple responses to message '" + messageName + "', only first response was accepted."); + }; +} + +function getSender(origin) +{ + if (origin instanceof Ci.nsIDOMXULElement) + origin = origin.messageManager; + + if (origin instanceof Ci.nsIMessageSender) + return new LightWeightPort(origin); + else + return null; +} + +/** + * Lightweight communication port allowing only sending messages. + * @param {nsIMessageManager} messageManager + * @constructor + */ +function LightWeightPort(messageManager) +{ + this._messageManager = messageManager; +} +LightWeightPort.prototype = +{ + /** + * @see Port#emit + */ + emit: function(messageName, payload) + { + sendMessage(this._messageManager, messageName, payload); + }, + + /** + * @see Port#emitSync + */ + emitSync: function(messageName, payload) + { + return sendSyncMessage(this._messageManager, messageName, payload); + } +}; + +/** + * Communication port wrapping the message manager API to send and receive + * messages. + * @param {nsIMessageManager} messageManager + * @constructor + */ +function Port(messageManager) +{ + this._messageManager = messageManager; + this._eventEmitter = new EventEmitter(); + + this._responseCallbacks = new Map(); + this._responseCallbackCounter = 0; + + this._handleRequest = this._handleRequest.bind(this); + this._handleResponse = this._handleResponse.bind(this); + this._messageManager.addMessageListener(MESSAGE_NAME, this._handleRequest); + this._messageManager.addMessageListener(RESPONSE_NAME, this._handleResponse); +} +Port.prototype = { + /** + * Disables the port and makes it stop listening to incoming messages. + */ + disconnect: function() + { + this._messageManager.removeMessageListener(MESSAGE_NAME, this._handleRequest); + this._messageManager.removeMessageListener(RESPONSE_NAME, this._handleResponse); + }, + + _sendResponse: function(sender, callbackID, payload) + { + if (!sender || typeof callbackID == "undefined") + return; + + let response = {callbackID, payload}; + sender._messageManager.sendAsyncMessage(RESPONSE_NAME, response); + }, + + _handleRequest: function(message) + { + let sender = getSender(message.target); + let {callbackID, messageName, payload} = message.data; + + let result = this._dispatch(messageName, payload, sender); + if (isPromise(result)) + { + // This is a promise - asynchronous response + if (message.sync) + { + Cu.reportError("Asynchronous response to the synchronous message '" + messageName + "' is not possible"); + return undefined; + } + + result.then(result => + { + this._sendResponse(sender, callbackID, result) + }, e => + { + Cu.reportError(e); + this._sendResponse(sender, callbackID, undefined); + }); + } + else + this._sendResponse(sender, callbackID, result); + + return result; + }, + + _handleResponse: function(message) + { + let {callbackID, payload} = message.data; + let callbackData = this._responseCallbacks.get(callbackID); + if (!callbackData) + return; + + let [callback, processor, expectedResponses] = callbackData; + + try + { + processor.add(payload); + } + catch (e) + { + Cu.reportError(e); + } + + callbackData[2] = --expectedResponses; + if (expectedResponses <= 0) + { + this._responseCallbacks.delete(callbackID); + callback(processor.value); + } + }, + + _dispatch: function(messageName, payload, sender) + { + let callbacks = this._eventEmitter.listeners(messageName); + let processor = new ResponseProcessor(messageName); + for (let callback of callbacks) + { + try + { + processor.add(callback(payload, sender)); + } + catch (e) + { + Cu.reportError(e); + } + } + return processor.value; + }, + + /** + * Function to be called when a particular message is received + * @callback Port~messageHandler + * @param payload data attached to the message if any + * @param {LightWeightPort} sender object that can be used to communicate with + * the sender of the message, could be null + * @return the handler can return undefined (no response), a value (response + * to be sent to sender immediately) or a promise (asynchronous + * response). + */ + + /** + * Adds a handler for the specified message. + * @param {string} messageName message that would trigger the callback + * @param {Port~messageHandler} callback + */ + on: function(messageName, callback) + { + this._eventEmitter.on(messageName, callback); + }, + + /** + * Removes a handler for the specified message. + * @param {string} messageName message that would trigger the callback + * @param {Port~messageHandler} callback + */ + off: function(messageName, callback) + { + this._eventEmitter.off(messageName, callback); + }, + + /** + * Sends a message. + * @param {string} messageName message identifier + * @param [payload] data to attach to the message + */ + emit: function(messageName, payload) + { + sendMessage(this._messageManager, messageName, payload, undefined); + }, + + /** + * Sends a message and expects a response. + * @param {string} messageName message identifier + * @param [payload] data to attach to the message + * @return {Promise} promise that will be resolved with the response + */ + emitWithResponse: function(messageName, payload) + { + let callbackID = ++this._responseCallbackCounter; + let expectedResponses = sendMessage( + this._messageManager, messageName, payload, callbackID); + return new Promise((resolve, reject) => + { + this._responseCallbacks.set(callbackID, + [resolve, new ResponseProcessor(messageName), expectedResponses]); + }); + }, + + /** + * Sends a synchonous message (DO NOT USE unless absolutely unavoidable). + * @param {string} messageName message identifier + * @param [payload] data to attach to the message + * @return response returned by the handler + */ + emitSync: function(messageName, payload) + { + return sendSyncMessage(this._messageManager, messageName, payload); + } +}; +exports.Port = Port; + +let messageManager; +try +{ + // Child + messageManager = require("messageManager"); +} +catch (e) +{ + // Parent + messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] + .getService(Ci.nsIMessageListenerManager); +} + +let port = new Port(messageManager); +onShutdown.add(() => port.disconnect()); +exports.port = port; diff --git a/data/extensions/spyblock@gnu.org/lib/notification.js b/data/extensions/spyblock@gnu.org/lib/notification.js index 1fa8eed..311e4e8 100644 --- a/data/extensions/spyblock@gnu.org/lib/notification.js +++ b/data/extensions/spyblock@gnu.org/lib/notification.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,32 +15,39 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** * @fileOverview Handles notifications. */ -Cu.import("resource://gre/modules/Services.jsm"); +const {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); -let {Prefs} = require("prefs"); -let {Downloader, Downloadable, MILLIS_IN_MINUTE, MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader"); -let {Utils} = require("utils"); -let {Matcher} = require("matcher"); -let {Filter} = require("filterClasses"); +const {Prefs} = require("prefs"); +const {Downloader, Downloadable, + MILLIS_IN_MINUTE, MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader"); +const {Utils} = require("utils"); +const {Matcher, defaultMatcher} = require("matcher"); +const {Filter, RegExpFilter, WhitelistFilter} = require("filterClasses"); -let INITIAL_DELAY = 12 * MILLIS_IN_MINUTE; -let CHECK_INTERVAL = 1 * MILLIS_IN_HOUR; -let EXPIRATION_INTERVAL = 1 * MILLIS_IN_DAY; -let TYPE = { +const INITIAL_DELAY = 1 * MILLIS_IN_MINUTE; +const CHECK_INTERVAL = 1 * MILLIS_IN_HOUR; +const EXPIRATION_INTERVAL = 1 * MILLIS_IN_DAY; +const TYPE = { information: 0, question: 1, - critical: 2 + relentless: 2, + critical: 3 }; -let listeners = {}; +let showListeners = []; +let questionListeners = {}; function getNumericalSeverity(notification) { - return (notification.type in TYPE ? TYPE[notification.type] : TYPE.information); + if (notification.type in TYPE) + return TYPE[notification.type]; + return TYPE.information; } function saveNotificationData() @@ -64,7 +71,7 @@ function localize(translations, locale) /** * The object providing actual downloading functionality. - * @type Downloader + * @type {Downloader} */ let downloader = null; let localData = []; @@ -78,31 +85,31 @@ let Notification = exports.Notification = /** * Called on module startup. */ - init: function() + init() { - downloader = new Downloader(this._getDownloadables.bind(this), INITIAL_DELAY, CHECK_INTERVAL); - onShutdown.add(function() - { - downloader.cancel(); - }); - + downloader = new Downloader(this._getDownloadables.bind(this), + INITIAL_DELAY, CHECK_INTERVAL); downloader.onExpirationChange = this._onExpirationChange.bind(this); downloader.onDownloadSuccess = this._onDownloadSuccess.bind(this); downloader.onDownloadError = this._onDownloadError.bind(this); + onShutdown.add(() => downloader.cancel()); }, /** * Yields a Downloadable instances for the notifications download. */ - _getDownloadables: function() + *_getDownloadables() { let downloadable = new Downloadable(Prefs.notificationurl); if (typeof Prefs.notificationdata.lastError === "number") downloadable.lastError = Prefs.notificationdata.lastError; if (typeof Prefs.notificationdata.lastCheck === "number") downloadable.lastCheck = Prefs.notificationdata.lastCheck; - if (typeof Prefs.notificationdata.data === "object" && "version" in Prefs.notificationdata.data) + if (typeof Prefs.notificationdata.data === "object" && + "version" in Prefs.notificationdata.data) + { downloadable.lastVersion = Prefs.notificationdata.data.version; + } if (typeof Prefs.notificationdata.softExpiration === "number") downloadable.softExpiration = Prefs.notificationdata.softExpiration; if (typeof Prefs.notificationdata.hardExpiration === "number") @@ -112,7 +119,7 @@ let Notification = exports.Notification = yield downloadable; }, - _onExpirationChange: function(downloadable) + _onExpirationChange(downloadable) { Prefs.notificationdata.lastCheck = downloadable.lastCheck; Prefs.notificationdata.softExpiration = downloadable.softExpiration; @@ -120,7 +127,8 @@ let Notification = exports.Notification = saveNotificationData(); }, - _onDownloadSuccess: function(downloadable, responseText, errorCallback, redirectCallback) + _onDownloadSuccess(downloadable, responseText, errorCallback, + redirectCallback) { try { @@ -145,12 +153,18 @@ let Notification = exports.Notification = Prefs.notificationdata.lastError = 0; Prefs.notificationdata.downloadStatus = "synchronize_ok"; - [Prefs.notificationdata.softExpiration, Prefs.notificationdata.hardExpiration] = downloader.processExpirationInterval(EXPIRATION_INTERVAL); + [ + Prefs.notificationdata.softExpiration, + Prefs.notificationdata.hardExpiration + ] = downloader.processExpirationInterval(EXPIRATION_INTERVAL); Prefs.notificationdata.downloadCount = downloadable.downloadCount; saveNotificationData(); + + Notification.showNext(); }, - _onDownloadError: function(downloadable, downloadURL, error, channelStatus, responseStatus, redirectCallback) + _onDownloadError(downloadable, downloadURL, error, channelStatus, + responseStatus, redirectCallback) { Prefs.notificationdata.lastError = Date.now(); Prefs.notificationdata.downloadStatus = error; @@ -158,52 +172,115 @@ let Notification = exports.Notification = }, /** + * Adds a listener for notifications to be shown. + * @param {Function} listener Listener to be invoked when a notification is + * to be shown + */ + addShowListener(listener) + { + if (showListeners.indexOf(listener) == -1) + showListeners.push(listener); + }, + + /** + * Removes the supplied listener. + * @param {Function} listener Listener that was added via addShowListener() + */ + removeShowListener(listener) + { + let index = showListeners.indexOf(listener); + if (index != -1) + showListeners.splice(index, 1); + }, + + /** * Determines which notification is to be shown next. - * @param {String} url URL to match notifications to (optional) + * @param {string} url URL to match notifications to (optional) * @return {Object} notification to be shown, or null if there is none */ - getNextToShow: function(url) + _getNextToShow(url) { function checkTarget(target, parameter, name, version) { let minVersionKey = parameter + "MinVersion"; let maxVersionKey = parameter + "MaxVersion"; return !((parameter in target && target[parameter] != name) || - (minVersionKey in target && Services.vc.compare(version, target[minVersionKey]) < 0) || - (maxVersionKey in target && Services.vc.compare(version, target[maxVersionKey]) > 0)); + (minVersionKey in target && + Services.vc.compare(version, target[minVersionKey]) < 0) || + (maxVersionKey in target && + Services.vc.compare(version, target[maxVersionKey]) > 0)); } let remoteData = []; - if (typeof Prefs.notificationdata.data == "object" && Prefs.notificationdata.data.notifications instanceof Array) - remoteData = Prefs.notificationdata.data.notifications; - - if (!(Prefs.notificationdata.shown instanceof Array)) + if (typeof Prefs.notificationdata.data == "object" && + Prefs.notificationdata.data.notifications instanceof Array) { - Prefs.notificationdata.shown = []; - saveNotificationData(); + remoteData = Prefs.notificationdata.data.notifications; } let notifications = localData.concat(remoteData); if (notifications.length === 0) return null; - let {addonName, addonVersion, application, applicationVersion, platform, platformVersion} = require("info"); + const {addonName, addonVersion, application, + applicationVersion, platform, platformVersion} = require("info"); let notificationToShow = null; for (let notification of notifications) { - if ((typeof notification.type === "undefined" || notification.type !== "critical") - && Prefs.notificationdata.shown.indexOf(notification.id) !== -1) - continue; + if (typeof notification.type === "undefined" || + notification.type !== "critical") + { + let shown; + if (typeof Prefs.notificationdata.shown == "object") + shown = Prefs.notificationdata.shown[notification.id]; + + if (typeof shown != "undefined") + { + if (typeof notification.interval == "number") + { + if (shown + notification.interval > Date.now()) + continue; + } + else if (shown) + continue; + } + + if (notification.type !== "relentless" && + Prefs.notifications_ignoredcategories.indexOf("*") != -1) + { + continue; + } + } if (typeof url === "string" || notification.urlFilters instanceof Array) { - if (typeof url === "string" && notification.urlFilters instanceof Array) + if (Prefs.enabled && typeof url === "string" && + notification.urlFilters instanceof Array) { + let host; + try + { + host = new URL(url).hostname; + } + catch (e) + { + host = ""; + } + + let exception = defaultMatcher.matchesAny( + url, RegExpFilter.typeMap.DOCUMENT, host, false, null + ); + if (exception instanceof WhitelistFilter) + continue; + let matcher = new Matcher(); for (let urlFilter of notification.urlFilters) matcher.add(Filter.fromText(urlFilter)); - if (!matcher.matchesAny(url, "DOCUMENT", url)) + if (!matcher.matchesAny(url, RegExpFilter.typeMap.DOCUMENT, host, + false, null)) + { continue; + } } else continue; @@ -215,7 +292,8 @@ let Notification = exports.Notification = for (let target of notification.targets) { if (checkTarget(target, "extension", addonName, addonVersion) && - checkTarget(target, "application", application, applicationVersion) && + checkTarget(target, "application", application, + applicationVersion) && checkTarget(target, "platform", platform, platformVersion)) { match = true; @@ -226,37 +304,63 @@ let Notification = exports.Notification = continue; } - if (!notificationToShow - || getNumericalSeverity(notification) > getNumericalSeverity(notificationToShow)) + if (!notificationToShow || + getNumericalSeverity(notification) > + getNumericalSeverity(notificationToShow)) notificationToShow = notification; } - if (notificationToShow && "id" in notificationToShow) + return notificationToShow; + }, + + /** + * Invokes the listeners added via addShowListener() with the next + * notification to be shown. + * @param {string} url URL to match notifications to (optional) + */ + showNext(url) + { + let notification = Notification._getNextToShow(url); + if (notification) { - if (notificationToShow.type !== "question") - this.markAsShown(notificationToShow.id); + for (let showListener of showListeners) + showListener(notification); } - - return notificationToShow; }, - markAsShown: function(id) + /** + * Marks a notification as shown. + * @param {string} id ID of the notification to be marked as shown + */ + markAsShown(id) { - if (Prefs.notificationdata.shown.indexOf(id) > -1) - return; + let now = Date.now(); + let data = Prefs.notificationdata; + + if (data.shown instanceof Array) + { + let newShown = {}; + for (let oldId of data.shown) + newShown[oldId] = now; + data.shown = newShown; + } + + if (typeof data.shown != "object") + data.shown = {}; + + data.shown[id] = now; - Prefs.notificationdata.shown.push(id); saveNotificationData(); }, /** * Localizes the texts of the supplied notification. * @param {Object} notification notification to translate - * @param {String} locale the target locale (optional, defaults to the + * @param {string} locale the target locale (optional, defaults to the * application locale) * @return {Object} the translated texts */ - getLocalizedTexts: function(notification, locale) + getLocalizedTexts(notification, locale) { locale = locale || Utils.appLocale; let textKeys = ["title", "message"]; @@ -278,7 +382,7 @@ let Notification = exports.Notification = * Adds a local notification. * @param {Object} notification notification to add */ - addNotification: function(notification) + addNotification(notification) { if (localData.indexOf(notification) == -1) localData.push(notification); @@ -288,7 +392,7 @@ let Notification = exports.Notification = * Removes an existing local notification. * @param {Object} notification notification to remove */ - removeNotification: function(notification) + removeNotification(notification) { let index = localData.indexOf(notification); if (index > -1) @@ -296,42 +400,76 @@ let Notification = exports.Notification = }, /** + * A callback function which listens to see if notifications were approved. + * + * @callback QuestionListener + * @param {boolean} approved + */ + + /** * Adds a listener for question-type notifications + * @param {string} id + * @param {QuestionListener} listener */ - addQuestionListener: function(/**string*/ id, /**function(approved)*/ listener) + addQuestionListener(id, listener) { - if (!(id in listeners)) - listeners[id] = []; - if (listeners[id].indexOf(listener) === -1) - listeners[id].push(listener); + if (!(id in questionListeners)) + questionListeners[id] = []; + if (questionListeners[id].indexOf(listener) === -1) + questionListeners[id].push(listener); }, /** * Removes a listener that was previously added via addQuestionListener + * @param {string} id + * @param {QuestionListener} listener */ - removeQuestionListener: function(/**string*/ id, /**function(approved)*/ listener) + removeQuestionListener(id, listener) { - if (!(id in listeners)) + if (!(id in questionListeners)) return; - let index = listeners[id].indexOf(listener); + let index = questionListeners[id].indexOf(listener); if (index > -1) - listeners[id].splice(index, 1); - if (listeners[id].length === 0) - delete listeners[id]; + questionListeners[id].splice(index, 1); + if (questionListeners[id].length === 0) + delete questionListeners[id]; }, /** - * Notifies listeners about interactions with a notification - * @param {String} id notification ID - * @param {Boolean} approved indicator whether notification has been approved or not + * Notifies question listeners about interactions with a notification + * @param {string} id notification ID + * @param {boolean} approved indicator whether notification has been approved */ - triggerQuestionListeners: function(id, approved) + triggerQuestionListeners(id, approved) { - if (!(id in listeners)) + if (!(id in questionListeners)) return; - let questionListeners = listeners[id]; - for (let listener of questionListeners) + let listeners = questionListeners[id]; + for (let listener of listeners) listener(approved); + }, + + /** + * Toggles whether notifications of a specific category should be ignored + * @param {string} category notification category identifier + * @param {boolean} [forceValue] force specified value + */ + toggleIgnoreCategory(category, forceValue) + { + let categories = Prefs.notifications_ignoredcategories; + let index = categories.indexOf(category); + if (index == -1 && forceValue !== false) + { + categories.push(category); + Prefs.notifications_showui = true; + } + else if (index != -1 && forceValue !== true) + categories.splice(index, 1); + + // HACK: JSON values aren't saved unless they are assigned a + // different object. + Prefs.notifications_ignoredcategories = + JSON.parse(JSON.stringify(categories)); } }; Notification.init(); diff --git a/data/extensions/spyblock@gnu.org/lib/objectTabs.js b/data/extensions/spyblock@gnu.org/lib/objectTabs.js index bcf4362..3ee92bc 100644 --- a/data/extensions/spyblock@gnu.org/lib/objectTabs.js +++ b/data/extensions/spyblock@gnu.org/lib/objectTabs.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -19,479 +19,95 @@ * @fileOverview Code responsible for showing and hiding object tabs. */ +let {Prefs} = require("prefs"); +let {Utils} = require("utils"); +let {port} = require("messaging"); + /** - * Class responsible for showing and hiding object tabs. - * @class + * Random element class, to be used for object tabs displayed on top of the + * plugin content. + * @type string */ -var objTabs = -{ - /** - * Number of milliseconds to wait until hiding tab after the mouse moves away. - * @type Integer - */ - HIDE_DELAY: 1000, - - /** - * Flag used to trigger object tabs initialization first time object tabs are - * used. - * @type Boolean - */ - initialized: false, - - /** - * Will be set to true while initialization is in progress. - * @type Boolean - */ - initializing: false, - - /** - * Parameters for _showTab, to be called once initialization is complete. - */ - delayedShowParams: null, - - /** - * Randomly generated class to be used for visible object tabs on top of object. - * @type String - */ - objTabClassVisibleTop: null, - - /** - * Randomly generated class to be used for visible object tabs at the bottom of the object. - * @type String - */ - objTabClassVisibleBottom: null, - - /** - * Randomly generated class to be used for invisible object tabs. - * @type String - */ - objTabClassHidden: null, - - /** - * Document element the object tab is currently being displayed for. - * @type Element - */ - currentElement: null, - - /** - * Windows that the window event handler is currently registered for. - * @type Array of Window - */ - windowListeners: null, - - /** - * Panel element currently used as object tab. - * @type Element - */ - objtabElement: null, - - /** - * Time of previous position update. - * @type Integer - */ - prevPositionUpdate: 0, - - /** - * Timer used to update position of the object tab. - * @type nsITimer - */ - positionTimer: null, - - /** - * Timer used to delay hiding of the object tab. - * @type nsITimer - */ - hideTimer: null, - - /** - * Used when hideTimer is running, time when the tab should be hidden. - * @type Integer - */ - hideTargetTime: 0, - - /** - * Initializes object tabs (generates random classes and registers stylesheet). - */ - _initCSS: function() - { - function processCSSData(request) - { - if (onShutdown.done) - return; - - let data = request.responseText; - - let rnd = []; - let offset = "a".charCodeAt(0); - for (let i = 0; i < 60; i++) - rnd.push(offset + Math.random() * 26); - - this.objTabClassVisibleTop = String.fromCharCode.apply(String, rnd.slice(0, 20)); - this.objTabClassVisibleBottom = String.fromCharCode.apply(String, rnd.slice(20, 40)); - this.objTabClassHidden = String.fromCharCode.apply(String, rnd.slice(40, 60)); - - let {Utils} = require("utils"); - let url = Utils.makeURI("data:text/css," + encodeURIComponent(data.replace(/%%CLASSVISIBLETOP%%/g, this.objTabClassVisibleTop) - .replace(/%%CLASSVISIBLEBOTTOM%%/g, this.objTabClassVisibleBottom) - .replace(/%%CLASSHIDDEN%%/g, this.objTabClassHidden))); - Utils.styleService.loadAndRegisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET); - onShutdown.add(function() - { - Utils.styleService.unregisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET); - }); - - this.initializing = false; - this.initialized = true; - - if (this.delayedShowParams) - this._showTab.apply(this, this.delayedShowParams); - } - - this.delayedShowParams = arguments; - - if (!this.initializing) - { - this.initializing = true; - - // Load CSS asynchronously - try { - let request = new XMLHttpRequest(); - request.mozBackgroundRequest = true; - request.open("GET", "chrome://adblockplus/content/objtabs.css"); - request.overrideMimeType("text/plain"); - - request.addEventListener("load", processCSSData.bind(this, request), false); - request.send(null); - } - catch (e) - { - Cu.reportError(e); - this.initializing = false; - } - } - }, - - /** - * Called to show object tab for an element. - */ - showTabFor: function(/**Element*/ element) - { - // Object tabs aren't usable in Fennec - let {application} = require("info"); - if (application == "fennec" || application == "fennec2" || application == "icecatmobile") - return; - - let {Prefs} = require("prefs"); - if (!Prefs.frameobjects) - return; - - if (this.hideTimer) - { - this.hideTimer.cancel(); - this.hideTimer = null; - } - - if (this.objtabElement) - this.objtabElement.style.setProperty("opacity", "1", "important"); - - if (this.currentElement != element) - { - this._hideTab(); - - let {Policy} = require("contentPolicy"); - let {RequestNotifier} = require("requestNotifier"); - let data = RequestNotifier.getDataForNode(element, true, Policy.type.OBJECT); - if (data) - { - if (this.initialized) - this._showTab(element, data[1]); - else - this._initCSS(element, data[1]); - } - } - }, - - /** - * Called to hide object tab for an element (actual hiding happens delayed). - */ - hideTabFor: function(/**Element*/ element) - { - if (element != this.currentElement || this.hideTimer) - return; - - this.hideTargetTime = Date.now() + this.HIDE_DELAY; - this.hideTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); - this.hideTimer.init(this, 40, Ci.nsITimer.TYPE_REPEATING_SLACK); - }, - - /** - * Makes the tab element visible. - * @param {Element} element - * @param {RequestEntry} data - */ - _showTab: function(element, data) - { - let {UI} = require("ui"); - if (!UI.overlay) - return; - - let doc = element.ownerDocument.defaultView.top.document; - - this.objtabElement = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"); - this.objtabElement.textContent = UI.overlay.attributes.objtabtext; - this.objtabElement.setAttribute("title", UI.overlay.attributes.objtabtooltip); - this.objtabElement.setAttribute("href", data.location); - this.objtabElement.setAttribute("class", this.objTabClassHidden); - this.objtabElement.style.setProperty("opacity", "1", "important"); - this.objtabElement.nodeData = data; - - this.currentElement = element; - - // Register paint listeners for the relevant windows - this.windowListeners = []; - let wnd = element.ownerDocument.defaultView; - while (wnd) - { - wnd.addEventListener("MozAfterPaint", objectWindowEventHandler, false); - this.windowListeners.push(wnd); - wnd = (wnd.parent != wnd ? wnd.parent : null); - } +let classVisibleTop = null; - // Register mouse listeners on the object tab - this.objtabElement.addEventListener("mouseover", objectTabEventHander, false); - this.objtabElement.addEventListener("mouseout", objectTabEventHander, false); - this.objtabElement.addEventListener("click", objectTabEventHander, true); - - // Insert the tab into the document and adjust its position - doc.documentElement.appendChild(this.objtabElement); - if (!this.positionTimer) - { - this.positionTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); - this.positionTimer.init(this, 200, Ci.nsITimer.TYPE_REPEATING_SLACK); - } - this._positionTab(); - }, +/** + * Random element class, to be used for object tabs displayed at the bottom of + * the plugin content. + * @type string + */ +let classVisibleBottom = null; - /** - * Hides the tab element. - */ - _hideTab: function() - { - this.delayedShowParams = null; +/** + * Random element class, to be used for object tabs that are hidden. + * @type string + */ +let classHidden = null; - if (this.objtabElement) - { - // Prevent recursive calls via popuphidden handler - let objtab = this.objtabElement; - this.objtabElement = null; - this.currentElement = null; +port.on("getObjectTabsStatus", function(message, sender) +{ + let {UI} = require("ui"); - if (this.hideTimer) - { - this.hideTimer.cancel(); - this.hideTimer = null; - } + return !!(Prefs.enabled && Prefs.frameobjects && UI.overlay && classHidden); +}); - if (this.positionTimer) - { - this.positionTimer.cancel(); - this.positionTimer = null; - } +port.on("getObjectTabsTexts", function(message, sender) +{ + let {UI} = require("ui"); - try { - objtab.parentNode.removeChild(objtab); - } catch (e) {} - objtab.removeEventListener("mouseover", objectTabEventHander, false); - objtab.removeEventListener("mouseout", objectTabEventHander, false); - objtab.nodeData = null; + return { + label: UI.overlay.attributes.objtabtext, + tooltip: UI.overlay.attributes.objtabtooltip, + classVisibleTop, classVisibleBottom, classHidden + }; +}); - for (let wnd of this.windowListeners) - wnd.removeEventListener("MozAfterPaint", objectWindowEventHandler, false); - this.windowListeners = null; - } - }, +port.on("blockItem", function({request, nodesID}, sender) +{ + let {UI} = require("ui"); + UI.blockItem(UI.currentWindow, nodesID, request); +}); - /** - * Updates position of the tab element. - */ - _positionTab: function() +function init() +{ + function processCSSData(event) { - // Test whether element is still in document - let elementDoc = null; - try - { - elementDoc = this.currentElement.ownerDocument; - } catch (e) {} // Ignore "can't access dead object" error - if (!elementDoc || !this.currentElement.offsetWidth || !this.currentElement.offsetHeight || - !elementDoc.defaultView || !elementDoc.documentElement) - { - this._hideTab(); + if (onShutdown.done) return; - } - - let objRect = this._getElementPosition(this.currentElement); - - let className = this.objTabClassVisibleTop; - let left = objRect.right - this.objtabElement.offsetWidth; - let top = objRect.top - this.objtabElement.offsetHeight; - if (top < 0) - { - top = objRect.bottom; - className = this.objTabClassVisibleBottom; - } - if (this.objtabElement.style.left != left + "px") - this.objtabElement.style.setProperty("left", left + "px", "important"); - if (this.objtabElement.style.top != top + "px") - this.objtabElement.style.setProperty("top", top + "px", "important"); + let data = event.target.responseText; - if (this.objtabElement.getAttribute("class") != className) - this.objtabElement.setAttribute("class", className); + let rnd = []; + let offset = "a".charCodeAt(0); + for (let i = 0; i < 60; i++) + rnd.push(offset + Math.random() * 26); - this.prevPositionUpdate = Date.now(); - }, + classVisibleTop = String.fromCharCode.apply(String, rnd.slice(0, 20)); + classVisibleBottom = String.fromCharCode.apply(String, rnd.slice(20, 40)); + classHidden = String.fromCharCode.apply(String, rnd.slice(40, 60)); - /** - * Calculates element's position relative to the top frame and considering - * clipping due to scrolling. - * @return {left: Number, top: Number, right: Number, bottom: Number} - */ - _getElementPosition: function(/**Element*/ element) - { - // Restrict rectangle coordinates by the boundaries of a window's client area - function intersectRect(rect, wnd) + let url = Utils.makeURI("data:text/css," + encodeURIComponent(data.replace(/%%CLASSVISIBLETOP%%/g, classVisibleTop) + .replace(/%%CLASSVISIBLEBOTTOM%%/g, classVisibleBottom) + .replace(/%%CLASSHIDDEN%%/g, classHidden))); + Utils.styleService.loadAndRegisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET); + onShutdown.add(function() { - // Cannot use wnd.innerWidth/Height because they won't account for scrollbars - let doc = wnd.document; - let wndWidth = doc.documentElement.clientWidth; - let wndHeight = doc.documentElement.clientHeight; - if (doc.compatMode == "BackCompat") // clientHeight will be bogus in quirks mode - wndHeight = Math.max(doc.documentElement.offsetHeight, doc.body.offsetHeight) - wnd.scrollMaxY - 1; - - rect.left = Math.max(rect.left, 0); - rect.top = Math.max(rect.top, 0); - rect.right = Math.min(rect.right, wndWidth); - rect.bottom = Math.min(rect.bottom, wndHeight); - } - - let rect = element.getBoundingClientRect(); - let wnd = element.ownerDocument.defaultView; - - let style = wnd.getComputedStyle(element, null); - let offsets = [ - parseFloat(style.borderLeftWidth) + parseFloat(style.paddingLeft), - parseFloat(style.borderTopWidth) + parseFloat(style.paddingTop), - parseFloat(style.borderRightWidth) + parseFloat(style.paddingRight), - parseFloat(style.borderBottomWidth) + parseFloat(style.paddingBottom) - ]; - - rect = {left: rect.left + offsets[0], top: rect.top + offsets[1], - right: rect.right - offsets[2], bottom: rect.bottom - offsets[3]}; - while (true) - { - intersectRect(rect, wnd); - - if (!wnd.frameElement) - break; - - // Recalculate coordinates to be relative to frame's parent window - let frameElement = wnd.frameElement; - wnd = frameElement.ownerDocument.defaultView; - - let frameRect = frameElement.getBoundingClientRect(); - let frameStyle = wnd.getComputedStyle(frameElement, null); - let relLeft = frameRect.left + parseFloat(frameStyle.borderLeftWidth) + parseFloat(frameStyle.paddingLeft); - let relTop = frameRect.top + parseFloat(frameStyle.borderTopWidth) + parseFloat(frameStyle.paddingTop); - - rect.left += relLeft; - rect.right += relLeft; - rect.top += relTop; - rect.bottom += relTop; - } - - return rect; - }, - - doBlock: function() - { - let {UI} = require("ui"); - let {Utils} = require("utils"); - let chromeWindow = Utils.getChromeWindow(this.currentElement.ownerDocument.defaultView); - UI.blockItem(chromeWindow, this.currentElement, this.objtabElement.nodeData); - }, + Utils.styleService.unregisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET); + }); + } - /** - * Called whenever a timer fires. - * @param {nsISupport} subject - * @param {string} topic - * @param {string} data - */ - observe: function(subject, topic, data) + // Load CSS asynchronously + try { - if (subject == this.positionTimer) - { - // Don't update position if it was already updated recently (via MozAfterPaint) - if (Date.now() - this.prevPositionUpdate > 100) - this._positionTab(); - } - else if (subject == this.hideTimer) - { - let now = Date.now(); - if (now >= this.hideTargetTime) - this._hideTab(); - else if (this.hideTargetTime - now < this.HIDE_DELAY / 2) - this.objtabElement.style.setProperty("opacity", (this.hideTargetTime - now) * 2 / this.HIDE_DELAY, "important"); - } + let request = new XMLHttpRequest(); + request.mozBackgroundRequest = true; + request.open("GET", "chrome://adblockplus/content/objtabs.css"); + request.overrideMimeType("text/plain"); + request.addEventListener("load", processCSSData, false); + request.send(null); } -}; - -onShutdown.add(objTabs._hideTab.bind(objTabs)); - -/** - * Function called whenever the mouse enters or leaves an object. - */ -function objectMouseEventHander(/**Event*/ event) -{ - if (!event.isTrusted) - return; - - if (event.type == "mouseover") - objTabs.showTabFor(event.target); - else if (event.type == "mouseout") - objTabs.hideTabFor(event.target); -} - -/** - * Function called for paint events of the object tab window. - */ -function objectWindowEventHandler(/**Event*/ event) -{ - if (!event.isTrusted) - return; - - // Don't trigger update too often, avoid overusing CPU on frequent page updates - if (event.type == "MozAfterPaint" && Date.now() - objTabs.prevPositionUpdate > 20) - objTabs._positionTab(); -} - -/** - * Function called whenever the mouse enters or leaves an object tab. - */ -function objectTabEventHander(/**Event*/ event) -{ - if (onShutdown.done || !event.isTrusted) - return; - - if (event.type == "click" && event.button == 0) + catch (e) { - event.preventDefault(); - event.stopPropagation(); - - objTabs.doBlock(); + Cu.reportError(e); } - else if (event.type == "mouseover") - objTabs.showTabFor(objTabs.currentElement); - else if (event.type == "mouseout") - objTabs.hideTabFor(objTabs.currentElement); } -exports.objectMouseEventHander = objectMouseEventHander; +init(); diff --git a/data/extensions/spyblock@gnu.org/lib/prefs.js b/data/extensions/spyblock@gnu.org/lib/prefs.js index ab1cc5c..d1ebb95 100644 --- a/data/extensions/spyblock@gnu.org/lib/prefs.js +++ b/data/extensions/spyblock@gnu.org/lib/prefs.js @@ -2,41 +2,45 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); +let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); let {addonRoot, addonName} = require("info"); let branchName = "extensions." + addonName + "."; let branch = Services.prefs.getBranch(branchName); +let preconfiguredBranch = + Services.prefs.getBranch(branchName + "preconfigured."); let ignorePrefChanges = false; function init() { // Load default preferences and set up properties for them let defaultBranch = Services.prefs.getDefaultBranch(branchName); - let scope = + + let prefsData = require("prefs.json"); + let defaults = prefsData.defaults; + let preconfigurable = new Set(prefsData.preconfigurable); + for (let pref in defaults) { - pref: function(pref, value) + let value = defaults[pref]; + let [getter, setter] = typeMap[typeof value]; + if (preconfigurable.has(pref)) { - if (pref.substr(0, branchName.length) != branchName) + try { - Cu.reportError(new Error("Ignoring default preference " + pref + ", wrong branch.")); - return; + value = getter(preconfiguredBranch, pref); } - pref = pref.substr(branchName.length); - - let [getter, setter] = typeMap[typeof value]; - setter(defaultBranch, pref, value); - defineProperty(pref, false, getter, setter); + catch (e) {} } - }; - Services.scriptloader.loadSubScript(addonRoot + "defaults/prefs.js", scope); + setter(defaultBranch, pref, value); + defineProperty(pref, false, getter, setter); + } // Add preference change observer try { branch.QueryInterface(Ci.nsIPrefBranch2).addObserver("", Prefs, true); - onShutdown.add(function() branch.removeObserver("", Prefs)); + onShutdown.add(() => branch.removeObserver("", Prefs)); } catch (e) { @@ -50,7 +54,7 @@ function init() function defineProperty(/**String*/ name, defaultValue, /**Function*/ readFunc, /**Function*/ writeFunc) { let value = defaultValue; - Prefs["_update_" + name] = function() + Prefs["_update_" + name] = () => { try { @@ -62,29 +66,32 @@ function defineProperty(/**String*/ name, defaultValue, /**Function*/ readFunc, Cu.reportError(e); } }; - Prefs.__defineGetter__(name, function() value); - Prefs.__defineSetter__(name, function(newValue) - { - if (value == newValue) - return value; - - try - { - ignorePrefChanges = true; - writeFunc(branch, name, newValue); - value = newValue; - Services.prefs.savePrefFile(null); - triggerListeners(name); - } - catch(e) - { - Cu.reportError(e); - } - finally + Object.defineProperty(Prefs, name, { + enumerable: true, + get: () => value, + set: (newValue) => { - ignorePrefChanges = false; + if (value == newValue) + return value; + + try + { + ignorePrefChanges = true; + writeFunc(branch, name, newValue); + value = newValue; + Services.prefs.savePrefFile(null); + triggerListeners(name); + } + catch(e) + { + Cu.reportError(e); + } + finally + { + ignorePrefChanges = false; + } + return value; } - return value; }); Prefs["_update_" + name](); } @@ -161,6 +168,23 @@ let Prefs = exports.Prefs = QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) }; +let getIntPref = (branch, pref) => branch.getIntPref(pref); +let setIntPref = (branch, pref, newValue) => branch.setIntPref(pref, newValue); + +let getBoolPref = (branch, pref) => branch.getBoolPref(pref); +let setBoolPref = (branch, pref, newValue) => branch.setBoolPref(pref, newValue); + +let getCharPref = (branch, pref) => branch.getComplexValue(pref, Ci.nsISupportsString).data; +let setCharPref = (branch, pref, newValue) => +{ + let str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString); + str.data = newValue; + branch.setComplexValue(pref, Ci.nsISupportsString, str); +}; + +let getJSONPref = (branch, pref) => JSON.parse(getCharPref(branch, pref)); +let setJSONPref = (branch, pref, newValue) => setCharPref(branch, pref, JSON.stringify(newValue)); + // Getter/setter functions for difference preference types let typeMap = { @@ -170,21 +194,4 @@ let typeMap = object: [getJSONPref, setJSONPref] }; -function getIntPref(branch, pref) branch.getIntPref(pref) -function setIntPref(branch, pref, newValue) branch.setIntPref(pref, newValue) - -function getBoolPref(branch, pref) branch.getBoolPref(pref) -function setBoolPref(branch, pref, newValue) branch.setBoolPref(pref, newValue) - -function getCharPref(branch, pref) branch.getComplexValue(pref, Ci.nsISupportsString).data -function setCharPref(branch, pref, newValue) -{ - let str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString); - str.data = newValue; - branch.setComplexValue(pref, Ci.nsISupportsString, str); -} - -function getJSONPref(branch, pref) JSON.parse(getCharPref(branch, pref)) -function setJSONPref(branch, pref, newValue) setCharPref(branch, pref, JSON.stringify(newValue)) - init(); diff --git a/data/extensions/spyblock@gnu.org/lib/requestNotifier.js b/data/extensions/spyblock@gnu.org/lib/requestNotifier.js index 8b9ca30..f42eaac 100644 --- a/data/extensions/spyblock@gnu.org/lib/requestNotifier.js +++ b/data/extensions/spyblock@gnu.org/lib/requestNotifier.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -19,86 +19,59 @@ * @fileOverview Stores Adblock Plus data to be attached to a window. */ -Cu.import("resource://gre/modules/Services.jsm"); +let {port} = require("messaging"); -let {Utils} = require("utils"); -let {BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideException} = require("filterClasses"); +let requestNotifierMaxId = 0; -let nodeData = new WeakMap(); -let windowStats = new WeakMap(); -let windowSelection = new WeakMap(); -let requestEntryMaxId = 0; +/** + * Active RequestNotifier instances by their ID + * @type Map.<number,RequestNotifier> + */ +let notifiers = new Map(); -let setEntry, hasEntry, getEntry; -// Last issue(Bug 982561) preventing us from using WeakMap fixed for FF version 32 -if (Services.vc.compare(Utils.platformVersion, "32.0a1") >= 0) -{ - setEntry = (map, key, value) => map.set(key, value); - hasEntry = (map, key) => map.has(key); - getEntry = (map, key) => map.get(key); -} -else +port.on("foundNodeData", ({notifierID, data}, sender) => { - // Fall back to user data - let dataSeed = Math.random(); - let nodeDataProp = "abpNodeData" + dataSeed; - let windowStatsProp = "abpWindowStats" + dataSeed; - let windowSelectionProp = "abpWindowSelection" + dataSeed; - let getProp = function(map) - { - switch (map) - { - case nodeData: - return nodeDataProp; - case windowStats: - return windowStatsProp; - case windowSelection: - return windowSelectionProp; - default: - return null; - } - }; - - setEntry = (map, key, value) => key.setUserData(getProp(map), value, null); - hasEntry = (map, key) => key.getUserData(getProp(map)); - getEntry = (map, key) => key.getUserData(getProp(map)) || undefined; -} + let notifier = notifiers.get(notifierID); + if (notifier) + notifier.notifyListener(data); +}); -/** - * List of notifiers in use - these notifiers need to receive notifications on - * new requests. - * @type RequestNotifier[] - */ -let activeNotifiers = []; +port.on("scanComplete", (notifierID, sender) => +{ + let notifier = notifiers.get(notifierID); + if (notifier) + notifier.onComplete(); +}); /** * Creates a notifier object for a particular window. After creation the window * will first be scanned for previously saved requests. Once that scan is * complete only new requests for this window will be reported. - * @param {Window} wnd window to attach the notifier to + * @param {Integer} outerWindowID ID of the window to attach the notifier to * @param {Function} listener listener to be called whenever a new request is found * @param {Object} [listenerObj] "this" pointer to be used when calling the listener */ -function RequestNotifier(wnd, listener, listenerObj) +function RequestNotifier(outerWindowID, listener, listenerObj) { - this.window = wnd; this.listener = listener; this.listenerObj = listenerObj || null; - activeNotifiers.push(this); - if (wnd) - this.startScan(wnd); - else - this.scanComplete = true; + this.id = ++requestNotifierMaxId; + notifiers.set(this.id, this); + + port.emit("startWindowScan", { + notifierID: this.id, + outerWindowID: outerWindowID + }); } exports.RequestNotifier = RequestNotifier; RequestNotifier.prototype = { /** - * The window this notifier is associated with. - * @type Window + * The unique ID of this notifier. + * @type Integer */ - window: null, + id: null, /** * The listener to be called when a new request is found. @@ -124,268 +97,113 @@ RequestNotifier.prototype = */ shutdown: function() { - delete this.window; - delete this.listener; - delete this.listenerObj; - - for (let i = activeNotifiers.length - 1; i >= 0; i--) - if (activeNotifiers[i] == this) - activeNotifiers.splice(i, 1); + notifiers.delete(this.id); + port.emit("shutdownNotifier", this.id); }, /** * Notifies listener about a new request. - * @param {Window} wnd - * @param {Node} node - * @param {RequestEntry} entry + * @param {Object} entry */ - notifyListener: function(wnd, node, entry) + notifyListener: function(entry) { - this.listener.call(this.listenerObj, wnd, node, entry, this.scanComplete); + this.listener.call(this.listenerObj, entry, this.scanComplete); }, - /** - * Number of currently posted scan events (will be 0 when the scan finishes - * running). - */ - eventsPosted: 0, + onComplete: function() + { + this.scanComplete = true; + this.notifyListener(null); + }, /** - * Starts the initial scan of the window (will recurse into frames). - * @param {Window} wnd the window to be scanned + * Makes the nodes associated with the given requests blink. + * @param {number[]} requests list of request IDs that were previously + * reported by this notifier. + * @param {Boolean} scrollToItem if true, scroll to first node */ - startScan: function(wnd) + flashNodes: function(requests, scrollToItem) { - let doc = wnd.document; - let walker = doc.createTreeWalker(doc, Ci.nsIDOMNodeFilter.SHOW_ELEMENT, null, false); + if (!requests) + requests = []; - let process = function() - { - if (!this.listener) - return; + port.emit("flashNodes", { + notifierID: this.id, + requests, + scrollToItem + }); + }, - let node = walker.currentNode; - let data = getEntry(nodeData, node); - if (typeof data != "undefined") - for (let k in data) - this.notifyListener(wnd, node, data[k]); + /** + * Attempts to calculate the size of the nodes associated with the requests. + * @param {number[]} requests list of request IDs that were previously + * reported by this notifier. + * @param {Function} callback function to be called with two parameters (x,y) + */ + retrieveNodeSize: function(requests, callback) + { + if (!requests) + requests = []; - if (walker.nextNode()) - Utils.runAsync(process); - else - { - // Done with the current window, start the scan for its frames - for (let i = 0; i < wnd.frames.length; i++) - this.startScan(wnd.frames[i]); + port.emitWithResponse("retrieveNodeSize", { + notifierID: this.id, + requests + }).then(callback); + }, - this.eventsPosted--; - if (!this.eventsPosted) - { - this.scanComplete = true; - this.notifyListener(wnd, null, null); - } - } - }.bind(this); + /** + * Stores the nodes associated with the requests and generates a unique ID + * for them that can be used with Policy.refilterNodes(). Note that + * Policy.deleteNodes() always has to be called to release the memory. + * @param {number[]} requests list of request IDs that were previously + * reported by this notifier. + * @param {Function} callback function to be called with the nodes ID. + */ + storeNodesForEntries: function(requests, callback) + { + if (!requests) + requests = []; - // Process each node in a separate event to allow other events to process - this.eventsPosted++; - Utils.runAsync(process); + port.emitWithResponse("storeNodesForEntries", { + notifierID: this.id, + requests + }).then(callback); } }; -RequestNotifier.storeSelection = function(/**Window*/ wnd, /**String*/ selection) -{ - setEntry(windowSelection, wnd.document, selection); -}; -RequestNotifier.getSelection = function(/**Window*/ wnd) /**String*/ -{ - if (hasEntry(windowSelection, wnd.document)) - return getEntry(windowSelection, wnd.document); - else - return null; -}; - -/** - * Attaches request data to a DOM node. - * @param {Node} node node to attach data to - * @param {Window} topWnd top-level window the node belongs to - * @param {Integer} contentType request type, one of the Policy.type.* constants - * @param {String} docDomain domain of the document that initiated the request - * @param {Boolean} thirdParty will be true if a third-party server has been requested - * @param {String} location the address that has been requested - * @param {Filter} filter filter applied to the request or null if none - */ -RequestNotifier.addNodeData = function(/**Node*/ node, /**Window*/ topWnd, /**Integer*/ contentType, /**String*/ docDomain, /**Boolean*/ thirdParty, /**String*/ location, /**Filter*/ filter) -{ - return new RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location, filter); -} - /** - * Retrieves the statistics for a window. - * @result {Object} Object with the properties items, blocked, whitelisted, hidden, filters containing statistics for the window (might be null) + * Associates a piece of data with a particular window. + * @param {number} outerWindowID the ID of the window + * @static */ -RequestNotifier.getWindowStatistics = function(/**Window*/ wnd) +RequestNotifier.storeWindowData = function(outerWindowID, data) { - if (hasEntry(windowStats, wnd.document)) - return getEntry(windowStats, wnd.document); - else - return null; -} + port.emit("storeWindowData", { + outerWindowID, + data + }); +}; /** - * Retrieves the request entry associated with a DOM node. - * @param {Node} node - * @param {Boolean} noParent if missing or false, the search will extend to the parent nodes until one is found that has data associated with it - * @param {Integer} [type] request type to be looking for - * @param {String} [location] request location to be looking for - * @result {[Node, RequestEntry]} + * Retrieves a piece of data previously associated with the window by calling + * storeWindowData. + * @param {number} outerWindowID the ID of the window + * @param {Function} callback function to be called with the data. * @static */ -RequestNotifier.getDataForNode = function(node, noParent, type, location) +RequestNotifier.retrieveWindowData = function(outerWindowID, callback) { - while (node) - { - let data = getEntry(nodeData, node); - if (typeof data != "undefined") - { - let entry = null; - // Look for matching entry - for (let k in data) - { - if ((!entry || entry.id < data[k].id) && - (typeof type == "undefined" || data[k].type == type) && - (typeof location == "undefined" || data[k].location == location)) - { - entry = data[k]; - } - } - if (entry) - return [node, entry]; - } - - // If we don't have any match on this node then maybe its parent will do - if ((typeof noParent != "boolean" || !noParent) && - node.parentNode instanceof Ci.nsIDOMElement) - { - node = node.parentNode; - } - else - { - node = null; - } - } - - return null; + port.emitWithResponse("retrieveWindowData", outerWindowID).then(callback); }; -function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location, filter) -{ - this.type = contentType; - this.docDomain = docDomain; - this.thirdParty = thirdParty; - this.location = location; - this.filter = filter; - this.id = ++requestEntryMaxId; - - this.attachToNode(node); - - // Update window statistics - if (!hasEntry(windowStats, topWnd.document)) - { - setEntry(windowStats, topWnd.document, { - items: 0, - hidden: 0, - blocked: 0, - whitelisted: 0, - filters: {} - }); - } - - let stats = getEntry(windowStats, topWnd.document); - if (!filter || !(filter instanceof ElemHideBase)) - stats.items++; - if (filter) - { - if (filter instanceof BlockingFilter) - stats.blocked++; - else if (filter instanceof WhitelistFilter || filter instanceof ElemHideException) - stats.whitelisted++; - else if (filter instanceof ElemHideFilter) - stats.hidden++; - - if (filter.text in stats.filters) - stats.filters[filter.text]++; - else - stats.filters[filter.text] = 1; - } - - // Notify listeners - for (let notifier of activeNotifiers) - if (!notifier.window || notifier.window == topWnd) - notifier.notifyListener(topWnd, node, this); -} -RequestEntry.prototype = +/** + * Retrieves the statistics for a window. + * @param {number} outerWindowID the ID of the window + * @param {Function} callback the callback to be called with the resulting + * object (object properties will be items, blocked, + * whitelisted, hidden, filters) or null. + */ +RequestNotifier.getWindowStatistics = function(outerWindowID, callback) { - /** - * id of request (used to determine last entry attached to a node) - * @type integer - */ - id: 0, - /** - * Content type of the request (one of the nsIContentPolicy constants) - * @type Integer - */ - type: null, - /** - * Domain name of the requesting document - * @type String - */ - docDomain: null, - /** - * True if the request goes to a different domain than the domain of the containing document - * @type Boolean - */ - thirdParty: false, - /** - * Address being requested - * @type String - */ - location: null, - /** - * Filter that was applied to this request (if any) - * @type Filter - */ - filter: null, - /** - * String representation of the content type, e.g. "subdocument" - * @type String - */ - get typeDescr() - { - return require("contentPolicy").Policy.typeDescr[this.type]; - }, - /** - * User-visible localized representation of the content type, e.g. "frame" - * @type String - */ - get localizedDescr() - { - return require("contentPolicy").Policy.localizedDescr[this.type]; - }, - - /** - * Attaches this request object to a DOM node. - */ - attachToNode: function(/**Node*/ node) - { - let existingData = getEntry(nodeData, node); - if (typeof existingData == "undefined") - { - existingData = {}; - setEntry(nodeData, node, existingData); - } - - // Add this request to the node data - existingData[this.type + " " + this.location] = this; - } + port.emitWithResponse("retrieveWindowStats", outerWindowID).then(callback); }; diff --git a/data/extensions/spyblock@gnu.org/lib/subscriptionClasses.js b/data/extensions/spyblock@gnu.org/lib/subscriptionClasses.js index 6ba15f5..5fe1eb8 100644 --- a/data/extensions/spyblock@gnu.org/lib/subscriptionClasses.js +++ b/data/extensions/spyblock@gnu.org/lib/subscriptionClasses.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,20 +15,22 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** * @fileOverview Definition of Subscription class and its subclasses. */ -Cu.import("resource://gre/modules/Services.jsm"); - -let {ActiveFilter, BlockingFilter, WhitelistFilter, ElemHideBase} = require("filterClasses"); -let {FilterNotifier} = require("filterNotifier"); +const {ActiveFilter, BlockingFilter, + WhitelistFilter, ElemHideBase} = require("filterClasses"); +const {FilterNotifier} = require("filterNotifier"); +const {desc, extend} = require("coreUtils"); /** * Abstract base class for filter subscriptions * - * @param {String} url download location of the subscription - * @param {String} [title] title of the filter subscription + * @param {string} url download location of the subscription + * @param {string} [title] title of the filter subscription * @constructor */ function Subscription(url, title) @@ -37,11 +39,6 @@ function Subscription(url, title) this.filters = []; if (title) this._title = title; - else - { - let {Utils} = require("utils"); - this._title = Utils.getString("newGroup_title"); - } Subscription.knownSubscriptions[url] = this; } exports.Subscription = Subscription; @@ -50,13 +47,13 @@ Subscription.prototype = { /** * Download location of the subscription - * @type String + * @type {string} */ url: null, /** * Filters contained in the filter subscription - * @type Array of Filter + * @type {Filter[]} */ filters: null, @@ -66,7 +63,7 @@ Subscription.prototype = /** * Title of the filter subscription - * @type String + * @type {string} */ get title() { @@ -78,14 +75,15 @@ Subscription.prototype = { let oldValue = this._title; this._title = value; - FilterNotifier.triggerListeners("subscription.title", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.title", + this, value, oldValue); } return this._title; }, /** * Determines whether the title should be editable - * @type Boolean + * @type {boolean} */ get fixedTitle() { @@ -97,14 +95,15 @@ Subscription.prototype = { let oldValue = this._fixedTitle; this._fixedTitle = value; - FilterNotifier.triggerListeners("subscription.fixedTitle", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.fixedTitle", + this, value, oldValue); } return this._fixedTitle; }, /** * Defines whether the filters in the subscription should be disabled - * @type Boolean + * @type {boolean} */ get disabled() { @@ -116,33 +115,36 @@ Subscription.prototype = { let oldValue = this._disabled; this._disabled = value; - FilterNotifier.triggerListeners("subscription.disabled", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.disabled", + this, value, oldValue); } return this._disabled; }, /** - * Serializes the subscription to an array of strings for writing out on the disk. - * @param {Array of String} buffer buffer to push the serialization results into + * Serializes the subscription to an array of strings for writing + * out on the disk. + * @param {string[]} buffer buffer to push the serialization results into */ - serialize: function(buffer) + serialize(buffer) { buffer.push("[Subscription]"); buffer.push("url=" + this.url); - buffer.push("title=" + this._title); + if (this._title) + buffer.push("title=" + this._title); if (this._fixedTitle) buffer.push("fixedTitle=true"); if (this._disabled) buffer.push("disabled=true"); }, - serializeFilters: function(buffer) + serializeFilters(buffer) { for (let filter of this.filters) buffer.push(filter.text.replace(/\[/g, "\\[")); }, - toString: function() + toString() { let buffer = []; this.serialize(buffer); @@ -152,45 +154,40 @@ Subscription.prototype = /** * Cache for known filter subscriptions, maps URL to subscription objects. - * @type Object + * @type {Object} */ Subscription.knownSubscriptions = Object.create(null); /** * Returns a subscription from its URL, creates a new one if necessary. - * @param {String} url URL of the subscription - * @return {Subscription} subscription or null if the subscription couldn't be created + * @param {string} url + * URL of the subscription + * @return {Subscription} + * subscription or null if the subscription couldn't be created */ Subscription.fromURL = function(url) { if (url in Subscription.knownSubscriptions) return Subscription.knownSubscriptions[url]; - try - { - // Test URL for validity - url = Services.io.newURI(url, null, null).spec; + if (url[0] != "~") return new DownloadableSubscription(url, null); - } - catch (e) - { - return new SpecialSubscription(url); - } + return new SpecialSubscription(url); }; /** * Deserializes a subscription * - * @param {Object} obj map of serialized properties and their values - * @return {Subscription} subscription or null if the subscription couldn't be created + * @param {Object} obj + * map of serialized properties and their values + * @return {Subscription} + * subscription or null if the subscription couldn't be created */ Subscription.fromObject = function(obj) { let result; - try + if (obj.url[0] != "~") { - obj.url = Services.io.newURI(obj.url, null, null).spec; - // URL is valid - this is a downloadable subscription result = new DownloadableSubscription(obj.url, obj.title); if ("downloadStatus" in obj) @@ -208,12 +205,7 @@ Subscription.fromObject = function(obj) if ("version" in obj) result.version = parseInt(obj.version, 10) || 0; if ("requiredVersion" in obj) - { - let {addonVersion} = require("info"); result.requiredVersion = obj.requiredVersion; - if (Services.vc.compare(result.requiredVersion, addonVersion) > 0) - result.upgradeRequired = true; - } if ("homepage" in obj) result._homepage = obj.homepage; if ("lastDownload" in obj) @@ -221,25 +213,8 @@ Subscription.fromObject = function(obj) if ("downloadCount" in obj) result.downloadCount = parseInt(obj.downloadCount, 10) || 0; } - catch (e) + else { - // Invalid URL - custom filter group - if (!("title" in obj)) - { - // Backwards compatibility - titles and filter types were originally - // determined by group identifier. - if (obj.url == "~wl~") - obj.defaults = "whitelist"; - else if (obj.url == "~fl~") - obj.defaults = "blocking"; - else if (obj.url == "~eh~") - obj.defaults = "elemhide"; - if ("defaults" in obj) - { - let {Utils} = require("utils"); - obj.title = Utils.getString(obj.defaults + "Group_title"); - } - } result = new SpecialSubscription(obj.url, obj.title); if ("defaults" in obj) result.defaults = obj.defaults.split(" "); @@ -256,8 +231,8 @@ Subscription.fromObject = function(obj) /** * Class for special filter subscriptions (user's filters) - * @param {String} url see Subscription() - * @param {String} [title] see Subscription() + * @param {string} url see Subscription() + * @param {string} [title] see Subscription() * @constructor * @augments Subscription */ @@ -267,23 +242,20 @@ function SpecialSubscription(url, title) } exports.SpecialSubscription = SpecialSubscription; -SpecialSubscription.prototype = -{ - __proto__: Subscription.prototype, - +SpecialSubscription.prototype = extend(Subscription, { /** * Filter types that should be added to this subscription by default * (entries should correspond to keys in SpecialSubscription.defaultsMap). - * @type Array of String + * @type {string[]} */ defaults: null, /** * Tests whether a filter should be added to this group by default * @param {Filter} filter filter to be tested - * @return {Boolean} + * @return {boolean} */ - isDefaultFor: function(filter) + isDefaultFor(filter) { if (this.defaults && this.defaults.length) { @@ -301,35 +273,41 @@ SpecialSubscription.prototype = /** * See Subscription.serialize() + * @inheritdoc */ - serialize: function(buffer) + serialize(buffer) { Subscription.prototype.serialize.call(this, buffer); if (this.defaults && this.defaults.length) - buffer.push("defaults=" + this.defaults.filter((type) => type in SpecialSubscription.defaultsMap).join(" ")); + { + buffer.push("defaults=" + + this.defaults.filter( + type => type in SpecialSubscription.defaultsMap + ).join(" ") + ); + } if (this._lastDownload) buffer.push("lastDownload=" + this._lastDownload); } -}; +}); -SpecialSubscription.defaultsMap = { - __proto__: null, - "whitelist": WhitelistFilter, - "blocking": BlockingFilter, - "elemhide": ElemHideBase -}; +SpecialSubscription.defaultsMap = Object.create(null, desc({ + whitelist: WhitelistFilter, + blocking: BlockingFilter, + elemhide: ElemHideBase +})); /** * Creates a new user-defined filter group. - * @param {String} [title] title of the new filter group - * @result {SpecialSubscription} + * @param {string} [title] title of the new filter group + * @return {SpecialSubscription} */ SpecialSubscription.create = function(title) { let url; do { - url = "~user~" + Math.round(Math.random()*1000000); + url = "~user~" + Math.round(Math.random() * 1000000); } while (url in Subscription.knownSubscriptions); return new SpecialSubscription(url, title); }; @@ -337,8 +315,10 @@ SpecialSubscription.create = function(title) /** * Creates a new user-defined filter group and adds the given filter to it. * This group will act as the default group for this filter type. + * @param {Filter} filter + * @return {SpecialSubscription} */ -SpecialSubscription.createForFilter = function(/**Filter*/ filter) /**SpecialSubscription*/ +SpecialSubscription.createForFilter = function(filter) { let subscription = SpecialSubscription.create(); subscription.filters.push(filter); @@ -349,16 +329,14 @@ SpecialSubscription.createForFilter = function(/**Filter*/ filter) /**SpecialSub } if (!subscription.defaults) subscription.defaults = ["blocking"]; - - let {Utils} = require("utils"); - subscription.title = Utils.getString(subscription.defaults[0] + "Group_title"); return subscription; }; /** - * Abstract base class for regular filter subscriptions (both internally and externally updated) - * @param {String} url see Subscription() - * @param {String} [title] see Subscription() + * Abstract base class for regular filter subscriptions (both + * internally and externally updated) + * @param {string} url see Subscription() + * @param {string} [title] see Subscription() * @constructor * @augments Subscription */ @@ -368,16 +346,13 @@ function RegularSubscription(url, title) } exports.RegularSubscription = RegularSubscription; -RegularSubscription.prototype = -{ - __proto__: Subscription.prototype, - +RegularSubscription.prototype = extend(Subscription, { _homepage: null, _lastDownload: 0, /** * Filter subscription homepage if known - * @type String + * @type {string} */ get homepage() { @@ -389,14 +364,16 @@ RegularSubscription.prototype = { let oldValue = this._homepage; this._homepage = value; - FilterNotifier.triggerListeners("subscription.homepage", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.homepage", + this, value, oldValue); } return this._homepage; }, /** - * Time of the last subscription download (in seconds since the beginning of the epoch) - * @type Number + * Time of the last subscription download (in seconds since the + * beginning of the epoch) + * @type {number} */ get lastDownload() { @@ -408,15 +385,17 @@ RegularSubscription.prototype = { let oldValue = this._lastDownload; this._lastDownload = value; - FilterNotifier.triggerListeners("subscription.lastDownload", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.lastDownload", + this, value, oldValue); } return this._lastDownload; }, /** * See Subscription.serialize() + * @inheritdoc */ - serialize: function(buffer) + serialize(buffer) { Subscription.prototype.serialize.call(this, buffer); if (this._homepage) @@ -424,12 +403,12 @@ RegularSubscription.prototype = if (this._lastDownload) buffer.push("lastDownload=" + this._lastDownload); } -}; +}); /** * Class for filter subscriptions updated externally (by other extension) - * @param {String} url see Subscription() - * @param {String} [title] see Subscription() + * @param {string} url see Subscription() + * @param {string} [title] see Subscription() * @constructor * @augments RegularSubscription */ @@ -439,23 +418,23 @@ function ExternalSubscription(url, title) } exports.ExternalSubscription = ExternalSubscription; -ExternalSubscription.prototype = -{ - __proto__: RegularSubscription.prototype, - +ExternalSubscription.prototype = extend(RegularSubscription, { /** * See Subscription.serialize() + * @inheritdoc */ - serialize: function(buffer) + serialize(buffer) { - throw new Error("Unexpected call, external subscriptions should not be serialized"); + throw new Error( + "Unexpected call, external subscriptions should not be serialized" + ); } -}; +}); /** * Class for filter subscriptions updated externally (by other extension) - * @param {String} url see Subscription() - * @param {String} [title] see Subscription() + * @param {string} url see Subscription() + * @param {string} [title] see Subscription() * @constructor * @augments RegularSubscription */ @@ -465,17 +444,14 @@ function DownloadableSubscription(url, title) } exports.DownloadableSubscription = DownloadableSubscription; -DownloadableSubscription.prototype = -{ - __proto__: RegularSubscription.prototype, - +DownloadableSubscription.prototype = extend(RegularSubscription, { _downloadStatus: null, _lastCheck: 0, _errors: 0, /** * Status of the last download (ID of a string) - * @type String + * @type {string} */ get downloadStatus() { @@ -485,7 +461,8 @@ DownloadableSubscription.prototype = { let oldValue = this._downloadStatus; this._downloadStatus = value; - FilterNotifier.triggerListeners("subscription.downloadStatus", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.downloadStatus", + this, value, oldValue); return this._downloadStatus; }, @@ -496,10 +473,11 @@ DownloadableSubscription.prototype = lastSuccess: 0, /** - * Time when the subscription was considered for an update last time (in seconds - * since the beginning of the epoch). This will be used to increase softExpiration - * if the user doesn't use Adblock Plus for some time. - * @type Number + * Time when the subscription was considered for an update last time + * (in seconds since the beginning of the epoch). This will be used + * to increase softExpiration if the user doesn't use Adblock Plus + * for some time. + * @type {number} */ get lastCheck() { @@ -511,26 +489,29 @@ DownloadableSubscription.prototype = { let oldValue = this._lastCheck; this._lastCheck = value; - FilterNotifier.triggerListeners("subscription.lastCheck", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.lastCheck", + this, value, oldValue); } return this._lastCheck; }, /** - * Hard expiration time of the filter subscription (in seconds since the beginning of the epoch) - * @type Number + * Hard expiration time of the filter subscription (in seconds since + * the beginning of the epoch) + * @type {number} */ expires: 0, /** - * Soft expiration time of the filter subscription (in seconds since the beginning of the epoch) - * @type Number + * Soft expiration time of the filter subscription (in seconds since + * the beginning of the epoch) + * @type {number} */ softExpiration: 0, /** * Number of download failures since last success - * @type Number + * @type {number} */ get errors() { @@ -542,32 +523,27 @@ DownloadableSubscription.prototype = { let oldValue = this._errors; this._errors = value; - FilterNotifier.triggerListeners("subscription.errors", this, value, oldValue); + FilterNotifier.triggerListeners("subscription.errors", this, + value, oldValue); } return this._errors; }, /** * Version of the subscription data retrieved on last successful download - * @type Number + * @type {number} */ version: 0, /** * Minimal Adblock Plus version required for this subscription - * @type String + * @type {string} */ requiredVersion: null, /** - * Should be true if requiredVersion is higher than current Adblock Plus version - * @type Boolean - */ - upgradeRequired: false, - - /** * Number indicating how often the object was downloaded. - * @type Number + * @type {number} */ downloadCount: 0, @@ -579,8 +555,9 @@ DownloadableSubscription.prototype = /** * See Subscription.serialize() + * @inheritdoc */ - serialize: function(buffer) + serialize(buffer) { RegularSubscription.prototype.serialize.call(this, buffer); if (this.downloadStatus) @@ -604,4 +581,4 @@ DownloadableSubscription.prototype = if (this.privateMode) buffer.push("privateMode=" + this.privateMode); } -}; +}); diff --git a/data/extensions/spyblock@gnu.org/lib/sync.js b/data/extensions/spyblock@gnu.org/lib/sync.js index a250e81..3f9d973 100644 --- a/data/extensions/spyblock@gnu.org/lib/sync.js +++ b/data/extensions/spyblock@gnu.org/lib/sync.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as diff --git a/data/extensions/spyblock@gnu.org/lib/synchronizer.js b/data/extensions/spyblock@gnu.org/lib/synchronizer.js index 2304895..b8d14a2 100644 --- a/data/extensions/spyblock@gnu.org/lib/synchronizer.js +++ b/data/extensions/spyblock@gnu.org/lib/synchronizer.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -15,29 +15,29 @@ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ +"use strict"; + /** * @fileOverview Manages synchronization of filter subscriptions. */ -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); - -let {Downloader, Downloadable, - MILLIS_IN_SECOND, MILLIS_IN_MINUTE, MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader"); -let {Filter, CommentFilter} = require("filterClasses"); -let {FilterStorage} = require("filterStorage"); -let {FilterNotifier} = require("filterNotifier"); -let {Prefs} = require("prefs"); -let {Subscription, DownloadableSubscription} = require("subscriptionClasses"); -let {Utils} = require("utils"); +const {Downloader, Downloadable, + MILLIS_IN_SECOND, MILLIS_IN_MINUTE, + MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader"); +const {Filter} = require("filterClasses"); +const {FilterStorage} = require("filterStorage"); +const {FilterNotifier} = require("filterNotifier"); +const {Prefs} = require("prefs"); +const {Subscription, DownloadableSubscription} = require("subscriptionClasses"); +const {Utils} = require("utils"); -let INITIAL_DELAY = 6 * MILLIS_IN_MINUTE; -let CHECK_INTERVAL = 1 * MILLIS_IN_HOUR; -let DEFAULT_EXPIRATION_INTERVAL = 5 * MILLIS_IN_DAY; +const INITIAL_DELAY = 1 * MILLIS_IN_MINUTE; +const CHECK_INTERVAL = 1 * MILLIS_IN_HOUR; +const DEFAULT_EXPIRATION_INTERVAL = 5 * MILLIS_IN_DAY; /** * The object providing actual downloading functionality. - * @type Downloader + * @type {Downloader} */ let downloader = null; @@ -51,10 +51,11 @@ let Synchronizer = exports.Synchronizer = /** * Called on module startup. */ - init: function() + init() { - downloader = new Downloader(this._getDownloadables.bind(this), INITIAL_DELAY, CHECK_INTERVAL); - onShutdown.add(function() + downloader = new Downloader(this._getDownloadables.bind(this), + INITIAL_DELAY, CHECK_INTERVAL); + onShutdown.add(() => { downloader.cancel(); }); @@ -67,20 +68,23 @@ let Synchronizer = exports.Synchronizer = /** * Checks whether a subscription is currently being downloaded. - * @param {String} url URL of the subscription - * @return {Boolean} + * @param {string} url URL of the subscription + * @return {boolean} */ - isExecuting: function(url) + isExecuting(url) { return downloader.isDownloading(url); }, /** * Starts the download of a subscription. - * @param {DownloadableSubscription} subscription Subscription to be downloaded - * @param {Boolean} manual true for a manually started download (should not trigger fallback requests) + * @param {DownloadableSubscription} subscription + * Subscription to be downloaded + * @param {boolean} manual + * true for a manually started download (should not trigger fallback + * requests) */ - execute: function(subscription, manual) + execute(subscription, manual) { downloader.download(this._getDownloadable(subscription, manual)); }, @@ -88,7 +92,7 @@ let Synchronizer = exports.Synchronizer = /** * Yields Downloadable instances for all subscriptions that can be downloaded. */ - _getDownloadables: function() + *_getDownloadables() { if (!Prefs.subscriptions_autoupdate) return; @@ -102,8 +106,11 @@ let Synchronizer = exports.Synchronizer = /** * Creates a Downloadable instance for a subscription. + * @param {Subscription} subscription + * @param {boolean} manual + * @return {Downloadable} */ - _getDownloadable: function(/**Subscription*/ subscription, /**Boolean*/ manual) /**Downloadable*/ + _getDownloadable(subscription, manual) { let result = new Downloadable(subscription.url); if (subscription.lastDownload != subscription.lastSuccess) @@ -118,27 +125,34 @@ let Synchronizer = exports.Synchronizer = return result; }, - _onExpirationChange: function(downloadable) + _onExpirationChange(downloadable) { let subscription = Subscription.fromURL(downloadable.url); - subscription.lastCheck = Math.round(downloadable.lastCheck / MILLIS_IN_SECOND); - subscription.softExpiration = Math.round(downloadable.softExpiration / MILLIS_IN_SECOND); - subscription.expires = Math.round(downloadable.hardExpiration / MILLIS_IN_SECOND); + subscription.lastCheck = Math.round( + downloadable.lastCheck / MILLIS_IN_SECOND + ); + subscription.softExpiration = Math.round( + downloadable.softExpiration / MILLIS_IN_SECOND + ); + subscription.expires = Math.round( + downloadable.hardExpiration / MILLIS_IN_SECOND + ); }, - _onDownloadStarted: function(downloadable) + _onDownloadStarted(downloadable) { let subscription = Subscription.fromURL(downloadable.url); - FilterNotifier.triggerListeners("subscription.downloadStatus", subscription); + FilterNotifier.triggerListeners("subscription.downloading", subscription); }, - _onDownloadSuccess: function(downloadable, responseText, errorCallback, redirectCallback) + _onDownloadSuccess(downloadable, responseText, errorCallback, + redirectCallback) { let lines = responseText.split(/[\r\n]+/); - let match = /\[Adblock(?:\s*Plus\s*([\d\.]+)?)?\]/i.exec(lines[0]); - if (!match) + let headerMatch = /\[Adblock(?:\s*Plus\s*([\d.]+)?)?\]/i.exec(lines[0]); + if (!headerMatch) return errorCallback("synchronize_invalid_data"); - let minVersion = match[1]; + let minVersion = headerMatch[1]; // Don't remove parameter comments immediately but add them to a list first, // they need to be considered in the checksum calculation. @@ -177,8 +191,10 @@ let Synchronizer = exports.Synchronizer = return redirectCallback(params.redirect); // Handle redirects - let subscription = Subscription.fromURL(downloadable.redirectURL || downloadable.url); - if (downloadable.redirectURL && downloadable.redirectURL != downloadable.url) + let subscription = Subscription.fromURL(downloadable.redirectURL || + downloadable.url); + if (downloadable.redirectURL && + downloadable.redirectURL != downloadable.url) { let oldSubscription = Subscription.fromURL(downloadable.url); subscription.title = oldSubscription.title; @@ -196,7 +212,9 @@ let Synchronizer = exports.Synchronizer = } // The download actually succeeded - subscription.lastSuccess = subscription.lastDownload = Math.round(Date.now() / MILLIS_IN_SECOND); + subscription.lastSuccess = subscription.lastDownload = Math.round( + Date.now() / MILLIS_IN_SECOND + ); subscription.downloadStatus = "synchronize_ok"; subscription.downloadCount = downloadable.downloadCount; subscription.errors = 0; @@ -208,9 +226,18 @@ let Synchronizer = exports.Synchronizer = // Process parameters if (params.homepage) { - let uri = Utils.makeURI(params.homepage); - if (uri && (uri.scheme == "http" || uri.scheme == "https")) - subscription.homepage = uri.spec; + let url; + try + { + url = new URL(params.homepage); + } + catch (e) + { + url = null; + } + + if (url && (url.protocol == "http:" || url.protocol == "https:")) + subscription.homepage = url.href; } if (params.privatemode) @@ -242,19 +269,17 @@ let Synchronizer = exports.Synchronizer = } } - let [softExpiration, hardExpiration] = downloader.processExpirationInterval(expirationInterval); + let [ + softExpiration, + hardExpiration + ] = downloader.processExpirationInterval(expirationInterval); subscription.softExpiration = Math.round(softExpiration / MILLIS_IN_SECOND); subscription.expires = Math.round(hardExpiration / MILLIS_IN_SECOND); - delete subscription.requiredVersion; - delete subscription.upgradeRequired; if (minVersion) - { - let {addonVersion} = require("info"); subscription.requiredVersion = minVersion; - if (Services.vc.compare(minVersion, addonVersion) > 0) - subscription.upgradeRequired = true; - } + else + delete subscription.requiredVersion; // Process filters lines.shift(); @@ -271,7 +296,8 @@ let Synchronizer = exports.Synchronizer = return undefined; }, - _onDownloadError: function(downloadable, downloadURL, error, channelStatus, responseStatus, redirectCallback) + _onDownloadError(downloadable, downloadURL, error, channelStatus, + responseStatus, redirectCallback) { let subscription = Subscription.fromURL(downloadable.url); subscription.lastDownload = Math.round(Date.now() / MILLIS_IN_SECOND); @@ -282,18 +308,26 @@ let Synchronizer = exports.Synchronizer = { subscription.errors++; - if (redirectCallback && subscription.errors >= Prefs.subscriptions_fallbackerrors && /^https?:\/\//i.test(subscription.url)) + if (redirectCallback && + subscription.errors >= Prefs.subscriptions_fallbackerrors && + /^https?:\/\//i.test(subscription.url)) { subscription.errors = 0; let fallbackURL = Prefs.subscriptions_fallbackurl; - let {addonVersion} = require("info"); - fallbackURL = fallbackURL.replace(/%VERSION%/g, encodeURIComponent(addonVersion)); - fallbackURL = fallbackURL.replace(/%SUBSCRIPTION%/g, encodeURIComponent(subscription.url)); - fallbackURL = fallbackURL.replace(/%URL%/g, encodeURIComponent(downloadURL)); - fallbackURL = fallbackURL.replace(/%ERROR%/g, encodeURIComponent(error)); - fallbackURL = fallbackURL.replace(/%CHANNELSTATUS%/g, encodeURIComponent(channelStatus)); - fallbackURL = fallbackURL.replace(/%RESPONSESTATUS%/g, encodeURIComponent(responseStatus)); + const {addonVersion} = require("info"); + fallbackURL = fallbackURL.replace(/%VERSION%/g, + encodeURIComponent(addonVersion)); + fallbackURL = fallbackURL.replace(/%SUBSCRIPTION%/g, + encodeURIComponent(subscription.url)); + fallbackURL = fallbackURL.replace(/%URL%/g, + encodeURIComponent(downloadURL)); + fallbackURL = fallbackURL.replace(/%ERROR%/g, + encodeURIComponent(error)); + fallbackURL = fallbackURL.replace(/%CHANNELSTATUS%/g, + encodeURIComponent(channelStatus)); + fallbackURL = fallbackURL.replace(/%RESPONSESTATUS%/g, + encodeURIComponent(responseStatus)); let request = new XMLHttpRequest(); request.mozBackgroundRequest = true; @@ -302,7 +336,7 @@ let Synchronizer = exports.Synchronizer = request.channel.loadFlags = request.channel.loadFlags | request.channel.INHIBIT_CACHING | request.channel.VALIDATE_ALWAYS; - request.addEventListener("load", function(ev) + request.addEventListener("load", ev => { if (onShutdown.done) return; @@ -311,17 +345,21 @@ let Synchronizer = exports.Synchronizer = return; let match = /^(\d+)(?:\s+(\S+))?$/.exec(request.responseText); - if (match && match[1] == "301" && match[2] && /^https?:\/\//i.test(match[2])) // Moved permanently + if (match && match[1] == "301" && // Moved permanently + match[2] && /^https?:\/\//i.test(match[2])) + { redirectCallback(match[2]); - else if (match && match[1] == "410") // Gone + } + else if (match && match[1] == "410") // Gone { - let data = "[Adblock]\n" + subscription.filters.map((f) => f.text).join("\n"); + let data = "[Adblock]\n" + + subscription.filters.map(f => f.text).join("\n"); redirectCallback("data:text/plain," + encodeURIComponent(data)); } }, false); request.send(null); } } - }, + } }; Synchronizer.init(); diff --git a/data/extensions/spyblock@gnu.org/lib/ui.js b/data/extensions/spyblock@gnu.org/lib/ui.js index 6009f9e..1941a97 100644 --- a/data/extensions/spyblock@gnu.org/lib/ui.js +++ b/data/extensions/spyblock@gnu.org/lib/ui.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -19,6 +19,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); let {Utils} = require("utils"); +let {port} = require("messaging"); let {Prefs} = require("prefs"); let {Policy} = require("contentPolicy"); let {FilterStorage} = require("filterStorage"); @@ -125,6 +126,14 @@ let optionsObserver = this.value = Prefs.savestats; }); + hideElement("adblockplus-shownotifications", !Prefs.notifications_showui); + setChecked("adblockplus-shownotifications", Prefs.notifications_ignoredcategories.indexOf("*") == -1); + addCommandHandler("adblockplus-shownotifications", function() + { + Notification.toggleIgnoreCategory("*"); + this.value = (Prefs.notifications_ignoredcategories.indexOf("*") == -1); + }); + let hasAcceptableAds = FilterStorage.subscriptions.some((subscription) => subscription instanceof DownloadableSubscription && subscription.url == Prefs.subscriptions_exceptionsurl); setChecked("adblockplus-acceptableAds", hasAcceptableAds); @@ -268,64 +277,57 @@ let UI = exports.UI = */ init: function() { - // We should call initDone once both overlay and filters are loaded - let overlayLoaded = false; - let filtersLoaded = false; - let sessionRestored = false; + // We have to wait for multiple events before running start-up actions + let prerequisites = []; // Start loading overlay - let request = new XMLHttpRequest(); - request.mozBackgroundRequest = true; - request.open("GET", "chrome://adblockplus/content/ui/overlay.xul"); - request.addEventListener("load", function(event) + prerequisites.push(new Promise((resolve, reject) => { - if (onShutdown.done) - return; + let request = new XMLHttpRequest(); + request.mozBackgroundRequest = true; + request.open("GET", "chrome://adblockplus/content/ui/overlay.xul"); + request.channel.owner = Utils.systemPrincipal; + request.addEventListener("load", event => + { + if (onShutdown.done) + return; - this.processOverlay(request.responseXML.documentElement); + this.processOverlay(request.responseXML.documentElement); - // Don't wait for the rest of the startup sequence, add icon already - this.addToolbarButton(); + // Don't wait for the rest of the startup sequence, add icon already + this.addToolbarButton(); - overlayLoaded = true; - if (overlayLoaded && filtersLoaded && sessionRestored) - this.initDone(); - }.bind(this), false); - request.send(null); + resolve(); + }, false); - // Wait for filters to load - if (FilterStorage._loading) - { - let listener = function(action) + request.addEventListener("error", event => { - if (action != "load") - return; + reject(new Error("Unexpected: Failed to load overlay.xul")); + }); - FilterNotifier.removeListener(listener); - filtersLoaded = true; - if (overlayLoaded && filtersLoaded && sessionRestored) - this.initDone(); - }.bind(this); - FilterNotifier.addListener(listener); - } - else - filtersLoaded = true; + request.send(null); + })); + + // Wait for filters to load + if (!FilterStorage.initialized) + prerequisites.push(FilterNotifier.once("load")); - // Initialize UI after the session is restored - let window = this.currentWindow; - if (!window && "nsISessionStore" in Ci) + // Wait for session to be restored + prerequisites.push(new Promise((resolve, reject) => { - // No application windows yet, the application must be starting up. Wait - // for session to be restored before initializing our UI. - new SessionRestoreObserver(function() + let window = this.currentWindow; + if (!window && "nsISessionStore" in Ci) { - sessionRestored = true; - if (overlayLoaded && filtersLoaded && sessionRestored) - this.initDone(); - }.bind(this)); - } - else - sessionRestored = true; + // No application windows yet, the application must be starting up. Wait + // for session to be restored before initializing our UI. + new SessionRestoreObserver(resolve); + } + else + resolve(); + })); + + Promise.all(prerequisites).then(() => this.initDone()) + .catch(e => Cu.reportError(e)); }, /** @@ -403,44 +405,45 @@ let UI = exports.UI = this.updateState(); // Listen for pref and filters changes - Prefs.addListener(function(name) + Prefs.addListener(name => { if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaultstatusbaraction") this.updateState(); else if (name == "showinstatusbar") { - for (let window in this.applicationWindows) + for (let window of this.applicationWindows) this.updateStatusbarIcon(window); } - }.bind(this)); - FilterNotifier.addListener(function(action) + }); + + for (let eventName of [ + "filter.added", "filter.removed", "filter.disabled", + "subscription.added", "subscription.removed", "subscription.disabled", + "subscription.updated", "load" + ]) { - if (/^(filter|subscription)\.(added|removed|disabled|updated)$/.test(action) || action == "load") - this.updateState(); - }.bind(this)); + FilterNotifier.on(eventName, () => this.updateState()); + } + + Notification.addShowListener(notification => + { + let window = this.currentWindow; + if (!window) + return; + + let button = window.document.getElementById("abp-toolbarbutton") + || window.document.getElementById("abp-status"); + if (!button) + return; - notificationTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); - notificationTimer.initWithCallback(this.showNextNotification.bind(this), - 3 * 60 * 1000, Ci.nsITimer.TYPE_ONE_SHOT); - onShutdown.add(() => notificationTimer.cancel()); + this._showNotification(window, button, notification); + }); // Add "anti-adblock messages" notification initAntiAdblockNotification(); - let documentCreationObserver = { - observe: function(subject, topic, data) - { - if (!(subject instanceof Ci.nsIDOMWindow)) - return; - - this.showNextNotification(subject.location.href); - }.bind(UI) - }; - Services.obs.addObserver(documentCreationObserver, "content-document-global-created", false); - onShutdown.add(function() - { - Services.obs.removeObserver(documentCreationObserver, "content-document-global-created", false); - }); + // Initialize subscribe link handling + port.on("subscribeLinkClick", data => this.subscribeLinkClicked(data)); // Execute first-run actions if a window is open already, otherwise it // will happen in applyToWindow() when a window is opened. @@ -494,7 +497,7 @@ let UI = exports.UI = firstRunActions: function(window) { - if (this.firstRunDone || !window || FilterStorage._loading) + if (this.firstRunDone || !window || !FilterStorage.initialized) return; this.firstRunDone = true; @@ -525,7 +528,7 @@ let UI = exports.UI = */ applyToWindow: function(/**Window*/ window, /**Boolean*/ noDelay) { - let {delayInitialization, isKnownWindow, getBrowser, addBrowserLocationListener, addBrowserClickListener} = require("appSupport"); + let {delayInitialization, isKnownWindow, getBrowser, addBrowserLocationListener} = require("appSupport"); if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnownWindow(window)) { // Add style processing instruction @@ -575,12 +578,25 @@ let UI = exports.UI = { this.updateIconState(window, window.document.getElementById("abp-status")); this.updateIconState(window, window.document.getElementById("abp-toolbarbutton")); + + Notification.showNext(this.getCurrentLocation(window).spec); }.bind(this)); - addBrowserClickListener(window, this.onBrowserClick.bind(this, window)); - window.document.getElementById("abp-notification-close").addEventListener("command", function(event) + let notificationPanel = window.document.getElementById("abp-notification"); + notificationPanel.addEventListener("command", function(event) { - window.document.getElementById("abp-notification").hidePopup(); + switch (event.target.id) + { + case "abp-notification-close": + notificationPanel.classList.add("abp-closing"); + break; + case "abp-notification-optout": + Notification.toggleIgnoreCategory("*", true); + /* FALL THROUGH */ + case "abp-notification-hide": + notificationPanel.hidePopup(); + break; + } }, false); // First-run actions? @@ -599,7 +615,7 @@ let UI = exports.UI = */ removeFromWindow: function(/**Window*/ window) { - let {isKnownWindow, removeBrowserLocationListeners, removeBrowserClickListeners} = require("appSupport"); + let {isKnownWindow, removeBrowserLocationListeners} = require("appSupport"); if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnownWindow(window)) { // Remove style processing instruction @@ -634,7 +650,6 @@ let UI = exports.UI = window.removeEventListener("popupshowing", this.onPopupShowing, false); window.removeEventListener("keypress", this.onKeyPress, false); removeBrowserLocationListeners(window); - removeBrowserClickListeners(window); }, /** @@ -716,14 +731,17 @@ let UI = exports.UI = /** - * Brings up the filter composer dialog to block an item. + * Brings up the filter composer dialog to block an item. The optional nodesID + * parameter must be a unique ID returned by + * RequestNotifier.storeNodesForEntry() or similar. */ - blockItem: function(/**Window*/ window, /**Node*/ node, /**RequestEntry*/ item) + blockItem: function(/**Window*/ window, /**string*/ nodesID, /**RequestEntry*/ item) { if (!item) return; - window.openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", "chrome,centerscreen,resizable,dialog=no,dependent", [node], item); + window.openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", + "chrome,centerscreen,resizable,dialog=no,dependent", nodesID, item); }, /** @@ -762,7 +780,10 @@ let UI = exports.UI = if (uri) { let {getBrowser} = require("appSupport"); - window.openDialog("chrome://adblockplus/content/ui/sendReport.xul", "_blank", "chrome,centerscreen,resizable=no", getBrowser(window).contentWindow, uri); + let browser = getBrowser(window); + if ("selectedBrowser" in browser) + browser = browser.selectedBrowser; + window.openDialog("chrome://adblockplus/content/ui/sendReport.xul", "_blank", "chrome,centerscreen,resizable=no", browser.outerWindowID, uri, browser); } } }, @@ -852,6 +873,7 @@ let UI = exports.UI = function notifyUser() {return; + let {addTab} = require("appSupport"); if (addTab) { @@ -902,64 +924,12 @@ let UI = exports.UI = }, /** - * Handles clicks inside the browser's content area, will intercept clicks on - * abp: links. This can be called either with an event object or with the link - * target (if it is the former then link target will be retrieved from event - * target). + * Called whenever child/subscribeLinks module intercepts clicks on abp: links + * as well as links to subscribe.adblockplus.org. */ - onBrowserClick: function (/**Window*/ window, /**Event*/ event, /**String*/ linkTarget) + subscribeLinkClicked: function({title, url, + mainSubscriptionTitle, mainSubscriptionURL}) { - if (event) - { - // Ignore right-clicks - if (event.button == 2) - return; - - // Search the link associated with the click - let link = event.target; - while (link && !(link instanceof Ci.nsIDOMHTMLAnchorElement)) - link = link.parentNode; - - if (!link || link.protocol != "abp:") - return; - - // This is our link - make sure the browser doesn't handle it - event.preventDefault(); - event.stopPropagation(); - - linkTarget = link.href; - } - - let match = /^abp:\/*subscribe\/*\?(.*)/i.exec(linkTarget); - if (!match) - return; - - // Decode URL parameters - let title = null; - let url = null; - let mainSubscriptionTitle = null; - let mainSubscriptionURL = null; - for (let param of match[1].split('&')) - { - let parts = param.split("=", 2); - if (parts.length != 2 || !/\S/.test(parts[1])) - continue; - switch (parts[0]) - { - case "title": - title = decodeURIComponent(parts[1]); - break; - case "location": - url = decodeURIComponent(parts[1]); - break; - case "requiresTitle": - mainSubscriptionTitle = decodeURIComponent(parts[1]); - break; - case "requiresLocation": - mainSubscriptionURL = decodeURIComponent(parts[1]); - break; - } - } if (!url) return; @@ -997,7 +967,7 @@ let UI = exports.UI = mainSubscriptionURL = mainSubscriptionURL.spec; } - this.openSubscriptionDialog(window, url, title, mainSubscriptionURL, mainSubscriptionTitle); + this.openSubscriptionDialog(this.currentWindow, url, title, mainSubscriptionURL, mainSubscriptionTitle); }, /** @@ -1093,7 +1063,7 @@ let UI = exports.UI = */ updateState: function() { - for (let window in this.applicationWindows) + for (let window of this.applicationWindows) { this.updateIconState(window, window.document.getElementById("abp-status")); this.updateIconState(window, window.document.getElementById("abp-toolbarbutton")); @@ -1197,7 +1167,10 @@ let UI = exports.UI = FilterStorage.removeFilter(filter); } else + { + filter.disabled = false; FilterStorage.addFilter(filter); + } }, @@ -1419,54 +1392,66 @@ let UI = exports.UI = } statusDescr.setAttribute("value", statusStr); - let activeFilters = []; - E("abp-tooltip-blocked-label").hidden = (state != "active"); - E("abp-tooltip-blocked").hidden = (state != "active"); + E("abp-tooltip-blocked-label").hidden = true; + E("abp-tooltip-blocked").hidden = true; + E("abp-tooltip-filters-label").hidden = true; + E("abp-tooltip-filters").hidden = true; + E("abp-tooltip-more-filters").hidden = true; + if (state == "active") { let {getBrowser} = require("appSupport"); - let stats = RequestNotifier.getWindowStatistics(getBrowser(window).contentWindow); - - let blockedStr = Utils.getString("blocked_count_tooltip"); - blockedStr = blockedStr.replace(/\?1\?/, stats ? stats.blocked : 0).replace(/\?2\?/, stats ? stats.items : 0); - - if (stats && stats.whitelisted + stats.hidden) + let browser = getBrowser(window); + if ("selectedBrowser" in browser) + browser = browser.selectedBrowser; + let outerWindowID = browser.outerWindowID; + RequestNotifier.getWindowStatistics(outerWindowID, (stats) => { - blockedStr += " " + Utils.getString("blocked_count_addendum"); - blockedStr = blockedStr.replace(/\?1\?/, stats.whitelisted).replace(/\?2\?/, stats.hidden); - } + E("abp-tooltip-blocked-label").hidden = false; + E("abp-tooltip-blocked").hidden = false; - E("abp-tooltip-blocked").setAttribute("value", blockedStr); + let blockedStr = Utils.getString("blocked_count_tooltip"); + blockedStr = blockedStr.replace(/\?1\?/, stats ? stats.blocked : 0).replace(/\?2\?/, stats ? stats.items : 0); - if (stats) - { - let filterSort = function(a, b) + if (stats && stats.whitelisted + stats.hidden) { - return stats.filters[b] - stats.filters[a]; - }; - for (let filter in stats.filters) - activeFilters.push(filter); - activeFilters = activeFilters.sort(filterSort); - } + blockedStr += " " + Utils.getString("blocked_count_addendum"); + blockedStr = blockedStr.replace(/\?1\?/, stats.whitelisted).replace(/\?2\?/, stats.hidden); + } - if (activeFilters.length > 0) - { - let filtersContainer = E("abp-tooltip-filters"); - while (filtersContainer.firstChild) - filtersContainer.removeChild(filtersContainer.firstChild); + E("abp-tooltip-blocked").setAttribute("value", blockedStr); - for (let i = 0; i < activeFilters.length && i < 3; i++) + let activeFilters = []; + if (stats) { - let descr = filtersContainer.ownerDocument.createElement("description"); - descr.setAttribute("value", activeFilters[i] + " (" + stats.filters[activeFilters[i]] + ")"); - filtersContainer.appendChild(descr); + let filterSort = function(a, b) + { + return stats.filters[b] - stats.filters[a]; + }; + for (let filter in stats.filters) + activeFilters.push(filter); + activeFilters = activeFilters.sort(filterSort); } - } - } - E("abp-tooltip-filters-label").hidden = (activeFilters.length == 0); - E("abp-tooltip-filters").hidden = (activeFilters.length == 0); - E("abp-tooltip-more-filters").hidden = (activeFilters.length <= 3); + if (activeFilters.length > 0) + { + let filtersContainer = E("abp-tooltip-filters"); + while (filtersContainer.firstChild) + filtersContainer.removeChild(filtersContainer.firstChild); + + for (let i = 0; i < activeFilters.length && i < 3; i++) + { + let descr = filtersContainer.ownerDocument.createElement("description"); + descr.setAttribute("value", activeFilters[i] + " (" + stats.filters[activeFilters[i]] + ")"); + filtersContainer.appendChild(descr); + } + } + + E("abp-tooltip-filters-label").hidden = (activeFilters.length == 0); + E("abp-tooltip-filters").hidden = (activeFilters.length == 0); + E("abp-tooltip-more-filters").hidden = (activeFilters.length <= 3); + }); + } }, /** @@ -1562,10 +1547,12 @@ let UI = exports.UI = let hasStatusBar = statusbarPosition; hideElement(prefix + "showintoolbar", !hasToolbar || prefix == "abp-toolbar-"); hideElement(prefix + "showinstatusbar", !hasStatusBar); + hideElement(prefix + "shownotifications", !Prefs.notifications_showui); hideElement(prefix + "iconSettingsSeparator", (prefix == "abp-toolbar-" || !hasToolbar) && !hasStatusBar); setChecked(prefix + "showintoolbar", this.isToolbarIconVisible()); setChecked(prefix + "showinstatusbar", Prefs.showinstatusbar); + setChecked(prefix + "shownotifications", Prefs.notifications_ignoredcategories.indexOf("*") == -1); let {Sync} = require("sync"); let syncEngine = Sync.getEngine(); @@ -1611,29 +1598,36 @@ let UI = exports.UI = */ fillContentContextMenu: function(/**Element*/ popup) { - let target = popup.triggerNode; - if (target instanceof Ci.nsIDOMHTMLMapElement || target instanceof Ci.nsIDOMHTMLAreaElement) - { - // HTML image maps will usually receive events when the mouse pointer is - // over a different element, get the real event target. - let rect = target.getClientRects()[0]; - target = target.ownerDocument.elementFromPoint(Math.max(rect.left, 0), Math.max(rect.top, 0)); + let window = popup.ownerDocument.defaultView; + let data = window.gContextMenuContentData; + if (!data) + { + // This is SeaMonkey Mail or Thunderbird, they won't get context menu data + // for us. Send the notification ourselves. + data = { + event: {target: popup.triggerNode}, + addonInfo: {}, + get wrappedJSObject() {return this;} + }; + Services.obs.notifyObservers(data, "AdblockPlus:content-contextmenu", null); } - if (!target) + if (typeof data.addonInfo != "object" || typeof data.addonInfo.adblockplus != "object") return; - let window = popup.ownerDocument.defaultView; + let items = data.addonInfo.adblockplus; + let clicked = null; let menuItems = []; - let addMenuItem = function([node, nodeData]) + + function menuItemTriggered(id, nodeData) { - let type = nodeData.typeDescr.toLowerCase(); - if (type == "background") - { - type = "image"; - node = null; - } + clicked = id; + this.blockItem(window, id, nodeData); + } + for (let [id, nodeData] of items) + { + let type = nodeData.type.toLowerCase(); let label = this.overlay.attributes[type + "contextlabel"]; if (!label) return; @@ -1641,66 +1635,10 @@ let UI = exports.UI = let item = popup.ownerDocument.createElement("menuitem"); item.setAttribute("label", label); item.setAttribute("class", "abp-contextmenuitem"); - item.addEventListener("command", this.blockItem.bind(this, window, node, nodeData), false); + item.addEventListener("command", menuItemTriggered.bind(this, id, nodeData), false); popup.appendChild(item); menuItems.push(item); - }.bind(this); - - // Look up data that we have for the node - let data = RequestNotifier.getDataForNode(target); - let hadImage = false; - if (data && !data[1].filter) - { - addMenuItem(data); - hadImage = (data[1].typeDescr == "IMAGE"); - } - - // Look for frame data - let wnd = Utils.getWindow(target); - if (wnd.frameElement) - { - let data = RequestNotifier.getDataForNode(wnd.frameElement, true); - if (data && !data[1].filter) - addMenuItem(data); - } - - // Look for a background image - if (!hadImage) - { - let extractImageURL = function(computedStyle, property) - { - let value = computedStyle.getPropertyCSSValue(property); - // CSSValueList - if ("length" in value && value.length >= 1) - value = value[0]; - // CSSValuePrimitiveType - if ("primitiveType" in value && value.primitiveType == value.CSS_URI) - return Utils.unwrapURL(value.getStringValue()).spec; - - return null; - }; - - let node = target; - while (node) - { - if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) - { - let style = wnd.getComputedStyle(node, ""); - let bgImage = extractImageURL(style, "background-image") || extractImageURL(style, "list-style-image"); - if (bgImage) - { - let data = RequestNotifier.getDataForNode(wnd.document, true, Policy.type.IMAGE, bgImage); - if (data && !data[1].filter) - { - addMenuItem(data); - break; - } - } - } - - node = node.parentNode; - } } // Add "Remove exception" menu item if necessary @@ -1722,20 +1660,21 @@ let UI = exports.UI = } // Make sure to clean up everything once the context menu is closed - if (menuItems.length) + let cleanUp = function(event) { - let cleanUp = function(event) - { - if (event.eventPhase != event.AT_TARGET) - return; + if (event.eventPhase != event.AT_TARGET) + return; - popup.removeEventListener("popuphidden", cleanUp, false); - for (let i = 0; i < menuItems.length; i++) - if (menuItems[i].parentNode) - menuItems[i].parentNode.removeChild(menuItems[i]); - }.bind(this); - popup.addEventListener("popuphidden", cleanUp, false); - } + popup.removeEventListener("popuphidden", cleanUp, false); + for (let menuItem of menuItems) + if (menuItem.parentNode) + menuItem.parentNode.removeChild(menuItem); + + for (let [id, nodeData] of items) + if (id && id != clicked) + Policy.deleteNodes(id); + }.bind(this); + popup.addEventListener("popuphidden", cleanUp, false); }, /** @@ -1815,8 +1754,10 @@ let UI = exports.UI = removeBottomBar(window); let browser = (getBrowser ? getBrowser(window) : null); + if (browser && "selectedBrowser" in browser) + browser = browser.selectedBrowser; if (browser) - browser.contentWindow.focus(); + browser.focus(); } else if (!detach) { @@ -1857,24 +1798,6 @@ let UI = exports.UI = } }, - showNextNotification: function(url) - { - let window = this.currentWindow; - if (!window) - return; - - let button = window.document.getElementById("abp-toolbarbutton") - || window.document.getElementById("abp-status"); - if (!button) - return; - - let notification = Notification.getNextToShow(url); - if (!notification) - return; - - this._showNotification(window, button, notification); - }, - _showNotification: function(window, button, notification) { let panel = window.document.getElementById("abp-notification"); @@ -1940,9 +1863,11 @@ let UI = exports.UI = window.document.getElementById("abp-notification-yes").onclick = buttonHandler.bind(null, true); window.document.getElementById("abp-notification-no").onclick = buttonHandler.bind(null, false); } + else + Notification.markAsShown(notification.id); panel.setAttribute("class", "abp-" + notification.type); - panel.setAttribute("noautohide", notification.type === "question"); + panel.setAttribute("noautohide", true); panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null); } }; @@ -1969,12 +1894,13 @@ let eventHandlers = [ ["abp-command-toggleshowinstatusbar", "command", UI.togglePref.bind(UI, "showinstatusbar")], ["abp-command-enable", "command", UI.togglePref.bind(UI, "enabled")], ["abp-command-contribute", "command", UI.openContributePage.bind(UI)], - ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)] + ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)], + ["abp-command-toggleshownotifications", "command", Notification.toggleIgnoreCategory.bind(Notification, "*", null)] ]; onShutdown.add(function() { - for (let window in UI.applicationWindows) + for (let window of UI.applicationWindows) if (UI.isBottombarOpen(window)) UI.toggleBottombar(window); }); diff --git a/data/extensions/spyblock@gnu.org/lib/utils.js b/data/extensions/spyblock@gnu.org/lib/utils.js index 13f4876..7b07041 100644 --- a/data/extensions/spyblock@gnu.org/lib/utils.js +++ b/data/extensions/spyblock@gnu.org/lib/utils.js @@ -1,6 +1,6 @@ /* * This file is part of Adblock Plus <https://adblockplus.org/>, - * Copyright (C) 2006-2015 Eyeo GmbH + * Copyright (C) 2006-2017 eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as @@ -213,47 +213,18 @@ let Utils = exports.Utils = /** * Posts an action to the event queue of the current thread to run it - * asynchronously. Any additional parameters to this function are passed - * as parameters to the callback. + * asynchronously. * @param {function} callback - * @param {object} thisPtr */ - runAsync: function(callback, thisPtr) + runAsync: function(callback) { - let params = Array.prototype.slice.call(arguments, 2); - let runnable = { - run: function() - { - callback.apply(thisPtr, params); - } - }; - Services.tm.currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL); - }, - - /** - * Gets the DOM window associated with a particular request (if any). - */ - getRequestWindow: function(/**nsIChannel*/ channel) /**nsIDOMWindow*/ - { - try - { - if (channel.notificationCallbacks) - return channel.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow; - } catch(e) {} - - try - { - if (channel.loadGroup && channel.loadGroup.notificationCallbacks) - return channel.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow; - } catch(e) {} - - return null; + Services.tm.currentThread.dispatch(callback, Ci.nsIEventTarget.DISPATCH_NORMAL); }, /** * Generates filter subscription checksum. * - * @param {Array of String} lines filter subscription lines (with checksum line removed) + * @param {string[]} lines filter subscription lines (with checksum line removed) * @return {String} checksum or null */ generateChecksum: function(lines) @@ -367,22 +338,6 @@ let Utils = exports.Utils = }, /** - * Pauses code execution and allows events to be processed. Warning: - * other extension code might execute, the extension might even shut down. - */ - yield: function() - { - let {Prefs} = require("prefs"); - if (Prefs.please_kill_startup_performance) - { - this.yield = function() {}; - return; - } - let thread = Services.tm.currentThread; - while (thread.processNextEvent(false)); - }, - - /** * Saves sidebar state before detaching/reattaching */ setParams: function(params) @@ -618,8 +573,6 @@ XPCOMUtils.defineLazyServiceGetter(Utils, "windowWatcher", "@mozilla.org/embedco XPCOMUtils.defineLazyServiceGetter(Utils, "chromeRegistry", "@mozilla.org/chrome/chrome-registry;1", "nsIXULChromeRegistry"); XPCOMUtils.defineLazyServiceGetter(Utils, "systemPrincipal", "@mozilla.org/systemprincipal;1", "nsIPrincipal"); XPCOMUtils.defineLazyServiceGetter(Utils, "dateFormatter", "@mozilla.org/intl/scriptabledateformat;1", "nsIScriptableDateFormat"); -XPCOMUtils.defineLazyServiceGetter(Utils, "childMessageManager", "@mozilla.org/childprocessmessagemanager;1", "nsISyncMessageSender"); -XPCOMUtils.defineLazyServiceGetter(Utils, "parentMessageManager", "@mozilla.org/parentprocessmessagemanager;1", "nsIFrameMessageManager"); XPCOMUtils.defineLazyServiceGetter(Utils, "httpProtocol", "@mozilla.org/network/protocol;1?name=http", "nsIHttpProtocolHandler"); XPCOMUtils.defineLazyServiceGetter(Utils, "clipboard", "@mozilla.org/widget/clipboard;1", "nsIClipboard"); XPCOMUtils.defineLazyServiceGetter(Utils, "clipboardHelper", "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper"); @@ -627,7 +580,7 @@ XPCOMUtils.defineLazyGetter(Utils, "crypto", function() { try { - let ctypes = Components.utils.import("resource://gre/modules/ctypes.jsm", null).ctypes; + let ctypes = Cu.import("resource://gre/modules/ctypes.jsm", null).ctypes; let nsslib; try diff --git a/data/extensions/spyblock@gnu.org/lib/whitelisting.js b/data/extensions/spyblock@gnu.org/lib/whitelisting.js new file mode 100644 index 0000000..1006d26 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/lib/whitelisting.js @@ -0,0 +1,46 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @fileOverview This is a dummy to provide a function needed by message + * responder. + */ + +"use strict"; + +let {Policy} = require("contentPolicy"); +let {RegExpFilter} = require("filterClasses"); + +// NOTE: The function interface is supposed to be compatible with +// checkWhitelisted in adblockpluschrome. That's why there is a typeMask +// parameter here. However, this parameter is only used to decide whether +// elemhide whitelisting should be considered, so only supported values for this +// parameter are RegExpFilter.typeMap.DOCUMENT and +// RegExpFilter.typeMap.DOCUMENT | RegExpFilter.typeMap.ELEMHIDE. +exports.checkWhitelisted = function(page, frames, typeMask) +{ + let match = + Policy.isFrameWhitelisted(frames, typeMask & RegExpFilter.typeMap.ELEMHIDE); + if (match) + { + let [frameIndex, matchType, docDomain, thirdParty, location, filter] = match; + if (matchType == "DOCUMENT" || matchType == "ELEMHIDE") + return filter; + } + + return null; +}; diff --git a/data/extensions/spyblock@gnu.org/webextension/.eslintrc.json b/data/extensions/spyblock@gnu.org/webextension/.eslintrc.json new file mode 100644 index 0000000..ea12297 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/webextension/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": "eslint-config-eyeo", + "root": true, + "env": { + "webextensions": true + } +} diff --git a/data/extensions/spyblock@gnu.org/webextension/background.js b/data/extensions/spyblock@gnu.org/webextension/background.js new file mode 100644 index 0000000..88feb91 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/webextension/background.js @@ -0,0 +1,41 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +/* global IO */ + +let port = browser.runtime.connect(); + +port.onMessage.addListener(message => +{ + IO[message.method](...message.args).then(result => + { + port.postMessage({ + id: message.id, + success: true, + result + }); + }).catch(error => + { + port.postMessage({ + id: message.id, + success: false, + result: String(error) + }); + }); +}); diff --git a/data/extensions/spyblock@gnu.org/webextension/io.js b/data/extensions/spyblock@gnu.org/webextension/io.js new file mode 100644 index 0000000..adfee2f --- /dev/null +++ b/data/extensions/spyblock@gnu.org/webextension/io.js @@ -0,0 +1,109 @@ +/* + * This file is part of Adblock Plus <https://adblockplus.org/>, + * Copyright (C) 2006-2017 eyeo GmbH + * + * Adblock Plus is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * Adblock Plus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. + */ + +"use strict"; + +(function(exports) +{ + const keyPrefix = "file:"; + + function fileToKey(fileName) + { + return keyPrefix + fileName; + } + + function loadFile(file) + { + let key = fileToKey(file); + + return browser.storage.local.get(key).then(items => + { + if (items.hasOwnProperty(key)) + return items[key]; + + throw "NoSuchFile"; + }); + } + + function saveFile(file, data) + { + return browser.storage.local.set({ + [fileToKey(file)]: { + content: Array.from(data), + lastModified: Date.now() + } + }); + } + + function removeFile(file) + { + return browser.storage.local.remove(fileToKey(file)); + } + + exports.IO = + { + readFromFile(file) + { + return loadFile(file).then(entry => + { + return entry.content; + }); + }, + + writeToFile(file, data) + { + return saveFile(file, data); + }, + + copyFile(fromFile, toFile) + { + return loadFile(fromFile).then(entry => + { + return saveFile(toFile, entry.content); + }); + }, + + renameFile(fromFile, newName) + { + return loadFile(fromFile).then(entry => + { + return browser.storage.local.set({ + [fileToKey(newName)]: entry + }); + }).then(() => + { + return removeFile(fromFile); + }); + }, + + removeFile(file) + { + return removeFile(file); + }, + + statFile(file) + { + return loadFile(file).then(entry => + { + return { + exists: true, + lastModified: entry.lastModified + }; + }); + } + }; +})(this); diff --git a/data/extensions/spyblock@gnu.org/webextension/manifest.json b/data/extensions/spyblock@gnu.org/webextension/manifest.json new file mode 100644 index 0000000..46575e7 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/webextension/manifest.json @@ -0,0 +1,9 @@ +{ + "manifest_version": 2, + "name": "Web Extensions I/O backend", + "version": "1.0", + "permissions": ["storage"], + "background": { + "scripts": ["background.js", "io.js"] + } +} |