From 4360099a81547b398ab0846ab4509d86ef6e8677 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Fri, 14 Feb 2025 19:28:03 +0300 Subject: [PATCH 01/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 514b5646ca..e07fc0d715 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.37", + "version": "5.1.38", "description": "AdGuard Extension", "type": "module", "scripts": { From 9545c7172ea97141f67a1f93b3273dc6d8d90ab6 Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Mon, 17 Feb 2025 17:47:09 +0300 Subject: [PATCH 02/29] AG-39904: filtering log do not detect opening tabs Squashed commit of the following: commit f0fbe1e9b38cb9d27817bc8bd04f06df93d73ef1 Author: Dmitriy Seregin Date: Mon Feb 17 17:41:26 2025 +0300 added changelog commit 9f054f48dd00004244971ce9ab777749f2c93d0b Merge: 52b9d7f8f 4360099a8 Author: Dmitriy Seregin Date: Mon Feb 17 17:40:00 2025 +0300 Merge branch 'master' into fix/AG-39904 commit 52b9d7f8f3b7cbae878a5e7dfdf6a5b089cce260 Author: Dmitriy Seregin Date: Thu Feb 13 18:05:22 2025 +0300 AG-39904: filtering log do not detect opening tabs --- CHANGELOG.md | 1 + Extension/src/background/api/filtering-log.ts | 42 +++++++++---------- .../src/background/api/filters/allowlist.ts | 6 +-- .../src/background/api/filters/userrules.ts | 5 ++- Extension/src/background/api/settings/main.ts | 10 +++-- .../src/background/connection-handler.ts | 20 ++++++--- Extension/src/background/engine/engine-mv2.ts | 7 ++-- Extension/src/background/engine/engine-mv3.ts | 8 ++-- Extension/src/background/notifier.ts | 8 ++-- .../custom-filters-service-mv2.ts | 4 +- .../custom-filters-service-mv3.ts | 4 +- Extension/src/background/services/event.ts | 21 ++++++---- .../services/filters/filters-service-mv2.ts | 7 ++-- .../services/fullscreen-user-rules-editor.ts | 4 +- Extension/src/background/services/ui/main.ts | 5 ++- Extension/src/common/constants.ts | 11 +++-- Extension/src/pages/services/messenger.ts | 17 ++++---- 17 files changed, 98 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9590a1aa17..ec08ce5a78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Blocked counter on the popup updates for blocked requests from other tabs [#3050]. - `$popup,third-party` modifiers cause document blocking [#3012]. - Don't show lines for absent metadata when adding a custom filter [#3057]. +- Filtering log does not observe tab changes, openings, or closings. ### Removed diff --git a/Extension/src/background/api/filtering-log.ts b/Extension/src/background/api/filtering-log.ts index 971ccf2f6e..e85368b1d6 100644 --- a/Extension/src/background/api/filtering-log.ts +++ b/Extension/src/background/api/filtering-log.ts @@ -35,12 +35,12 @@ import { import { logger } from '../../common/logger'; import { translator } from '../../common/translators/translator'; -import { listeners } from '../notifier'; +import { notifier } from '../notifier'; import { engine } from '../engine'; import { settingsStorage } from '../storages'; import { SettingOption } from '../schema'; import { TabsApi } from '../../common/api/extension/tabs'; -import { AntiBannerFiltersId } from '../../common/constants'; +import { AntiBannerFiltersId, NotifierType } from '../../common/constants'; import { FiltersStoragesAdapter } from '../storages/filters-adapter'; export type FilteringEventRuleData = { @@ -562,7 +562,7 @@ export class FilteringLogApi { this.tabsInfoMap.set(id, tabInfo); - listeners.notifyListeners(listeners.TabAdded, tabInfo); + notifier.notifyListeners(NotifierType.TabAdded, tabInfo); } /** @@ -592,7 +592,7 @@ export class FilteringLogApi { tabInfo.title = title; tabInfo.isExtensionTab = isExtensionUrl(url); - listeners.notifyListeners(listeners.TabUpdate, tabInfo); + notifier.notifyListeners(NotifierType.TabUpdate, tabInfo); } /** @@ -609,7 +609,7 @@ export class FilteringLogApi { const tabInfo = this.tabsInfoMap.get(id); if (tabInfo) { - listeners.notifyListeners(listeners.TabClose, tabInfo); + notifier.notifyListeners(NotifierType.TabClose, tabInfo); } this.tabsInfoMap.delete(id); @@ -683,7 +683,7 @@ export class FilteringLogApi { if (tabInfo && !preserveLog) { tabInfo.filteringEvents = []; - listeners.notifyListeners(listeners.TabReset, tabInfo); + notifier.notifyListeners(NotifierType.TabReset, tabInfo); } } @@ -711,9 +711,6 @@ export class FilteringLogApi { // don't remove first item, cause it's request to main frame tabInfo.filteringEvents.splice(1, 1); } - - // TODO: Looks like not using. Maybe lost listener in refactoring. - listeners.notifyListeners(listeners.LogEventAdded, tabInfo, data); } /** @@ -737,24 +734,23 @@ export class FilteringLogApi { let event = filteringEvents.find((e) => e.eventId === eventId); - if (event) { - if (data.requestRule && !event.requestRule?.appliedRuleText) { - data.requestRule = await this.applyRuleTextToRuleData(data.requestRule); - } - - if (data.replaceRules) { - data.replaceRules = await this.applyRuleTextToRuleDataArray(data.replaceRules); - } + if (!event) { + return; + } - if (data.stealthAllowlistRules) { - data.stealthAllowlistRules = await this.applyRuleTextToRuleDataArray(data.stealthAllowlistRules); - } + if (data.requestRule && !event.requestRule?.appliedRuleText) { + data.requestRule = await this.applyRuleTextToRuleData(data.requestRule); + } - event = Object.assign(event, data); + if (data.replaceRules) { + data.replaceRules = await this.applyRuleTextToRuleDataArray(data.replaceRules); + } - // TODO: Looks like not using. Maybe lost listener in refactoring. - listeners.notifyListeners(listeners.LogEventAdded, tabInfo, event); + if (data.stealthAllowlistRules) { + data.stealthAllowlistRules = await this.applyRuleTextToRuleDataArray(data.stealthAllowlistRules); } + + event = Object.assign(event, data); } /** diff --git a/Extension/src/background/api/filters/allowlist.ts b/Extension/src/background/api/filters/allowlist.ts index c607644f7c..2cf26dacd9 100644 --- a/Extension/src/background/api/filters/allowlist.ts +++ b/Extension/src/background/api/filters/allowlist.ts @@ -20,7 +20,7 @@ import zod from 'zod'; import { tabsApi as tsWebExtTabsApi, getDomain } from '../../tswebextension'; import { logger } from '../../../common/logger'; import { SettingOption } from '../../schema'; -import { listeners } from '../../notifier'; +import { notifier } from '../../notifier'; import { settingsStorage, allowlistDomainsStorage, @@ -28,7 +28,7 @@ import { } from '../../storages'; import { engine } from '../../engine'; import { TabsApi } from '../../../common/api/extension'; -import { AntiBannerFiltersId } from '../../../common/constants'; +import { AntiBannerFiltersId, NotifierType } from '../../../common/constants'; import { UrlUtils } from '../../utils'; import { UserRulesApi } from './userrules'; @@ -374,7 +374,7 @@ export class AllowlistApi { storage.setData(domains); - listeners.notifyListeners(listeners.UpdateAllowlistFilterRules); + notifier.notifyListeners(NotifierType.UpdateAllowlistFilterRules); } /** diff --git a/Extension/src/background/api/filters/userrules.ts b/Extension/src/background/api/filters/userrules.ts index 8a848bb7b0..ed363e2463 100644 --- a/Extension/src/background/api/filters/userrules.ts +++ b/Extension/src/background/api/filters/userrules.ts @@ -29,9 +29,10 @@ import { AntiBannerFiltersId, NEWLINE_CHAR_REGEX, NEWLINE_CHAR_UNIX, + NotifierType, } from '../../../common/constants'; import { SettingOption } from '../../schema'; -import { listeners } from '../../notifier'; +import { notifier } from '../../notifier'; import { FiltersStorage, settingsStorage, @@ -225,7 +226,7 @@ export class UserRulesApi { public static async setUserRules(rulesText: string): Promise { await FiltersStorage.set(AntiBannerFiltersId.UserFilterId, rulesText); - listeners.notifyListeners(listeners.UserFilterUpdated); + notifier.notifyListeners(NotifierType.UserFilterUpdated); } /** diff --git a/Extension/src/background/api/settings/main.ts b/Extension/src/background/api/settings/main.ts index 2c43cac9d6..fefe951d31 100644 --- a/Extension/src/background/api/settings/main.ts +++ b/Extension/src/background/api/settings/main.ts @@ -55,9 +55,13 @@ import { AllowlistApi, annoyancesConsent, } from '../filters'; -import { ADGUARD_SETTINGS_KEY, AntiBannerFiltersId } from '../../../common/constants'; +import { + ADGUARD_SETTINGS_KEY, + AntiBannerFiltersId, + NotifierType, +} from '../../../common/constants'; import { settingsEvents } from '../../events'; -import { listeners } from '../../notifier'; +import { notifier } from '../../notifier'; import { Unknown } from '../../../common/unknown'; import { messenger } from '../../../pages/services/messenger'; import { Prefs } from '../../prefs'; @@ -115,7 +119,7 @@ export class SettingsApi { await settingsEvents.publishEvent(key, value); // legacy event mediator for frontend - listeners.notifyListeners(listeners.SettingUpdated, { + notifier.notifyListeners(NotifierType.SettingUpdated, { propertyName: key, propertyValue: value, }); diff --git a/Extension/src/background/connection-handler.ts b/Extension/src/background/connection-handler.ts index 6afb0c2faf..ba348c8ae8 100644 --- a/Extension/src/background/connection-handler.ts +++ b/Extension/src/background/connection-handler.ts @@ -18,11 +18,15 @@ import browser, { Runtime } from 'webextension-polyfill'; import { KEEP_ALIVE_PORT_NAME } from '../common/constants'; -import { messageHasTypeAndDataFields, MessageType } from '../common/messages'; +import { + messageHasTypeAndDataFields, + MessageType, + type NotifyListenersMessage, +} from '../common/messages'; import { logger } from '../common/logger'; import { Page } from '../pages/services/messenger'; -import { listeners } from './notifier'; +import { notifier } from './notifier'; import { filteringLogApi } from './api'; import { fullscreenUserRulesEditor } from './services'; import { KeepAlive } from './keep-alive'; @@ -53,7 +57,7 @@ export class ConnectionHandler { port.onMessage.addListener((message) => { if (!messageHasTypeAndDataFields(message)) { // eslint-disable-next-line max-len - logger.warn('Received message in ConnectionHandler.handleConnection has no type or data field: ', message); + logger.error('Received message in ConnectionHandler.handleConnection has no type or data field: ', message); return; } @@ -63,9 +67,13 @@ export class ConnectionHandler { const { data: { events } } = message; - listenerId = listeners.addSpecifiedListener(events, async (...args) => { + listenerId = notifier.addSpecifiedListener(events, async (...data) => { try { - port.postMessage({ type: MessageType.NotifyListeners, args }); + const message: NotifyListenersMessage = { + type: MessageType.NotifyListeners, + data, + }; + port.postMessage(message); } catch (e) { logger.error('Failed to send message to the port due to an error:', e); } @@ -77,7 +85,7 @@ export class ConnectionHandler { logger.debug('An error occurred on disconnect', browser.runtime.lastError); } ConnectionHandler.onPortDisconnection(port); - listeners.removeListener(listenerId); + notifier.removeListener(listenerId); logger.info(`Port: "${port.name}" disconnected`); }); } diff --git a/Extension/src/background/engine/engine-mv2.ts b/Extension/src/background/engine/engine-mv2.ts index 8c7fc90da8..90c90af985 100644 --- a/Extension/src/background/engine/engine-mv2.ts +++ b/Extension/src/background/engine/engine-mv2.ts @@ -28,7 +28,7 @@ import { import { logger } from '../../common/logger'; import { WEB_ACCESSIBLE_RESOURCES_OUTPUT } from '../../../../constants'; -import { listeners } from '../notifier'; +import { notifier } from '../notifier'; import { FiltersStorage } from '../storages'; import { FiltersApi, @@ -40,6 +40,7 @@ import { filteringLogApi, CustomFilterApi, } from '../api'; +import { NotifierType } from '../../common/constants'; import { type TsWebExtensionEngine } from './interface'; @@ -89,7 +90,7 @@ export class Engine implements TsWebExtensionEngine { const rulesCount = this.api.getRulesCount(); logger.info(`tswebextension is started. Rules count: ${rulesCount}`); // TODO: remove after frontend refactoring - listeners.notifyListeners(listeners.RequestFilterUpdated); + notifier.notifyListeners(NotifierType.RequestFilterUpdated); filteringLogApi.onEngineUpdated(configuration.settings.allowlistInverted); } @@ -107,7 +108,7 @@ export class Engine implements TsWebExtensionEngine { const rulesCount = this.api.getRulesCount(); logger.info(`tswebextension configuration is updated. Rules count: ${rulesCount}`); // TODO: remove after frontend refactoring - listeners.notifyListeners(listeners.RequestFilterUpdated); + notifier.notifyListeners(NotifierType.RequestFilterUpdated); filteringLogApi.onEngineUpdated(configuration.settings.allowlistInverted); } diff --git a/Extension/src/background/engine/engine-mv3.ts b/Extension/src/background/engine/engine-mv3.ts index c00f7ad990..21c6a5b910 100644 --- a/Extension/src/background/engine/engine-mv3.ts +++ b/Extension/src/background/engine/engine-mv3.ts @@ -30,7 +30,7 @@ import { import { logger } from '../../common/logger'; import { WEB_ACCESSIBLE_RESOURCES_OUTPUT_REDIRECTS } from '../../../../constants'; -import { listeners } from '../notifier'; +import { notifier } from '../notifier'; import { FiltersApi, AllowlistApi, @@ -43,7 +43,7 @@ import { } from '../api'; import { RulesLimitsService, rulesLimitsService } from '../services/rules-limits/rules-limits-service-mv3'; import { UserRulesService } from '../services/userrules'; -import { emptyPreprocessedFilterList } from '../../common/constants'; +import { emptyPreprocessedFilterList, NotifierType } from '../../common/constants'; import { SettingOption } from '../schema/settings/enum'; import { localScriptRules } from '../../../filters/chromium-mv3/local_script_rules'; @@ -115,7 +115,7 @@ export class Engine implements TsWebExtensionEngine { const rulesCount = this.api.getRulesCount(); logger.info(`tswebextension is started. Rules count: ${rulesCount}`); // TODO: remove after frontend refactoring - listeners.notifyListeners(listeners.RequestFilterUpdated); + notifier.notifyListeners(NotifierType.RequestFilterUpdated); await RulesLimitsService.checkFiltersLimitsChange(this.update.bind(this)); @@ -164,7 +164,7 @@ export class Engine implements TsWebExtensionEngine { const rulesCount = this.api.getRulesCount(); logger.info(`tswebextension configuration is updated. Rules count: ${rulesCount}`); // TODO: remove after frontend refactoring - listeners.notifyListeners(listeners.RequestFilterUpdated); + notifier.notifyListeners(NotifierType.RequestFilterUpdated); if (!skipLimitsCheck) { await RulesLimitsService.checkFiltersLimitsChange(this.update.bind(this)); diff --git a/Extension/src/background/notifier.ts b/Extension/src/background/notifier.ts index 09924250fd..c2128e5025 100644 --- a/Extension/src/background/notifier.ts +++ b/Extension/src/background/notifier.ts @@ -108,15 +108,13 @@ class Notifier { * * @throws Error if some event is illegal. */ - notifyListeners(...args: [string, ...unknown[]]): void { + notifyListeners(...args: [NotifierType, ...unknown[]]): void { const [event] = args; if (!event || !(event in this.eventNotifierEventsMap)) { throw new Error(`Illegal event: ${event}`); } - Object.entries( - this.listenersMap as Record, - ).forEach(([listenerId, listener]) => { + Object.entries(this.listenersMap).forEach(([listenerId, listener]) => { const events = this.listenersEventsMap[Number(listenerId)]; if (events && events.length > 0 && events.indexOf(event) < 0) { return; @@ -130,4 +128,4 @@ class Notifier { } } -export const listeners = new Notifier() as Notifier & typeof NotifierType; +export const notifier = new Notifier(); diff --git a/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts b/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts index 6c18f23bc4..3a481738ea 100644 --- a/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts +++ b/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts @@ -35,7 +35,7 @@ // } from '../../../common/messages'; // import { CustomFilterApi, GetCustomFilterInfoResult } from '../../api/filters/custom'; // import { messageHandler } from '../../message-handler'; -// import { listeners } from '../../notifier'; +// import { notifier } from '../../notifier'; // import { engine } from '../../engine'; // import type { CustomFilterMetadata } from '../../schema'; @@ -91,7 +91,7 @@ export class CustomFiltersService { // engine.debounceUpdate(); - // listeners.notifyListeners(NotifierType.CustomFilterAdded); + // notifier.notifyListeners(NotifierType.CustomFilterAdded); // return filterMetadata; // } diff --git a/Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts b/Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts index 31a828c532..c2cadf07f7 100644 --- a/Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts +++ b/Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts @@ -34,7 +34,7 @@ // } from '../../../common/messages'; // import { CustomFilterApi, GetCustomFilterInfoResult } from '../../api/filters/custom'; // import { messageHandler } from '../../message-handler'; -// import { listeners } from '../../notifier'; +// import { notifier } from '../../notifier'; // import { engine } from '../../engine'; // import type { CustomFilterMetadata } from '../../schema'; @@ -90,7 +90,7 @@ export class CustomFiltersService { // await engine.update(); - // listeners.notifyListeners(NotifierType.CustomFilterAdded); + // notifier.notifyListeners(NotifierType.CustomFilterAdded); // return filterMetadata; // } diff --git a/Extension/src/background/services/event.ts b/Extension/src/background/services/event.ts index 9653578c62..0bb36b7193 100644 --- a/Extension/src/background/services/event.ts +++ b/Extension/src/background/services/event.ts @@ -17,12 +17,13 @@ */ import browser, { Runtime } from 'webextension-polyfill'; -import { listeners } from '../notifier'; +import { notifier } from '../notifier'; import { messageHandler } from '../message-handler'; import { RemoveListenerMessage, CreateEventListenerMessage, MessageType, + NotifyListenersMessage, } from '../../common/messages'; export type CreateEventListenerResponse = { @@ -67,14 +68,18 @@ export class EventService { ): CreateEventListenerResponse { const { events } = message.data; - const listenerId = listeners.addSpecifiedListener(events, (...args) => { + const listenerId = notifier.addSpecifiedListener(events, (...data) => { const sender = this.eventListeners.get(listenerId); - if (sender) { - browser.tabs.sendMessage(sender.tab.id, { - type: MessageType.NotifyListeners, - data: args, - }); + if (!sender) { + return; } + + const message: NotifyListenersMessage = { + type: MessageType.NotifyListeners, + data, + }; + + browser.tabs.sendMessage(sender.tab.id, message); }); this.eventListeners.set(listenerId, sender); @@ -89,7 +94,7 @@ export class EventService { private removeEventListener(message: RemoveListenerMessage): void { const { listenerId } = message.data; - listeners.removeListener(listenerId); + notifier.removeListener(listenerId); this.eventListeners.delete(listenerId); } } diff --git a/Extension/src/background/services/filters/filters-service-mv2.ts b/Extension/src/background/services/filters/filters-service-mv2.ts index a0f71eac82..351d016c99 100644 --- a/Extension/src/background/services/filters/filters-service-mv2.ts +++ b/Extension/src/background/services/filters/filters-service-mv2.ts @@ -44,7 +44,8 @@ import { contextMenuEvents, settingsEvents, } from '../../events'; -import { listeners } from '../../notifier'; +import { notifier } from '../../notifier'; +import { NotifierType } from '../../../common/constants'; /** * FiltersService creates handlers for messages that relate to filters. @@ -209,12 +210,12 @@ export class FiltersService { const updatedFilters = await FilterUpdateApi.autoUpdateFilters(true); toasts.showFiltersUpdatedAlertMessage(true, updatedFilters); - listeners.notifyListeners(listeners.FiltersUpdateCheckReady, updatedFilters); + notifier.notifyListeners(NotifierType.FiltersUpdateCheckReady, updatedFilters); return updatedFilters; } catch (e) { toasts.showFiltersUpdatedAlertMessage(false); - listeners.notifyListeners(listeners.FiltersUpdateCheckReady); + notifier.notifyListeners(NotifierType.FiltersUpdateCheckReady); } } diff --git a/Extension/src/background/services/fullscreen-user-rules-editor.ts b/Extension/src/background/services/fullscreen-user-rules-editor.ts index 7c7d3cc735..64d8207837 100644 --- a/Extension/src/background/services/fullscreen-user-rules-editor.ts +++ b/Extension/src/background/services/fullscreen-user-rules-editor.ts @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with AdGuard Browser Extension. If not, see . */ -import { listeners } from '../notifier'; +import { notifier } from '../notifier'; import { NotifierType } from '../../common/constants'; /** @@ -47,7 +47,7 @@ class FullscreenUserRulesEditor { * Notifies listeners of changes in the open page counter. */ onPagesCountChanged(): void { - listeners.notifyListeners(NotifierType.FullscreenUserRulesEditorUpdated, this.isOpen()); + notifier.notifyListeners(NotifierType.FullscreenUserRulesEditorUpdated, this.isOpen()); } /** diff --git a/Extension/src/background/services/ui/main.ts b/Extension/src/background/services/ui/main.ts index c0d29ea945..6dc3b7a45f 100644 --- a/Extension/src/background/services/ui/main.ts +++ b/Extension/src/background/services/ui/main.ts @@ -33,7 +33,7 @@ import { import { UserAgent } from '../../../common/user-agent'; import { engine } from '../../engine'; import { AntiBannerFiltersId, NotifierType } from '../../../common/constants'; -import { listeners } from '../../notifier'; +import { notifier } from '../../notifier'; import { toasts, FiltersApi, @@ -72,6 +72,7 @@ export type PageInitAppData = { }, constants: { AntiBannerFiltersId: typeof AntiBannerFiltersId, + // TODO: Seems like deprecated, can be removed. EventNotifierType: typeof NotifierType, }, }; @@ -240,7 +241,7 @@ export class UiService { }, constants: { AntiBannerFiltersId, - EventNotifierType: listeners.events, + EventNotifierType: notifier.events, }, }; } diff --git a/Extension/src/common/constants.ts b/Extension/src/common/constants.ts index f279ed90d1..be38319de0 100644 --- a/Extension/src/common/constants.ts +++ b/Extension/src/common/constants.ts @@ -79,8 +79,10 @@ export const enum AntibannerGroupsId { */ export const RECOMMENDED_TAG_ID = 10; -// TODO: Add types checking for messages payload, because it many messages data -// are not used in the fronted code, except FiltersUpdateCheckReady and FullscreenUserRulesEditorUpdated. +/** + * Enum with the list of the messages which are sent from the background + * to notify UI about some events, e.g. some field in settings was updated. + */ export enum NotifierType { RequestFilterUpdated = 'event.request.filter.updated', UserFilterUpdated = 'event.user.filter.updated', @@ -88,14 +90,11 @@ export enum NotifierType { UpdateAllowlistFilterRules = 'event.update.allowlist.filter.rules', SettingUpdated = 'event.update.setting.value', FiltersUpdateCheckReady = 'event.update.filters.check', - // Log events + // Filtering log events. TabAdded = 'log.tab.added', TabClose = 'log.tab.close', TabUpdate = 'log.tab.update', TabReset = 'log.tab.reset', - LogEventAdded = 'log.event.added', - // Sync events - SettingsUpdated = 'event.sync.finished', // Fullscreen user rules events FullscreenUserRulesEditorUpdated = 'event.user.rules.editor.updated', } diff --git a/Extension/src/pages/services/messenger.ts b/Extension/src/pages/services/messenger.ts index fd9f72a6fc..b6975b37f3 100644 --- a/Extension/src/pages/services/messenger.ts +++ b/Extension/src/pages/services/messenger.ts @@ -159,13 +159,13 @@ class Messenger { port.onMessage.addListener((message) => { if (!messageHasTypeField(message)) { - logger.warn('Received message in Messenger.createLongLivedConnection has no type field: ', message); + logger.error('Received message in Messenger.createLongLivedConnection has no type field: ', message); return; } if (message.type === MessageType.NotifyListeners) { if (!messageHasTypeAndDataFields(message)) { - logger.warn('Received message with type MessageType.NotifyListeners has no data: ', message); + logger.error('Received message with type MessageType.NotifyListeners has no data: ', message); return; } @@ -218,30 +218,31 @@ class Messenger { ): Promise => { let listenerId: number | null; - const response = await this.sendMessage( + const response: CreateEventListenerResponse = await this.sendMessage( MessageType.CreateEventListener, { events }, - ) as CreateEventListenerResponse; + ); + listenerId = response.listenerId; const onUpdateListeners = async (): Promise => { - const updatedResponse = await this.sendMessage( + const updatedResponse: CreateEventListenerResponse = await this.sendMessage( MessageType.CreateEventListener, { events }, - ) as CreateEventListenerResponse; + ); listenerId = updatedResponse.listenerId; }; browser.runtime.onMessage.addListener((message) => { if (!messageHasTypeField(message)) { - logger.warn('Received message in Messenger.createEventListener has no type field: ', message); + logger.error('Received message in Messenger.createEventListener has no type field: ', message); return undefined; } if (message.type === MessageType.NotifyListeners) { if (!messageHasTypeAndDataFields(message)) { - logger.warn('Received message with type MessageType.NotifyListeners has no data: ', message); + logger.error('Received message with type MessageType.NotifyListeners has no data: ', message); return undefined; } From 8cd0bd166a6841a53b1d9994ba99b37e0025c99b Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 17 Feb 2025 17:47:57 +0300 Subject: [PATCH 03/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e07fc0d715..40913d2f5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.38", + "version": "5.1.39", "description": "AdGuard Extension", "type": "module", "scripts": { From d064fe5c8e139a0e91f4358c6947911cb2361785 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Mon, 17 Feb 2025 18:17:45 +0300 Subject: [PATCH 04/29] AG-36223 update locales Squashed commit of the following: commit af6d6077f077827c7a2fa96b5a034ef110e08a5e Author: Slava Leleka Date: Mon Feb 17 10:10:58 2025 -0500 update locales --- Extension/_locales/be/messages.json | 283 ++++++++ Extension/_locales/bg/messages.json | 325 +++++++++ Extension/_locales/ca/messages.json | 447 +++++++++++- Extension/_locales/de/messages.json | 26 +- Extension/_locales/el/messages.json | 307 ++++++++ Extension/_locales/et/messages.json | 340 +++++++++ Extension/_locales/fa/messages.json | 286 ++++++++ Extension/_locales/fi/messages.json | 139 ++++ Extension/_locales/he/messages.json | 160 +++++ Extension/_locales/hi/messages.json | 324 ++++++++- Extension/_locales/hr/messages.json | 277 ++++++++ Extension/_locales/hu/messages.json | 187 +++++ Extension/_locales/hy/messages.json | 934 ++++++++++++++++++++++++- Extension/_locales/id/messages.json | 10 + Extension/_locales/lt/messages.json | 294 +++++++- Extension/_locales/mk/messages.json | 226 ++++++ Extension/_locales/ms/messages.json | 525 +++++++++++++- Extension/_locales/th/messages.json | 234 ++++++- Extension/_locales/zh_TW/messages.json | 6 +- 19 files changed, 5306 insertions(+), 24 deletions(-) diff --git a/Extension/_locales/be/messages.json b/Extension/_locales/be/messages.json index 67dd37ed8c..0ca91b0961 100644 --- a/Extension/_locales/be/messages.json +++ b/Extension/_locales/be/messages.json @@ -32,6 +32,9 @@ "options_filters_annoyances_consent_enable_button": { "message": "Уключыць" }, + "popup_header_cta_link": { + "message": "Як палепшыць абарону" + }, "popup_header_update_filters": { "message": "Праверыць абнаўленні фільтраў" }, @@ -59,6 +62,9 @@ "options_popup_version_update_disable_notification": { "message": "Адключыць апавяшчэнні" }, + "popup_adguard_footer_title": { + "message": "Абараніце свой мабільны прылад" + }, "options_popup_call_to_action": { "message": "Увядзіце правільны URL фільтра або шлях да файла фільтра ў поле вышэй." }, @@ -86,12 +92,21 @@ "options_add_custom_filter_modal_title": { "message": "Дадаць свой" }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Праверка фільтра..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Не ўдалося дадаць карыстацкі фільтр" + }, "options_add_custom_filter_modal_error_subtitle": { "message": "Паўтарыце спробу або звярніцеся у службу падтрымкі" }, "options_add_custom_filter_modal_add_button": { "message": "ДАДАЦЬ" }, + "options_add_custom_filter_modal_filter_name": { + "message": "Назва фільтра:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Давераны" }, @@ -135,15 +150,33 @@ "options_allowlist": { "message": "Белы спіс" }, + "options_allowlist_desc": { + "message": "AdGuard не фільтруе вэб-сайты з белага спіса" + }, "options_allowlist_invert": { "message": "Інвертаваць белы спіс" }, + "options_allowlist_invert_desc": { + "message": "Разблакаваць рэкламу ўсюды, акрамя белага спіса" + }, "options_allowlist_alert_invert": { "message": "Белы спіс інвертаваны. Рэклама блакіруецца толькі на сайтах са спіса. Адключыць<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Вашы змены ў белым спісе будуць страчаны" + }, "options_userfilter": { "message": "Уласны фільтр" }, + "filtering_log_modified_rules": { + "message": "Змененыя правілы: %rules_count%" + }, + "filtering_log_stealth_rules": { + "message": "Правілы Антытрэкiнгу: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Абарона ад сачэння ўжыта" + }, "filtering_log_in_allowlist": { "message": "Гэты сайт у белым спісе" }, @@ -204,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "Вы вырашылі давяраць гэтаму фільтру." }, + "options_filters_info_mv3_total_rules": { + "message": "Усяго правілаў: %num%" + }, "options_add_custom_filter": { "message": "Дадаць фільтр" }, + "options_filters_custom_disabled_cws": { + "message": "Карыстальніцкія фільтры хутка вернуцца. Даведайцеся больш у нашым блогу" + }, "options_empty_custom_filter": { "message": "У вас пакуль няма карыстальніцкіх фільтраў" }, @@ -222,6 +261,9 @@ "options_popup_import_error_required_privacy_permission": { "message": "Каб імпартаваць гэты файл налад, дазвольце AdGuard змяніць налады, звязаныя з прыватнасцю." }, + "options_popup_import_success_title": { + "message": "Налады імпартованы" + }, "options_popup_import_error_title": { "message": "Не ўдалося імпартаваць налады" }, @@ -240,15 +282,27 @@ "popup_site_filtering_state_loading": { "message": "Запампоўка..." }, + "popup_site_filtering_state_enabling": { + "message": "Уключэнне абароны..." + }, "popup_site_filtering_state_enabled": { "message": "Абарона ўключана" }, + "popup_site_filtering_state_disabling": { + "message": "Адключэнне абароны..." + }, "popup_site_filtering_state_disabled": { "message": "Абарона адключана" }, + "popup_site_filtering_state_pausing": { + "message": "Прыпынак абароны..." + }, "popup_site_filtering_state_paused": { "message": "Абарона прыпынена" }, + "popup_site_filtering_state_resuming": { + "message": "Вяртанне абароны..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "для ўсіх сайтаў" }, @@ -258,6 +312,9 @@ "popup_tab_blocked_count": { "message": "Заблакіравана: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Усяго заблакіравана: %num%" + }, "popup_statistics_total": { "message": "Усяго" }, @@ -369,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "ДАДАТКОВАЯ ІНФАРМАЦЫЯ" }, + "popup_block_site_ads_option": { + "message": "Заблакаваць рэкламу ўручную" + }, "popup_security_report": { "message": "Справаздача пра бяспеку сайта" }, + "popup_reset_page_user_rules": { + "message": "Выдаліць карыстніцкія правілы для гэтага сайта" + }, + "context_block_site_ads": { + "message": "Заблакаваць рэкламу ўручную" + }, "context_security_report": { "message": "Справаздача пра бяспеку сайта" }, "context_complaint_website": { "message": "Паведаміць пра праблему" }, + "context_site_filtering_disabled": { + "message": "AdGuard не можа адфільтраваць гэтую старонку" + }, "context_disable_protection": { "message": "Прыпыніць абарону AdGuard" }, @@ -417,6 +486,9 @@ "filters_download_loading": { "message": "Калі ласка, пачакайце ідзе запампоўка базы фільтраў..." }, + "post_install_loading": { + "message": "Загрузка пашырэння..." + }, "filtering_modal_element": { "message": "Элемент:" }, @@ -435,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Пошук па ўкладках" }, + "filtering_log_preserve_log_off": { + "message": "Не запісваць журнал" + }, + "filtering_log_preserve_log_on": { + "message": "Запіс журнала" + }, "filtering_refresh_tab_short": { "message": "Абнавіць" }, @@ -462,6 +540,9 @@ "filtering_table_filter": { "message": "Фільтр" }, + "filtering_table_empty_reload_page_desc": { + "message": "Нічога не знойдзена. Адключыце фільтры<\/reset> або абнавіце старонку<\/refresh>, каб праглядаць запісы журнала." + }, "filtering_modal_info_title": { "message": "Інфармацыя пра запыт" }, @@ -480,6 +561,9 @@ "filtering_modal_rules": { "message": "Правілы:" }, + "filtering_modal_privacy": { + "message": "Абарона ад сачэння:" + }, "filtering_modal_filter": { "message": "Фільтр:" }, @@ -507,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Статус:" }, + "filtering_modal_status_text_error": { + "message": "Не ўдалося загрузіць папярэдні прагляд. Паспрабуйце яшчэ раз" + }, "filtering_modal_status_text_loading": { "message": "Запампоўка..." }, @@ -603,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Блакіраваць пошукавую рэкламу і самарэкламу сайтаў" }, + "options_block_acceptable_ads_desc": { + "message": "Выдаліць самарэкламныя аб'явы з вэб-сайтаў і кантэкстныя аб'явы з вынікаў пошуку. Даведайцеся больш<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Паказваць колькасць заблакіраванай рэкламы на значку AdGuard" }, "options_enable_autodetect_filter": { "message": "Аўтаматычна падключаць найболей прыдатныя фільтры" }, + "options_enable_autodetect_filter_desc": { + "message": "Фільтры для пэўных моў будуць ўключаны ў залежнасці ад мовы сайта" + }, "options_select_theme": { "message": "Тэма" }, @@ -648,12 +741,24 @@ "options_set_update_interval": { "message": "Аўтаматычнае абнаўленне фільтраў" }, + "options_set_update_interval_desc": { + "message": "Для больш эфектыўнага блакавання фільтры трэба рэгулярна абнаўляць" + }, "options_userfilter_export": { "message": "Экспарт" }, "options_editor_save": { "message": "Захаваць" }, + "options_editor_leave_title": { + "message": "Пакінуць без захавання?" + }, + "options_editor_leave_confirm": { + "message": "Так, пакінуць" + }, + "options_editor_leave_cancel": { + "message": "Назад да рэдагавання" + }, "options_userfilter_import": { "message": "Імпарт" }, @@ -663,6 +768,15 @@ "options_userfilter_subtitle_key": { "message": "Выкарыстоўваць правілы для больш дакладнай блакавання" }, + "options_userfilter_line_break_off": { + "message": "Перанос радка: Адключана" + }, + "options_userfilter_line_break_on": { + "message": "Перанос радка: Уключана" + }, + "options_userfilter_leave_subtitle": { + "message": "Вашы змены ў правілах будуць страчаны" + }, "options_open_changelog": { "message": "Спіс змен" }, @@ -693,15 +807,40 @@ "options_rule_limits": { "message": "Абмежаванні правілаў" }, + "options_rule_limits_description": { + "message": "Браўзер абмяжоўвае колькасць правілаў, якія могуць быць ужыты" + }, "options_rule_limits_dynamic": { "message": "Дынамічныя правілы" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Карыстніцкія правілы, такія як карыстніцкія правілы<\/user_rules>, вэб-сайты ў белым спісе<\/allowlist>, карыстніцкія фільтры<\/custom_filters> і фільтры хуткай фіксацыі<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Небяспечныя дынамічныя правілы (выкарыстоўваюцца для некаторых прасунутых мадзіфікатараў, такіх як $$redirect або $$cookie) — уключаны ў правілы, дададзеныя карыстальнікам" + }, + "options_rule_limits_dynamic_regex": { + "message": "Правілы рэгулярных выразаў — уключаны ў правілы, дададзеныя карыстальнікам" + }, "options_rule_limits_static_rulesets": { "message": "Статычныя наборы правілаў" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Убудаваныя фільтры<\/a>, такія як Блакаваць надакучлівасці або Фільтры для пэўных моў" + }, "options_rule_limits_static_rules": { "message": "Статычныя правілы" }, + "options_rule_limits_static_rules_all": { + "message": "Правілы з убудаваных фільтраў<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Правілы рэгулярных выразаў — уключаны ў вышэй" + }, + "options_rule_limits_numbers": { + "message": "%current% з %maximum%" + }, "options_rule_limits_warning_title": { "message": "Браўзер змяніў спіс актыўных фільтраў" }, @@ -720,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "Вашы магчымыя дзеянні" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Варыянт 1. Выдаліце з браўзера непатрэбныя пашырэнні, якія блакіруюць рэкламу. Каб паўторна актываваць фільтры, згаданыя ў раздзеле \"Фільтры, уключаныя перад абнаўленнем\", націсніце паўторна актываваць фільтры.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Варыянт 2. Усталюйце праграму AdGuard Ad Blocker: яна не мае абмежаванняў па правілах фільтрацыі. Атрымайце праграму AdGuard<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Варыянт 3. Калі вы задаволены ўключаным у цяперашні час фільтрам, закрыйце гэтае папярэджанне.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Варыянт 3. Калі вы задаволены ўключанымі ў цяперашні час фільтрамі, закрыйце гэтае папярэджанне.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Вы дасягнулі ліміту актыўных убудаваных правілаў. Ваш браўзер змяніў спіс актыўных убудаваных фільтраў. Колькасць уключаных фільтраў змянілася з %expected% на %current%." + }, + "options_limits_warning_static_filters": { + "message": "Вы дасягнулі ліміту актыўных убудаваных фільтраў. %maximum% з %current% фільтраў уключана. Каб актываваць новыя правілы, адключыце некаторыя ўбудаваныя фільтры." + }, + "options_limits_warning_static_rules": { + "message": "Вы дасягнулі ліміту актыўных убудаваных правілаў. %maximum% з %current% правілаў уключана. Каб актываваць новыя правілы, адключыце некаторыя ўбудаваныя фільтры." + }, + "options_limits_warning_static_regex_rules": { + "message": "Вы дасягнулі ліміту актыўных правілаў рэгулярных выразаў. %maximum% з %current% правілаў рэгулярных выразаў уключана. Каб актываваць новыя правілы, адключыце некаторыя ўбудаваныя фільтры." + }, + "options_limits_warning_dynamic_rules": { + "message": "Вы дасягнулі ліміту правілаў, дададзеных карыстальнікам. %maximum% з %current% правілаў уключана." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Вы дасягнулі мяжы карыстальніцкіх небяспечных правілаў. %maximum% з %current% небяспечных правілаў актыўныя." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Вы дасягнулі ліміту правілаў рэгулярных выразаў, дададзеных карыстальнікам. %maximum% з %current% правілаў рэгулярных выразаў уключана." + }, "options_show_adguard_full_version_title": { "message": "Паказваць інфармацыю аб поўнай версіі AdGuard" }, @@ -747,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Дапамагаць у распрацоўцы фільтраў AdGuard" }, + "options_collect_hit_stats_desc": { + "message": "Адпраўляйце ананімную статыстыку выкарыстання рэкламных фільтраў<\/a>, гэта дапаможа нам палепшыць і аптымізаваць іх." + }, "options_show_context_menu_title": { "message": "Дадаць AdGuard у кантэкстнае меню браўзера" }, @@ -759,15 +934,27 @@ "options_privacy_title": { "message": "Абарона ад сачэння" }, + "options_privacy_desc": { + "message": "Абараніце сваёй асабістыя звесткі ад тысяч інтэрнэт-трэкераў, заблакіраваўшы найбольш папулярныя спосабы адсочвання" + }, "options_hide_referrer_title": { "message": "Схаваць Referrer ад старонніх рэсурсаў" }, + "options_hide_referrer_desc": { + "message": "Не дазваляйце староннім рэсурсам ведаць, які вэб-сайт вы наведваеце" + }, "options_hide_search_queries_title": { "message": "Схаваць пошукавыя запыты" }, + "options_hide_search_queries_desc": { + "message": "Схавайце запыты да сайтаў, наведаных з пошукавай сістэмы" + }, "options_send_not_track_title": { "message": "Папрасіце вэб-сайты не адсочваць вас" }, + "options_send_not_track_desc": { + "message": "Адпраўляйце сігналы Global Privacy Control<\/gpc> і Do Not Track<\/dnt> на сайты, якія вы наведваеце" + }, "options_stripped_tracking_parameters": { "message": "Параметры адсочвання выдалены" }, @@ -780,21 +967,39 @@ "options_remove_client_data_title": { "message": "Выдаліць загаловак X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "Блакаваць адпраўку браўзарам Google Chrome інфармацыі аб версіі і змяненнях на дамены Google" + }, "options_disable_webrtc_title": { "message": "Адключыць WebRTC" }, + "options_disable_webrtc_desc": { + "message": "Праз WebRTC можа вызначаны ваш IP-адрас, нават калі вы выкарыстоўваеце проксі-сервер ці VPN. Адключэнне WebRTC можа прывесці да паломкі некаторых ўэб-сайтаў" + }, "options_strip_tracking_params_title": { "message": "Выдаляць параметры адсочвання" }, + "options_strip_tracking_params_description": { + "message": "Выдаленне параметраў з вэб-запытаў з дапамогай фільтра адсочвання URL AdGuard" + }, "options_block_known_trackers_title": { "message": "Блакіраваць трэкеры" }, + "options_block_known_trackers_description": { + "message": "Блакіраваць трэкеры і інструменты вэб-аналітыкі з дапамогай фільтра абароны ад адсочвання AdGuard" + }, "options_third_party_title": { "message": "Самазнішчэнне старонніх файлаў cookie" }, + "options_third_party_desc": { + "message": "Абмежаваць час існавання пабочнымі файламі cookie (хвілін)" + }, "options_first_party_title": { "message": "Самазнішчэнне асноўных файлаў cookies (не рэкамендуецца)" }, + "options_first_party_desc": { + "message": "Абмежаваць час існавання асноўнымі файламі cookie (хвілін)" + }, "popup_abuse_site": { "message": "Паведаміць пра праблему" }, @@ -822,6 +1027,12 @@ "popup_switch_button": { "message": "Пераключэнне абароны" }, + "popup_limits_exceeded_warning": { + "message": "Ваш браўзер змяніў спіс актыўных убудаваных фільтраў" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Ліміт правілаў перавышаны ў пашырэнні AdGuard для браўзера. Праверце свае фільтры і адключыце тыя, якія вам не патрэбны" + }, "short_name": { "message": "AdGuard" }, @@ -861,12 +1072,39 @@ "options_about_title": { "message": "Браўзернае пашырэнне AdGuard" }, + "group_description_adblocking": { + "message": "Наладзьце блакаванне рэкламы, каб раз і назаўжды пазбыцца надакучлівых банараў, усплыўных вокнаў, відэарэкламы і іншых раздражняльнікаў" + }, + "group_description_stealth": { + "message": "Абараніце асабістыя звесткі ад анлайн-трэкераў, заблакаваўшы ўсе вядомыя папулярныя метады асочвання" + }, + "group_description_social": { + "message": "Схавайце непатрэбныя кнопкі «Падабаецца», «Падзяліцца» і іншыя віджэты сацыяльных сетак" + }, + "group_description_annoyances": { + "message": "Прыбярыце ўсплыўныя вокны і іншыя раздражняльныя апавяшчэнні, напрыклад апавяшчэнні пра файлы cookie" + }, + "group_description_security": { + "message": "Абараніце сябе ад шкодных праграм, фішынгу і іншых анлайн-пагроз" + }, + "group_description_miscellaneous": { + "message": "Дадатковыя налады, каб зрабіць ўэб-сёрфінг яшчэ зручнейшым з дапамогай AdGuard" + }, "group_description_custom": { "message": "Стварайце свае фільтры, каб яшчэ больш дэталёва наладзіць вэб-фільтрацыю пад сябе." }, + "group_description_lang": { + "message": "Не абмяжоўвайце сябе — блакуйце рэкламу на сайтах на ўсякіх мовах" + }, "fullscreen_user_rules_title": { "message": "Карыстальніцкі фільтр" }, + "options_user_rules_editor_stub_title": { + "message": "Рэдактар адкрыты ў іншым акне" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Вашы правілы з'явяцца тут пасля таго, як вы яго зачыніце" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Перайсці ў рэдактар" }, @@ -900,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Паўтарыць спробу" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Толькі ўнутраныя запыты" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Запыты трэцяй бок" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Запыты, апрацаваныя без фільтрацыі" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Дазволеныя і разблакіраваныя запыты" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Заблакіраваныя запыты" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Змененыя запыты" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Запыты, на якія ўплываюць карыстніцкія правілы" + }, "filtering_log_tag_tooltip_html": { "message": "Дакументы і паддакументы" }, @@ -918,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Медыа" }, + "filtering_log_tag_tooltip_other": { + "message": "Шрыфты, пінгі, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Старонні запыт" }, @@ -927,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "Код стану HTTP" }, + "filtering_log_assumed_rule_description": { + "message": "Гэта прапанаванае правіла. Для падрабязнай інфармацыі глядзіце нашу Ведамасную базу<\/a>" + }, "options_stealth_general_title": { "message": "Агульныя" }, @@ -936,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "Рознае" }, + "options_coming_soon": { + "message": "Хутка" + }, "blocking_pages_malware": { "message": "Гэтая старонка на %host%<\/strong> была адзначана як старонка са шкодным ПЗ. Яна была заблакіравана ў адпаведнасці з вашымі наладамі бяспекі." }, @@ -974,5 +1242,20 @@ }, "close_button_title": { "message": "Закрыць" + }, + "filtering_modal_applied_rules": { + "message": "| Прымянёнае правіла: | Прымянёныя правілы: | Прымянёныя правілы:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Прадпалагаемае правіла: | Прадпалагаемыя правілы: | Прадпалагаемыя правілы:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Арыгінальнае правіла: | Арыгінальныя правілы: | Арыгінальныя правілы:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "DNR правіла:" } } \ No newline at end of file diff --git a/Extension/_locales/bg/messages.json b/Extension/_locales/bg/messages.json index b9eb03397c..9178e0d40d 100644 --- a/Extension/_locales/bg/messages.json +++ b/Extension/_locales/bg/messages.json @@ -32,12 +32,18 @@ "options_filters_annoyances_consent_enable_button": { "message": "Включи" }, + "popup_header_cta_link": { + "message": "Как да подобрите защитата" + }, "popup_header_update_filters": { "message": "Провери за актуализации на филтрите" }, "options_popup_import_settings_wrong_file_ext": { "message": "Разширението на файла трябва да бъде %extension%" }, + "popup_resume_protection_button": { + "message": "Продължи" + }, "popup_adguard_for_ios": { "message": "AdGuard за iOS" }, @@ -56,6 +62,9 @@ "options_popup_version_update_disable_notification": { "message": "Деактивиране на известията" }, + "popup_adguard_footer_title": { + "message": "Защити твоето устройство" + }, "options_popup_call_to_action": { "message": "Въведете валиден URL или файлов път на филтъра в полето по-горе." }, @@ -83,9 +92,27 @@ "options_add_custom_filter_modal_title": { "message": "Добави персонализиран филтър" }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Проверка на вашия филтър..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Неуспешно добавяне на външен филтър" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "Моля, опитайте отново или се свържете с поддръжката" + }, + "options_add_custom_filter_modal_add_button": { + "message": "ДОБАВИ" + }, + "options_add_custom_filter_modal_filter_name": { + "message": "Име на филтъра:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Доверен" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "Някои правила за филтриране могат значително да променят вашето преживяване при сърфиране и да компрометират вашата приватност. Убедете се, че използвате само филтри от разработчици, на които се доверявате" + }, "options_popup_try_again_button": { "message": "Опитай пак" }, @@ -123,21 +150,39 @@ "options_allowlist": { "message": "Списък с разрешения" }, + "options_allowlist_desc": { + "message": "AdGuard не филтрира уебсайтове от списъка с разрешения" + }, "options_allowlist_invert": { "message": "Инвертиране на списъка с разрешения" }, + "options_allowlist_invert_desc": { + "message": "Отблокирайте рекламите навсякъде, освен в списъка с разрешения" + }, "options_allowlist_alert_invert": { "message": "Allowlist е обърнат. Рекламите се блокират само в уебсайтове, добавени в него. Деактивиране на<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Вашите промени в списъка с разрешения ще бъдат изгубени" + }, "options_userfilter": { "message": "Потребителски филтър" }, "filtering_log_modified_rules": { "message": "Изменени правила: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "Правила за защита при проследяване: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Защита от проследяване" + }, "filtering_log_in_allowlist": { "message": "Сайтът е разрешен" }, + "filtering_log_hide_referrer": { + "message": "Препратки, скрити от трети страни" + }, "filtering_log_hide_search_queries": { "message": "Вашите заявки за търсене са скрити" }, @@ -192,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "Вие избирате да се доверите на този филтър" }, + "options_filters_info_mv3_total_rules": { + "message": "Общ брой правила: %num%" + }, "options_add_custom_filter": { "message": "Добавете персонализиран филтър" }, + "options_filters_custom_disabled_cws": { + "message": "Персонализираните филтри скоро ще се върнат. Научете повече в нашия блог" + }, "options_empty_custom_filter": { "message": "Все още нямате персонализирани филтри" }, @@ -210,6 +261,12 @@ "options_popup_import_error_required_privacy_permission": { "message": "За да импортирате този файл с настройки, позволете на AdGuard да променя настройките, свързани с поверителността." }, + "options_popup_import_success_title": { + "message": "Настройките са импортирани" + }, + "options_popup_import_error_title": { + "message": "Неуспешно импортиране на настройки" + }, "options_popup_import_error_file_description": { "message": "Нещо се обърка" }, @@ -225,15 +282,27 @@ "popup_site_filtering_state_loading": { "message": "Зареждане..." }, + "popup_site_filtering_state_enabling": { + "message": "Активиране на защитата..." + }, "popup_site_filtering_state_enabled": { "message": "Защитата е активирана" }, + "popup_site_filtering_state_disabling": { + "message": "Деактивиране на защитата..." + }, "popup_site_filtering_state_disabled": { "message": "Защитата е деактивирана" }, + "popup_site_filtering_state_pausing": { + "message": "Пауза на защитата..." + }, "popup_site_filtering_state_paused": { "message": "Защитата е на пауза" }, + "popup_site_filtering_state_resuming": { + "message": "Възстанови защитата..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "за всички уебсайтове" }, @@ -243,12 +312,30 @@ "popup_tab_blocked_count": { "message": "Блокирани: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Общо блокирани: %num%" + }, "popup_statistics_total": { "message": "Общо" }, "popup_statistics_all_categories": { "message": "All" }, + "popup_statistics_category_advertising": { + "message": "Реклама" + }, + "popup_statistics_category_trackers": { + "message": "Тракери" + }, + "popup_statistics_category_social_media": { + "message": "Социална медия" + }, + "popup_statistics_category_cdn": { + "message": "CDN" + }, + "popup_statistics_category_other": { + "message": "Друго" + }, "popup_statistics_week_days_mon": { "message": "Пон" }, @@ -339,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "НАУЧЕТЕ ПОВЕЧЕ" }, + "popup_block_site_ads_option": { + "message": "Блокирайте реклами ръчно" + }, "popup_security_report": { "message": "Проверка на сигурността на уебсайта" }, + "popup_reset_page_user_rules": { + "message": "Премахни потребителските правила за този уебсайт" + }, + "context_block_site_ads": { + "message": "Блокирайте реклами ръчно" + }, "context_security_report": { "message": "Проверка на сигурността на уебсайта" }, "context_complaint_website": { "message": "Съобщи за проблем" }, + "context_site_filtering_disabled": { + "message": "AdGuard не може да филтрира тази страница" + }, "context_disable_protection": { "message": "Пауза на защитата AdGuard" }, @@ -387,6 +486,9 @@ "filters_download_loading": { "message": "Моля, изчакайте, докато базата данни с филтри се зарежда..." }, + "post_install_loading": { + "message": "Зареждане на разширение..." + }, "filtering_modal_element": { "message": "Елемент:" }, @@ -405,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Търсене в разделите" }, + "filtering_log_preserve_log_off": { + "message": "Не записвайте дневник" + }, + "filtering_log_preserve_log_on": { + "message": "Записвай дневник" + }, "filtering_refresh_tab_short": { "message": "Обнови" }, @@ -432,6 +540,9 @@ "filtering_table_filter": { "message": "Филтър" }, + "filtering_table_empty_reload_page_desc": { + "message": "Нищо не е намерено. Деактивирайте филтрите<\/reset> или презаредете страницата<\/refresh>, за да видите log записите." + }, "filtering_modal_info_title": { "message": "Детайли за запитването" }, @@ -450,6 +561,9 @@ "filtering_modal_rules": { "message": "Правила:" }, + "filtering_modal_privacy": { + "message": "Защита от проследяване:" + }, "filtering_modal_filter": { "message": "Филтър:" }, @@ -477,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Статус:" }, + "filtering_modal_status_text_error": { + "message": "Неуспешно зареждане на прегледа. Моля, опитайте отново" + }, "filtering_modal_status_text_loading": { "message": "Зареждане..." }, @@ -573,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Блокиране на реклами за търсене и самореклама на уебсайтове" }, + "options_block_acceptable_ads_desc": { + "message": "Премахнете само-промоционалните реклами от уебсайтове и контекстуални реклами от резултатите от търсенето. Научете повече<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Покажи броят наблокираните реклами наиконата на AdGuard" }, "options_enable_autodetect_filter": { "message": "Автоматично активиране на най-подходящите филтри" }, + "options_enable_autodetect_filter_desc": { + "message": "Специфичните за езика филтри ще се включат в зависимост от езика на сайта" + }, "options_select_theme": { "message": "Тема" }, @@ -603,6 +726,9 @@ "options_leave_feedback": { "message": "Оставете обратна връзка" }, + "options_privacy": { + "message": "Защита от проследяване" + }, "options_update_antibanner_filters": { "message": "Провери за актуализации" }, @@ -615,18 +741,42 @@ "options_set_update_interval": { "message": "Интервал за актуализиране на филтрите" }, + "options_set_update_interval_desc": { + "message": "За по-ефективно блокиране, филтрите трябва да се актуализират редовно" + }, "options_userfilter_export": { "message": "Експортирай" }, "options_editor_save": { "message": "Запази" }, + "options_editor_leave_title": { + "message": "Да напуснете без запазване?" + }, + "options_editor_leave_confirm": { + "message": "Да, напусни" + }, + "options_editor_leave_cancel": { + "message": "Обратно към редактиране" + }, "options_userfilter_import": { "message": "Импортирай" }, "options_userfilter_description_key": { "message": "Можете да добавите свои собствени правила тук. Тази опция се препоръчва за напреднали потребители, които са запознати с HTML\/CSS. Прочетете ръководството за правила за филтриране<\/a>, за да научите как да напишете свои собствени правила за филтриране." }, + "options_userfilter_subtitle_key": { + "message": "Усъвършенствайте блокирането на реклами с вашите собствени правила за филтриране" + }, + "options_userfilter_line_break_off": { + "message": "Прекъсване на реда: Изключен" + }, + "options_userfilter_line_break_on": { + "message": "Прекъсване на реда: Включен" + }, + "options_userfilter_leave_subtitle": { + "message": "Вашите промени по правилата ще бъдат изгубени" + }, "options_open_changelog": { "message": "Дневник на промените" }, @@ -651,18 +801,46 @@ "options_miscellaneous_settings": { "message": "Допълнителни настройки" }, + "options_rule_syntax": { + "message": "Синтаксис на правилото" + }, "options_rule_limits": { "message": "Ограничения на правилата" }, + "options_rule_limits_description": { + "message": "Chrome ограничава броя на правилата, които могат да се прилагат" + }, "options_rule_limits_dynamic": { "message": "Динамични правила" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Добавени от потребителя правила, като например потребителски правила<\/user_rules>, уебсайтове с разрешен списък<\/allowlist>, персонализирани филтри<\/custom_filters>, и филтър за бързи корекции<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Опасни динамични правила (използвани за някои разширени модификатори, като $$redirect или $$cookie) — включени в правилата, добавени от потребителя" + }, + "options_rule_limits_dynamic_regex": { + "message": "Правила с регулярни изрази — включени в правилата, добавени от потребителя" + }, "options_rule_limits_static_rulesets": { "message": "Набори от статични правила" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Вградени филтри<\/a>, като блокиране на досадни неща или езиково специфични филтри" + }, "options_rule_limits_static_rules": { "message": "Статични правила" }, + "options_rule_limits_static_rules_all": { + "message": "Правила от вградените филтри<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Правила на Regex (включени в горното)" + }, + "options_rule_limits_numbers": { + "message": "%current% от %maximum%" + }, "options_rule_limits_warning_title": { "message": "Браузърът е променил списъка с активните филтри" }, @@ -681,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "Вашите възможни действия" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Вариант 1. Изтрийте ненужните разширения за блокиране на реклами от браузъра си. За да активирате отново филтрите, посочени в раздела \"Филтри, активирани преди актуализацията\", щракнете повторно активиране на филтрите.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Вариант 2. Инсталирайте приложението AdGuard Ad Blocker: то няма ограничения за правилата за филтриране. Вземете AdGuard Ad Blocker<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Вариант 3. Ако сте доволни от текущо активирания филтър, затворете това предупреждение.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Вариант 3. Ако сте доволни от текущо активираните филтри, затворете това предупреждение.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Достигнали сте лимита на активните вградени правила. Вашият браузър е променил списъка с активни вградени филтри. Броят на активираните филтри се е променил от %expected% на %current%." + }, + "options_limits_warning_static_filters": { + "message": "Достигнали сте лимита на активните вградени филтри. %maximum% от %current% филтри са активирани. За да активирате нови правила, деактивирайте някои вградени филтри." + }, + "options_limits_warning_static_rules": { + "message": "Достигнали сте лимита на активните вградени правила. %maximum% от %current% правила са активирани. За да активирате нови правила, деактивирайте някои вградени филтри." + }, + "options_limits_warning_static_regex_rules": { + "message": "Достигнали сте лимита на активните вградени правила на regex. %maximum% от %current% правила на regex са активирани. За да активирате нови правила, деактивирайте някои вградени филтри." + }, + "options_limits_warning_dynamic_rules": { + "message": "Достигнали сте лимита на правила, добавени от потребителя. %maximum% от %current% правила са активирани." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Достигнали сте лимита на добавените от потребителя небезопасни правила. %maximum% от %current% небезопасни правила са активирани." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Достигнали сте лимита на правилата на regex, добавени от потребителя. %maximum% от %current% правила на regex са активирани." + }, "options_show_adguard_full_version_title": { "message": "Показване на информация за пълната версия на AdGuard" }, @@ -708,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Помощ при разработването на филтри на AdGuard" }, + "options_collect_hit_stats_desc": { + "message": "Изпратете анонимна статистика за използването на рекламни филтри<\/a>, за да помогнете на AdGuard да подобри своите филтри" + }, "options_show_context_menu_title": { "message": "Добавяне на елемент AdGuard в контекстното меню на браузъра" }, @@ -717,15 +931,30 @@ "options_use_optimized_filters_desc": { "message": "Използва по-кратки версии на филтри само с най-популярните правила, за да спести трафик. По-подходящ за мобилни браузъри" }, + "options_privacy_title": { + "message": "Защита от проследяване" + }, + "options_privacy_desc": { + "message": "Защитете своята идентичност и чувствителна лична информация от хиляди онлайн проследяващи, като блокирате най-популярните методи за проследяване" + }, "options_hide_referrer_title": { "message": "Скрива Referer от странични ресурси" }, + "options_hide_referrer_desc": { + "message": "Предотвратете трети страни да знаят какъв уебсайт посещавате" + }, "options_hide_search_queries_title": { "message": "Скриване на вашите заявки за търсене" }, + "options_hide_search_queries_desc": { + "message": "Скривайте заявките за посетени уебсайтове от търсачката" + }, "options_send_not_track_title": { "message": "Помолете уебсайтовете да не ви проследяват" }, + "options_send_not_track_desc": { + "message": "Изпратете Global Privacy Control<\/gpc> и Do Not Track<\/dnt> сигнали до уебсайтовете, които посещавате" + }, "options_stripped_tracking_parameters": { "message": "Параметрите за проследяване са премахнати" }, @@ -738,21 +967,39 @@ "options_remove_client_data_title": { "message": "Премахнете заглавката на X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "Блокирайте Google Chrome да изпраща информация за своята версия и модификации до домейни на Google" + }, "options_disable_webrtc_title": { "message": "Блокирайте WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC може да разкрие вашия истински IP адрес, дори ако използвате прокси или VPN. Деактивирането на WebRTC може да наруши работата на някои уебсайтове." + }, "options_strip_tracking_params_title": { "message": "Премахване на параметрите за проследяване" }, + "options_strip_tracking_params_description": { + "message": "Премахнете параметрите от уеб заявки с филтъра за проследяване на URL на AdGuard" + }, "options_block_known_trackers_title": { "message": "Блокиране на тракери" }, + "options_block_known_trackers_description": { + "message": "Блокирайте проследяващите и инструментите за уеб анализ с филтъра „Защита на AdGuard срещу проследяване“" + }, "options_third_party_title": { "message": "Самоунищожаващи се бисквитки на трети страни" }, + "options_third_party_desc": { + "message": "Ограничете живота на бисквитките на трети страни (минути)" + }, "options_first_party_title": { "message": "Самоунищожаващи се бисквитки от първа страна (не се препоръчва)" }, + "options_first_party_desc": { + "message": "Ограничете живота на първите бисквитки (минути)" + }, "popup_abuse_site": { "message": "Докладване за проблем" }, @@ -780,6 +1027,12 @@ "popup_switch_button": { "message": "Защитен превключвател" }, + "popup_limits_exceeded_warning": { + "message": "Вашият браузър е променил списъка с активни вградени филтри" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Лимитът на правилата е надвишен в разширението на браузъра AdGuard. Моля, проверете филтрите си и деактивирайте тези, от които нямате нужда" + }, "short_name": { "message": "AdGuard" }, @@ -819,12 +1072,39 @@ "options_about_title": { "message": "Разширение на браузъра AdGuard" }, + "group_description_adblocking": { + "message": "Конфигурирайте блокирането на реклами тук, за да се справите с досадните банери, изскачащи прозорци, видео реклами и други подобни, веднъж завинаги" + }, + "group_description_stealth": { + "message": "Защитете самоличността си и чувствителната си лична информация от хиляди онлайн проследяващи устройства, като блокирате всички известни популярни методи за проследяване." + }, + "group_description_social": { + "message": "Скрийте нежеланите бутони \"Харесвам\"\/\"Сподели\" и други уиджети на социални медии" + }, + "group_description_annoyances": { + "message": "Премахнете изскачащите прозорци и други досадни известия като известията за бисквитки" + }, + "group_description_security": { + "message": "Защитете се от зловреден софтуер, фишинг и други онлайн заплахи" + }, + "group_description_miscellaneous": { + "message": "Още настройки за допълнително конфигуриране на сърфирането в интернет с AdGuard" + }, "group_description_custom": { "message": "Създайте свои собствени филтри, за да настроите филтрирането на уеб според предпочитанията си." }, + "group_description_lang": { + "message": "Не се ограничавайте — блокирайте рекламите на сайтове на всякакви езици" + }, "fullscreen_user_rules_title": { "message": "Потребителски филтър" }, + "options_user_rules_editor_stub_title": { + "message": "Редакторът се отвори в друг прозорец" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Вашите правила ще се появят тук, след като го затворите" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Отидете при редактора" }, @@ -858,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Опитай пак" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Заявки от първа страна" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Заявки от трета страна" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Заявки, обработени без филтриране" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Разрешени и отблокирани заявки" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Блокирани заявки" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Модифицирани заявки" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Заявки, повлияни от потребителските правила" + }, "filtering_log_tag_tooltip_html": { "message": "Документи и поддокументи" }, @@ -876,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Медия" }, + "filtering_log_tag_tooltip_other": { + "message": "Шрифтове, пингове, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Заявка от трета страна" }, @@ -885,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "Код на състоянието на HTTP" }, + "filtering_log_assumed_rule_description": { + "message": "Това е примерно правило. За подробности, вижте нашата база знания<\/a>" + }, "options_stealth_general_title": { "message": "General" }, @@ -894,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "Разни" }, + "options_coming_soon": { + "message": "Очаквайте скоро" + }, "blocking_pages_malware": { "message": "Тази уеб страница в %host%<\/strong> е докладвана като страница със зловреден софтуер и е блокирана въз основа на вашите предпочитания за сигурност." }, @@ -932,5 +1242,20 @@ }, "close_button_title": { "message": "Затвори" + }, + "filtering_modal_applied_rules": { + "message": "| Прилагано правило: | Прилагани правила:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Примерно правило: | Примерни правила:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Оригинално правило: | Оригинални правила:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "DNR правило:" } } \ No newline at end of file diff --git a/Extension/_locales/ca/messages.json b/Extension/_locales/ca/messages.json index c15b344858..49a7b9f2a1 100644 --- a/Extension/_locales/ca/messages.json +++ b/Extension/_locales/ca/messages.json @@ -89,9 +89,30 @@ "options_popup_check_false_description": { "message": "Error en afegir el teu filtre personalitzat." }, + "options_add_custom_filter_modal_title": { + "message": "Afegir filtre personalitzat" + }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Comprovant el teu filtre..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "No s'ha pogut afegir el filtre personalitzat" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "Si us plau, torneu-ho a provar o poseu-vos en contacte amb el suport" + }, + "options_add_custom_filter_modal_add_button": { + "message": "Afegir" + }, + "options_add_custom_filter_modal_filter_name": { + "message": "Nom del filtre:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Confiable" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "Algunes regles de filtratge poden alterar significativament la vostra experiència de navegació i comprometre la vostra privadesa. Assegureu-vos d'utilitzar només filtres de desenvolupadors de confiança" + }, "options_popup_try_again_button": { "message": "Intenta-ho de nou" }, @@ -129,15 +150,33 @@ "options_allowlist": { "message": "Llista de permesos" }, + "options_allowlist_desc": { + "message": "AdGuard no filtra llocs web de la llista blanca" + }, "options_allowlist_invert": { "message": "Inverteix la llista de permesos" }, + "options_allowlist_invert_desc": { + "message": "Desbloqueu anuncis a tot arreu excepte a la llista blanca" + }, + "options_allowlist_alert_invert": { + "message": "Llista blanca invertida. Els anuncis es bloquegen només en pàgines web afegides a ella. Desactiveu<\/a>" + }, + "options_allowlist_leave_subtitle": { + "message": "Els vostres canvis a la llista blanca es perdran" + }, "options_userfilter": { "message": "Utilitzeu el filtre" }, "filtering_log_modified_rules": { "message": "Regles modificades: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "Regles de protecció de rastreig: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Protecció de rastreig aplicada" + }, "filtering_log_in_allowlist": { "message": "El lloc està permès" }, @@ -198,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "Vas decidir confiar en aquest filtre." }, + "options_filters_info_mv3_total_rules": { + "message": "Regles totals: %num%" + }, "options_add_custom_filter": { "message": "Afegir filtre personalitzat" }, + "options_filters_custom_disabled_cws": { + "message": "Els filtres personalitzats tornaran aviat. Apreneu més al nostre bloc" + }, "options_empty_custom_filter": { "message": "Encara no teniu cap filtre personalitzat" }, @@ -213,6 +258,15 @@ "options_editor_indicator_saved": { "message": "Guardat" }, + "options_popup_import_error_required_privacy_permission": { + "message": "Per a importar aquest fitxer de configuració, permeteu a AdGuard canviar les configuracions relacionades amb la vostra privadesa." + }, + "options_popup_import_success_title": { + "message": "Les configuracions s'han importat" + }, + "options_popup_import_error_title": { + "message": "Error a importar la configuració" + }, "options_popup_import_error_file_description": { "message": "Alguna cosa ha anat malament." }, @@ -225,27 +279,54 @@ "popup_site_filtering_state_secure_page": { "message": "Pàgina segura" }, + "popup_site_filtering_state_loading": { + "message": "Carregant..." + }, + "popup_site_filtering_state_enabling": { + "message": "Activant la protecció..." + }, "popup_site_filtering_state_enabled": { "message": "Protecció està activada" }, + "popup_site_filtering_state_disabling": { + "message": "Desactivant la protecció..." + }, "popup_site_filtering_state_disabled": { "message": "La protecció està desactivada" }, + "popup_site_filtering_state_pausing": { + "message": "Pausa de la protecció..." + }, "popup_site_filtering_state_paused": { "message": "La protecció està en pausa" }, + "popup_site_filtering_state_resuming": { + "message": "Reprendrà la protecció..." + }, + "popup_site_filtering_state_subtitle_all_websites": { + "message": "per a tots els llocs web" + }, "popup_site_exception_information": { "message": "El filtratge està desactivat perquè pot interferir amb el funcionament d'aquest lloc web." }, "popup_tab_blocked_count": { "message": "Bloquejat: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Total bloquejat: %num%" + }, "popup_statistics_total": { "message": "Total" }, + "popup_statistics_all_categories": { + "message": "Tots" + }, "popup_statistics_category_advertising": { "message": "Publicitat" }, + "popup_statistics_category_trackers": { + "message": "Rastrejadors" + }, "popup_statistics_category_social_media": { "message": "Mitjans socials" }, @@ -345,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "APRÈN MÉS" }, + "popup_block_site_ads_option": { + "message": "Bloquegeu anuncis manualment" + }, "popup_security_report": { "message": "Comproveu la seguretat del lloc web" }, + "popup_reset_page_user_rules": { + "message": "Elimineu les regles d'usuari per aquesta pàgina" + }, + "context_block_site_ads": { + "message": "Bloquegeu anuncis manualment" + }, "context_security_report": { "message": "Comproveu la seguretat del lloc web" }, "context_complaint_website": { "message": "Informar d’un problema" }, + "context_site_filtering_disabled": { + "message": "AdGuard no pot filtrar aquesta pàgina" + }, "context_disable_protection": { "message": "Atureu la protecció d'AdGuard" }, @@ -366,6 +459,9 @@ "context_open_settings": { "message": "Opcions d'AdGuard" }, + "context_open_log": { + "message": "Registre del filtratge" + }, "context_site_exception": { "message": "Aquesta pàgina web es troba a les excepcions" }, @@ -390,6 +486,9 @@ "filters_download_loading": { "message": "Espereu mentre es carrega la base de dades de filtres..." }, + "post_install_loading": { + "message": "S'està carregant l'extensió..." + }, "filtering_modal_element": { "message": "Element:" }, @@ -408,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Cerca en pestanyes" }, + "filtering_log_preserve_log_off": { + "message": "No registrar registres" + }, + "filtering_log_preserve_log_on": { + "message": "Registrar registres" + }, "filtering_refresh_tab_short": { "message": "Refrescar" }, @@ -435,6 +540,9 @@ "filtering_table_filter": { "message": "Filtre" }, + "filtering_table_empty_reload_page_desc": { + "message": "No s'ha trobat res. Desactiveu filtres<\/reset> o recarregueu la pàgina<\/refresh> per veure els registres." + }, "filtering_modal_info_title": { "message": "Detalls de la petició" }, @@ -453,6 +561,9 @@ "filtering_modal_rules": { "message": "Regles:" }, + "filtering_modal_privacy": { + "message": "Protecció de rastreig:" + }, "filtering_modal_filter": { "message": "Filtre:" }, @@ -480,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Estat:" }, + "filtering_modal_status_text_error": { + "message": "No s'ha pogut carregar l'aperíu. Si us plau, torneu-ho a intentar" + }, "filtering_modal_status_text_loading": { "message": "Carregant..." }, @@ -546,21 +660,60 @@ "filtering_log_filter_allowed": { "message": "Permès" }, + "filtering_log_filter_blocked": { + "message": "Bloquejat" + }, + "filtering_log_filter_modified": { + "message": "Modificat" + }, + "filtering_log_filter_user_rules": { + "message": "Regles de l'usuari" + }, "filtering_log_status_processed": { "message": "Processat" }, + "filtering_log_status_allowed": { + "message": "Permès" + }, + "filtering_log_status_blocked": { + "message": "Bloquejat" + }, + "filtering_log_status_modified": { + "message": "Modificat" + }, "options_settings": { "message": "Opcions d'AdGuard" }, "options_general_settings": { "message": "Opcions generals" }, + "options_block_acceptable_ads": { + "message": "Bloquejar anuncis de cerca i l'auto-promoció dels llocs web" + }, + "options_block_acceptable_ads_desc": { + "message": "Eliminar anuncis d'auto-promoció de llocs web i anuncis contextuals dels resultats de cerca. Aprendre més<\/a>" + }, + "options_show_blocked_ads_count_title": { + "message": "Indiqueu a la icona el nombre d'anuncis de publicitat filtrats per l'extensió AdGuard" + }, "options_enable_autodetect_filter": { "message": "Activeu els filtres més adequats automàticament" }, + "options_enable_autodetect_filter_desc": { + "message": "Els filtres específics de llenguatge s'activaran depenent de la llengua del lloc" + }, + "options_select_theme": { + "message": "Tema" + }, "options_theme_selector_system": { "message": "Per defecte del sistema" }, + "options_theme_selector_light": { + "message": "Clar" + }, + "options_theme_selector_dark": { + "message": "Fosc" + }, "options_export_settings": { "message": "Exportar configuracions" }, @@ -570,36 +723,175 @@ "options_report_bug": { "message": "Informa d'un error" }, + "options_leave_feedback": { + "message": "Deixar comentari" + }, + "options_privacy": { + "message": "Protecció de seguiment" + }, "options_update_antibanner_filters": { "message": "Busqueu actualitzacions per els filtres" }, "options_check_update": { "message": "Comprovar si hi ha actualitzacions" }, + "options_check_update_progress": { + "message": "Comprovar..." + }, "options_set_update_interval": { "message": "Actualitza automàticament els filtres" }, + "options_set_update_interval_desc": { + "message": "Per a un bloqueig més efectiu, els filtres han de ser actualitzats regularment" + }, "options_userfilter_export": { "message": "Exporteu" }, + "options_editor_save": { + "message": "Desar" + }, + "options_editor_leave_title": { + "message": "Sortir sense desar?" + }, + "options_editor_leave_confirm": { + "message": "Sí, sortir" + }, + "options_editor_leave_cancel": { + "message": "Tornar a editar" + }, "options_userfilter_import": { "message": "Importeu" }, + "options_userfilter_subtitle_key": { + "message": "Ajusteu el bloqueig d'anuncis amb les vostres pròpies regles de filtratge" + }, + "options_userfilter_line_break_off": { + "message": "Salt de línia: Desactivat" + }, + "options_userfilter_line_break_on": { + "message": "Salt de línia: Activat" + }, + "options_userfilter_leave_subtitle": { + "message": "Els vostres canvis a les regles es perdran" + }, "options_open_changelog": { "message": "Registre de canvis" }, "options_safebrowsing_enabled": { "message": "Protecció contra la pesca electrònica i el programari maliciós" }, + "options_safebrowsing_enabled_desc": { + "message": "Activeu el mòdul de seguretat de navegació d'AdGuard que detecta llocs potencialment maliciosos i de phishing comprovant-los amb una base de dades en línia. Llegeix més<\/a>" + }, "options_site": { "message": "Pàgina web oficial" }, "options_discuss": { "message": "Parleu sobre AdGuard" }, + "options_do_you_like_question": { + "message": "Us agrada AdGuard?" + }, + "options_footer_like_us_cta": { + "message": "Valoreu-nos!" + }, "options_miscellaneous_settings": { "message": "Configuracions addicionals" }, + "options_rule_syntax": { + "message": "Sintaxi de regla" + }, + "options_rule_limits": { + "message": "Límits de regles" + }, + "options_rule_limits_description": { + "message": "Chrome limita el nombre de regles que poden aplicar-se" + }, + "options_rule_limits_dynamic": { + "message": "Regles dinàmiques" + }, + "options_rule_limits_dynamic_user_rules": { + "message": "Regles afegides per l'usuari, com ara regles d'usuari<\/user_rules>, pàgines web a la llista blanca<\/allowlist>, filtres personalitzats<\/custom_filters>, i Filtre de solucions ràpides<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Regles dinàmiques insegures (utilitzades per a alguns modificadors avançats, com ara $$redirect o $$cookie) — incloses en regles afegides per l'usuari" + }, + "options_rule_limits_dynamic_regex": { + "message": "Regles regex — incloses en regles afegides pels usuaris" + }, + "options_rule_limits_static_rulesets": { + "message": "Regles estàtiques" + }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Filtres integrats<\/a>, com ara Bloqueja molèsties o Filtres específics de llenguatge" + }, + "options_rule_limits_static_rules": { + "message": "Regles estàtiques" + }, + "options_rule_limits_static_rules_all": { + "message": "Regles de filtres integrats<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Regles Regex — incloses en l'anterior" + }, + "options_rule_limits_numbers": { + "message": "%current% de %maximum%" + }, + "options_rule_limits_warning_title": { + "message": "El navegador ha modificat la llista de filtres actius" + }, + "options_rule_limits_warning_explanation_title": { + "message": "Què ha passat?" + }, + "options_rule_limits_warning_explanation_description": { + "message": "El límit de regles integrades actives es va superar després d'una actualització o d'afegir una nova extensió. D'acord amb Manifest V3, el teu navegador Chrome va reaccionar desactivant tots els filtres integrats de l'extensió excepte els predeterminats." + }, + "options_rule_limits_warning_list_enabled_before_title": { + "message": "Filtres activats abans de l'actualització" + }, + "options_rule_limits_warning_list_enabled_now_title": { + "message": "Filtres activats ara" + }, + "options_rule_limits_warning_actions_title": { + "message": "Les teves possibles accions" + }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Opció 1. Elimineu extensions de bloqueig d'anuncis innecessàries del vostre navegador. Per reactivar els filtres esmentats a la secció \"Filtres habilitats abans de l'actualització\", feu clic reactivar filtres.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Opció 2. Instal·leu l'aplicació AdGuard Ad Blocker: no té restriccions sobre les regles de filtratge. Obteniu l'aplicació AdGuard<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Opció 3. Si esteu satisfets amb el filtre predeterminat actualment habilitat, tanca aquesta advertència.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Opció 3. Si esteu satisfets amb els filtres predeterminats actualment habilitats, tanca aquesta advertència.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Heu arribat al límit de regles integrades actives. El vostre navegador ha modificat la llista de filtres integrats actius. El nombre de filtres habilitats ha canviat de %expected% a %current%." + }, + "options_limits_warning_static_filters": { + "message": "Heu arribat al límit de filtres integrats actius. %maximum% de %current% filtres estan habilitats. Per activar noves regles, desactiveu alguns filtres integrats." + }, + "options_limits_warning_static_rules": { + "message": "Heu arribat al límit de regles integrades actives. %maximum% de %current% regles estan habilitades. Per activar noves regles, desactiveu alguns filtres integrats." + }, + "options_limits_warning_static_regex_rules": { + "message": "Heu arribat al límit de regles Regex integrades actives. %maximum% de %current% regles Regex estan habilitades. Per activar noves regles, desactiveu alguns filtres integrats." + }, + "options_limits_warning_dynamic_rules": { + "message": "Heu arribat al límit de regles afegides per l'usuari. %maximum% de %current% regles estan habilitades." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Heu arribat al límit de les regles insegures afegides per l'usuari. %maximum% de %current% regles insegures estan habilitades." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Heu arribat al límit de regles Regex afegides per l'usuari. %maximum% de %current% regles Regex estan habilitades." + }, + "options_show_adguard_full_version_title": { + "message": "Mostreu la informació a la versió completa d'AdGuard" + }, "options_show_app_updated_notification": { "message": "Notificar sobre actualitzacions d'extensions" }, @@ -615,21 +907,51 @@ "options_reset_settings": { "message": "Restablir configuració" }, + "options_reset_settings_done": { + "message": "Les configuracions s'han restablert" + }, + "options_reset_settings_error": { + "message": "Error al restablir les configuracions" + }, + "options_collect_hit_stats_title": { + "message": "Ajuda amb el desenvolupament dels filtres d'AdGuard" + }, + "options_collect_hit_stats_desc": { + "message": "Envieu estadístiques anònimes sobre l'ús del filtre d'anuncis<\/a> per ajudar AdGuard a millorar els seus filtres" + }, + "options_show_context_menu_title": { + "message": "Afegiu l'element AdGuard al menú contextual del navegador web" + }, "options_use_optimized_filters": { "message": "Utilitzeu filtres optimitzats" }, "options_use_optimized_filters_desc": { "message": "Utilitza versions més curtes de filtres amb només les regles més populars per estalviar trànsit. Més adequat per a navegadors mòbils" }, + "options_privacy_title": { + "message": "Protecció de seguiment" + }, + "options_privacy_desc": { + "message": "Protegeixi la seva identitat i informació personal sensible de milers de rastrejadors en línia bloquejant els mètodes de rastreig més populars" + }, "options_hide_referrer_title": { "message": "Ocultar el Referer de tercers" }, + "options_hide_referrer_desc": { + "message": "Eviti que tercers sàpiguen quin lloc web està visitant" + }, "options_hide_search_queries_title": { "message": "Amagueu les vostres cerques" }, + "options_hide_search_queries_desc": { + "message": "Amagueu les consultes dels llocs web visitats d'un motor de cerca" + }, "options_send_not_track_title": { "message": "Envia la capçalera Do-Not-Track" }, + "options_send_not_track_desc": { + "message": "Envieu les senyals de Control de privadesa global<\/gpc> i No rastrejar<\/dnt> als llocs web que visiteu" + }, "options_stripped_tracking_parameters": { "message": "S'han suprimit els paràmetres de seguiment" }, @@ -642,18 +964,39 @@ "options_remove_client_data_title": { "message": "Elimina la capçalera X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "Bloquegeu Google Chrome perquè no enviï informació de versió i modificacions als dominis de Google" + }, "options_disable_webrtc_title": { "message": "Bloca WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC pot filtrar la vostra adreça IP fins i tot si feu servir un servidor intermediari o una VPN. Desactivar WebRTC pot trencar alguns llocs web" + }, "options_strip_tracking_params_title": { "message": "Elimina els paràmetres de seguiment" }, + "options_strip_tracking_params_description": { + "message": "Elimineu els paràmetres de les sol·licituds web amb el filtre de seguiment d'URL d'AdGuard" + }, + "options_block_known_trackers_title": { + "message": "Bloquejar rastrejadors" + }, + "options_block_known_trackers_description": { + "message": "Bloquegeu rastrejadors i eines d'analítica web amb el filtre de protecció de rastreig d'AdGuard" + }, "options_third_party_title": { "message": "Autodestrucció de les galetes de tercers" }, + "options_third_party_desc": { + "message": "Limiteu la vida útil de les galetes de tercers (minuts)" + }, "options_first_party_title": { "message": "Autodestrucció de les galetes del domini (no recomanat)" }, + "options_first_party_desc": { + "message": "Limiteu la vida útil de les galetes del domini (minuts)" + }, "popup_abuse_site": { "message": "Informar d’un problema" }, @@ -681,6 +1024,12 @@ "popup_switch_button": { "message": "Commutador de protecció" }, + "popup_limits_exceeded_warning": { + "message": "El vostre navegador ha modificat la llista de filtres incorporats actius." + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Límit de regles superat en l'extensió del navegador AdGuard. Comproveu els vostres filtres i desactiveu els que no necessiteu" + }, "short_name": { "message": "AdGuard" }, @@ -702,9 +1051,57 @@ "options_copyright": { "message": "Tots els drets reservats." }, + "options_remove_filter_confirm_modal_title": { + "message": "Eliminar aquest filtre?" + }, + "options_remove_filter_confirm_modal_ok_button": { + "message": "Elimina" + }, + "options_nav_better_than_extension": { + "message": "Per què l'aplicació AdGuard és millor que l'extensió?" + }, + "options_nav_compare": { + "message": "Comparar" + }, "options_filters_search": { "message": "Búsqueda" }, + "options_about_title": { + "message": "Extensió del navegador AdGuard" + }, + "group_description_adblocking": { + "message": "Configureu el bloqueig d'anuncis aquí per gestionar banners molests, finestres emergents, anuncis de vídeo i més, d'una vegada per totes" + }, + "group_description_stealth": { + "message": "Protegiu la vostra identitat i informació personal sensible de milers de rastrejadors en línia bloquejant tots els mètodes de rastreig més coneguts i populars" + }, + "group_description_social": { + "message": "Amagueu botons de \"M'agrada\"\/\"Compartir\" i altres widgets de xarxes socials no desitjats" + }, + "group_description_annoyances": { + "message": "Eliminar finestres emergents i altres notificacions molestes com les notificacions de cookies" + }, + "group_description_security": { + "message": "Protegiu-vos contra malware, phishing i altres amenaces en línia" + }, + "group_description_miscellaneous": { + "message": "Més configuracions per configurar encara més la vostra navegació web amb AdGuard" + }, + "group_description_custom": { + "message": "Creeu els vostres propis filtres per ajustar el filtratge web a les vostres preferències." + }, + "group_description_lang": { + "message": "No us limiteu: bloquegeu anuncis a llocs web en qualsevol idioma" + }, + "fullscreen_user_rules_title": { + "message": "Regles de l'usuari" + }, + "options_user_rules_editor_stub_title": { + "message": "Editor obert en una altra finestra" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Les vostres regles apareixeran aquí després que la tanqueu" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Aneu a l'editor" }, @@ -714,6 +1111,9 @@ "options_editor_close_fullscreen_button_tooltip": { "message": "Sortiu del mode finestra" }, + "options_clear_stats_confirm_modal_title": { + "message": "Netejar estadístiques?" + }, "options_clear_stats_confirm_modal_clear_button": { "message": "Neteja" }, @@ -735,6 +1135,27 @@ "filtering_log_details_modal_try_again": { "message": "Intenta-ho de nou" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Sol·licituds de primera part" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Sol·licituds de tercers" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Sol·licituds processades sense filtratge" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Sol·licituds permeses i desbloquejades" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Sol·licituds bloquejades" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Sol·licituds modificades" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Sol·licituds afectades per regles d'usuari" + }, "filtering_log_tag_tooltip_html": { "message": "Documents i subdocuments" }, @@ -753,6 +1174,9 @@ "filtering_log_tag_tooltip_media": { "message": "Mitjans de comunicació" }, + "filtering_log_tag_tooltip_other": { + "message": "Fonts, pings, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Sol·licitud de tercers" }, @@ -762,6 +1186,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "Codi d'estat HTTP" }, + "filtering_log_assumed_rule_description": { + "message": "Aquesta és una regla assumida. Per a més detalls, consulteu la nostra Base de coneixements<\/a>" + }, "options_stealth_general_title": { "message": "General" }, @@ -771,6 +1198,9 @@ "options_stealth_miscellaneous_title": { "message": "Miscel·lània" }, + "options_coming_soon": { + "message": "Properament" + }, "blocking_pages_malware": { "message": "Aquesta pàgina web a %host%<\/strong> s'ha informat com a pàgina de programari maliciós i s'ha bloquejat segons les vostres preferències de seguretat." }, @@ -809,5 +1239,20 @@ }, "close_button_title": { "message": "Tancar" + }, + "filtering_modal_applied_rules": { + "message": "| Regla aplicada: | Regles aplicades:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Regla assumida: | Regles assumides:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Regla original: | Regles originals:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "Regla DNR:" } -} \ No newline at end of file +} diff --git a/Extension/_locales/de/messages.json b/Extension/_locales/de/messages.json index ff06203bf2..93d720a259 100644 --- a/Extension/_locales/de/messages.json +++ b/Extension/_locales/de/messages.json @@ -1004,7 +1004,7 @@ "message": "Fehler melden" }, "popup_open_filtering_log": { - "message": "Filter-Protokoll öffnen" + "message": "Filterungsprotokoll öffnen" }, "popup_tab_actions": { "message": "Aktionen" @@ -1013,7 +1013,7 @@ "message": "Statistiken" }, "popup_statistics_time_day": { - "message": "Letzte 24 Stunden" + "message": "Letzter Tag" }, "popup_statistics_time_week": { "message": "Letzte Woche" @@ -1073,7 +1073,7 @@ "message": "AdGuard Browsererweiterung" }, "group_description_adblocking": { - "message": "Sperren von Werbung konfigurieren, um lästige Banner, Pop-ups und Werbung in Videos zu entfernen" + "message": "Blockieren von Werbung konfigurieren, um störende Banner, Pop-ups und Werbung in Videos zu entfernen" }, "group_description_stealth": { "message": "Schützt Ihre Identität und sensible persönliche Daten vor Tausenden von Online-Trackern, indem es alle bekannten und beliebten Tracking-Methoden sperrt" @@ -1094,7 +1094,7 @@ "message": "Eigene Filter erstellen, um die Webfilterung nach Ihren Wünschen zu optimieren." }, "group_description_lang": { - "message": "Lassen Sie sich nicht einschränken — sperren Sie Werbung auf Websites in allen Sprachen" + "message": "Sie können Werbung auf Websites in allen Sprachen blockieren" }, "fullscreen_user_rules_title": { "message": "Benutzerregeln" @@ -1106,7 +1106,7 @@ "message": "Nach dem Schließen des Editors werden Ihre Regeln hier angezeigt" }, "options_user_rules_editor_stub_go_to_editor_button": { - "message": "Zum Editor wechseln" + "message": "Zum Editor" }, "options_editor_open_fullscreen_button_tooltip": { "message": "Editor in neuem Fenster öffnen" @@ -1169,22 +1169,22 @@ "message": "Skripts" }, "filtering_log_tag_tooltip_xhr": { - "message": "XMLHttpRequests und Abrufanforderungen" + "message": "XMLHttpRequests- und Fetch-Anfragen" }, "filtering_log_tag_tooltip_img": { - "message": "Grafiken" + "message": "Bilder" }, "filtering_log_tag_tooltip_media": { "message": "Medien" }, "filtering_log_tag_tooltip_other": { - "message": "Schriftarten, Pings, WebRTC, WebSocket ..." + "message": "Schriftarten, Pings, WebRTC, WebSocket..." }, "filtering_log_badge_tooltip_third_party": { "message": "Anfrage von Drittanbieter" }, "filtering_log_badge_tooltip_http_req_method": { - "message": "HTTP-Anforderungsmethode" + "message": "HTTP-Anfragemethode" }, "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP-Statuscode" @@ -1205,10 +1205,10 @@ "message": "Demnächst verfügbar" }, "blocking_pages_malware": { - "message": "Diese Webseite unter %host%<\/strong> wurde als Webseite gemeldet die Malware enthält und wurde aufgrund Ihrer Sicherheitseinstellungen gesperrt." + "message": "Diese Website unter %host%<\/strong> wurde als Malware-Seite gemeldet und aufgrund Ihrer Sicherheitseinstellungen blockiert." }, "blocking_pages_phishing": { - "message": "Diese Webseite unter %host%<\/strong> wurde als Phishing-Seite gemeldet und gemäß Ihren Sicherheitseinstellungen gesperrt." + "message": "Diese Website unter %host%<\/strong> wurde als Phishing-Seite gemeldet und aufgrund Ihrer Sicherheitseinstellungen blockiert." }, "blocking_pages_advanced_button": { "message": "Erweitert" @@ -1235,10 +1235,10 @@ "message": "Trotzdem fortfahren" }, "text_collapser_show_default": { - "message": "Vollständigen Text anzeigen" + "message": "Volltext anzeigen" }, "text_collapser_hide_default": { - "message": "Vollständigen Text ausblenden" + "message": "Volltext ausblenden" }, "close_button_title": { "message": "Schließen" diff --git a/Extension/_locales/el/messages.json b/Extension/_locales/el/messages.json index 35676669f1..32b84be599 100644 --- a/Extension/_locales/el/messages.json +++ b/Extension/_locales/el/messages.json @@ -17,6 +17,9 @@ "options_antibanner_custom_filter_already_exists": { "message": "Αυτό το προσαρμοσμένο φίλτρο έχει ήδη προστεθεί" }, + "options_filters_annoyances_consent_title": { + "message": "Διαβάστε προσεκτικά πριν ενεργοποιήσετε τα φίλτρα ενοχλήσεων" + }, "options_filters_annoyances_consent_description": { "message": "Πρόκειται να ενεργοποιήσετε ένα ή περισσότερα φίλτρα ενόχλησης. Αποκλείουν στοιχεία που είτε δεν σχετίζονται με το περιεχόμενο του ιστότοπου είτε σχετίζονται αλλά ενοχλούν την εμπειρία χρήστη σας. Οι ιδιοκτήτες ιστότοπων ενδέχεται να θεωρούν αυτά τα στοιχεία υποχρεωτικά: εάν τα αποκλείσετε, ενδέχεται να παραβιάζετε τους όρους τους. Ορισμένες λειτουργίες των ιστότοπων ενδέχεται να μην είναι διαθέσιμες ή να μην λειτουργούν σωστά. Κατανοείτε και συμφωνείτε ότι είστε αποκλειστικά υπεύθυνοι για τη συμμόρφωση με τους όρους χρήσης των ιστότοπων που επισκέπτεστε και ότι η AdGuard δεν είναι υπεύθυνη για τη συμμόρφωσή σας με τους όρους χρήσης των ιστότοπων που επισκέπτεστε." }, @@ -29,6 +32,9 @@ "options_filters_annoyances_consent_enable_button": { "message": "Ενεργοποίηση" }, + "popup_header_cta_link": { + "message": "Πώς να ενισχύσετε την προστασία" + }, "popup_header_update_filters": { "message": "Έλεγχος για ενημερώσεις φίλτρων" }, @@ -56,6 +62,9 @@ "options_popup_version_update_disable_notification": { "message": "Απενεργοποίηση ειδοποιήσεων" }, + "popup_adguard_footer_title": { + "message": "Προστατέψτε την κινητή σας συσκευή" + }, "options_popup_call_to_action": { "message": "Εισάγετε μια έγκυρη διεύθυνση URL ή τη διαδρομή αρχείου του φίλτρου στο ανωτέρω πεδίο." }, @@ -83,9 +92,27 @@ "options_add_custom_filter_modal_title": { "message": "Προσθήκη προσαρμοσμένου φίλτρου" }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Έλεγχος του φίλτρου σας..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Αποτυχία προσθήκης προσαρμοσμένου φίλτρου" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "Παρακαλώ προσπαθήστε ξανά ή επικοινωνήστε με την υποστήριξη" + }, + "options_add_custom_filter_modal_add_button": { + "message": "Προσθήκη" + }, + "options_add_custom_filter_modal_filter_name": { + "message": "Όνομα φίλτρου:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Έμπιστο" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "Ορισμένοι κανόνες φιλτραρίσματος μπορούν να αλλοιώσουν σημαντικά την εμπειρία πλοήγησής σας και να διακυβεύσουν την ιδιωτικότητά σας. Βεβαιωθείτε ότι χρησιμοποιείτε μόνο φίλτρα από προγραμματιστές που εμπιστεύεστε" + }, "options_popup_try_again_button": { "message": "Δοκιμάστε ξανά" }, @@ -123,18 +150,33 @@ "options_allowlist": { "message": "Επιτρεπόμενη λίστα" }, + "options_allowlist_desc": { + "message": "Το AdGuard δεν φιλτράρει ιστότοπους από τη λίστα επιτρεπόμενων" + }, "options_allowlist_invert": { "message": "Αντιστροφή της λίστας επιτρεπόμενων" }, + "options_allowlist_invert_desc": { + "message": "Κατάργηση αποκλεισμού διαφημίσεων παντού εκτός από τη λίστα επιτρεπόμενων" + }, "options_allowlist_alert_invert": { "message": "Η λίστα επιτρεπόμενων είναι ανεστραμμένη. Οι διαφημίσεις αποκλείονται μόνο σε ιστότοπους που προστίθενται εδώ. Απενεργοποίηση<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Οι αλλαγές σας στη λίστα επιτρεπόμενων θα χαθούν" + }, "options_userfilter": { "message": "Κανόνες χρήστη" }, "filtering_log_modified_rules": { "message": "Τροποποιημένοι κανόνες: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "Κανόνες προστασίας παρακολούθησης: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Η προστασία παρακολούθησης εφαρμόστηκε" + }, "filtering_log_in_allowlist": { "message": "Η ιστοσελίδα επιτρέπεται" }, @@ -195,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "Επιλέξατε να εμπιστευτείτε αυτό το φίλτρο" }, + "options_filters_info_mv3_total_rules": { + "message": "Σύνολο κανόνων: %num%" + }, "options_add_custom_filter": { "message": "Προσθήκη προσαρμοσμένου φίλτρου" }, + "options_filters_custom_disabled_cws": { + "message": "Τα προσαρμοσμένα φίλτρα θα επανέλθουν σύντομα. Μάθετε περισσότερα στο blog μας" + }, "options_empty_custom_filter": { "message": "Δεν έχετε προσαρμοσμένα φίλτρα ακόμα" }, @@ -210,6 +258,15 @@ "options_editor_indicator_saved": { "message": "Αποθηκεύτηκε" }, + "options_popup_import_error_required_privacy_permission": { + "message": "Για να εισαγάγετε αυτό το αρχείο ρυθμίσεων, επιτρέψτε στο AdGuard να αλλάξει τις ρυθμίσεις σας που σχετίζονται με την ιδιωτικότητα." + }, + "options_popup_import_success_title": { + "message": "Εισαγωγή ρυθμίσεων" + }, + "options_popup_import_error_title": { + "message": "Αποτυχία εισαγωγής ρυθμίσεων" + }, "options_popup_import_error_file_description": { "message": "Κάτι πήγε στραβά" }, @@ -222,15 +279,30 @@ "popup_site_filtering_state_secure_page": { "message": "Ασφαλής σελίδα" }, + "popup_site_filtering_state_loading": { + "message": "Φόρτωση..." + }, + "popup_site_filtering_state_enabling": { + "message": "Ενεργοποίηση προστασίας..." + }, "popup_site_filtering_state_enabled": { "message": "Η προστασία είναι ενεργοποιημένη" }, + "popup_site_filtering_state_disabling": { + "message": "Απενεργοποίηση προστασίας..." + }, "popup_site_filtering_state_disabled": { "message": "Η προστασία είναι απενεργοποιημένη" }, + "popup_site_filtering_state_pausing": { + "message": "Παύση προστασίας..." + }, "popup_site_filtering_state_paused": { "message": "Η προστασία τέθηκε σε παύση" }, + "popup_site_filtering_state_resuming": { + "message": "Συνέχιση προστασίας..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "για όλες τις ιστοσελίδες" }, @@ -240,6 +312,9 @@ "popup_tab_blocked_count": { "message": "Αποκλείστηκαν: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Σύνολο αποκλεισμένων: %num%" + }, "popup_statistics_total": { "message": "Συνολικά" }, @@ -351,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "ΜΑΘΕΤΕ ΠΕΡΙΣΣΟΤΕΡΑ" }, + "popup_block_site_ads_option": { + "message": "Αποκλείστε τις διαφημίσεις χειροκίνητα" + }, "popup_security_report": { "message": "Αναφορά ασφάλειας ιστότοπου" }, + "popup_reset_page_user_rules": { + "message": "Διαγραφή κανόνων χρήστη για αυτόν τον ιστότοπο" + }, + "context_block_site_ads": { + "message": "Αποκλείστε τις διαφημίσεις χειροκίνητα" + }, "context_security_report": { "message": "Αναφορά ασφάλειας ιστότοπου" }, "context_complaint_website": { "message": "Αναφέρετε ένα πρόβλημα" }, + "context_site_filtering_disabled": { + "message": "Το AdGuard δεν μπορεί να φιλτράρει αυτήν τη σελίδα" + }, "context_disable_protection": { "message": "Παύση προστασίας AdGuard" }, @@ -399,6 +486,9 @@ "filters_download_loading": { "message": "Περιμένετε όσο φορτώνεται η βάση δεδομένων φίλτρων..." }, + "post_install_loading": { + "message": "Φόρτωση επέκτασης..." + }, "filtering_modal_element": { "message": "Στοιχείο:" }, @@ -417,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Αναζήτηση σε καρτέλες" }, + "filtering_log_preserve_log_off": { + "message": "Μην καταγράφετε το αρχείο καταγραφής" + }, + "filtering_log_preserve_log_on": { + "message": "Καταγράψτε το αρχείο καταγραφής" + }, "filtering_refresh_tab_short": { "message": "Ανανέωση" }, @@ -444,6 +540,9 @@ "filtering_table_filter": { "message": "Φίλτρο" }, + "filtering_table_empty_reload_page_desc": { + "message": "Δεν βρέθηκε τίποτα. Απενεργοποιήστε τα φίλτρα<\/reset> ή ανανεώστε τη σελίδα<\/refresh> για να δείτε τις καταγραφές." + }, "filtering_modal_info_title": { "message": "Λεπτομέρειες σύνδεσης" }, @@ -462,6 +561,9 @@ "filtering_modal_rules": { "message": "Κανόνες:" }, + "filtering_modal_privacy": { + "message": "Προστασία από καταγραφή:" + }, "filtering_modal_filter": { "message": "Φίλτρο:" }, @@ -489,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Κατάσταση:" }, + "filtering_modal_status_text_error": { + "message": "Απέτυχε να φορτώσει την προεπισκόπηση. Παρακαλώ προσπαθήστε ξανά" + }, "filtering_modal_status_text_loading": { "message": "Φόρτωση..." }, @@ -585,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Αποκλεισμός διαφημίσεων αναζήτησης και αυτοπροβολή των ιστοσελίδων" }, + "options_block_acceptable_ads_desc": { + "message": "Αφαιρέστε τις αυτοπροωθούμενες διαφημίσεις από τους ιστότοπους και τις συγκείμενες διαφημίσεις από τα αποτελέσματα αναζήτησης. Μάθετε περισσότερα<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Υπόδειξη του αριθμού των αποκλεισμένων διαφημίσεων στο εικονίδιο επέκτασης AdGuard" }, "options_enable_autodetect_filter": { "message": "Αυτόματη ενεργοποίηση των πιο κατάλληλων φίλτρων" }, + "options_enable_autodetect_filter_desc": { + "message": "Τα φίλτρα που σχετίζονται με τη γλώσσα θα ενεργοποιηθούν ανάλογα με τη γλώσσα του ιστότοπου" + }, "options_select_theme": { "message": "Θέμα" }, @@ -630,18 +741,42 @@ "options_set_update_interval": { "message": "Αυτόματη ενημέρωση φίλτρων" }, + "options_set_update_interval_desc": { + "message": "Για πιο αποτελεσματικό αποκλεισμό, τα φίλτρα πρέπει να ενημερώνονται τακτικά" + }, "options_userfilter_export": { "message": "Εξαγωγή" }, "options_editor_save": { "message": "Αποθήκευση" }, + "options_editor_leave_title": { + "message": "Θέλετε να φύγετε χωρίς αποθήκευση;" + }, + "options_editor_leave_confirm": { + "message": "Ναι, αποχώρηση" + }, + "options_editor_leave_cancel": { + "message": "Επιστροφή στην επεξεργασία" + }, "options_userfilter_import": { "message": "Εισαγωγή" }, "options_userfilter_description_key": { "message": "Μπορείτε να προσθέσετε τους δικούς σας κανόνες εδώ. Αυτή η επιλογή συνιστάται για προχωρημένους χρήστες εξοικειωμένους με HTML\/CSS. Διαβάστε τον οδηγό κανόνων φίλτρου<\/a> για να μάθετε πώς να γράφετε τους δικούς σας κανόνες φίλτρου." }, + "options_userfilter_subtitle_key": { + "message": "Ρυθμίστε την αποκλειστική διαφήμιση με τους δικούς σας κανόνες φιλτραρίσματος" + }, + "options_userfilter_line_break_off": { + "message": "Διακοπή γραμμής: Ανενεργή" + }, + "options_userfilter_line_break_on": { + "message": "Διακοπή γραμμής: Ενεργή" + }, + "options_userfilter_leave_subtitle": { + "message": "Οι αλλαγές σας στους κανόνες θα χαθούν" + }, "options_open_changelog": { "message": "Αρχείο αλλαγών" }, @@ -666,18 +801,46 @@ "options_miscellaneous_settings": { "message": "Επιπρόσθετες ρυθμίσεις" }, + "options_rule_syntax": { + "message": "Σύνταξη κανόνα" + }, "options_rule_limits": { "message": "Όρια κανόνων" }, + "options_rule_limits_description": { + "message": "Ο Chrome περιορίζει τον αριθμό των κανόνων που μπορούν να εφαρμοστούν" + }, "options_rule_limits_dynamic": { "message": "Δυναμικοί κανόνες" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Κανόνες που προστέθηκαν από χρήστες, όπως κανόνες χρήστη<\/user_rules>, ιστότοποι που επιτρέπονται<\/allowlist>, προσαρμοσμένα φίλτρα<\/custom_filters> και φίλτρο γρήγορων διορθώσεων<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Μη ασφαλείς δυναμικοί κανόνες (χρησιμοποιούνται για ορισμένα κανόνες που προστέθηκαν από τον χρήστη, όπως $$redirect ή $$cookie) — συμπεριλαμβάνονται στους κανόνες που προστέθηκαν από τον χρήστη" + }, + "options_rule_limits_dynamic_regex": { + "message": "Κανόνες Regex — περιλαμβάνονται στους κανόνες που έχουν προστεθεί από τον χρήστη" + }, "options_rule_limits_static_rulesets": { "message": "Στατικά σύνολα κανόνων" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Ενσωματωμένα φίλτρα<\/a>, όπως το Block annoyances ή φίλτρα που σχετίζονται με τη γλώσσα" + }, "options_rule_limits_static_rules": { "message": "Στατικοί κανόνες" }, + "options_rule_limits_static_rules_all": { + "message": "Κανόνες από ενσωματωμένα φίλτρα<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Κανόνες Regex — περιλαμβάνονται στα παραπάνω" + }, + "options_rule_limits_numbers": { + "message": "%current% από %maximum%" + }, "options_rule_limits_warning_title": { "message": "Το πρόγραμμα περιήγησης έχει τροποποιήσει τη λίστα των ενεργών φίλτρων" }, @@ -696,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "Οι πιθανές σας ενέργειες" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Επιλογή 1. Διαγράψτε τις περιττές επεκτάσεις αποκλεισμού διαφημίσεων από το πρόγραμμα περιήγησής σας. Για να επανενεργοποιήσετε τα φίλτρα που αναφέρθηκαν στην ενότητα \"Φίλτρα που ενεργοποιήθηκαν πριν από την ενημέρωση\", κάντε κλικ επανενεργοποιήστε τα φίλτρα.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Επιλογή 2. Εγκαταστήστε την εφαρμογή AdGuard Ad Blocker: δεν έχει περιορισμούς στους κανόνες φιλτραρίσματος. Αποκτήστε την εφαρμογή AdGuard<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Επιλογή 3. Εάν είστε ικανοποιημένοι με το ενεργοποιημένο προεπιλεγμένο φίλτρο, κλείστε αυτή την προειδοποίηση.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Επιλογή 3. Εάν είστε ικανοποιημένοι με τα ενεργοποιημένα προεπιλεγμένα φίλτρα, κλείστε αυτή την προειδοποίηση.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Έχετε φτάσει το όριο των ενεργών ενσωματωμένων κανόνων. Το πρόγραμμα περιήγησής σας έχει τροποποιήσει τη λίστα των ενεργών ενσωματωμένων φίλτρων. Ο αριθμός των ενεργοποιημένων φίλτρων έχει αλλάξει από %expected% σε %current%." + }, + "options_limits_warning_static_filters": { + "message": "Έχετε φτάσει το όριο των ενεργών ενσωματωμένων φίλτρων. %maximum% από %current% φίλτρα είναι ενεργοποιημένα. Για να ενεργοποιήσετε νέους κανόνες, απενεργοποιήστε ορισμένα ενσωματωμένα φίλτρα." + }, + "options_limits_warning_static_rules": { + "message": "Έχετε φτάσει το όριο των ενεργών ενσωματωμένων κανόνων. %maximum% από %current% κανόνες είναι ενεργοποιημένοι. Για να ενεργοποιήσετε νέους κανόνες, απενεργοποιήστε ορισμένα ενσωματωμένα φίλτρα." + }, + "options_limits_warning_static_regex_rules": { + "message": "Έχετε φτάσει το όριο των ενεργών regex κανόνων. %maximum% από %current% regex κανόνες είναι ενεργοποιημένοι. Για να ενεργοποιήσετε νέους κανόνες, απενεργοποιήστε ορισμένα ενσωματωμένα φίλτρα." + }, + "options_limits_warning_dynamic_rules": { + "message": "Έχετε φτάσει στο όριο των κανόνων που προστέθηκαν από τον χρήστη. %maximum% από %current% κανόνες είναι ενεργοποιημένοι." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Έχετε φτάσει στο όριο των κανόνων που προστίθενται από χρήστες και δεν είναι ασφαλείς. %maximum% από %current% μη ασφαλείς κανόνες είναι ενεργοί." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Έχετε φτάσει στο όριο των regex κανόνων που προστέθηκαν από τον χρήστη. %maximum% από %current% regex κανόνες είναι ενεργοποιημένοι." + }, "options_show_adguard_full_version_title": { "message": "Εμφάνιση πληροφοριών σχετικά με την πλήρη έκδοση του AdGuard" }, @@ -723,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Βοήθεια στην ανάπτυξη των φίλτρων AdGuard" }, + "options_collect_hit_stats_desc": { + "message": "Αποστολή ανώνυμων στατιστικών στοιχείων σχετικά με τη χρήση φίλτρων διαφημίσεων<\/a> για να βοηθήσετε το AdGuard να βελτιώσει τα φίλτρα του" + }, "options_show_context_menu_title": { "message": "Προσθήκη στοιχείου AdGuard στο μενού περιβάλλοντος του περιηγητή" }, @@ -735,15 +934,27 @@ "options_privacy_title": { "message": "Προστασία παρακολούθησης" }, + "options_privacy_desc": { + "message": "Προστατέψτε την ταυτότητά σας και τα ευαίσθητα προσωπικά σας στοιχεία από χιλιάδες διαδικτυακούς ιχνηλάτες, αποκλείοντας τις πιο δημοφιλείς μεθόδους παρακολούθησης" + }, "options_hide_referrer_title": { "message": " Απόκρυψη Παραπομπής από τρίτα μέρη" }, + "options_hide_referrer_desc": { + "message": "Εμποδίζει τρίτους από το να γνωρίζουν ποια ιστοσελίδα επισκέπτεστε" + }, "options_hide_search_queries_title": { "message": "Απόκρυψη ερωτημάτων αναζήτησης" }, + "options_hide_search_queries_desc": { + "message": "Απόκρυψη των ερωτημάτων για ιστότοπους που επισκεφθήκατε με μια μηχανή αναζήτησης" + }, "options_send_not_track_title": { "message": "Αποστολή αιτήματος \"Χωρίς παρακολούθηση\"" }, + "options_send_not_track_desc": { + "message": "Αποστολή σήματος Παγκόσμιος Έλεγχος Απορρήτου<\/gpc> και Χωρίς Παρακολούθηση<\/dnt> στους ιστότοπους που επισκέπτεστε" + }, "options_stripped_tracking_parameters": { "message": "Αφαιρέθηκε παράμετρος παρακολούθησης" }, @@ -756,21 +967,39 @@ "options_remove_client_data_title": { "message": "Αφαίρεση αιτήματος X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "Εμποδίζει το Google Chrome από το να στέλνει πληροφορίες σχετικά με την έκδοση και τις ρυθμίσεις του σε διευθύνσεις της Google" + }, "options_disable_webrtc_title": { "message": "Απενεργοποίηση WebRTC" }, + "options_disable_webrtc_desc": { + "message": "Το WebRTC μπορεί να διαρρεύσει τη διεύθυνση IP σας ακόμα και αν χρησιμοποιείτε διακομιστή μεσολάβησης ή VPN. Η απενεργοποίηση του WebRTC μπορεί να σπάσει ορισμένους ιστότοπους" + }, "options_strip_tracking_params_title": { "message": "Αφαίρεση παραμέτρων παρακολούθησης" }, + "options_strip_tracking_params_description": { + "message": "Διαγραφή παραμέτρων από αιτήματα ιστού με το φίλτρο παρακολούθησης URL AdGuard" + }, "options_block_known_trackers_title": { "message": "Αποκλεισμός γνωστών ιχνηλατών" }, + "options_block_known_trackers_description": { + "message": "Αποκλείστε ιχνηλάτες και εργαλεία διαδικτυακής ανάλυσης με το φίλτρο AdGuard προστασίας παρακολούθησης" + }, "options_third_party_title": { "message": "Αυτοκαταστροφή cookies τρίτων" }, + "options_third_party_desc": { + "message": "Περιορίστε το διάστημα κατά το οποίο τα cookies τρίτων παραμένουν ενεργά (λεπτά)" + }, "options_first_party_title": { "message": "Αυτοκαταστροφή κύριων cookies (δεν συνίσταται)" }, + "options_first_party_desc": { + "message": "Περιορίστε το διάστημα κατά το οποίο τα κύρια cookies παραμένουν ενεργά (λεπτά)" + }, "popup_abuse_site": { "message": "Αποστολή παραπόνου για αυτή την ιστοσελίδα" }, @@ -798,6 +1027,12 @@ "popup_switch_button": { "message": "Διακόπτης προστασίας" }, + "popup_limits_exceeded_warning": { + "message": "Το πρόγραμμα περιήγησής σας έχει τροποποιήσει τη λίστα των ενεργών ενσωματωμένων φίλτρων" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Υπερέβη τον περιορισμό κανόνων στην Επέκταση προγράμματος περιήγησης AdGuard. Παρακαλώ ελέγξτε τα φίλτρα σας και απενεργοποιήστε αυτά που δεν χρειάζεστε" + }, "short_name": { "message": "AdGuard" }, @@ -837,12 +1072,39 @@ "options_about_title": { "message": "Επέκταση προγράμματος περιήγησης AdGuard" }, + "group_description_adblocking": { + "message": "Διαμορφώστε τον αποκλεισμό διαφημίσεων εδώ για να αντιμετωπίσετε ενοχλητικά banners, αναδυόμενα παράθυρα, διαφημίσεις βίντεο και άλλα τέτοια, μια για πάντα" + }, + "group_description_stealth": { + "message": "Προστατέψτε την ταυτότητά σας και τις ευαίσθητες προσωπικές πληροφορίες σας από χιλιάδες διαδικτυακούς ιχνηλάτες, αποκλείοντας όλες τις γνωστές δημοφιλείς μεθόδους παρακολούθησης" + }, + "group_description_social": { + "message": "Απόκρυψη ανεπιθύμητων κουμπιών \"Μου αρέσει\"\/\"Κοινή χρήση\" και άλλων γραφικών στοιχείων κοινωνικών μέσων" + }, + "group_description_annoyances": { + "message": "Αφαιρέστε τα αναδυόμενα παράθυρα και άλλες ενοχλητικές ειδοποιήσεις, όπως ειδοποιήσεις cookie" + }, + "group_description_security": { + "message": "Προστατέψτε τον εαυτό σας από κακόβουλο λογισμικό, ηλεκτρονικό ψάρεμα και άλλες διαδικτυακές απειλές" + }, + "group_description_miscellaneous": { + "message": "Περισσότερες ρυθμίσεις για τη διαμόρφωση της περιήγησής σας στον ιστό με το AdGuard ακόμη περισσότερο" + }, "group_description_custom": { "message": "Δημιουργήστε τα δικά σας φίλτρα για να ρυθμίσετε το φιλτράρισμα ιστού σύμφωνα με τις προτιμήσεις σας" }, + "group_description_lang": { + "message": "Μην περιορίζεστε - αποκλείστε διαφημίσεις σε ιστότοπους σε οποιαδήποτε γλώσσα" + }, "fullscreen_user_rules_title": { "message": "Κανόνες χρήστη" }, + "options_user_rules_editor_stub_title": { + "message": "Ο επεξεργαστής άνοιξε σε άλλο παράθυρο" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Οι κανόνες σας θα εμφανιστούν εδώ αφού το κλείσετε" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Μετάβαση στον διαμορφωτή" }, @@ -876,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Δοκιμάστε ξανά" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Αιτήματα πρώτου μέρους" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Αιτήματα τρίτου μέρους" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Αιτήματα που έχουν επεξεργαστεί χωρίς φιλτράρισμα" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Επιτρέπονται και μη αποκλεισμένα αιτήματα" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Αποκλεισμένα αιτήματα" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Τροποποιημένα αιτήματα" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Αιτήματα που επηρεάζονται από κανόνες χρήστη" + }, "filtering_log_tag_tooltip_html": { "message": "Έγγραφα και υπο-έγγραφα" }, @@ -894,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Πολυμέσα" }, + "filtering_log_tag_tooltip_other": { + "message": "Γραμματοσειρές, pings, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Αίτημα τρίτου μέρους" }, @@ -903,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "Κωδικός κατάστασης HTTP" }, + "filtering_log_assumed_rule_description": { + "message": "Αυτός είναι ένας υποτιθέμενος κανόνας. Για λεπτομέρειες, δείτε τη Βάση γνώσεων<\/a>" + }, "options_stealth_general_title": { "message": "Γενικά" }, @@ -912,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "Διάφορα" }, + "options_coming_soon": { + "message": "Έρχεται σύντομα" + }, "blocking_pages_malware": { "message": "Αυτή η ιστοσελίδα στο %host%<\/strong> έχει αναφερθεί ως σελίδα κακόβουλου λογισμικού και έχει αποκλειστεί με βάση τις προτιμήσεις ασφαλείας σας." }, @@ -950,5 +1242,20 @@ }, "close_button_title": { "message": "Κλείσιμο" + }, + "filtering_modal_applied_rules": { + "message": "| Εφαρμοσμένος κανόνας: | Εφαρμοσμένοι κανόνες:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Υποτιθέμενος κανόνας: | Υποτιθέμενοι κανόνες:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Αρχικός κανόνας: | Αρχικοί κανόνες:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "Κανόνας DNR:" } } \ No newline at end of file diff --git a/Extension/_locales/et/messages.json b/Extension/_locales/et/messages.json index 8f3a933cb2..d882da63ba 100644 --- a/Extension/_locales/et/messages.json +++ b/Extension/_locales/et/messages.json @@ -17,6 +17,9 @@ "options_antibanner_custom_filter_already_exists": { "message": "See kohandatud filter on juba lisatud" }, + "options_filters_annoyances_consent_title": { + "message": "Lugege enne häirivate filtrite lubamist hoolikalt läbi" + }, "options_filters_annoyances_consent_description": { "message": "Olete lubamas üht või mitut häirimisfiltrit. Need blokeerivad elemente, mis ei ole veebisaidi sisuga seotud või on teie kasutuskogemusega seotud, kuid häirivad. Veebisaitide omanikud võivad pidada neid elemente kohustuslikuks: kui te need blokeerite, võite rikkuda nende tingimusi; mõned veebisaitide funktsioonid ei pruugi olla saadaval või ei pruugi korralikult töötada. Mõistate ja nõustute, et vastutate ainuisikuliselt külastatavate veebisaitide kasutustingimuste järgimise eest ja AdGuard ei vastuta külastatavate veebisaitide kasutustingimuste järgimise eest." }, @@ -29,12 +32,18 @@ "options_filters_annoyances_consent_enable_button": { "message": "Lubama" }, + "popup_header_cta_link": { + "message": "Kuidas kaitset täiustada" + }, "popup_header_update_filters": { "message": "Käivita filtrite uuendamine" }, "options_popup_import_settings_wrong_file_ext": { "message": "Faili laiendus peab olema %extension%" }, + "popup_resume_protection_button": { + "message": "Jätka" + }, "popup_adguard_for_ios": { "message": "AdGuard for iOS" }, @@ -53,6 +62,9 @@ "options_popup_version_update_disable_notification": { "message": "Lülita teavitused välja" }, + "popup_adguard_footer_title": { + "message": "Kaitse oma mobiilseadet" + }, "options_popup_call_to_action": { "message": "Lisa filtri URL või asukoht ülemisse kasti." }, @@ -77,9 +89,30 @@ "options_popup_check_false_description": { "message": "Valikulise filtri lisamisel ilmes viga." }, + "options_add_custom_filter_modal_title": { + "message": "Lisa kohandatud filter" + }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Filtri kontrollimine..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Kohandatud filtri lisamine ebaõnnestus" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "Palun proovige uuesti või võtke ühendust toega" + }, + "options_add_custom_filter_modal_add_button": { + "message": "Lisa" + }, + "options_add_custom_filter_modal_filter_name": { + "message": "Filtri nimi:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Usaldatud" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "Mõned filtering reeglid võivad oluliselt muuta teie sirvimiskogemust ja ohustada teie privaatsust. Veenduge, et kasutate ainult arendajate filtreid, kellele te usaldate" + }, "options_popup_try_again_button": { "message": "Proovi uuesti" }, @@ -117,18 +150,33 @@ "options_allowlist": { "message": "Valge list" }, + "options_allowlist_desc": { + "message": "AdGuard ei filtreeri valges listis olevaid veebilehti" + }, "options_allowlist_invert": { "message": "Pöördjärjesta valge list" }, + "options_allowlist_invert_desc": { + "message": "Lubab reklaami kõikjal, välja arvatud valges listis olevatel veebilehtedel" + }, "options_allowlist_alert_invert": { "message": "Valge list on ümber pööratud. Reklaami blokeeritakse ainult alljärgnevatel lehekülgedel. Muuda tagasi<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Teie muudatused lubatud nimekirjas kaovad" + }, "options_userfilter": { "message": "Kasutaja reeglid" }, "filtering_log_modified_rules": { "message": "Muudetud reegleid: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "Jälgimiskaitse reeglid: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Jälgimiskaitse rakendatud" + }, "filtering_log_in_allowlist": { "message": "Sait on lubatud" }, @@ -189,18 +237,36 @@ "options_filters_filter_trusted_tag_desc": { "message": "Otsustasid, et usaldad seda filtrit" }, + "options_filters_info_mv3_total_rules": { + "message": "Kokku reegleid: %num%" + }, "options_add_custom_filter": { "message": "Lisa kohandatud filter" }, + "options_filters_custom_disabled_cws": { + "message": "Kohandatud filtrid on peagi tagasi. Uuri lähemalt meie blogist" + }, "options_empty_custom_filter": { "message": "Vabandame, aga sul ei ole hetkel ühtegi kohandatud filtrit" }, + "options_loader_applying_changes": { + "message": "Rakenda muudatused..." + }, "options_editor_indicator_saving": { "message": "Salvestamine..." }, "options_editor_indicator_saved": { "message": "Salvesta" }, + "options_popup_import_error_required_privacy_permission": { + "message": "Selle seadistuste faili importimiseks luba AdGuardil muuta teie privaatsusega seotud seadeid." + }, + "options_popup_import_success_title": { + "message": "Seaded imporditud" + }, + "options_popup_import_error_title": { + "message": "Seadete importimine ebaõnnestus" + }, "options_popup_import_error_file_description": { "message": "Midagi läks valesti." }, @@ -213,15 +279,30 @@ "popup_site_filtering_state_secure_page": { "message": "Turvaline leht" }, + "popup_site_filtering_state_loading": { + "message": "Laadimine..." + }, + "popup_site_filtering_state_enabling": { + "message": "Kaitse aktiveerimine..." + }, "popup_site_filtering_state_enabled": { "message": "Kaitse on sisselülitatud" }, + "popup_site_filtering_state_disabling": { + "message": "Kaitse deaktiveerimine..." + }, "popup_site_filtering_state_disabled": { "message": "Kaitse on väljalülitatud" }, + "popup_site_filtering_state_pausing": { + "message": "Kaitse pausile seadmine..." + }, "popup_site_filtering_state_paused": { "message": "Kaitse on peatatud" }, + "popup_site_filtering_state_resuming": { + "message": "Kaitse jätkamine..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "kõikidele veebilehtedele" }, @@ -231,12 +312,27 @@ "popup_tab_blocked_count": { "message": "Blokeeritud: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Kokku blokeeritud: %num%" + }, "popup_statistics_total": { "message": "Kokku" }, + "popup_statistics_all_categories": { + "message": "Kõik" + }, + "popup_statistics_category_advertising": { + "message": "Reklaam" + }, "popup_statistics_category_trackers": { "message": "Jälitajaid" }, + "popup_statistics_category_social_media": { + "message": "Ühismeedia" + }, + "popup_statistics_category_cdn": { + "message": "CDN" + }, "popup_statistics_category_other": { "message": "Muu" }, @@ -330,12 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "ROHKEM TEAVET" }, + "popup_block_site_ads_option": { + "message": "Blokeeri reklaame käsitsi" + }, "popup_security_report": { "message": "Kontrolli veebilehe turvalisust" }, + "popup_reset_page_user_rules": { + "message": "Kustuta kasutaja reeglid selle veebilehe jaoks" + }, + "context_block_site_ads": { + "message": "Blokeeri reklaame käsitsi" + }, "context_security_report": { "message": "Kontrolli veebilehe turvalisust" }, + "context_complaint_website": { + "message": "Teatage probleemist" + }, + "context_site_filtering_disabled": { + "message": "AdGuard ei saa seda lehte filtreerida" + }, "context_disable_protection": { "message": "Peata AdGuardi kaitse" }, @@ -348,6 +459,9 @@ "context_open_settings": { "message": "AdGuardi seaded" }, + "context_open_log": { + "message": "Filtreerimise logi" + }, "context_site_exception": { "message": "See veebileht on erandites" }, @@ -372,6 +486,9 @@ "filters_download_loading": { "message": "Palun oota, kuni toimub filtrite andmebaaside laadimine..." }, + "post_install_loading": { + "message": "Laienemise laadimine..." + }, "filtering_modal_element": { "message": "Element:" }, @@ -390,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Otsi vahelehtedelt" }, + "filtering_log_preserve_log_off": { + "message": "Ära salvesta logi" + }, + "filtering_log_preserve_log_on": { + "message": "Salvesta logi" + }, "filtering_refresh_tab_short": { "message": "Värskenda" }, @@ -417,6 +540,9 @@ "filtering_table_filter": { "message": "Filter" }, + "filtering_table_empty_reload_page_desc": { + "message": "Midagi ei leitud. Keela filtrid<\/reset> või uuenda lehte<\/refresh>, et logi salvestusi vaadata." + }, "filtering_modal_info_title": { "message": "Päringu detailid" }, @@ -435,6 +561,9 @@ "filtering_modal_rules": { "message": "Reeglid:" }, + "filtering_modal_privacy": { + "message": "Jälgimiskaitse:" + }, "filtering_modal_filter": { "message": "Filter:" }, @@ -462,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Staatus:" }, + "filtering_modal_status_text_error": { + "message": "Eelvaate laadimine ebaõnnestus. Palun proovi uuesti" + }, "filtering_modal_status_text_loading": { "message": "Laadimine..." }, @@ -558,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Blokeeri otsingureklaami ja veebilehtede reklaamikampaaniaid" }, + "options_block_acceptable_ads_desc": { + "message": "Eemalda isekesksed reklaamid veebisaitidelt ja kontekstuaalsed reklaamid otsingutulemustest. Õpi rohkem<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Kuva AdGuardi ikoonil blokeeritud reklaami arvu" }, "options_enable_autodetect_filter": { "message": "Aktiveeri automaatselt sobivad filtrid" }, + "options_enable_autodetect_filter_desc": { + "message": "Keele spetsiifilised filtrid lülitatakse sisse sõltuvalt saidi keelest" + }, "options_select_theme": { "message": "Välimus" }, @@ -588,6 +726,9 @@ "options_leave_feedback": { "message": "Anna tagasisidet" }, + "options_privacy": { + "message": "Jälgimiskaitse" + }, "options_update_antibanner_filters": { "message": "Käivita filtrite uuendamine" }, @@ -600,18 +741,42 @@ "options_set_update_interval": { "message": "Filtrite uuendamise sagedus" }, + "options_set_update_interval_desc": { + "message": "Efektiivsemaks blokeerimiseks peavad filtreid regulaarselt uuendama." + }, "options_userfilter_export": { "message": "Ekspordi" }, "options_editor_save": { "message": "Salvesta" }, + "options_editor_leave_title": { + "message": "Kas lahkuda ilma salvestamata?" + }, + "options_editor_leave_confirm": { + "message": "Jah, lahku" + }, + "options_editor_leave_cancel": { + "message": "Tagasi redigeerimise juurde" + }, "options_userfilter_import": { "message": "Impordi" }, "options_userfilter_description_key": { "message": "Siia saab lisada enda reegleid. Soovitatav kasutajatele, kes on tuttavad HTML\/CSS-iga. Rohkema info saamiseks tutvu filtri loomise abilisega<\/a>." }, + "options_userfilter_subtitle_key": { + "message": "Täpsemalt reklaamide blokeerimist oma filtrireeglitega." + }, + "options_userfilter_line_break_off": { + "message": "Rea murdmine: Välja lülitatud" + }, + "options_userfilter_line_break_on": { + "message": "Rea murdmine: Sisse lülitatud" + }, + "options_userfilter_leave_subtitle": { + "message": "Teie reeglite muudatused on kaotatud" + }, "options_open_changelog": { "message": "Muudatuste logi" }, @@ -636,18 +801,46 @@ "options_miscellaneous_settings": { "message": "Täiendavad seaded" }, + "options_rule_syntax": { + "message": "Reegli süntaks" + }, "options_rule_limits": { "message": "Reegli piirangud" }, + "options_rule_limits_description": { + "message": "Chrome piirab rakendatavate reeglite arvu" + }, "options_rule_limits_dynamic": { "message": "Dünaamilised reeglid" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Kasutaja lisatud reeglid, nagu kasutajareeglid<\/user_rules>, lubatud veebisaidid<\/allowlist>, kohandatud filtrid<\/custom_filters> ja Kiirparanduste filter<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Ohutud dünaamilised reeglid (kasutatakse mõnede täiustatud modifikaatorite jaoks, nagu $$redirect või $$cookie) — sisaldub kasutaja lisatud reeglites" + }, + "options_rule_limits_dynamic_regex": { + "message": "Regex reeglid — sisaldub kasutaja lisatud reeglites" + }, "options_rule_limits_static_rulesets": { "message": "Staatilised reeglistikud" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Sisseehitatud filtrid<\/a>, nagu Blokeeri tüütused või Keelespetsiifilised filtrid" + }, "options_rule_limits_static_rules": { "message": "Staatilised reeglid" }, + "options_rule_limits_static_rules_all": { + "message": "Reeglid sisseehitatud filtritest<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Regex reeglid — sisalduvad eespool" + }, + "options_rule_limits_numbers": { + "message": "%current%\/%maximum%" + }, "options_rule_limits_warning_title": { "message": "Brauser on muutnud aktiivsete filtrite nimekirja" }, @@ -666,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "Teie võimalikud tegevused" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Võimalus 1. Kustutage oma brauserist mittevajalikud reklaami blokeerivad laiendused. Punktis \"Enne uuendust lubatud filtrid\" nimetatud filtrite taasaktiveerimiseks klõpsake filtrite taasaktiveerimisele.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Võimalus 2. Paigaldage AdGuard Ad Blocker rakendus: sellel ei ole filtreerimisreeglitele piiranguid. Hankige AdGuard Ad Blocker rakendus<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Võimalus 3. Kui olete rahul hetkel aktiveeritud vaikimisi filtriga, sulgege see hoiatus.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Valik 3. Kui olete rahul hetkel aktiveeritud vaikimisi filtritega, sulgege see hoiatus.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Te olete jõudnud aktiivsete sisseehitatud reeglite piirini. Brauser on muutnud aktiivsete sisseehitatud filtrite nimekirja. Filtrite arv on muutunud %expected% -lt %current%-le." + }, + "options_limits_warning_static_filters": { + "message": "Te olete jõudnud aktiivsete sisseehitatud filtrite piirini. %maximum% %current% filtrit on lubatud. Uute reeglite aktiveerimiseks lülitage mõned sisseehitatud filtrid välja." + }, + "options_limits_warning_static_rules": { + "message": "Te olete jõudnud aktiivsete sisseehitatud reeglite piirini. %maximum% %current% reeglit on lubatud. Uute reeglite aktiveerimiseks lülitage mõned sisseehitatud filtrid välja." + }, + "options_limits_warning_static_regex_rules": { + "message": "Te olete jõudnud aktiivsete sisseehitatud regex-reeglite piirini. %maximum% of %current% regex-reeglit on lubatud. Uute reeglite aktiveerimiseks lülitage mõned sisseehitatud filtrid välja." + }, + "options_limits_warning_dynamic_rules": { + "message": "Te olete jõudnud kasutaja poolt lisatud reeglite piirini. %maximum% of %current% reeglit on lubatud." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Olete jõudnud kasutajate lisatud ebaturvaliste reeglite limiidini. %maximum% \/ %current% ebaturvalised reeglid on lubatud." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Te olete jõudnud kasutaja poolt lisatud regex-reeglite piirini. %maximum% of %current% regex-reeglit on lubatud." + }, "options_show_adguard_full_version_title": { "message": "Näita teavitust AdGuardi täisversiooni kohta" }, @@ -693,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Osalege AdGuard filtrite arendamises" }, + "options_collect_hit_stats_desc": { + "message": "Saatke anonüümne statistika reklaamifiltrite kasutamise kohta<\/a>, mis aitab AdGuardil oma filtreid täiustada" + }, "options_show_context_menu_title": { "message": "Lisa AdGuard brauseri parema kliki menüüsse" }, @@ -702,15 +931,30 @@ "options_use_optimized_filters_desc": { "message": "Liikluse säästmiseks kasutab filtrite lühemaid versioone ainult kõige populaarsemate reeglitega. Sobib paremini mobiilibrauseritele" }, + "options_privacy_title": { + "message": "Jälgimiskaitse" + }, + "options_privacy_desc": { + "message": "Kaitse oma identiteeti ja delikaatseid isikuandmeid tuhandete onlain jälitajate eest, blokeerides kõige populaarsemad jälgimismeetodid" + }, "options_hide_referrer_title": { "message": "Peidab kolmandate osapoolte eest Viitaja" }, + "options_hide_referrer_desc": { + "message": "Takista kolmandate isikute teadlikkust, milliseid veebilehti külastate." + }, "options_hide_search_queries_title": { "message": "Peida tehtavad otsingupäringud" }, + "options_hide_search_queries_desc": { + "message": "Peida otsingumootorist külastatud veebilehtede päringud" + }, "options_send_not_track_title": { "message": "Saada Do-Not-Track päis" }, + "options_send_not_track_desc": { + "message": "Saatke külastatavatele veebisaitidele signaalid Globaalne privaatsuskontroll<\/gpc> ja Ära jälgi<\/dnt>" + }, "options_stripped_tracking_parameters": { "message": "Eemaldatakse jälitamise parameetrid" }, @@ -723,21 +967,39 @@ "options_remove_client_data_title": { "message": "Eemalda X-Client-Data päis" }, + "options_remove_client_data_desc": { + "message": "Blokeerib Google Chrome'i, et see ei saaks Google domeenidele oma versiooni ja muudatuste andmeid saata" + }, "options_disable_webrtc_title": { "message": "Blokeeri WebRTC-d" }, + "options_disable_webrtc_desc": { + "message": "WebRTC võib teie IP-aadressi lekkida isegi siis, kui kasutate puhverserverit või VPN-i. WebRTC keelamine võib mõne veebisaidi rikkuda" + }, "options_strip_tracking_params_title": { "message": "Eemalda jälitamise parameetrid" }, + "options_strip_tracking_params_description": { + "message": "Eemalda parameetrid veebipäringutest AdGuard URL jälgimise filtriga" + }, "options_block_known_trackers_title": { "message": "Blokeeri tuntud jälitajad" }, + "options_block_known_trackers_description": { + "message": "Sisselülitamisel blokeerib AdGuardi Tracking Protection filter tuntud jälitajaid" + }, "options_third_party_title": { "message": "Isehävinevad kolmandate osapoolte küpsised" }, + "options_third_party_desc": { + "message": "Limiteeri kolmandate osapoolte küpsiste eluiga (minutites)" + }, "options_first_party_title": { "message": "Isehävinevad esimeste osapoolte küpsised (ei ole soovituslik)" }, + "options_first_party_desc": { + "message": "Limiteeri esimeste osapoolte küpsiste eluiga (minutites)" + }, "popup_abuse_site": { "message": "Teata probleemist" }, @@ -765,6 +1027,12 @@ "popup_switch_button": { "message": "Kaitse lüliti" }, + "popup_limits_exceeded_warning": { + "message": "Brauser on muutnud aktiivsete sisseehitatud filtrite nimekirja" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Reeglite piirang ületatud AdGuard Brauseri Laienduses. Palun kontrollige oma filtreid ja keelake need, mida te ei vaja" + }, "short_name": { "message": "AdGuard" }, @@ -804,12 +1072,39 @@ "options_about_title": { "message": "AdGuard'i brauseri laiendus" }, + "group_description_adblocking": { + "message": "Siin saad seadistada reklaami blokeerimisel kasutatavaid filtreid. Liiga paljude filtrite korraga kasutamine võib jõudlusele negatiivselt mõjuda" + }, + "group_description_stealth": { + "message": "Kaitse oma identiteeti ja delikaatseid isikuandmeid tuhandete veebijälitajate eest, blokeerides kõik teadaolevad populaarsed jälgimismeetodid" + }, + "group_description_social": { + "message": "Peida soovimatuid \"Like\"\/\"Share\" nuppe ja teisi sotsiaalmeedia vidinaid" + }, + "group_description_annoyances": { + "message": "Eemalda hüpikreklaamid ja teised tüütud teavitused nagu küpsiste bännerid" + }, + "group_description_security": { + "message": "Kaitse end pahavara, andmepüügist ja teistest veebiohtudest." + }, + "group_description_miscellaneous": { + "message": "Erinevad valikud, mis võimaldavad AdGuardi veelgi rohkem seadistada" + }, "group_description_custom": { "message": "Loo erinevaid filtreid, mis aitavad veebisisu veelgi paremini filtreerida." }, + "group_description_lang": { + "message": "Ära piira end — blokeeri reklaame veebisaitidel igasugustes keeltes" + }, "fullscreen_user_rules_title": { "message": "Kasutaja reeglid" }, + "options_user_rules_editor_stub_title": { + "message": "Toimetaja avati teises aknas" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Teie reeglid kuvatakse siin pärast sulgemist" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Ava redigeerija" }, @@ -843,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Proovi uuesti" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Esimese osapoole päringud" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Kolmanda-osapoole päringud" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Ainult ilma filtreerimiseta töödeldud päringud" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Ainult lubatud või blokeerimata päringud" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Blokeeritud taotlused" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Ainult muudetud päringud" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Ainult päringud, mida on muutnud kasutaja reeglid" + }, "filtering_log_tag_tooltip_html": { "message": "Dokumendid ja alamdomeenid" }, @@ -861,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Meedia" }, + "filtering_log_tag_tooltip_other": { + "message": "Fondid, pingid, WebRTC, WebSocket jms..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Kolmanda osapoole päring" }, @@ -870,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP staatuse kood" }, + "filtering_log_assumed_rule_description": { + "message": "See on eeldatav reegel. Täiendava teabe saamiseks vaata meie teadmistebaasi<\/a>" + }, "options_stealth_general_title": { "message": "Üldine" }, @@ -879,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "Mitmesugust" }, + "options_coming_soon": { + "message": "Varsti saadaval" + }, "blocking_pages_malware": { "message": "Veebileht %host%<\/strong> on meile teadaolevalt pahavara levitav veebileht. Keelasime sellele ligipääsu vastavalt AdGuardi seadistusele." }, @@ -917,5 +1242,20 @@ }, "close_button_title": { "message": "Sulge" + }, + "filtering_modal_applied_rules": { + "message": "| Rakendatud reegel: | Rakendatud reeglid:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Eeldatav reegel: | Eeldatavad reeglid:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Originaal reegel: | Originaalsed reeglid:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "DNR reegel:" } } \ No newline at end of file diff --git a/Extension/_locales/fa/messages.json b/Extension/_locales/fa/messages.json index 0e49f6f36e..4070b85d96 100644 --- a/Extension/_locales/fa/messages.json +++ b/Extension/_locales/fa/messages.json @@ -32,6 +32,9 @@ "options_filters_annoyances_consent_enable_button": { "message": "فعالسازي" }, + "popup_header_cta_link": { + "message": "چگونه محافظت را ارتقا دهیم" + }, "popup_header_update_filters": { "message": "بررسی بروز رسانی برای فیلتر" }, @@ -59,6 +62,9 @@ "options_popup_version_update_disable_notification": { "message": "غيرفعالسازي اطلاع رسانی ها" }, + "popup_adguard_footer_title": { + "message": "از دستگاه تلفن همراه خود محافظت کنید" + }, "options_popup_call_to_action": { "message": "آدرس یا مسیر فایل فیلتر معتبر در کادر بالا وارد کنید." }, @@ -86,12 +92,21 @@ "options_add_custom_filter_modal_title": { "message": "افزودن فیلتر دستی" }, + "options_add_custom_filter_modal_checking_filter": { + "message": "در حال بررسی فیلتر شما..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "در افزودن فیلتر سفارشی خطا پیش آمد" + }, "options_add_custom_filter_modal_error_subtitle": { "message": "لطفاً دوباره امتحان کنید یا با پشتیبانی تماس بگیرید" }, "options_add_custom_filter_modal_add_button": { "message": "افزودن" }, + "options_add_custom_filter_modal_filter_name": { + "message": "نام فیلتر:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "قابل اعتماد" }, @@ -135,18 +150,33 @@ "options_allowlist": { "message": "لیست سفید" }, + "options_allowlist_desc": { + "message": "AdGuard تارنماهای مجاز را پالایش نمی‌کند" + }, "options_allowlist_invert": { "message": "معکوس کردن لیست سفید" }, + "options_allowlist_invert_desc": { + "message": "باز کردن تبلیغات در همه جا بجز لیست سفید" + }, "options_allowlist_alert_invert": { "message": "حالت معکوس برای لیست مجازها فعال است. تبلیغات فقط برای سایت‌هایی که به لیست افزوده شده‌اند فیلتر می‌شوند. غیرفعال<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "تغییرات شما در لیست مجاز از دست خواهد رفت" + }, "options_userfilter": { "message": "فیلتر کاربر" }, "filtering_log_modified_rules": { "message": "قوانین اصلاح شده: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "قوانین حفاظت از ردیابی: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "حفاظت ردیابی اعمال شد" + }, "filtering_log_in_allowlist": { "message": "این تارنما مجاز است" }, @@ -207,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "شما اعتماد به این فیلتر را انتخاب کردید." }, + "options_filters_info_mv3_total_rules": { + "message": "کل قوانین: %num%" + }, "options_add_custom_filter": { "message": "افزودن فیلتر دستی" }, + "options_filters_custom_disabled_cws": { + "message": "فیلترهای سفارشی به زودی باز خواهند گشت. بیشتر بدانید در وبلاگ ما" + }, "options_empty_custom_filter": { "message": "شما هنوز هیچ فیلتر سفارشی ندارید" }, @@ -225,6 +261,9 @@ "options_popup_import_error_required_privacy_permission": { "message": "برای درون‌برد این فایل تنظیمات، به AdGuard اجازه دهید تنظیمات مربوط به حریم خصوصی شما را تغییر دهد." }, + "options_popup_import_success_title": { + "message": "تنظیمات وارد شده" + }, "options_popup_import_error_title": { "message": "تنظیمات وارد نشد" }, @@ -243,15 +282,27 @@ "popup_site_filtering_state_loading": { "message": "بارگیری..." }, + "popup_site_filtering_state_enabling": { + "message": "فعال‌سازي محافظت..." + }, "popup_site_filtering_state_enabled": { "message": "حفاظت فعال شده است" }, + "popup_site_filtering_state_disabling": { + "message": "غیرفعال کردن محافظت..." + }, "popup_site_filtering_state_disabled": { "message": "حفاظت غيرفعال شده است" }, + "popup_site_filtering_state_pausing": { + "message": "در حال توقف محافظت..." + }, "popup_site_filtering_state_paused": { "message": "حفاظت متوقف شده است" }, + "popup_site_filtering_state_resuming": { + "message": "از سرگیری محافظت..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "برای همه تارنماها" }, @@ -261,6 +312,9 @@ "popup_tab_blocked_count": { "message": "مسدود شده: %num%" }, + "popup_tab_blocked_all_count": { + "message": "کل مسدود شده: %num%" + }, "popup_statistics_total": { "message": "مجموع" }, @@ -372,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "بیشتر بدانید" }, + "popup_block_site_ads_option": { + "message": "مسدود کردن تبلیغات به‌صورت دستی" + }, "popup_security_report": { "message": "گزارش امنیتی وبسایت" }, + "popup_reset_page_user_rules": { + "message": "حذف رویه‌های کاربر برای این تارنما" + }, + "context_block_site_ads": { + "message": "مسدود کردن تبلیغات به‌صورت دستی" + }, "context_security_report": { "message": "گزارش امنیتی وبسایت" }, "context_complaint_website": { "message": "گزارش یک مشکل" }, + "context_site_filtering_disabled": { + "message": "AdGuard نمی‌تواند این صفحه را فیلتر کند" + }, "context_disable_protection": { "message": "وقفه حفاظت AdGuard" }, @@ -420,6 +486,9 @@ "filters_download_loading": { "message": "لطفا حین بارگیری پایگاه اطلاعات فیلترها منتظر بمانید..." }, + "post_install_loading": { + "message": "بارگذاری افزونه..." + }, "filtering_modal_element": { "message": "عنصر:" }, @@ -438,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "جستجو در زبانه ها" }, + "filtering_log_preserve_log_off": { + "message": "عدم ثبت رویداد" + }, + "filtering_log_preserve_log_on": { + "message": "ثبت رویداد" + }, "filtering_refresh_tab_short": { "message": "نوسازی" }, @@ -465,6 +540,9 @@ "filtering_table_filter": { "message": "فیلتر" }, + "filtering_table_empty_reload_page_desc": { + "message": "هیچ موردی یافت نشد. فیلترها را غیرفعال نمایید<\/reset> یا صفحه را دوباره بارگذاری کنید<\/refresh> تا سوابق گزارش را مشاهده کنید." + }, "filtering_modal_info_title": { "message": "جزئیات درخواست" }, @@ -483,6 +561,9 @@ "filtering_modal_rules": { "message": "دستورات:" }, + "filtering_modal_privacy": { + "message": "حفاظت در برابر ردیابی:" + }, "filtering_modal_filter": { "message": "فیلتر:" }, @@ -510,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "وضعیت:" }, + "filtering_modal_status_text_error": { + "message": "بارگذاری پیش‌نمایش شکست خورد. لطفا دوباره تلاش کنید" + }, "filtering_modal_status_text_loading": { "message": "در حال بارگذاری..." }, @@ -606,12 +690,18 @@ "options_block_acceptable_ads": { "message": "مسدودسازی تبلیغات جستجو و تبلیغات شخصی وبسایت ها" }, + "options_block_acceptable_ads_desc": { + "message": "حذف تبلیغاتی که به خود تبلیغی می‌پردازند از وب‌سایت‌ها و تبلیغات زمینه‌ای از نتایج جستجو. بیشتر بدانید<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "تعداد تبلیغات مسدود شده را در آیکون افزونه AdGuard نشان می دهد" }, "options_enable_autodetect_filter": { "message": "فعالسازی خودکار بیشتر فیلترهای مناسب" }, + "options_enable_autodetect_filter_desc": { + "message": "فیلترهای مشخص زبان با توجه به زبان وب‌سایت فعال می‌شوند" + }, "options_select_theme": { "message": "تم" }, @@ -651,12 +741,24 @@ "options_set_update_interval": { "message": "فاصله بروز رسانی فیلترها" }, + "options_set_update_interval_desc": { + "message": "برای مسدود کردن موثرتر، فیلترها باید به طور مرتب به روز شوند" + }, "options_userfilter_export": { "message": "خروجيگيري" }, "options_editor_save": { "message": "ذخیره" }, + "options_editor_leave_title": { + "message": "آیا بدون ذخیره کردن ترک می‌کنید؟" + }, + "options_editor_leave_confirm": { + "message": "بله، بروید" + }, + "options_editor_leave_cancel": { + "message": "بازگشت به ویرایش" + }, "options_userfilter_import": { "message": "وارد کردن" }, @@ -666,6 +768,15 @@ "options_userfilter_subtitle_key": { "message": "مسدود کردن تبلیغات را با قوانین فیلترینگ خودتان تنظیم کنید" }, + "options_userfilter_line_break_off": { + "message": "شکست خط: غیر فعال" + }, + "options_userfilter_line_break_on": { + "message": "شکست خط: فعال" + }, + "options_userfilter_leave_subtitle": { + "message": "تغییرات شما در قوانین از دست خواهد رفت" + }, "options_open_changelog": { "message": "وقایع تغییرات" }, @@ -696,18 +807,49 @@ "options_rule_limits": { "message": "محدودیت‌های رویه" }, + "options_rule_limits_description": { + "message": "Chrome تعداد قوانینی که می‌تواند اعمال شود را محدود می‌کند" + }, "options_rule_limits_dynamic": { "message": "قوانین پویا" }, + "options_rule_limits_dynamic_user_rules": { + "message": "قواعد اضافه شده توسط کاربر، مانند رویۀ کاربر<\/user_rules>، تارنماهای موجود در لیست مجاز<\/allowlist>، فیلترهای سفارشی<\/custom_filters>، و فیلتر اصلاحات سریع<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "قواعد دینامیکی ناامن (که برای برخی از اصلاح‌کننده‌های پیشرفته مانند $$redirect یا $$cookie استفاده می‌شوند) — شامل رویه‌های اضافه شده توسط کاربر" + }, + "options_rule_limits_dynamic_regex": { + "message": "قوانین Regex — شامل رویه‌های اضافه شده توسط کاربر" + }, + "options_rule_limits_static_rulesets": { + "message": "قوانین ثابت" + }, + "options_rule_limits_static_rulesets_builtin": { + "message": "فیلترهای داخلی<\/a>، مانند مسدود کردن مزاحمت‌ها یا فیلترهای خاص زبان" + }, "options_rule_limits_static_rules": { "message": "قوانین ثابت" }, + "options_rule_limits_static_rules_all": { + "message": "قوانین از فیلترهای داخلی<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "قوانین Regex - در موارد فوق گنجانده شده است" + }, + "options_rule_limits_numbers": { + "message": "%current% از %maximum%" + }, "options_rule_limits_warning_title": { "message": "مرورگر فهرست فیلتر های فعال را اصلاح کرده است" }, "options_rule_limits_warning_explanation_title": { "message": "چه اتفاقی افتاد؟" }, + "options_rule_limits_warning_explanation_description": { + "message": "پس از به روز رسانی یا افزودن یک افزونه جدید، از حد مجاز قوانین داخلی فعال فراتر رفت. طبق Manifest V3، مرورگر کروم شما با غیرفعال کردن تمام فیلترهای داخلی برنامه افزودنی به جز فیلترهای پیش فرض، واکنش نشان داد." + }, "options_rule_limits_warning_list_enabled_before_title": { "message": "پالایه‌ها قبل از به‌روزرسانی فعال شدند" }, @@ -717,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "اقدامات احتمالی شما" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "گزینه 1. افزونه های غیرضروری مسدودکننده تبلیغات را از مرورگر خود حذف کنید. برای فعال سازی مجدد فیلترهای ذکر شده در بخش «فیلترها قبل از به روز رسانی فعال شده اند»، روی فیلترها را دوباره فعال کنید.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "گزینه ۲. نصب برنامه AdGuard Ad Blocker: هیچ محدودیتی برای قواعد فیلترینگ ندارد. برنامه AdGuard را دریافت کنید<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "گزینه ۳. اگر از فیلتر پیش‌فرض فعلی راضی هستید، این هشدار را ببندید.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "گزینه ۳. اگر از فیلترهای پیش‌فرض فعلی راضی هستید، این هشدار را ببندید.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "شما به حد قواعد داخلی فعال رسیده‌اید. مرورگر شما فهرست فیلترهای داخلی فعال را اصلاح کرده است. تعداد فیلترهای فعال از %expected% به %current% تغییر کرده است." + }, + "options_limits_warning_static_filters": { + "message": "شما به حد فیلترهای داخلی فعال رسیده‌اید. %maximum% از %current% فیلتر فعال هستند. برای فعال سازی قواعد جدید، برخی از فیلترهای داخلی را غیر فعال کنید." + }, + "options_limits_warning_static_rules": { + "message": "شما به حد قواعد داخلی فعال رسیده‌اید. %maximum% از %current% قواعد فعال هستند. برای فعال سازی قواعد جدید، برخی از فیلترهای داخلی را غیر فعال کنید." + }, + "options_limits_warning_static_regex_rules": { + "message": "شما به حد قواعد عبارات منظم داخلی رسیده‌اید. %maximum% از %current% قواعد عبارات منظم فعال هستند. برای فعال‌سازی قواعد جدید، برخی از فیلترهای داخلی را غیرفعال کنید." + }, + "options_limits_warning_dynamic_rules": { + "message": "شما به حد قواعد اضافه‌شده توسط کاربر رسیده‌اید. %maximum% از %current% قواعد فعال هستند." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "شما به حد قوانین ناامن اضافه شده توسط کاربر رسیده‌اید. %maximum% از %current% قوانین ناامن فعال شده‌اند." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "شما به حد قواعد regex اضافه‌شده توسط کاربر رسیده‌اید. %maximum% از %current% قواعد regex فعال هستند." + }, "options_show_adguard_full_version_title": { "message": "نمایش اطلاعات در نسخه کامل AdGuard" }, @@ -744,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "مشارکت در توسعه فیلترهای AdGuard" }, + "options_collect_hit_stats_desc": { + "message": "ارسال آمار ناشناس از استفاده از پالایشگرهای تبلیغات<\/a> تا به AdGuard کمک کند تا پالایشگرهای خود را بهبود بخشد" + }, "options_show_context_menu_title": { "message": "افزودن AdGuard به منوی زمینۀ مرورگر" }, @@ -756,15 +934,27 @@ "options_privacy_title": { "message": "حفاظت ردیابی" }, + "options_privacy_desc": { + "message": "با مسدود کردن همه روش‌های شناخته شده ردیابی، از هویت و اطلاعات شخصی حساس خود در برابر هزاران ردیاب آنلاین محافظت کنید" + }, "options_hide_referrer_title": { "message": " مخفی کردن ارجاع دهنده شما از ثالث ها" }, + "options_hide_referrer_desc": { + "message": "بازداری طرفهای ثالث از شناسایی تارنماهایی که بازدید می‌کنید" + }, "options_hide_search_queries_title": { "message": "پنهان‌سازی جستارهای جستجوی شما" }, + "options_hide_search_queries_desc": { + "message": "مخفی کردن جستارها برای وبسایت های بازدید شده از موتور جستجو" + }, "options_send_not_track_title": { "message": "درخواست از تارنماها که شما را ردیابی نکنند" }, + "options_send_not_track_desc": { + "message": "ارسال کنترل حریم خصوصی جهانی<\/gpc> و ردیابی نکنید<\/dnt> به وب سایت هایی که بازدید می کنید" + }, "options_stripped_tracking_parameters": { "message": "پارامترهای ردیابی حذف شده" }, @@ -777,21 +967,39 @@ "options_remove_client_data_title": { "message": "حذف سرساز X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "مسدودسازی گوگل کروم از ارسال نسخه آن و اطلاعات ویرایش شده به دامنه های گوگل" + }, "options_disable_webrtc_title": { "message": "مسدودسازی WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC می تواند آدرس IP شما را فاش کند حتی اگر از پراکسی یا VPN استفاده کنید. غیرفعال کردن WebRTC می تواند برخی از وب سایت ها را خراب کند" + }, "options_strip_tracking_params_title": { "message": "حذف پارامترهای ردیابی" }, + "options_strip_tracking_params_description": { + "message": "حذف پارامترها از درخواست های تارنشانی وب با فیلتر ردیابی تارنشانی AdGuard" + }, "options_block_known_trackers_title": { "message": "مسدودسازی ردیاب های شناخته شده" }, + "options_block_known_trackers_description": { + "message": "مسدود کردن ردیاب ها و ابزارهای تجزیه و تحلیل وب با فیلتر محافظت از ردیابی AdGuard" + }, "options_third_party_title": { "message": "خود-تخریبی کوکی های شخص ثالث" }, + "options_third_party_desc": { + "message": "محدودسازی عمر کلوچک‌های طرف ثالث (دقایق)" + }, "options_first_party_title": { "message": "خود-تخریبی کوکی های اولیه (توصیه نمی شود)" }, + "options_first_party_desc": { + "message": "محدودسازی عمر کلوچک‌های طرف اول (دقایق)" + }, "popup_abuse_site": { "message": "ارسال گزارش مشکل" }, @@ -819,6 +1027,12 @@ "popup_switch_button": { "message": "تعویض حفاظت" }, + "popup_limits_exceeded_warning": { + "message": "مرورگر شما فهرست پالایش های داخلی فعال را اصلاح کرده است" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "حد قانون در افزونه مرورگر AdGuard تجاوز شده است. لطفا فیلترهای خود را بررسی کرده و مواردی که نیاز ندارید غیرفعال کنید" + }, "short_name": { "message": "AdGuard" }, @@ -858,12 +1072,39 @@ "options_about_title": { "message": "افزونه مرورگر AdGuard" }, + "group_description_adblocking": { + "message": "مسدود کردن تبلیغات را در اینجا پیکربندی کنید تا با بنرهای مزاحم، پنجره‌های بازشو، تبلیغات ویدیویی و مواردی از این دست، یک بار برای همیشه مقابله کنید" + }, + "group_description_stealth": { + "message": "با مسدود کردن همه روش‌های شناخته شده ردیابی، از هویت و اطلاعات شخصی حساس خود در برابر هزاران ردیاب آنلاین محافظت کنید" + }, + "group_description_social": { + "message": "دکمه‌های «لایک»\/«اشتراک‌گذاری» ناخواسته و سایر ابزارک‌های رسانه‌های اجتماعی را پنهان کنید" + }, + "group_description_annoyances": { + "message": "پنجره های پاپ آپ و سایر اعلان های مزاحم مانند اطلاعیه های کوکی را حذف کنید" + }, + "group_description_security": { + "message": "از خود در برابر بدافزار، فیشینگ و سایر تهدیدات آنلاین محافظت کنید" + }, + "group_description_miscellaneous": { + "message": "تنظیمات بیشتر برای پیکربندی بیشتر وب گردی با ادگارد" + }, "group_description_custom": { "message": "فیلترهای خود را ایجاد کنید تا فیلتر وب را به دلخواه خود تنظیم کنید." }, + "group_description_lang": { + "message": "خودتان را محدود نکنید — تبلیغات را در وب سایت ها به هر زبانی مسدود کنید" + }, "fullscreen_user_rules_title": { "message": "فیلتر کاربر" }, + "options_user_rules_editor_stub_title": { + "message": "ویرایشگر در یک پنجره دیگر باز شد" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "قوانین شما پس از بستن آن اینجا ظاهر خواهد شد" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "به ویرایشگر بروید" }, @@ -897,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "امتحان دوباره" }, + "filtering_log_tag_tooltip_first_party": { + "message": "درخواست‌های طرف اول" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "درخواست‌های شخص ثالث" + }, + "filtering_log_tag_tooltip_regular": { + "message": "درخواست‌های پردازش‌شده بدون فیلتر" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "درخواست‌های مجاز و رفع انسداد" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "درخواست‌های مسدود شده" + }, + "filtering_log_tag_tooltip_modified": { + "message": "درخواست‌های اصلاح‌شده" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "درخواست‌های تحت تأثیر رویه‌های کاربر" + }, "filtering_log_tag_tooltip_html": { "message": "اسناد و مدارک فرعی" }, @@ -915,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "رسانه" }, + "filtering_log_tag_tooltip_other": { + "message": "فونت‌ها، پینگ‌ها، WebRTC، WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "درخواست شخص ثالث" }, @@ -924,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "کد وضعیت HTTP" }, + "filtering_log_assumed_rule_description": { + "message": "این یک رویه فرضی است. برای جزئیات، به پایگاه دانش<\/a> ما مراجعه کنید." + }, "options_stealth_general_title": { "message": "عمومی" }, @@ -933,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "متفرقه" }, + "options_coming_soon": { + "message": "به زودی" + }, "blocking_pages_malware": { "message": "این صفحه وب در %host%<\/strong>تحت عنوان صفحه بدافزار گزارش و بر اساس ترجیحات امنیتی شما مسدود شده است." }, @@ -971,5 +1242,20 @@ }, "close_button_title": { "message": "بستن" + }, + "filtering_modal_applied_rules": { + "message": "| رویه‌ی اعمال‌شده: | رویه‌های اعمال‌شده:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| رویه‌ی فرض‌شده: | رویه‌های فرض‌شده:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| رویه‌ی اصلی: | رویه‌های اصلی:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "قانون DNR:" } } \ No newline at end of file diff --git a/Extension/_locales/fi/messages.json b/Extension/_locales/fi/messages.json index 18b061cb2b..c560fa3712 100644 --- a/Extension/_locales/fi/messages.json +++ b/Extension/_locales/fi/messages.json @@ -150,12 +150,21 @@ "options_allowlist": { "message": "Sallittujen lista" }, + "options_allowlist_desc": { + "message": "AdGuard ei suodata sallittujen listalla olevia sivuja" + }, "options_allowlist_invert": { "message": "Käänteinen sallittujen lista" }, + "options_allowlist_invert_desc": { + "message": "Sallii mainokset kaikkialla, paitsi sallittujen listan sivuilla" + }, "options_allowlist_alert_invert": { "message": "Käänteinen sallittujen lista on käytössä. Mainokset estetään vain listalla olevilla sivustoilla. Poista käytöstä<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Muutokset sallittujen luetteloon menetetään" + }, "options_userfilter": { "message": "Käyttäjän säännöt" }, @@ -252,6 +261,9 @@ "options_popup_import_error_required_privacy_permission": { "message": "Tuodaksesi tämän asetustiedoston, salli AdGuardin muuttaa tietosuojaan liittyviä asetuksiasi." }, + "options_popup_import_success_title": { + "message": "Asetukset tuotu" + }, "options_popup_import_error_title": { "message": "Asetusten tuonti epäonnistui" }, @@ -300,6 +312,9 @@ "popup_tab_blocked_count": { "message": "Estetty: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Täysin estetty: %num%" + }, "popup_statistics_total": { "message": "Kaikki yhteensä" }, @@ -411,18 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "LUE LISÄÄ" }, + "popup_block_site_ads_option": { + "message": "Estä mainokset käsin" + }, "popup_security_report": { "message": "Sivuston suojausraportti" }, "popup_reset_page_user_rules": { "message": "Poista sivustolle luodut käyttäjän säännöt" }, + "context_block_site_ads": { + "message": "Estä mainokset käsin" + }, "context_security_report": { "message": "Sivuston suojausraportti" }, "context_complaint_website": { "message": "Ilmoita ongelmasta" }, + "context_site_filtering_disabled": { + "message": "AdGuard ei voi suodattaa tätä sivua" + }, "context_disable_protection": { "message": "Pysäytä AdGuardin suojaus" }, @@ -483,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Etsi välilehdistä" }, + "filtering_log_preserve_log_off": { + "message": "Ei lokikirjausta" + }, + "filtering_log_preserve_log_on": { + "message": "Kirjaa loki" + }, "filtering_refresh_tab_short": { "message": "Päivitä" }, @@ -660,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Estä hakumainonta ja sivustojen oma markkinointi" }, + "options_block_acceptable_ads_desc": { + "message": "Poista itseään mainostavat mainokset verkkosivuilta ja kontekstuaaliset mainokset hakutuloksista. Lisätietoja<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Näytä estettyjen mainosten määrä AdGuard-laajennuksen kuvakkeessa" }, "options_enable_autodetect_filter": { "message": "Käytä sopivimpia suodattimia automaattisesti" }, + "options_enable_autodetect_filter_desc": { + "message": "Kielikohtaiset suodattimet otetaan käyttöön sivuston kielen perusteella" + }, "options_select_theme": { "message": "Teema" }, @@ -705,12 +741,21 @@ "options_set_update_interval": { "message": "Suodatinten automaattinen päivitys" }, + "options_set_update_interval_desc": { + "message": "Tehokas esto edellyttää suodattimien säännöllistä päivittämistä" + }, "options_userfilter_export": { "message": "Vie" }, "options_editor_save": { "message": "Tallenna" }, + "options_editor_leave_title": { + "message": "Jätä tallentamatta?" + }, + "options_editor_leave_confirm": { + "message": "Kyllä, sulje" + }, "options_editor_leave_cancel": { "message": "Palaa muokkaukseen" }, @@ -729,6 +774,9 @@ "options_userfilter_line_break_on": { "message": "Rivinvaihto: käytössä" }, + "options_userfilter_leave_subtitle": { + "message": "Muutokset sääntöihin menetetään" + }, "options_open_changelog": { "message": "Muutoshistoria" }, @@ -765,6 +813,16 @@ "options_rule_limits_dynamic": { "message": "Dynaamiset säännöt" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Käyttäjän lisäämät säännöt, kuten käyttäjäsäännöt<\/user_rules>, sallittujen sivustojen luettelo<\/allowlist>, mukautetut suodattimet<\/custom_filters> ja Pikakorjaukset-suodatin<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Vaaralliset dynaamiset säännöt (käytetään joissakin edistyneissä muuntimissa, kuten $$redirect tai $$cookie) — sisältyvät käyttäjien lisäämiin sääntöihin" + }, + "options_rule_limits_dynamic_regex": { + "message": "Regex-säännöt — sisältyvät käyttäjien lisäämiin sääntöihin" + }, "options_rule_limits_static_rulesets": { "message": "Staattiset sääntöjoukot" }, @@ -828,6 +886,9 @@ "options_limits_warning_dynamic_rules": { "message": "Olet saavuttanut käyttäjien lisäämien sääntöjen enimmäismäärän. %maximum% \/ %current% säännöt ovat käytössä." }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Olet saavuttanut käyttäjien lisäämien vaarallisten sääntöjen rajan. %maximum% ja %current% vaaralliset säännöt ovat käytössä." + }, "options_limits_warning_dynamic_regex_rules": { "message": "Olet saavuttanut käyttäjän lisäämien regex-sääntöjen määrän. %maximum% \/ %current% regex-säännöt ovat käytössä." }, @@ -858,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Auta AdGuardin suodatinten kehityksessä" }, + "options_collect_hit_stats_desc": { + "message": "Lähetä nimettömiä tilastotietoja mainossuodattimen käytöstä<\/a> auttaaksesi AdGuardia parantamaan suodattimiaan" + }, "options_show_context_menu_title": { "message": "Lisää AdGuard selaimen valikkoon" }, @@ -870,15 +934,27 @@ "options_privacy_title": { "message": "Seurantaesto" }, + "options_privacy_desc": { + "message": "Suojaa henkilöllisyytesi ja arkaluontoiset henkilötietosi tuhansilta online-seurantaohjelmilta estämällä suosituimmat seurantamenetelmät" + }, "options_hide_referrer_title": { "message": "Piilota Referer-viitetieto ulkopuolisilta" }, + "options_hide_referrer_desc": { + "message": "Estä kolmansia osapuolia näkemästä mistä saavuit ja millä sivustoilla olet vieraillut" + }, "options_hide_search_queries_title": { "message": "Piilota hakulausekkeet" }, + "options_hide_search_queries_desc": { + "message": "Piilota käytetyt hakusanat sivustoilta, joille siirryt hakukoneen tuloksista" + }, "options_send_not_track_title": { "message": "Pyydä, etteivät sivustot seuraa sinua" }, + "options_send_not_track_desc": { + "message": "Lähetä Global Privacy Control<\/gpc> ja Do Not Track<\/dnt> -signaalit käyttämillesi verkkosivustoille" + }, "options_stripped_tracking_parameters": { "message": "Poistetaan seurantaparametrit" }, @@ -891,21 +967,39 @@ "options_remove_client_data_title": { "message": "Poista X-Client-Data-tieto" }, + "options_remove_client_data_desc": { + "message": "Estää Google Chromea lähettämästä versionumeroaan ja kustomointitietoja Googlen palvelimille" + }, "options_disable_webrtc_title": { "message": "Poista WebRTC käytöstä" }, + "options_disable_webrtc_desc": { + "message": "WebRTC voi vuotaa IP-osoitteesi vaikka käyttäisitkin välityspalvelinta tai VPN-yhteyttä. Sen käytöstä poisto saattaa haitata joitakin sivustoja" + }, "options_strip_tracking_params_title": { "message": "Poista seurantaparametrit" }, + "options_strip_tracking_params_description": { + "message": "Poista verkkopyyntöjen seurantaparametrit AdGuardin URL-seurannanestosuodattimella" + }, "options_block_known_trackers_title": { "message": "Estä seurannat" }, + "options_block_known_trackers_description": { + "message": "Estä tunnetut analytiikkatyökalut AdGuardin seurantatosuodattimella" + }, "options_third_party_title": { "message": "Itsestään tuhoutuvat 3. osapuolen evästeet" }, + "options_third_party_desc": { + "message": "Rajoita kolmannen osapuolen evästeiden elinaikaa (minuuteina)" + }, "options_first_party_title": { "message": "Ensimmäisen osapuolen evästeet tuohoutuvat itsestään (ei suositella)" }, + "options_first_party_desc": { + "message": "Rajoita ensimmäisen osapuolen evästeiden elinaikaa (minuuteina)" + }, "popup_abuse_site": { "message": "Ilmoita ongelmasta" }, @@ -978,12 +1072,39 @@ "options_about_title": { "message": "AdGuard Selainlaajennus" }, + "group_description_adblocking": { + "message": "Määritä mainosten esto täällä käsitelläksesi ärsyttäviä bannereita, ponnahdusikkunoita, videomainoksia ja vastaavia kerta kaikkiaan" + }, + "group_description_stealth": { + "message": "Suojaa identiteettiäsi ja arkaluontoisia henkilötietojasi tuhansilta verkkoseurannoita estämällä kaikki yleisimmät seurantatavat" + }, + "group_description_social": { + "message": "Piilota ei toivotut \"Tykkää\"\/\"Jaa\" -painikkeet ja muut sosiaalisen median vimpaimet" + }, + "group_description_annoyances": { + "message": "Poista ponnahdusikkunat ja muut ärsyttävät ilmoitukset, kuten evästeilmoitukset" + }, + "group_description_security": { + "message": "Suojaudu haittaohjelmilta, tietojenkalastelulta ja muilta verkon uhkilta" + }, + "group_description_miscellaneous": { + "message": "Lisää asetuksia verkkoselauksesi muokkaamiseksi AdGuardilla vielä enemmän" + }, "group_description_custom": { "message": "Luo omia suodattimia hienosäätääksesi suodatuksen haluamaksesi." }, + "group_description_lang": { + "message": "Älä rajoita itseäsi — estä mainokset kaikenkielisillä verkkosivustoilla" + }, "fullscreen_user_rules_title": { "message": "Käyttäjän säännöt" }, + "options_user_rules_editor_stub_title": { + "message": "Editori avattu toisessa ikkunassa" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Sääntösi näkyvät tässä, kun suljet sen" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Siirry editoriin" }, @@ -1023,9 +1144,21 @@ "filtering_log_tag_tooltip_third_party": { "message": "Kolmannen osapuolen pyynnöt" }, + "filtering_log_tag_tooltip_regular": { + "message": "Ilman suodatusta käsitellyt pyynnöt" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Sallitut ja estämättömät pyynnöt" + }, "filtering_log_tag_tooltip_blocked": { "message": "Estetyt pyynnöt" }, + "filtering_log_tag_tooltip_modified": { + "message": "Muokatut pyynnöt" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Pyyntöä muokattiin käyttäjän säännöillä" + }, "filtering_log_tag_tooltip_html": { "message": "Dokumentit ja alidokumentit" }, @@ -1044,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Media" }, + "filtering_log_tag_tooltip_other": { + "message": "Kirjasimet, vasteajat, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Kolmannen osapuolen pyyntö" }, @@ -1053,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP-tilakoodi" }, + "filtering_log_assumed_rule_description": { + "message": "Tämä on oletettu sääntö. Lisätietoja saat -tietokannasta<\/a>" + }, "options_stealth_general_title": { "message": "Yleiset" }, diff --git a/Extension/_locales/he/messages.json b/Extension/_locales/he/messages.json index d4617b42be..4176ebdb7d 100644 --- a/Extension/_locales/he/messages.json +++ b/Extension/_locales/he/messages.json @@ -243,6 +243,9 @@ "options_add_custom_filter": { "message": "הוסף מסנן מותאם אישית" }, + "options_filters_custom_disabled_cws": { + "message": "סינונים מותאמים אישית יחזרו בקרוב. למד עוד בבלוג שלנו" + }, "options_empty_custom_filter": { "message": "אין לך עדיין מסננים מותאמים אישית כלשהם" }, @@ -810,6 +813,16 @@ "options_rule_limits_dynamic": { "message": "כללים דינמיים" }, + "options_rule_limits_dynamic_user_rules": { + "message": "כללים שנוספו על ידי המשתמש, כגון כללי משתמש<\/user_rules>, אתרים ברשימת ההיתרים<\/allowlist>, מסננים מותאמים אישית<\/custom_filters>, ו-מסנן תיקונים מהירים<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "כללים דינמיים לא בטוחים (משמשים עבור כמה מודיפיקטורים מתקדמים, כגון $$redirect או $$cookie) — כלולים בכלליים שנוספו על ידי המשתמש" + }, + "options_rule_limits_dynamic_regex": { + "message": "כללי ביטוי רגולרי — כלולים בכלליים שנוספו על ידי המשתמש" + }, "options_rule_limits_static_rulesets": { "message": "כללים סטטיים" }, @@ -822,6 +835,12 @@ "options_rule_limits_static_rules_all": { "message": "כללים מ-מסננים מובנים<\/a>" }, + "options_rule_limits_static_rules_regex": { + "message": "כללי Regex — כלולים באמור לעיל" + }, + "options_rule_limits_numbers": { + "message": "%current% מתוך %maximum%" + }, "options_rule_limits_warning_title": { "message": "הדפדפן שינה את רשימת המסננים הפעילים" }, @@ -840,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "הפעולות האפשריות שלך" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "אפשרות 1. מחק תוספי חסימת מודעות מיותרים מהדפדפן שלך. להפעלת המסננים המוזכרים בסעיף \"המסננים שהופעלו לפני העדכון\", לחץ על הפעל מסננים מחדש.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "אפשרות 2. התקן את אפליקציית חוסם הפרסומות של AdGuard: אין לה מגבלות על כללי הסינון. קבל את אפליקציית AdGuard<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "אפשרות 3. אם אתה מרוצה מהמסנן המוגדר כברירת מחדל שהופעל, סגור את האזהרה הזו<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "אפשרות 3. אם אתה מרוצה מהמסנרים המוגדרים כברירת מחדל שהופעלו, סגור את האזהרה הזו<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "הגעת למגבלת החוקים המובנים הפעילים. הדפדפן שלך שינה את רשימת המסננים המובנים הפעילים. מספר המסננים המופעלים השתנה מ-%expected% ל-%current%." + }, + "options_limits_warning_static_filters": { + "message": "הגעת למגבלה של מסננים מובנים פעילים. %maximum% מתוך %current% מסננים מופעלים. כדי להפעיל כללים חדשים, בטל כמה מסננים מובנים." + }, + "options_limits_warning_static_rules": { + "message": "הגעת למגבלה של כללי Regex מובנים פעילים. %maximum% מתוך %current% כללים מופעלים. כדי להפעיל כללים חדשים, בטל כמה מסננים מובנים." + }, + "options_limits_warning_static_regex_rules": { + "message": "הגעת למגבלה של כללים שנוספו על ידי המשתמש. %maximum% מתוך %current% כללים מופעלים." + }, + "options_limits_warning_dynamic_rules": { + "message": "הגעת למגבלה של כללי Regex שנוספו על ידי המשתמש. %maximum% מתוך %current% כללי Regex מופעלים." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "הגעת למגבלה של כללים לא בטוחים שנוספו על ידי המשתמש. %maximum% מתוך %current% כללים לא בטוחים מאופשרים." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "הגעת למגבלה של כללי Regex שנוספו על ידי המשתמש. %maximum% מתוך %current% כללי Regex מופעלים." + }, "options_show_adguard_full_version_title": { "message": "הראה מידע על הגרסה המלאה של AdGuard" }, @@ -867,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "עזור עם הפיתוח של מסנני AdGuard" }, + "options_collect_hit_stats_desc": { + "message": "שלח סטטיסטיקה אנונימית על שימוש במסנני מודעות<\/a> כדי לעזור ל-AdGuard לשפר את המסננים שלה" + }, "options_show_context_menu_title": { "message": "הוסף את AdGuard אל תפריט ההקשר של הדפדפן" }, @@ -879,15 +934,27 @@ "options_privacy_title": { "message": "הגנת מעקב" }, + "options_privacy_desc": { + "message": "הגן על הזהות שלך ומידע אישי רגיש מאלפי עוקבים מקוונים על ידי חסימת שיטות המעקב הפופולריות ביותר" + }, "options_hide_referrer_title": { "message": "הסתר מפנה מצדדים שלישיים" }, + "options_hide_referrer_desc": { + "message": "מנע מצדדים שלישיים לדעת באיזה אתר אתה גולש" + }, "options_hide_search_queries_title": { "message": "הסתר את שאילתות החיפוש שלך" }, + "options_hide_search_queries_desc": { + "message": "הסתר את השאילתות לאתרים שביקרת בהם ממנוע חיפוש" + }, "options_send_not_track_title": { "message": "בקש מאתרים לא לעקוב אחריך" }, + "options_send_not_track_desc": { + "message": "שלח את אותות ה-בקרת פרטיות גלובלית<\/gpc> ואת ה-אל תעקוב<\/dnt> לאתרים שאתה מבקר בהם" + }, "options_stripped_tracking_parameters": { "message": "פרמטרי מעקב הוסרו" }, @@ -900,21 +967,39 @@ "options_remove_client_data_title": { "message": "הסר כותרת עליונה X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "חסום את Google Chrome משליחת המידע על גרסתו ושינוייו לתחומי Google" + }, "options_disable_webrtc_title": { "message": "השבת WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC יכול לחשוף את כתובת ה-IP שלך גם אם אתה משתמש בפרוקסי או VPN. השבתת WebRTC יכולה לפגוע בתפקוד של אתרים מסוימים" + }, "options_strip_tracking_params_title": { "message": "הסר פרמטרי מעקב" }, + "options_strip_tracking_params_description": { + "message": "הסר פרמטרים מבקשות רשת עם מסנן מעקב כתובות ה-URL של AdGuard" + }, "options_block_known_trackers_title": { "message": "חסום עוקבנים" }, + "options_block_known_trackers_description": { + "message": "חסום עוקבנים וכלי אנליטיקת רשת עם מסנן הגנה מפני מעקב של AdGuard" + }, "options_third_party_title": { "message": "השמדה עצמית של עוגיות צד שלישי" }, + "options_third_party_desc": { + "message": "הגבל את אורך החיים של עוגיות צד שלישי (דקות)" + }, "options_first_party_title": { "message": "השמדה עצמית של עוגיות צד ראשון (לא מומלץ)" }, + "options_first_party_desc": { + "message": "הגבל את אורך החיים של עוגיות צד ראשון (דקות)" + }, "popup_abuse_site": { "message": "דווח על סוגייה" }, @@ -942,6 +1027,12 @@ "popup_switch_button": { "message": "מתג הגנה" }, + "popup_limits_exceeded_warning": { + "message": "הדפדפן שלך שינה את רשימת המסננים המובנים הפעילים" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "מגבלת החוקים חורגת בתוסף הדפדפן של AdGuard. בדוק את המסננים שלך והשבת את אלו שאינך זקוק להם" + }, "short_name": { "message": "AdGuard" }, @@ -981,12 +1072,39 @@ "options_about_title": { "message": "הרחבת דפדפן של AdGuard" }, + "group_description_adblocking": { + "message": "תצר חסימת פרסומות כאן כדי להתמודד עם מודעות מטרידות, חלונות קופצים מטרידים, פרסומות וידאו מטרידות וכולי, פעם אחת ולתמיד" + }, + "group_description_stealth": { + "message": "הגן על זהותך ועל המידע האישי הרגיש שלך מפני אלפי עוקבנים מקוונים ע״י חסימת כל שיטות המעקב הפופולריות הידועות" + }, + "group_description_social": { + "message": "הסתר כפתורים של \"אהבתי\"\/\"שתף\" בלתי רצויים ויישומונים אחרים של מדיה חברתית" + }, + "group_description_annoyances": { + "message": "הסר חלונות קופצים והתראות מטרידות אחרות כמו התראות עוגייה" + }, + "group_description_security": { + "message": "הגן על עצמך מפני נוזקה, דיוג ואיומים מקוונים אחרים" + }, + "group_description_miscellaneous": { + "message": "עוד הגדרות לתצר את גלישת האינטרנט שלך עם AdGuard אפילו יותר" + }, "group_description_custom": { "message": "צור מסננים משלך עבור סינון רשת מכוונן על פי העדפתך." }, + "group_description_lang": { + "message": "אל תגביל את עצמך — חסום פרסומות באתרים בכל שפה שהיא" + }, "fullscreen_user_rules_title": { "message": "כללי משתמש" }, + "options_user_rules_editor_stub_title": { + "message": "העורך נפתח בחלון אחר" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "החוקים שלך יופיעו כאן לאחר שתסגור אותו" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "לך אל העורך" }, @@ -1020,9 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "נסה שוב" }, + "filtering_log_tag_tooltip_first_party": { + "message": "בקשות צד ראשון" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "בקשות צד שלישי" + }, + "filtering_log_tag_tooltip_regular": { + "message": "בקשות מעובדות ללא סינון" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "בקשות מותרות ולא חסומות" + }, "filtering_log_tag_tooltip_blocked": { "message": "בקשות נחסמו" }, + "filtering_log_tag_tooltip_modified": { + "message": "בקשות ששונו" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "בקשות המושפעות מכללי משתמש" + }, "filtering_log_tag_tooltip_html": { "message": "מסמכים ותת־מסמכים" }, @@ -1041,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "מדיה" }, + "filtering_log_tag_tooltip_other": { + "message": "פונטים, פינגים, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "בקשת צד שלישי" }, @@ -1050,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "קוד מעמד HTTP" }, + "filtering_log_assumed_rule_description": { + "message": "זהו חוק משוער. לפרטים נוספים, עיין ב-מאגר הידע<\/a> שלנו" + }, "options_stealth_general_title": { "message": "כללי" }, @@ -1059,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "שונות" }, + "options_coming_soon": { + "message": "בקרוב" + }, "blocking_pages_malware": { "message": "דף רשת זה בכתובת %host%<\/strong> דווח כדף נוזקה ונחסם על סמך העדפות האבטחה שלך." }, @@ -1097,5 +1242,20 @@ }, "close_button_title": { "message": "סגור" + }, + "filtering_modal_applied_rules": { + "message": "| חוק שהוחל: | חוקים שהוחלו:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| חוק משוער: | חוקים משוערים:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| חוק מקורי: | חוקים מקוריים:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "חוק DNR:" } } \ No newline at end of file diff --git a/Extension/_locales/hi/messages.json b/Extension/_locales/hi/messages.json index 8368548e6a..eae0107857 100644 --- a/Extension/_locales/hi/messages.json +++ b/Extension/_locales/hi/messages.json @@ -17,6 +17,9 @@ "options_antibanner_custom_filter_already_exists": { "message": "यह कस्टम फ़िल्टर पहले ही जोड़ा जा चुका है" }, + "options_filters_annoyances_consent_title": { + "message": "झुंझलाहट फ़िल्टर सक्षम करने से पहले कृपया ध्यान से पढ़ें" + }, "options_filters_annoyances_consent_description": { "message": "आप एक या अधिक झुंझलाहट फ़िल्टर सक्षम करने वाले हैं. वे उन तत्वों को अवरुद्ध करते हैं जो या तो वेबसाइट सामग्री से असंबंधित हैं या संबंधित हैं लेकिन आपके उपयोगकर्ता अनुभव के लिए कष्टप्रद हैं। वेबसाइट के मालिक इन तत्वों को अनिवार्य मान सकते हैं: यदि आप उन्हें ब्लॉक करते हैं, तो आप उनकी शर्तों का उल्लंघन कर सकते हैं; वेबसाइटों की कुछ कार्यक्षमता उपलब्ध नहीं हो सकती है या ठीक से काम नहीं कर सकती है। आप समझते हैं और सहमत हैं कि आपके द्वारा देखी जाने वाली वेबसाइटों के उपयोग की शर्तों का पालन करने के लिए आप पूरी तरह से जिम्मेदार हैं और AdGuard आपके द्वारा देखी जाने वाली वेबसाइटों के उपयोग की शर्तों के अनुपालन के लिए जिम्मेदार नहीं है।" }, @@ -29,12 +32,18 @@ "options_filters_annoyances_consent_enable_button": { "message": "सक्षम" }, + "popup_header_cta_link": { + "message": "सुरक्षा कैसे बढ़ाएँ" + }, "popup_header_update_filters": { "message": "अद्यतन के लिए जांचे" }, "options_popup_import_settings_wrong_file_ext": { "message": "फ़ाइल एक्सटेंशन होना चाहिए %extension%" }, + "popup_resume_protection_button": { + "message": "फिर से शुरू करना" + }, "popup_adguard_for_ios": { "message": "IOS के लिए AdGuard" }, @@ -53,6 +62,9 @@ "options_popup_version_update_disable_notification": { "message": "नोटीफिकेशन निष्क्रिय किया गया" }, + "popup_adguard_footer_title": { + "message": "अपने मोबाइल डिवाइस को सुरक्षित करे" + }, "options_popup_call_to_action": { "message": "उपरोक्त क्षेत्र में फ़िल्टर का वैध यूआरएल या फ़ाइल पथ दर्ज करें।" }, @@ -77,9 +89,30 @@ "options_popup_check_false_description": { "message": "मनपसंद फ़िल्टर जोड़ने में त्रुटि." }, + "options_add_custom_filter_modal_title": { + "message": "मनपसंद फ़िल्टर जोड़ें" + }, + "options_add_custom_filter_modal_checking_filter": { + "message": "आपके फ़िल्टर की जाँच की जा रही है..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "कस्टम फ़िल्टर जोड़ने में विफल" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "कृपया पुनः प्रयास करें या सहायता से संपर्क करें" + }, + "options_add_custom_filter_modal_add_button": { + "message": "जोड़ें" + }, + "options_add_custom_filter_modal_filter_name": { + "message": "फ़िल्टर का नाम:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "विश्वसनीय" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "कुछ फ़िल्टर नियम आपके ब्राउज़िंग अनुभव को काफ़ी हद तक बदल सकते हैं और आपकी गोपनीयता नीति से समझौता कर सकते हैं। सुनिश्चित करें कि आप केवल उन डेवलपर्स के फ़िल्टर का उपयोग करें जिन पर आप भरोसा करते हैं" + }, "options_popup_try_again_button": { "message": "पुनः प्रयास करें" }, @@ -117,21 +150,39 @@ "options_allowlist": { "message": "अल्लॉवलिस्ट" }, + "options_allowlist_desc": { + "message": "AdGuard अनुमति सूची से वेबसाइटों को फ़िल्टर नहीं करता है" + }, "options_allowlist_invert": { "message": "अनुमति सूची को उल्टा करें" }, + "options_allowlist_invert_desc": { + "message": "इस सूची की वेबसाइटों को छोड़कर हर जगह विज्ञापन अनब्लॉक करें" + }, "options_allowlist_alert_invert": { "message": "अनुमति सूची उलटी है। विज्ञापन केवल इसमें जोड़ी गई वेबसाइटों पर अवरुद्ध किए जाते हैं। अक्षम<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "अनुमति सूची में आपके सारे परिवर्तन खो जाएंगे" + }, "options_userfilter": { "message": "उपयोगकर्ता फ़िल्टर" }, "filtering_log_modified_rules": { "message": "संशोधित नियम: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "ट्रैकिंग सुरक्षा नियम: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "ट्रैकिंग सुरक्षा लागू हो गयी \nहै" + }, "filtering_log_in_allowlist": { "message": "इस वेबसाइट को अनुमति है" }, + "filtering_log_hide_referrer": { + "message": "तीसरे पक्ष के सेखराहट से रेखांकित करें" + }, "filtering_log_hide_search_queries": { "message": "आपकी खोज क्वेरी छिपाये गए।" }, @@ -186,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "आपने इस फ़िल्टर पर विश्वास करना चुना है." }, + "options_filters_info_mv3_total_rules": { + "message": "कुल नियम: %num%" + }, "options_add_custom_filter": { "message": "मनपसंद फ़िल्टर जोड़ें" }, + "options_filters_custom_disabled_cws": { + "message": "कस्टम फ़िल्टर जल्द ही वापस आेंगे। हमारे ब्लॉग में अधिक जाने" + }, "options_empty_custom_filter": { "message": "क्षमा करें, लेकिन आपके पास अभी तक कोई कस्टम फ़िल्टर नहीं है" }, @@ -204,6 +261,12 @@ "options_popup_import_error_required_privacy_permission": { "message": "इस सेटिंग फ़ाइल को आयात करने के लिए, AdGuard को अपनी गोपनीयता-संबंधी सेटिंग बदलने की अनुमति दें." }, + "options_popup_import_success_title": { + "message": "सेटिंग्स आयात की गई" + }, + "options_popup_import_error_title": { + "message": "सेटिंग आयात करने में विफल" + }, "options_popup_import_error_file_description": { "message": "कुछ गलत हो गया" }, @@ -216,15 +279,30 @@ "popup_site_filtering_state_secure_page": { "message": "सुरक्षित पृष्ठ" }, + "popup_site_filtering_state_loading": { + "message": "लोड हो रहा है..." + }, + "popup_site_filtering_state_enabling": { + "message": "सुरक्षा सक्रिय कर रहे हैं..." + }, "popup_site_filtering_state_enabled": { "message": "सुरक्षा रोका गया है" }, + "popup_site_filtering_state_disabling": { + "message": "सुरक्षा बंद कर रहे हैं..." + }, "popup_site_filtering_state_disabled": { "message": "सुरक्षा अक्षम है" }, + "popup_site_filtering_state_pausing": { + "message": "सुरक्षा को विश्राम दे रहा है..." + }, "popup_site_filtering_state_paused": { "message": "सुरक्षा रोका गया है" }, + "popup_site_filtering_state_resuming": { + "message": "सुरक्षा को फिर से शुरू कर रहे हैं..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "सभी वेबसाइटों के लिए" }, @@ -234,15 +312,27 @@ "popup_tab_blocked_count": { "message": "बंद: %num%" }, + "popup_tab_blocked_all_count": { + "message": "कुल बंद: %num%" + }, "popup_statistics_total": { "message": "सम्पूर्ण" }, "popup_statistics_all_categories": { "message": "सभी" }, + "popup_statistics_category_advertising": { + "message": "विज्ञापन" + }, "popup_statistics_category_trackers": { "message": "ट्रैकर्स" }, + "popup_statistics_category_social_media": { + "message": "सामाजिक मीडिया" + }, + "popup_statistics_category_cdn": { + "message": "सीडीएन" + }, "popup_statistics_category_other": { "message": "अन्य" }, @@ -336,12 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "और अधिक जानें" }, + "popup_block_site_ads_option": { + "message": "विज्ञापनों को मैन्युअल रूप से ब्लॉक करें" + }, "popup_security_report": { "message": "वेबसाइट सुरक्षा रिपोर्ट" }, + "popup_reset_page_user_rules": { + "message": "इस वेबसाइट के लिए उपयोगकर्ता नियम हटाएँ" + }, + "context_block_site_ads": { + "message": "विज्ञापनों को मैन्युअल रूप से ब्लॉक करें" + }, "context_security_report": { "message": "वेबसाइट सुरक्षा रिपोर्ट" }, + "context_complaint_website": { + "message": "इस वेबसाइट की रिपोर्ट करें" + }, + "context_site_filtering_disabled": { + "message": "AdGuard इस पृष्ठ को फ़िल्टर नहीं कर सकता" + }, "context_disable_protection": { "message": "एडगार्ड सुरक्षा रोकें" }, @@ -354,6 +459,9 @@ "context_open_settings": { "message": "AdGuard सेटिंग्स" }, + "context_open_log": { + "message": "फ़िल्टरिंग लॉग" + }, "context_site_exception": { "message": " यह वेबसाइट अपवादों में है" }, @@ -378,6 +486,9 @@ "filters_download_loading": { "message": "कृपया प्रतीक्षा करें फिल्टर डेटाबेस लोड हो रहा है..." }, + "post_install_loading": { + "message": "एक्सटेंशन लोड हो रहा है..." + }, "filtering_modal_element": { "message": "तत्व:" }, @@ -396,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "टैब में खोजें" }, + "filtering_log_preserve_log_off": { + "message": "लॉग रिकॉर्ड न करें" + }, + "filtering_log_preserve_log_on": { + "message": "लॉग रिकॉर्ड करें" + }, "filtering_refresh_tab_short": { "message": "ताज़ा करना" }, @@ -423,6 +540,9 @@ "filtering_table_filter": { "message": "फ़िल्टर" }, + "filtering_table_empty_reload_page_desc": { + "message": "कुछ नहीं मिला। फ़िल्टर बंद करें<\/reset> या पृष्ठ को फिर से लोड करें<\/refresh> लॉग रिकॉर्ड देखने के लिए।" + }, "filtering_modal_info_title": { "message": "अनुरोध विवरण" }, @@ -441,6 +561,9 @@ "filtering_modal_rules": { "message": "नियम:" }, + "filtering_modal_privacy": { + "message": "ट्रैकिंग सुरक्षा:" + }, "filtering_modal_filter": { "message": "फ़िल्टर:" }, @@ -468,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "स्थिति" }, + "filtering_modal_status_text_error": { + "message": "पूर्वावलोकन लोड करने में विफल। पुनः प्रयास करें" + }, "filtering_modal_status_text_loading": { "message": "लोड हो रहा है..." }, @@ -564,12 +690,18 @@ "options_block_acceptable_ads": { "message": "खोज विज्ञापनों और वेबसाइटों के स्व-प्रचार को ब्लॉक करें" }, + "options_block_acceptable_ads_desc": { + "message": "वेबसाइटों से आत्म-प्रमोशनल विज्ञापनों और खोज परिणामों से संदर्भित विज्ञापनों को हटाएँ। अधिक जाने<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "AdGuard एक्सटेंशन आइकन पर अवरुद्ध विज्ञापनों की संख्या इंगित करें" }, "options_enable_autodetect_filter": { "message": "सबसे उपयुक्त फ़िल्टर को स्वचालित रूप से सक्रिय करें" }, + "options_enable_autodetect_filter_desc": { + "message": "साइट भाषा के आधार पर भाषा-विशिष्ट फ़िल्टर चालू हो जाएंगे।" + }, "options_select_theme": { "message": "थीम" }, @@ -594,6 +726,9 @@ "options_leave_feedback": { "message": "प्रतिक्रिया दें" }, + "options_privacy": { + "message": "ट्रैकिंग सुरक्षा" + }, "options_update_antibanner_filters": { "message": "अद्यतन के लिए जांचे" }, @@ -606,18 +741,42 @@ "options_set_update_interval": { "message": "\tअद्यतन अंतराल जांचना" }, + "options_set_update_interval_desc": { + "message": "अधिक प्रभावी ब्लॉकिंग के लिए, फ़िल्टर को नियमित रूप से अपडेट करना आवश्यक है।" + }, "options_userfilter_export": { "message": "निर्यात" }, "options_editor_save": { "message": "सहेजें" }, + "options_editor_leave_title": { + "message": "बिना सहेजे बाहर जाएं?" + }, + "options_editor_leave_confirm": { + "message": "हाँ, छोड़ें" + }, + "options_editor_leave_cancel": { + "message": "संपादन पर वापस जाएं" + }, "options_userfilter_import": { "message": "आयात" }, "options_userfilter_description_key": { "message": "आप यहां अपने स्वयं के नियम जोड़ सकते हैं। HTML\/CSS से परिचित उन्नत उपयोगकर्ताओं के लिए यह विकल्प अनुशंसित है. अपने स्वयं के फ़िल्टर नियमों<\/a> को लिखने का तरीका जानने के लिए फ़िल्टर नियम ट्यूटोरियल पढ़ें।" }, + "options_userfilter_subtitle_key": { + "message": "अपने फ़िल्टरिंग नियमों के साथ विज्ञापन अवरोधन को बेहतर बनाएं" + }, + "options_userfilter_line_break_off": { + "message": "लाइन ब्रेक: बंद" + }, + "options_userfilter_line_break_on": { + "message": "लाइन ब्रेक: चालू" + }, + "options_userfilter_leave_subtitle": { + "message": "आपके नियमों में परिवर्तन खो जाएंगे" + }, "options_open_changelog": { "message": "बदलाव का" }, @@ -642,18 +801,46 @@ "options_miscellaneous_settings": { "message": "अतिरिक्त सेटिंग्स" }, + "options_rule_syntax": { + "message": "नियम वाक्य रचना" + }, "options_rule_limits": { "message": "नियम सीमा" }, + "options_rule_limits_description": { + "message": "Chrome लागू किए जा सकने वाले नियमों की संख्या को सीमित करता है" + }, "options_rule_limits_dynamic": { "message": "गतिशील नियम" }, + "options_rule_limits_dynamic_user_rules": { + "message": "उपयोगकर्ता द्वारा जोड़े गए नियम, जैसे उपयोगकर्ता नियम<\/user_rules>, अनुमति की गई वेबसाइटें<\/allowlist>, कस्टम फ़िल्टर<\/custom_filters>, और त्वरित सुधार फ़िल्टर<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "खतरनाक गतिशील नियम (कुछ उन्नत संशोधकों के लिए उपयोग किए जाते हैं, जैसे $$redirect या $$cookie) — उपयोगकर्ता द्वारा जोड़े गए नियमों में शामिल हैं" + }, + "options_rule_limits_dynamic_regex": { + "message": "रेगेक्स नियम — उपयोगकर्ता द्वारा जोड़े गए नियमों में शामिल हैं" + }, "options_rule_limits_static_rulesets": { "message": "स्थैतिक नियम-सेट" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "अंतर्निहित फ़िल्टर<\/a>, जैसे व्याकुलताएं ब्लॉक करें या भाषा-विशिष्ट फ़िल्टर" + }, "options_rule_limits_static_rules": { "message": "स्थैतिक नियम" }, + "options_rule_limits_static_rules_all": { + "message": "अंतर्निहित फ़िल्टर<\/a> से नियम" + }, + "options_rule_limits_static_rules_regex": { + "message": "रेगेक्स नियम — उपरोक्त में शामिल" + }, + "options_rule_limits_numbers": { + "message": "%current% का %maximum%" + }, "options_rule_limits_warning_title": { "message": "ब्राउज़र ने सक्रिय फ़िल्टर की सूची संशोधित कर दी है" }, @@ -672,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "आपके संभावित कार्य" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "विकल्प 1. अपने ब्राउज़र से अनावश्यक विज्ञापन-अवरोधक एक्सटेंशन हटाएं। \"अपडेट से पहले सक्षम फ़िल्टर\" अनुभाग में उल्लिखित फ़िल्टर को पुनः सक्रिय करने के लिए, क्लिक करें फ़िल्टर पुनः सक्रिय करें<\/a>।" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "विकल्प 2. एडगार्ड एड ब्लॉकर ऐप इंस्टॉल करें: इसमें फ़िल्टरिंग नियमों पर कोई प्रतिबंध नहीं है। एडगार्ड ऐप प्राप्त करें<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "विकल्प 3. यदि आप वर्तमान में सक्षम डिफ़ॉल्ट फ़िल्टर से संतुष्ट हैं, तो इस चेतावनी को बंद करें<\/a>।" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "विकल्प 3. यदि आप वर्तमान में सक्षम डिफ़ॉल्ट फ़िल्टर से संतुष्ट हैं, तो इस चेतावनी को बंद करें<\/a>।" + }, + "options_all_limits_exceeded_warning": { + "message": "आप सक्रिय अंतर्निहित नियमों की सीमा तक पहुँच गए हैं। आपके ब्राउज़र ने सक्रिय अंतर्निहित फ़िल्टर की सूची को संशोधित किया है। सक्षम फ़िल्टरों की संख्या %expected% से %current% में बदल गई है।" + }, + "options_limits_warning_static_filters": { + "message": "आप सक्रिय अंतर्निहित फ़िल्टर की सीमा तक पहुँच गए हैं। %maximum% में से %current% फ़िल्टर सक्षम हैं। नए नियमों को सक्रिय करने के लिए, कुछ अंतर्निहित फ़िल्टर अक्षम करें।" + }, + "options_limits_warning_static_rules": { + "message": "आप सक्रिय अंतर्निहित नियमों की सीमा तक पहुँच गए हैं। %maximum% में से %current% नियम सक्षम हैं। नए नियमों को सक्रिय करने के लिए, कुछ अंतर्निहित फ़िल्टर अक्षम करें।" + }, + "options_limits_warning_static_regex_rules": { + "message": "आप सक्रिय अंतर्निहित रेगेक्स नियमों की सीमा तक पहुँच गए हैं। %maximum% में से %current% रेगेक्स नियम सक्षम हैं। नए नियमों को सक्रिय करने के लिए, कुछ अंतर्निहित फ़िल्टर अक्षम करें।" + }, + "options_limits_warning_dynamic_rules": { + "message": "आप उपयोगकर्ता द्वारा जोड़े गए नियमों की सीमा तक पहुँच गए हैं। %maximum% में से %current% नियम सक्षम हैं।" + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "आपने उपयोगकर्ता द्वारा जोड़ी गई खतरनाक नियमों की सीमा तक पहुँच गए हैं। %maximum% में से %current% खतरनाक नियम सक्षम हैं।" + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "आप उपयोगकर्ता द्वारा जोड़े गए रेगेक्स नियमों की सीमा तक पहुँच गए हैं। %maximum% में से %current% रेगेक्स नियम सक्षम हैं।" + }, "options_show_adguard_full_version_title": { "message": "AdGuard पूर्ण संस्करण के बारे में जानकारी दिखाएँ" }, @@ -699,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "AdGuard फ़िल्टर के विकास में मदद करें" }, + "options_collect_hit_stats_desc": { + "message": "AdGuard को अपने फ़िल्टर में सुधार करने में मदद करने के लिए विज्ञापन फ़िल्टर उपयोग के अनाम आंकड़े<\/a> भेजें" + }, "options_show_context_menu_title": { "message": "Adguard आइटम को ब्राउज़र के संदर्भ मेनू में जोड़ें" }, @@ -708,15 +931,30 @@ "options_use_optimized_filters_desc": { "message": "ट्रैफ़िक को बचाने के लिए केवल सबसे लोकप्रिय नियमों के साथ फ़िल्टर के छोटे संस्करणों का उपयोग करता है। मोबाइल ब्राउज़र के लिए बेहतर अनुकूल" }, + "options_privacy_title": { + "message": "ट्रैकिंग सुरक्षा" + }, + "options_privacy_desc": { + "message": "सबसे लोकप्रिय ट्रैकिंग विधियों को अवरुद्ध करके हजारों ऑनलाइन ट्रैकर्स से अपनी पहचान और संवेदनशील व्यक्तिगत जानकारी को सुरक्षित रखें।" + }, "options_hide_referrer_title": { "message": "तृतीय-पक्ष से संदर्भ छिपाएं" }, + "options_hide_referrer_desc": { + "message": "तृतीय-पक्ष को यह जानने से रोकें कि आप किस वेबसाइट पर जा रहे हैं।" + }, "options_hide_search_queries_title": { "message": "अपनी खोज क्वेरी छिपाएं" }, + "options_hide_search_queries_desc": { + "message": "खोज इंजन से विज़िट की गई वेबसाइटों के लिए क्वेरीज़ छुपाएं।" + }, "options_send_not_track_title": { "message": "Do-Not-Track हेडर भेजें" }, + "options_send_not_track_desc": { + "message": "भेजें वैश्विक गोपनीयता नियंत्रण<\/gpc> और ट्रैक न करें<\/dnt> संकेत आपके द्वारा देखी जाने वाली वेबसाइटों पर।" + }, "options_stripped_tracking_parameters": { "message": "ट्रैकिंग पैरामीटर stripped" }, @@ -729,21 +967,39 @@ "options_remove_client_data_title": { "message": "एक्स-क्लाइंट-डेटा हेडर निकालें" }, + "options_remove_client_data_desc": { + "message": "Google Chrome को उसका संस्करण और संशोधनों की जानकारी Google डोमेन पर भेजने से रोकें।" + }, "options_disable_webrtc_title": { "message": "WebRTC को ब्लॉक करें" }, + "options_disable_webrtc_desc": { + "message": "यदि आप प्रॉक्सी या VPN का उपयोग करते हैं तो WebRTC आपका IP पता लीक कर सकता है। WebRTC को बंद करने से कुछ वेबसाइटें टूट सकती हैं।" + }, "options_strip_tracking_params_title": { "message": "ट्रैकिंग पैरामीटर निकालें" }, + "options_strip_tracking_params_description": { + "message": "AdGuard URL ट्रैकिंग फ़िल्टर के साथ वेब अनुरोधों से पैरामीटर निकालें।" + }, "options_block_known_trackers_title": { "message": "ट्रैकर्स को ब्लॉक करें" }, + "options_block_known_trackers_description": { + "message": "AdGuard ट्रैकिंग सुरक्षा फ़िल्टर के साथ ट्रैकर्स और वेब विश्लेषिकी उपकरण को ब्लॉक करें।" + }, "options_third_party_title": { "message": "तृतीय-पक्ष कुकीज़ का स्व-विनाश" }, + "options_third_party_desc": { + "message": "तृतीय-पक्ष कुकीज़ (मिनट) के जीवनकाल को सीमित करें" + }, "options_first_party_title": { "message": "प्रथम-पक्ष कुकीज़ का स्व-विनाश (अनुशंसित नहीं)" }, + "options_first_party_desc": { + "message": "प्रथम-पक्ष कुकीज़ (मिनट) के जीवनकाल को सीमित करें" + }, "popup_abuse_site": { "message": "मामले का विवरण करें" }, @@ -771,6 +1027,12 @@ "popup_switch_button": { "message": "सुरक्षा स्थिति" }, + "popup_limits_exceeded_warning": { + "message": "आपके ब्राउज़र ने सक्रिय अंतर्निहित फ़िल्टर की सूची को संशोधित किया है" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "AdGuard ब्राउज़र एक्सटेंशन में नियम सीमा पार हो गई है। कृपया अपने फ़िल्टर की जांच करें और जो आपको आवश्यक नहीं हैं उन्हें बंद करें" + }, "short_name": { "message": "AdGuard" }, @@ -810,12 +1072,39 @@ "options_about_title": { "message": "AdGuard ब्राउज़र एक्सटेंशन" }, + "group_description_adblocking": { + "message": "परेशान करने वाले बैनर, पॉप-अप, वीडियो विज्ञापन और इस तरह के, एक बार और सभी से निपटने के लिए यहां विज्ञापन अवरोधन को कॉन्फ़िगर करें।" + }, + "group_description_stealth": { + "message": "सभी ज्ञात लोकप्रिय ट्रैकिंग विधियों को अवरुद्ध करके हजारों ऑनलाइन ट्रैकर्स से अपनी पहचान और संवेदनशील व्यक्तिगत जानकारी को सुरक्षित रखें।" + }, + "group_description_social": { + "message": "अन्य सोशल मीडिया विजेट्स और अवांछित \"लाइक\"\/\"शेयर\" बटन छुपाएं" + }, + "group_description_annoyances": { + "message": "पॉप-अप विंडोज़ और कुकी सूचनाएं जैसे अफसोसनाक नोटिफिकेशन्स को हटा दें।" + }, + "group_description_security": { + "message": "मैलवेयर, फिशिंग, और अन्य ऑनलाइन खतरों से अपने आपको सुरक्षित रखें।" + }, + "group_description_miscellaneous": { + "message": "AdGuard के साथ अपनी वेब सर्फिंग को और भी कॉन्फ़िगर करने के लिए अधिक सेटिंग्स।" + }, "group_description_custom": { "message": "अपनी पसंद के अनुसार वेब फ़िल्टरिंग को ठीक करने के लिए अपने स्वयं के फ़िल्टर बनाएं।" }, + "group_description_lang": { + "message": "अपने आप को सीमित न करें — किसी भी भाषा में वेबसाइटों पर विज्ञापन ब्लॉक करें।" + }, "fullscreen_user_rules_title": { "message": "उपयोगकर्ता नियम" }, + "options_user_rules_editor_stub_title": { + "message": "एडिटर एक अन्य विंडो में खोला गया" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "आपके नियम बंद करने के बाद यहां दिखाई देंगे" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "संपादक के पास जाएँ" }, @@ -849,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "पुनः प्रयास करें" }, + "filtering_log_tag_tooltip_first_party": { + "message": "प्रथम-पक्ष अनुरोध" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "तृतीय-पक्ष अनुरोध" + }, + "filtering_log_tag_tooltip_regular": { + "message": "फ़िल्टरिंग के बिना संसाधित किए गए अनुरोध" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "अनुमत और अनब्लॉक किए गए अनुरोध" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "ब्लॉक अनुरोध" + }, + "filtering_log_tag_tooltip_modified": { + "message": "संशोधित अनुरोध" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "उपयोगकर्ता नियमों द्वारा प्रभावित अनुरोध" + }, "filtering_log_tag_tooltip_html": { "message": "दस्तावेज़ और उप-दस्तावेज़" }, @@ -867,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "मीडिया" }, + "filtering_log_tag_tooltip_other": { + "message": "फ़ॉन्ट्स, पिंग, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "तृतीय-पक्ष अनुरोध" }, @@ -876,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP स्थिति कोड" }, + "filtering_log_assumed_rule_description": { + "message": "यह एक मान लिया गया नियम है। विवरण के लिए, हमारी ज्ञान आधार<\/a> देखें" + }, "options_stealth_general_title": { "message": "सामान्य" }, @@ -885,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "प्रकीर्ण" }, + "options_coming_soon": { + "message": "जल्द आ रहा है" + }, "blocking_pages_malware": { "message": "%host%<\/strong> पर इस वेब पेज को मैलवेयर पेज के रूप में रिपोर्ट किया गया है और आपकी सुरक्षा प्राथमिकताओं के आधार पर ब्लॉक किया गया है." }, @@ -923,5 +1242,8 @@ }, "close_button_title": { "message": "बंद" + }, + "filtering_modal_declarative_rule": { + "message": "DNR नियम:" } -} \ No newline at end of file +} diff --git a/Extension/_locales/hr/messages.json b/Extension/_locales/hr/messages.json index 2ecaf96b68..7201bc0c69 100644 --- a/Extension/_locales/hr/messages.json +++ b/Extension/_locales/hr/messages.json @@ -32,6 +32,9 @@ "options_filters_annoyances_consent_enable_button": { "message": "Omogućiti" }, + "popup_header_cta_link": { + "message": "Kako poboljšati zaštitu" + }, "popup_header_update_filters": { "message": "Provjeri ažuriranja za filtre" }, @@ -59,6 +62,9 @@ "options_popup_version_update_disable_notification": { "message": "Onemogući obavijesti" }, + "popup_adguard_footer_title": { + "message": "Zaštitite svoj mobilni uređaj" + }, "options_popup_call_to_action": { "message": "Unesite pravilan URL ili putanju datoteke do filtra u polju iznad." }, @@ -86,12 +92,21 @@ "options_add_custom_filter_modal_title": { "message": "Dodaj prilagođeni filtar" }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Provjera vašeg filtra..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Pogreška pri učitavanju filtra" + }, "options_add_custom_filter_modal_error_subtitle": { "message": "Prostražite pokušaj ponovno ili se obratite podršci" }, "options_add_custom_filter_modal_add_button": { "message": "DODAJ" }, + "options_add_custom_filter_modal_filter_name": { + "message": "Naziv filtra:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Pouzdan" }, @@ -135,18 +150,33 @@ "options_allowlist": { "message": "Bijela lista" }, + "options_allowlist_desc": { + "message": "AdGuard ne filtrira web stranice sa bijele liste" + }, "options_allowlist_invert": { "message": "Preokreni bijelu listu" }, + "options_allowlist_invert_desc": { + "message": "Odblokiraj reklame svugdje osim na bijeloj listi" + }, "options_allowlist_alert_invert": { "message": "Popis dopuštenih je obrnut. Oglasi su blokirani samo na web-lokacijama koje su mu dodane. Onemogući<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Vaše promjene na popisu dozvola će biti izgubljene" + }, "options_userfilter": { "message": "Korisnička pravila" }, "filtering_log_modified_rules": { "message": "Izmijenjena pravila: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "Pravila zaštite od praćenja: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Zaštita od praćenja primijenjena" + }, "filtering_log_in_allowlist": { "message": "Ova stranica je dopuštena" }, @@ -207,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "Izabrali ste vjerovati ovom filtru." }, + "options_filters_info_mv3_total_rules": { + "message": "Ukupno pravila: %num%" + }, "options_add_custom_filter": { "message": "Dodaj prilagođeni filtar" }, + "options_filters_custom_disabled_cws": { + "message": "Prilagođeni filtri će se uskoro vratiti. Saznajte više na našem blogu" + }, "options_empty_custom_filter": { "message": "Nemate prilagođene filtre" }, @@ -225,6 +261,9 @@ "options_popup_import_error_required_privacy_permission": { "message": "Za uvoz ove datoteke s postavkama dopustite AdGuardu da promijeni vaše postavke vezane uz privatnost." }, + "options_popup_import_success_title": { + "message": "Postavke uvezene" + }, "options_popup_import_error_title": { "message": "Uvoz postavki nije uspio" }, @@ -243,15 +282,27 @@ "popup_site_filtering_state_loading": { "message": "Učitavanje..." }, + "popup_site_filtering_state_enabling": { + "message": "Omogućavanje zaštite..." + }, "popup_site_filtering_state_enabled": { "message": "Zaštita je omogućena" }, + "popup_site_filtering_state_disabling": { + "message": "Onemogućavanje zaštite..." + }, "popup_site_filtering_state_disabled": { "message": "Zaštita je onemogućena" }, + "popup_site_filtering_state_pausing": { + "message": "Pauziranje zaštite..." + }, "popup_site_filtering_state_paused": { "message": "Zaštita je pauzirana" }, + "popup_site_filtering_state_resuming": { + "message": "Nastavljanje zaštite..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "za sve web stranice" }, @@ -261,6 +312,9 @@ "popup_tab_blocked_count": { "message": "Blokirano: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Oglasi blokirani: %num%" + }, "popup_statistics_total": { "message": "Ukupno" }, @@ -372,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "SAZNAJTE VIŠE" }, + "popup_block_site_ads_option": { + "message": "Ručno blokirajte oglase" + }, "popup_security_report": { "message": "Provjeri sigurnost web stranice" }, + "popup_reset_page_user_rules": { + "message": "Ukloni korisnička pravila za ovo web-mjesto" + }, + "context_block_site_ads": { + "message": "Ručno blokirajte oglase" + }, "context_security_report": { "message": "Provjeri sigurnost web stranice" }, "context_complaint_website": { "message": "Prijavite problem" }, + "context_site_filtering_disabled": { + "message": "AdGuard ne može filtrirati ovu stranicu" + }, "context_disable_protection": { "message": "Pauziraj AdGuard zaštitu" }, @@ -420,6 +486,9 @@ "filters_download_loading": { "message": "Molimo pričekajte dok se bazafiltara ne učita..." }, + "post_install_loading": { + "message": "Učitavanje proširenja..." + }, "filtering_modal_element": { "message": "Element:" }, @@ -438,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Pretraži u karticama" }, + "filtering_log_preserve_log_off": { + "message": "Ne snimaj log" + }, + "filtering_log_preserve_log_on": { + "message": "Snimaj log" + }, "filtering_refresh_tab_short": { "message": "Osvježi" }, @@ -465,6 +540,9 @@ "filtering_table_filter": { "message": "Filtar" }, + "filtering_table_empty_reload_page_desc": { + "message": "Nije pronađeno. Onemogući filtre<\/reset> ili ponovno učitaj stranicu<\/refresh> da prikažeš zapise." + }, "filtering_modal_info_title": { "message": "Detalji zahtjeva" }, @@ -483,6 +561,9 @@ "filtering_modal_rules": { "message": "pravila:" }, + "filtering_modal_privacy": { + "message": "Zaštita od praćenja:" + }, "filtering_modal_filter": { "message": "Filtar:" }, @@ -510,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Stanje:" }, + "filtering_modal_status_text_error": { + "message": "Nije uspjelo učitavanje pregleda. Pokušajte ponovo" + }, "filtering_modal_status_text_loading": { "message": "Učitavanje..." }, @@ -606,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Blokiranje samopromocije oglasa za pretraživanje i web-lokacija" }, + "options_block_acceptable_ads_desc": { + "message": "Uklonite oglase za samopromociju s web stranica i kontekstualne oglase iz rezultata pretraživanja. Saznajte više<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Prikaži broj blokiranih oglasa na ikoni AdGuard proširenja" }, "options_enable_autodetect_filter": { "message": "Automatski aktiviraj najprikladnije filtre" }, + "options_enable_autodetect_filter_desc": { + "message": "Filtri specifični za jezik uključit će se ovisno o jeziku web-mjesta" + }, "options_select_theme": { "message": "Tema" }, @@ -651,12 +741,24 @@ "options_set_update_interval": { "message": "Automatsko ažuriranje filtara" }, + "options_set_update_interval_desc": { + "message": "Za učinkovitije blokiranje filtre je potrebno redovito ažurirati" + }, "options_userfilter_export": { "message": "Izvoz" }, "options_editor_save": { "message": "Spremi" }, + "options_editor_leave_title": { + "message": "Želite li napustiti bez spremanja?" + }, + "options_editor_leave_confirm": { + "message": "Da, napusti" + }, + "options_editor_leave_cancel": { + "message": "Natrag na uređivanje" + }, "options_userfilter_import": { "message": "Uvoz" }, @@ -666,6 +768,15 @@ "options_userfilter_subtitle_key": { "message": "Koristiti pravila za preciznije filtriranje" }, + "options_userfilter_line_break_off": { + "message": "Prijelom retka: DEAKTIVIRAN" + }, + "options_userfilter_line_break_on": { + "message": "Prijelom retka: AKTIVIRAN" + }, + "options_userfilter_leave_subtitle": { + "message": "Vaše promjene u pravilima će biti izgubljene" + }, "options_open_changelog": { "message": "Zapisnik promjena" }, @@ -696,15 +807,40 @@ "options_rule_limits": { "message": "Ograničenja pravila" }, + "options_rule_limits_description": { + "message": "Chrome ograničava broj pravila koja se mogu primijeniti" + }, "options_rule_limits_dynamic": { "message": "Dinamička pravila" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Pravila koja je dodao korisnik, kao što su korisnička pravila<\/user_rules>, web stranice na dopuštenom popisu<\/allowlist>, prilagođeni filtri<\/custom_filters> i filtriranje brzih ispravaka<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Nesigurna dinamična pravila (koriste se za neke napredne modifikatore, kao što su $$redirect ili $$cookie) — uključena u pravila koja dodaje korisnik" + }, + "options_rule_limits_dynamic_regex": { + "message": "Pravila regularnih izraza — uključena u pravila koja dodaje korisnik" + }, "options_rule_limits_static_rulesets": { "message": "Statički skupovi pravila" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Ugrađeni filtri<\/a>, kao što su blokiranje ometanja ili filtri specifični za jezik." + }, "options_rule_limits_static_rules": { "message": "Statička pravila" }, + "options_rule_limits_static_rules_all": { + "message": "Pravila iz ugrađenih filtera<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Pravila regularnih izraza — uključena u gore" + }, + "options_rule_limits_numbers": { + "message": "%current% od %maximum%" + }, "options_rule_limits_warning_title": { "message": "Preglednik je izmijenio popis aktivnih filtera" }, @@ -723,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "Vaše moguće radnje" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Opcija 1. Uklonite nepotrebna proširenja za blokiranje oglasa iz svog preglednika. Da biste ponovno aktivirali filtru navedenu u odjeljku \"Filtri omogućeni prije ažuriranja\", kliknite reaktivirajte filtre.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Opcija 2. Instalirajte AdGuard Ad Blocker aplikaciju: nema ograničenja za pravila filtriranja. Nabavite aplikaciju AdGuard<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Opcija 3. Ako ste zadovoljni s trenutno omogućenim zadanim filtrima, Zatvorite ovo upozorenje.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Opcija 3. Ako ste zadovoljni s trenutno omogućenim filtrima, zatvorite ovo upozorenje.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Dosegli ste ograničenje broja aktivnih ugrađenih pravila. Preglednik je izmijenio popis aktivnih ugrađenih filtara. Broj omogućenih filtara promijenjen je s %expected% na %current%." + }, + "options_limits_warning_static_filters": { + "message": "Dosegli ste ograničenje aktivnih ugrađenih filtara. %maximum% od %current% filtara je omogućeno. Da biste aktivirali nova pravila, onemogućite neke ugrađene filtre." + }, + "options_limits_warning_static_rules": { + "message": "Dosegli ste ograničenje aktivnih ugrađenih pravila. %maximum% od %current% pravila je omogućeno. Da biste aktivirali nova pravila, onemogućite neke ugrađene filtre." + }, + "options_limits_warning_static_regex_rules": { + "message": "Dosegli ste ograničenje aktivnih ugrađenih regex pravila. %maximum% od %current% regex pravila je omogućeno. Da biste aktivirali nova pravila, onemogućite neke ugrađene filtre." + }, + "options_limits_warning_dynamic_rules": { + "message": "Dosegli ste ograničenje broja pravila koja je dodao korisnik. %maximum% od %current% pravila je omogućeno." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Dosegnuli ste limit korisnički dodanih nesigurnih pravila. %maximum% od %current% nesigurnih pravila je omogućeno." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Dosegli ste ograničenje broja regex pravila koje je dodao korisnik. %maximum% od %current% regex pravila je omogućeno." + }, "options_show_adguard_full_version_title": { "message": "Prikaži informacije o punoj verziji AdGuarda" }, @@ -750,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Pošaljite statistiku upotrebe filtara oglasa" }, + "options_collect_hit_stats_desc": { + "message": "Pošaljite anonimne statističke podatke o upotrebi filtara oglasa<\/a> koji će nam pomoći da poboljšamo i optimiziramo naše filtre" + }, "options_show_context_menu_title": { "message": "Dodaj AdGuard u kontekstni izbornik preglednika" }, @@ -762,15 +934,27 @@ "options_privacy_title": { "message": "Zaštita od praćenja" }, + "options_privacy_desc": { + "message": "Zaštitite svoj identitet i osjetljive osobne podatke od tisuća internetskih pratitelja, blokiranjem najpopularnijih metoda praćenja" + }, "options_hide_referrer_title": { "message": " Sakrij HTTP referer od trećih strana" }, + "options_hide_referrer_desc": { + "message": "Spriječite treće strane da znaju koju web stranicu posjećujete" + }, "options_hide_search_queries_title": { "message": "Sakrijte vaše upite pretraživanja" }, + "options_hide_search_queries_desc": { + "message": "Sakrijte upite o web stranicama koje ste posjetili iz pretraživača" + }, "options_send_not_track_title": { "message": "Zatražite od web-mjesta da vas ne prate" }, + "options_send_not_track_desc": { + "message": "Pošaljite signale Global Privacy Control<\/gpc> i Do Not Track<\/dnt> na web stranice koje posjećujete" + }, "options_stripped_tracking_parameters": { "message": "Parametri praćenja su uklonjeni" }, @@ -783,21 +967,39 @@ "options_remove_client_data_title": { "message": "Ukloni X-Client-Data zaglavlje" }, + "options_remove_client_data_desc": { + "message": "Blokirajte Google Chrome da ne šalje informacije o svojoj verziji i izmjenama prema Google-ovim domenama" + }, "options_disable_webrtc_title": { "message": "Blokiraj WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC može otkriti vašu IP adresu čak i ako koristite proxy ili VPN. Onemogućavanje WebRTC-a može pokvariti neke web stranice" + }, "options_strip_tracking_params_title": { "message": "Ukloni parametre praćenja" }, + "options_strip_tracking_params_description": { + "message": "Ukloni parametre iz web zahtjeva pomoću AdGuard URL filtra za praćenje" + }, "options_block_known_trackers_title": { "message": "Blokiranje poznatih alata za praćenje" }, + "options_block_known_trackers_description": { + "message": "Blokirajte pratitelje i alate za analizu weba pomoću AdGuard filtra zaštite od praćenja" + }, "options_third_party_title": { "message": "Samouništavajući kolačići treće strane" }, + "options_third_party_desc": { + "message": "Ograničite životni vijek kolačića treće strane (minute)" + }, "options_first_party_title": { "message": "Samouništavajući kolačići prve strane (ne preporučuje se)" }, + "options_first_party_desc": { + "message": "Ograničite životni vijek kolačića prve strane (minute)" + }, "popup_abuse_site": { "message": "Prijavite problem" }, @@ -825,6 +1027,12 @@ "popup_switch_button": { "message": "Promjena zaštite" }, + "popup_limits_exceeded_warning": { + "message": "Preglednik je izmijenio popis aktivnih ugrađenih filtara" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Prekoračeno ograničenje pravila u AdGuard proširenju preglednika. Provjerite svoje filtre i onemogućite one koji vam nisu potrebni" + }, "short_name": { "message": "AdGuard AdBlocker" }, @@ -864,12 +1072,39 @@ "options_about_title": { "message": "Proširenje preglednika AdGuard" }, + "group_description_adblocking": { + "message": "Konfigurirajte blokiranje oglasa ovdje kako biste se nosili s dosadnim natpisima, skočnim prozorima, videooglasima i slično, jednom zauvijek" + }, + "group_description_stealth": { + "message": "Zaštitite svoj identitet i osjetljive osobne podatke od tisuća internetskih pratitelja blokiranjem svih poznatih popularnih metoda praćenja" + }, + "group_description_social": { + "message": "Sakrijte neželjene gumbe \"Sviđa mi se\"\/\"Podijeli\" i druge widgete na društvenim mrežama" + }, + "group_description_annoyances": { + "message": "Uklonite skočne prozore i druge dosadne obavijesti kao što su obavijesti o kolačićima" + }, + "group_description_security": { + "message": "Zaštitite se od zlonamjernih programa, krađe identiteta i drugih internetskih prijetnji" + }, + "group_description_miscellaneous": { + "message": "Dodatne postavke za još veću konfiguraciju surfanja webom pomoću AdGuarda" + }, "group_description_custom": { "message": "Stvaranje vlastitih filtara radi preciznog podešavanja filtriranja weba prema vašim željama." }, + "group_description_lang": { + "message": "Nemojte se ograničavati – blokirajte oglase na web-lokacijama na bilo kojem jeziku" + }, "fullscreen_user_rules_title": { "message": "Korisnička pravila" }, + "options_user_rules_editor_stub_title": { + "message": "Uređivač otvoren u drugom prozoru" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Vaša pravila će se ovde pojaviti nakon što ga zatvorite" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Idi na uređivač" }, @@ -903,9 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Pokušajte ponovno" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Zahtjevi prve strane" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Zahtjevi trećih strana" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Samo zahtjevi procesirani bez filtriranja" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Samo dozvoljeni i odblokirani zahtjevi" + }, "filtering_log_tag_tooltip_blocked": { "message": "Blokirani zahtjevi" }, + "filtering_log_tag_tooltip_modified": { + "message": "Samo modificirani zahtjevi" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Zahtjevi na koje utiču korisnička pravila" + }, "filtering_log_tag_tooltip_html": { "message": "Dokumenti i poddokumenti" }, @@ -924,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Multimedija" }, + "filtering_log_tag_tooltip_other": { + "message": "Fontovi, pingovi, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Zahtjev treće strane" }, @@ -933,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP kod stanja" }, + "filtering_log_assumed_rule_description": { + "message": "Ovo je pretpostavljeno pravilo. Za detalje pogledajte našu bazu znanja<\/a>" + }, "options_stealth_general_title": { "message": "Općenito" }, @@ -942,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "Razno" }, + "options_coming_soon": { + "message": "Uskoro" + }, "blocking_pages_malware": { "message": "Ova web stranica na adresi %host%<\/strong> prijavljena je kao zlonamjerna stranica te je stoga blokirana bazirano na vašim postavkama sigurnosti." }, @@ -980,5 +1242,20 @@ }, "close_button_title": { "message": "Zatvori" + }, + "filtering_modal_applied_rules": { + "message": "| Primijenjeno pravilo: | Primijenjena pravila: | Primijenjena pravila:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Pretpostavljeno pravilo: | Pretpostavljena pravila: | Pretpostavljena pravila:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Izvorno pravilo: | Izvorna pravila: | Izvorna pravila:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "DNR pravilo:" } } \ No newline at end of file diff --git a/Extension/_locales/hu/messages.json b/Extension/_locales/hu/messages.json index 355c354820..4068ca0a2f 100644 --- a/Extension/_locales/hu/messages.json +++ b/Extension/_locales/hu/messages.json @@ -150,12 +150,21 @@ "options_allowlist": { "message": "Kivételek" }, + "options_allowlist_desc": { + "message": "Az AdGuard nem szűri a kivételek listáján szereplő oldalakat" + }, "options_allowlist_invert": { "message": "Kivételek megfordítása" }, + "options_allowlist_invert_desc": { + "message": "Engedélyezze a hirdetéseket mindenhol, leszámítva a kivételek listáját" + }, "options_allowlist_alert_invert": { "message": "A kivételek listája meg lett fordítva. A hirdetések csak azokon a webhelyeken lesznek blokkolva, amik hozzá lettek adva a kivételekhez. Kikapcsolás<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "A kivételek listájára tett módosításai elvesznek" + }, "options_userfilter": { "message": "Felhasználói szabályok" }, @@ -252,6 +261,9 @@ "options_popup_import_error_required_privacy_permission": { "message": "A beállításfájl importálásához engedélyezze az AdGuard számára az adatvédelemmel kapcsolatos beállítások módosítását." }, + "options_popup_import_success_title": { + "message": "Beállítások importálva" + }, "options_popup_import_error_title": { "message": "Nem sikerült importálni a beállításokat" }, @@ -300,6 +312,9 @@ "popup_tab_blocked_count": { "message": "Blokkolva: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Összes blokkolva: %num%" + }, "popup_statistics_total": { "message": "Összesen" }, @@ -411,18 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "TUDJON MEG TÖBBET" }, + "popup_block_site_ads_option": { + "message": "Hirdetések manuális blokkolása" + }, "popup_security_report": { "message": "Webhely biztonságának ellenőrzése" }, "popup_reset_page_user_rules": { "message": "Felhasználó szabályok törlése ennél a webhelynél" }, + "context_block_site_ads": { + "message": "Hirdetések manuális blokkolása" + }, "context_security_report": { "message": "Webhely biztonságának ellenőrzése" }, "context_complaint_website": { "message": "Probléma bejelentése" }, + "context_site_filtering_disabled": { + "message": "Az AdGuard nem tudja szűrni ezt az oldalt" + }, "context_disable_protection": { "message": "AdGuard védelem szüneteltetése" }, @@ -483,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Keresés a lapok között" }, + "filtering_log_preserve_log_off": { + "message": "Napló nem rögzítése" + }, + "filtering_log_preserve_log_on": { + "message": "Napló rögzítése" + }, "filtering_refresh_tab_short": { "message": "Frissítés" }, @@ -510,6 +540,9 @@ "filtering_table_filter": { "message": "Szűrő" }, + "filtering_table_empty_reload_page_desc": { + "message": "Nem találtunk semmit. Kapcsolja ki a szűrőket<\/reset>, vagy töltse be újra az oldalt<\/refresh> a naplóbejegyzések megtekintéséhez." + }, "filtering_modal_info_title": { "message": "Kérés részletei" }, @@ -558,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Állapot:" }, + "filtering_modal_status_text_error": { + "message": "Nem sikerült betölteni az előnézetet. Kérjük, próbálja újra" + }, "filtering_modal_status_text_loading": { "message": "Betöltés..." }, @@ -654,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Blokkolja a keresők hirdetéseit és a weboldalak önpromóciós reklámjait" }, + "options_block_acceptable_ads_desc": { + "message": "Törölje a saját reklámait a weboldalakról és a kontextusos hirdetéseket a keresési találatokból. Tudjon meg többet<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "A blokkolt hirdetések számának megjelenítése az AdGuard kiegészítő ikonján" }, "options_enable_autodetect_filter": { "message": "A megfelelő szűrők automatikus aktiválása" }, + "options_enable_autodetect_filter_desc": { + "message": "A nyelvspecifikus szűrők a webhely nyelvétől függően aktiválódnak" + }, "options_select_theme": { "message": "Téma" }, @@ -699,12 +741,24 @@ "options_set_update_interval": { "message": "Szűrők automatikus frissítése" }, + "options_set_update_interval_desc": { + "message": "A hatékonyabb blokkolás érdekében a szűrőket rendszeresen frissíteni kell" + }, "options_userfilter_export": { "message": "Exportálás" }, "options_editor_save": { "message": "Mentés" }, + "options_editor_leave_title": { + "message": "Bezárás mentés nélkül?" + }, + "options_editor_leave_confirm": { + "message": "Igen, kijelentkezés" + }, + "options_editor_leave_cancel": { + "message": "Vissza a szerkesztéshez" + }, "options_userfilter_import": { "message": "Importálás" }, @@ -714,6 +768,15 @@ "options_userfilter_subtitle_key": { "message": "Finomítsa a hirdetésblokkolást saját szűrési szabályaival" }, + "options_userfilter_line_break_off": { + "message": "Sortörés: Letiltva" + }, + "options_userfilter_line_break_on": { + "message": "Sortörés: Engedélyezve" + }, + "options_userfilter_leave_subtitle": { + "message": "A szabályok módosításai elvesznek" + }, "options_open_changelog": { "message": "Változásnapló" }, @@ -744,15 +807,34 @@ "options_rule_limits": { "message": "Szabálykorlátok" }, + "options_rule_limits_description": { + "message": "A Chrome korlátozza az alkalmazható szabályok számát" + }, "options_rule_limits_dynamic": { "message": "Dinamikus szabályok" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Felhasználó által hozzáadott szabályok, például felhasználói szabályok<\/user_rules>, engedélyezési listás webhelyek<\/allowlist>, egyéni szűrők<\/custom_filters>, és Gyorsjavítás szűrő<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Nem biztonságos dinamikus szabályok (egyes speciális módosítókhoz használatosak, például $$redirect vagy $$cookie) – a felhasználó által hozzáadott szabályokban" + }, + "options_rule_limits_dynamic_regex": { + "message": "Regex szabályok — Itt szerepelnek a felhasználó által hozzáadott szabályok" + }, "options_rule_limits_static_rulesets": { "message": "Statikus szabályrendszerek" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Beépített szűrők<\/a>, mint például a zavaró tényezők blokkolása vagy a nyelvspecifikus szűrők" + }, "options_rule_limits_static_rules": { "message": "Statikus szabályok" }, + "options_rule_limits_static_rules_all": { + "message": "Szabályok innen: beépített szűrők<\/a>" + }, "options_rule_limits_static_rules_regex": { "message": "Regex szabályok – a fentiekben" }, @@ -804,6 +886,9 @@ "options_limits_warning_dynamic_rules": { "message": "Elérte a felhasználók által hozzáadott szabályok korlátját. %maximum% \/ %current% szabály engedélyezve van." }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Elérte a felhasználók által hozzáadott nem biztonságos szabályok korlátját. %maximum% a %current% nem biztonságos szabályok közül engedélyezve van." + }, "options_limits_warning_dynamic_regex_rules": { "message": "Elérte a felhasználók által hozzáadott reguláris kifejezések korlátját. %maximum% \/ %current% regex szabály engedélyezve van." }, @@ -834,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Segítsen az AdGuard szűrőinek fejlesztésében" }, + "options_collect_hit_stats_desc": { + "message": "Küldjön névtelen statisztikákat a hirdetésszűrők használatáról<\/a>, ezzel segíti az AdGuard szűrőinek javítását" + }, "options_show_context_menu_title": { "message": "Az AdGuard hozzáadása a böngésző helyi menüjéhez" }, @@ -846,15 +934,27 @@ "options_privacy_title": { "message": "Nyomon követés elleni védelem" }, + "options_privacy_desc": { + "message": "Védje meg személyazonosságát és érzékeny személyes adatait több ezer online nyomkövetőtől a legnépszerűbb követési módszerek blokkolásával" + }, "options_hide_referrer_title": { "message": "Referer elrejtése a harmadik felek elől" }, + "options_hide_referrer_desc": { + "message": "Annaks megelőzése, hogy a harmadik felek megismerjék, Ön milyen webhelyeket látogat meg" + }, "options_hide_search_queries_title": { "message": "Keresési kérések elrejtése" }, + "options_hide_search_queries_desc": { + "message": "A keresési lekérdezéseket elrejti a látogatott weboldalak elől." + }, "options_send_not_track_title": { "message": "Kéri a webhelyeket, hogy ne kövessék nyomon" }, + "options_send_not_track_desc": { + "message": "Ez elküldi a Global Privacy Control<\/gpc> és a Do Not Track<\/dnt> jelzéseket a webhelyek számára, amelyeket meglátogat" + }, "options_stripped_tracking_parameters": { "message": "Követési paraméterek eltávolítva" }, @@ -867,21 +967,39 @@ "options_remove_client_data_title": { "message": "X-Client-Data fejléc eltávolítása" }, + "options_remove_client_data_desc": { + "message": "Megakadályozza, hogy a Google Chrome elküldje a verziószámát és egyéb információkat a Google domainek felé" + }, "options_disable_webrtc_title": { "message": "WebRTC tiltása" }, + "options_disable_webrtc_desc": { + "message": "A WebRTC mögül szivárog az IP cím, így megtudhatják az Ön valós IP címét, hiába használ proxyt vagy VPN-t. A WebRTC letiltása elronthatja egyes webhelyek működését" + }, "options_strip_tracking_params_title": { "message": "Követési paraméterek levágása" }, + "options_strip_tracking_params_description": { + "message": "Az AdGuard URL Követés szűrő segítségével eltávolítja a paramétereket a webes kérésekből" + }, "options_block_known_trackers_title": { "message": "Nyomkövetők blokkolása" }, + "options_block_known_trackers_description": { + "message": "Az AdGuard Követés Elleni szűrő segítségével blokkolja a nyomkövetőket és az elemző eszközöket" + }, "options_third_party_title": { "message": "Harmadik féltől származó sütik önmegsemmisítése" }, + "options_third_party_desc": { + "message": "A külső sütik élettartamának korlátozása (percekben)" + }, "options_first_party_title": { "message": "Az elsődleges sütik önmegsemmisítése (nem ajánlott)" }, + "options_first_party_desc": { + "message": "Az elsődleges sütik élettartamának korlátozása (percekben)" + }, "popup_abuse_site": { "message": "Probléma bejelentése" }, @@ -912,6 +1030,9 @@ "popup_limits_exceeded_warning": { "message": "A böngészője módosította az aktív beépített szűrők listáját" }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Túllépte a szabálykorlátot az AdGuard böngészőbővítményben. Kérjük, ellenőrizze a szűrőket, és tiltsa le azokat, amelyekre nincs szüksége" + }, "short_name": { "message": "AdGuard" }, @@ -951,12 +1072,39 @@ "options_about_title": { "message": "AdGuard Böngészőkiegészítő" }, + "group_description_adblocking": { + "message": "Itt tudja beállítani a hirdetésblokkolást, hogy egyszer és mindenkorra megszabaduljon a szalaghirdetésektől, felugró ablakoktól, videóhirdetésektől, stb" + }, + "group_description_stealth": { + "message": "Védje meg személyazonosságát és érzékeny személyes adatait az online nyomkövetők ezreivel szemben azzal, hogy blokkolja az összes népszerű nyomkövetési technikát" + }, + "group_description_social": { + "message": "Rejtse el a kéretlen \"Lájk\"\/\"Megosztás\" gombokat és a többi közösségi média widgetet" + }, + "group_description_annoyances": { + "message": "Távolítsa el az előugró ablakokat és egyéb bosszantó értesítéseket, például a süti értesítéseket" + }, + "group_description_security": { + "message": "Védje magát a rosszindulatú programokkal, adathalászokkal és más online fenyegetésekkel szemben" + }, + "group_description_miscellaneous": { + "message": "Egyéb beállítások, amelyekkel még tovább fokozhatja a webes böngészését az AdGuarddal" + }, "group_description_custom": { "message": "Hozza létre saját szűrőit a szűrés tetszés szerinti finomhangolásához." }, + "group_description_lang": { + "message": "Ne szorítsa magát korlátok közé — blokkolja a hirdetéseket bármilyen nyelvű weboldalon" + }, "fullscreen_user_rules_title": { "message": "Felhasználói szabályok" }, + "options_user_rules_editor_stub_title": { + "message": "A szerkesztő egy másik ablakban nyitva van" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "A szabályai itt jelennek meg, miután bezárta" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Szerkesztő megnyitása" }, @@ -990,9 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Újrapróbálkozás" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Elsődleges kérések" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Harmadik fél kérések" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Szűrés nélkül feldolgozott kérések" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Engedélyezett és feloldott kérések" + }, "filtering_log_tag_tooltip_blocked": { "message": "Blokkolt kérések" }, + "filtering_log_tag_tooltip_modified": { + "message": "Módosított kérések" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Felhasználói szabályok által érintett kérések" + }, "filtering_log_tag_tooltip_html": { "message": "Dokumentumok és aldokumentumok" }, @@ -1011,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Média" }, + "filtering_log_tag_tooltip_other": { + "message": "Betűtípusok, ping, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Harmadik fél kérése" }, @@ -1020,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP állapot kód" }, + "filtering_log_assumed_rule_description": { + "message": "Ez egy feltételezett szabály. További részletekért lásd a Tudásbázist<\/a>" + }, "options_stealth_general_title": { "message": "Általános" }, @@ -1070,5 +1242,20 @@ }, "close_button_title": { "message": "Bezárás" + }, + "filtering_modal_applied_rules": { + "message": "| Alkalmazott szabály: | Alkalmazott szabályok:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Feltételezett szabály: | Feltételezett szabályok:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Eredeti szabály: | Eredeti szabályok:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "DNR szabály:" } } \ No newline at end of file diff --git a/Extension/_locales/hy/messages.json b/Extension/_locales/hy/messages.json index 68094dedb9..fd52398153 100644 --- a/Extension/_locales/hy/messages.json +++ b/Extension/_locales/hy/messages.json @@ -1,10 +1,22 @@ { + "options_popup_title_placeholder": { + "message": "Մուտքագրեք ֆիլտրի անունը" + }, + "options_filters_list_search_display_option_all_filters": { + "message": "Բոլոր ֆիլտրերը" + }, "options_filters_list_search_display_option_enabled": { "message": "Թույլատրված" }, "options_filters_list_search_display_option_disabled": { "message": "Անջատված" }, + "options_filters_empty_title": { + "message": "Ոչինչ չի գտնվել" + }, + "options_antibanner_custom_filter_already_exists": { + "message": "Այս կարգավորվող զտիչն արդեն ավելացվել է" + }, "options_filters_annoyances_consent_title": { "message": "Խնդրում ենք ուշադիր կարդալ նախքան նյարդայնացնող ֆիլտրեր հնարավորություն տալը" }, @@ -20,73 +32,421 @@ "options_filters_annoyances_consent_enable_button": { "message": "Միացնել" }, + "popup_header_cta_link": { + "message": "Ինչպես բարելավել պաշտպանությունը" + }, "popup_header_update_filters": { "message": "Ստուգել զտիչի թարմացումները" }, + "options_popup_import_settings_wrong_file_ext": { + "message": "Ֆայլի ընդլայնումը պետք է լինի %extension%" + }, + "popup_resume_protection_button": { + "message": "Վերականգնել հիմա" + }, + "popup_adguard_for_ios": { + "message": "AdGuard iOS-ի համար" + }, + "popup_adguard_for_android": { + "message": "AdGuard Android-ի համար" + }, + "options_filters_filter_version": { + "message": "տարբերակ" + }, + "options_filters_filter_link": { + "message": "Գնալ գլխավոր էջ" + }, + "options_filters_filter_updated": { + "message": "թարմացվել է" + }, + "options_popup_version_update_disable_notification": { + "message": "Անջատել ծանուցումները" + }, + "popup_adguard_footer_title": { + "message": "Պաշտպանեք ձեր շարժական սարքը" + }, + "options_popup_call_to_action": { + "message": "Մուտքագրեք վավեր URL-ը կամ ֆիլտրի ֆայլի ուղին վերևի դաշտում:" + }, + "options_popup_description": { + "message": "Դուք կբաժանվեք այդ ֆիլտրին:" + }, "options_popup_url_title": { "message": "Նոր զտիչի բաժանորդագրություն" }, + "options_popup_url_placeholder": { + "message": "Մուտքագրեք URL կամ ֆայլի ուղին" + }, "options_popup_next_button": { "message": "Հաջորդը" }, + "options_popup_checking_filter": { + "message": "Ստուգվում է ձեր զտիչը" + }, "options_popup_check_false_title": { "message": "Սխալ" }, + "options_popup_check_false_description": { + "message": "Սխալ է ձեր մաքսային ֆիլտրը ավելացնելիս:" + }, "options_add_custom_filter_modal_title": { "message": "Ավելացնել հարմարեցված զտիչ" }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Աղբյուրի ձեր ֆիլտրը ստուգվում է..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Կարգավորումները հաշվի առնել" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "Խնդրում ենք կրկին փորձել կամ կապվել աջակցման ծառայության հետ" + }, + "options_add_custom_filter_modal_add_button": { + "message": "Ավելացնել" + }, + "options_add_custom_filter_modal_filter_name": { + "message": "Իմ զտիչի անունը:" + }, + "options_add_custom_filter_modal_filter_trusted": { + "message": "Վստահված" + }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "Զտիչի որոշ կանոններ կարող են զգալիորեն փոխել ձեր զննարկման փորձը և վտանգել ձեր գաղտնիությունը: Համոզվեք, որ օգտագործում եք զտիչներ միայն այն մշակողների կողմից, որոնց վստահում եք" + }, + "options_popup_try_again_button": { + "message": "Կրկին փորձեք" + }, + "options_popup_filter_title": { + "message": "Վերնագիր:" + }, "options_popup_filter_description": { "message": "Նկարագրություն՝" }, "options_popup_filter_version": { "message": "Տարբերակ՝ " }, + "options_popup_filter_rules_count": { + "message": "Կանոնների հաշվարկ." + }, + "options_popup_filter_homepage": { + "message": "Գլխավոր էջ" + }, "options_popup_filter_url": { "message": "URL:" }, + "options_popup_subscribe_button": { + "message": "Բաժանորդագրվել" + }, + "name": { + "message": "AdGuard AdBlocker" + }, "description": { "message": "Անգերազանցելի ընդլայնում՝ ընդդեմ գովազդի և ելնող պատուհանների: Արգելափակում է գովազդները Facebook-ում, Youtube-ում և այլ կայքերում.", "description": "TEXT MAX LENGTH: 132" }, + "background_tab_title": { + "message": "Հետեւի թաբ" + }, + "options_allowlist": { + "message": "Թույլատրեք ցուցակը" + }, + "options_allowlist_desc": { + "message": "AdGuard չի ֆիլտրում կայքերից թույլատրելու ցուցակից" + }, + "options_allowlist_invert": { + "message": "Շրջել թույլտվությունների ցանկը" + }, + "options_allowlist_invert_desc": { + "message": "Արգելափակել գովազդները՝ բացառությամբ թույլատրելու ցուցակի" + }, + "options_allowlist_alert_invert": { + "message": "Թույլատրելի ցուցակը հակառակ է: Գովազդները արգելափակվում են միայն այն կայքերում, որոնք ավելացվել են դրան: Պարունակությունը նվազեցնել<\/a>" + }, + "options_allowlist_leave_subtitle": { + "message": "Դուք կորցնելու եք Ձեր փոփոխությունները թույլատրելի ցուցակում" + }, "options_userfilter": { "message": "Օգտվողի զտիչ" }, + "filtering_log_modified_rules": { + "message": "Փոփոխված կանոններ. %rules_count%" + }, + "filtering_log_stealth_rules": { + "message": "Գտելու պաշտպանման կանոններ. %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Գտացող պաշտպանության կիրառված է" + }, + "filtering_log_in_allowlist": { + "message": "Կայքը թույլատրված է" + }, "filtering_log_hide_referrer": { "message": "Referer-ը թաքցված է երրորդ կողմից" }, + "filtering_log_hide_search_queries": { + "message": "Ձեր որոնման հարցումները թաքնված են" + }, + "filtering_log_remove_client_data": { + "message": "X-Client-Data գլուխը հեռացվել է" + }, + "filtering_log_send_not_track": { + "message": "Do-Not-Track-ի գլխամասը ուղարկվել է" + }, "options_select_update_period_default": { "message": "Հիմնական" }, + "options_select_update_period_48h": { + "message": "48 ժամ" + }, + "options_select_update_period_24h": { + "message": "24 ժամ" + }, + "options_select_update_period_12h": { + "message": "12 ժամ" + }, + "options_select_update_period_6h": { + "message": "6 ժամ" + }, + "options_select_update_period_1h": { + "message": "1 ժամ" + }, "options_select_update_period_disabled": { "message": "Անջատված" }, "options_filters": { "message": "Զտիչներ" }, + "options_antibanner_rules_count": { + "message": "Ֆիլտրի կանոնները հաշվել. %rules_count%" + }, "options_antibanner_custom_group": { "message": "Ընտրված" }, + "options_filters_enabled": { + "message": "Միացված:" + }, + "options_filters_enabled_and_more": { + "message": "%enabled% և %more% ավելի" + }, + "options_filters_enabled_and_last": { + "message": "%enabled% և %last%" + }, + "options_filters_no_enabled": { + "message": "Ոչ մի ֆիլտր չի մեկացված" + }, + "options_filters_filter_trusted_tag_desc": { + "message": "Դուք նախընտրեցիք վստահել այս ֆիլտրին:" + }, + "options_filters_info_mv3_total_rules": { + "message": "Ընդհանուր կանոններ. %num%" + }, "options_add_custom_filter": { "message": "Ավելացնել հարմարեցված զտիչ" }, + "options_filters_custom_disabled_cws": { + "message": "Անձնական ֆիլտերները շուտով վերադառնալու են։ Հրահանգների մասին ավելին իմացեք մեր բլոգում" + }, + "options_empty_custom_filter": { + "message": "Դուք դեռ չունեք որեւէ մաքսային ֆիլտր" + }, + "options_loader_applying_changes": { + "message": "Փոփոխությունների գործադրում..." + }, + "options_editor_indicator_saving": { + "message": "Պահվում է..." + }, + "options_editor_indicator_saved": { + "message": "Պահպանված է" + }, + "options_popup_import_error_required_privacy_permission": { + "message": "Այս կարգավիճակի ֆայլը ներբեռնելու համար թույլ տվեք AdGuard-ին փոխել ձեր գաղտնիությանը վերաբերող կարգավորումները։" + }, + "options_popup_import_success_title": { + "message": "Ապահովեք ձեր փոփոխությունները հաջողությամբ ներմուծվեցին" + }, + "options_popup_import_error_title": { + "message": "Հնարավոր չէ ներմուծել կարգավորումները" + }, + "options_popup_import_error_file_description": { + "message": "Սխալ առաջացավ։" + }, + "options_popup_trusted_filter_title": { + "message": "Վստահված" + }, + "options_popup_trusted_filter_description": { + "message": "Վստահելի ֆիլտրերը կարող են օգտագործել հզոր ֆիլտրի կանոնների փոփոխիչներ, որոնք կարող են վտանգավոր լինել, եթե դրանք ոչ պատշաճ կերպով օգտագործվեն: Մի ստուգեք այս տուփը, քանի դեռ լիովին չեք վստահում դրան։" + }, + "popup_site_filtering_state_secure_page": { + "message": "Ապահով էջ" + }, "popup_site_filtering_state_loading": { "message": "Բեռնում է..." }, + "popup_site_filtering_state_enabling": { + "message": "Միացնել պաշտպանությունը..." + }, "popup_site_filtering_state_enabled": { "message": "Պաշտպանությունը ակտիվ է" }, + "popup_site_filtering_state_disabling": { + "message": "Անջատել պաշտպանությունը..." + }, "popup_site_filtering_state_disabled": { "message": "Պաշտպանությունն անջատված է" }, + "popup_site_filtering_state_pausing": { + "message": "Դադարեցնել պաշտպանությունը..." + }, + "popup_site_filtering_state_paused": { + "message": "Պաշտպանությունը դադարեցված է" + }, + "popup_site_filtering_state_resuming": { + "message": "Վերականգնել պաշտպանությունը..." + }, + "popup_site_filtering_state_subtitle_all_websites": { + "message": "բոլոր կայքերի համար" + }, + "popup_site_exception_information": { + "message": "Զտիչը անջատված է, քանի որ դա կարող է խոչընդոտել այս կայքի աշխատանքին։" + }, + "popup_tab_blocked_count": { + "message": "Արգելափակված. %num%" + }, + "popup_tab_blocked_all_count": { + "message": "Ընդհանուր արգելված: %num%" + }, + "popup_statistics_total": { + "message": "Ընդամենը" + }, "popup_statistics_all_categories": { "message": "All" }, + "popup_statistics_category_advertising": { + "message": "Գովազդ" + }, + "popup_statistics_category_trackers": { + "message": "Հետագծումներ" + }, + "popup_statistics_category_social_media": { + "message": "Սոցիալական մեդիա" + }, + "popup_statistics_category_cdn": { + "message": "CDN" + }, + "popup_statistics_category_other": { + "message": "Այլ" + }, + "popup_statistics_week_days_mon": { + "message": "Երկ" + }, + "popup_statistics_week_days_tue": { + "message": "Երք" + }, + "popup_statistics_week_days_wed": { + "message": "Չրք" + }, + "popup_statistics_week_days_thu": { + "message": "Հինգշ" + }, + "popup_statistics_week_days_fri": { + "message": "Ուրբ" + }, + "popup_statistics_week_days_sat": { + "message": "Շաբ" + }, + "popup_statistics_week_days_sun": { + "message": "Ակն" + }, + "popup_statistics_months_jan": { + "message": "հուն" + }, + "popup_statistics_months_feb": { + "message": "փետր" + }, + "popup_statistics_months_mar": { + "message": "Մարտ" + }, + "popup_statistics_months_apr": { + "message": "Ապր" + }, + "popup_statistics_months_may": { + "message": "Մայիս" + }, + "popup_statistics_months_jun": { + "message": "հուն" + }, + "popup_statistics_months_jul": { + "message": "հուլ" + }, + "popup_statistics_months_aug": { + "message": "Օգս" + }, + "popup_statistics_months_sep": { + "message": "Սեպ" + }, + "popup_statistics_months_oct": { + "message": "Հոկ" + }, + "popup_statistics_months_nov": { + "message": "Նոյ" + }, + "popup_statistics_months_dec": { + "message": "Դեկտ" + }, + "options_popup_update_title_error": { + "message": "Խնդիր թարմացնելու ֆիլտրերը" + }, "options_popup_update_not_found": { "message": "Թարմացումներ չկան" }, "options_popup_update_error": { "message": "Հնարավոր չեղավ ստանալ թարմացում: Խնդրում ենք կրկին փորձել:" }, + "options_popup_update_filter": { + "message": "թարմացվել է:" + }, + "options_popup_update_filters": { + "message": "թարմացվել են։" + }, + "options_popup_version_update_title_text": { + "message": "AdGuard հավելվածը թարմացված է %current_version% տարբերակին" + }, + "options_popup_version_update_description_minor": { + "message": "Այս տարբերակը հիմնականում պարունակում է բնօրինակների ուղղումներ և փոքր բարելավումներ։" + }, + "options_popup_version_update_description_major": { + "message": "Այս մեծ հասաձայնության վերափոխումը ավելացնում է բազմաթիվ նոր հատկություններ և բարելավումներ։" + }, + "options_popup_version_update_changelog_text": { + "message": "Այս տարբերակում ինչ նորություններ կան:" + }, + "options_popup_version_update_offer": { + "message": "Դուք գիտե՞ք, որ AdGuard-ի հնարավորությունները սահմանափակված չեն այս զննարկչով:" + }, + "options_popup_version_update_offer_button_text": { + "message": "Իմանալ ավելին" + }, + "popup_block_site_ads_option": { + "message": "Արգելափակել գովազդը ձեռքով" + }, + "popup_security_report": { + "message": "Կայքի անվտանգության զեկույց" + }, + "popup_reset_page_user_rules": { + "message": "Հեռացնել օգտվողի կանոնները այս կայքի համար" + }, + "context_block_site_ads": { + "message": "Մանուալ՝ արգելափակեք գովազդները" + }, + "context_security_report": { + "message": "Կայքի անվտանգության զեկույց" + }, + "context_complaint_website": { + "message": "Հաղորդել թողարկման մասին" + }, + "context_site_filtering_disabled": { + "message": "AdGuard չի կարող ֆիլտրել այս էջը" + }, "context_disable_protection": { "message": "Դադարեցնել AdGuard-ի պաշտպանությունը" }, @@ -117,18 +477,57 @@ "alert_popup_filter_enabled_title": { "message": "Զտիչների ինքնաակտիվացում" }, + "alert_popup_filter_enabled_desc": { + "message": "%filter_name% ինքնաբերաբար ակտիվացված է:" + }, + "filters_download_title": { + "message": "Զտիչների շտեմարանը բեռնվում է..." + }, + "filters_download_loading": { + "message": "Սպասեք, մինչև զտիչների շտեմարանը կբեռնվի..." + }, + "post_install_loading": { + "message": "Ներբեռնում է լայնեցումը..." + }, + "filtering_modal_element": { + "message": "Էլեմենտ:" + }, + "filtering_modal_cookie": { + "message": "Թխուկներ:" + }, "filtering_modal_important": { "message": "Բարձր առաջնահերթություն տալ կանոնին" }, "filtering_log_title": { "message": "Զտիչների մատյան" }, + "filtering_log_search_string": { + "message": "Զտիչի մատյան" + }, + "filtering_log_search_tabs_placeholder": { + "message": "Որոնել ներդրումների մեջ" + }, + "filtering_log_preserve_log_off": { + "message": "Մի գրանցեք հիփ." + }, + "filtering_log_preserve_log_on": { + "message": "Վերագրել դեպքը" + }, + "filtering_refresh_tab_short": { + "message": "Թարմացնել" + }, "filtering_clear_log_events": { "message": "Մաքրել մատյանը" }, "filtering_type_all": { "message": "Բոլորը" }, + "filtering_type_other": { + "message": "Այլ" + }, + "filtering_table_status": { + "message": "Վիճակ" + }, "filtering_table_type": { "message": "Տեսակ" }, @@ -141,6 +540,9 @@ "filtering_table_filter": { "message": "Զտիչ" }, + "filtering_table_empty_reload_page_desc": { + "message": "Միայն արգելափակված հարցումների ծանուցում: Արգելափակված հարցումների ծանուցում<\/reset> կամ վերաբեռնել էջը<\/refresh>՝ գրառումները տեսնելու համար։" + }, "filtering_modal_info_title": { "message": "Հարցման մանրամասներ" }, @@ -156,30 +558,66 @@ "filtering_modal_rule": { "message": "Կանոն." }, + "filtering_modal_rules": { + "message": "Կանոններ." + }, + "filtering_modal_privacy": { + "message": "Հետևելու պաշտպանություն." + }, "filtering_modal_filter": { "message": "Զտիչ." }, "filtering_modal_block": { "message": "Արգելափակել" }, + "filtering_modal_block_again": { + "message": "Նորից արգելափակել" + }, "filtering_modal_unblock": { "message": "Ապաարգելափակել" }, + "filtering_modal_remove_user": { + "message": "Ջնջել կանոնը" + }, "filtering_modal_preview_request_button": { "message": "Նախատեսք" }, + "filtering_modal_remove_allowlist": { + "message": "Հեռացնել թույլատրվող ցուցակից" + }, "filtering_modal_add_title": { "message": "Կանոնի հավելում" }, + "filtering_modal_status_text_desc": { + "message": "Վիճակ:" + }, + "filtering_modal_status_text_error": { + "message": "Նախնական դիտումը համալրել հնարավոր չէ։ Խնդրում ենք կրկին փորձել" + }, "filtering_modal_status_text_loading": { "message": "Բեռնում է..." }, + "filtering_modal_filtering_status_text_desc": { + "message": "Զտման վիճակ:" + }, + "filtering_modal_rule_text_desc": { + "message": "Կանոնի տեքստը:" + }, + "filtering_modal_patterns_desc": { + "message": "Նախշեր:" + }, + "filtering_modal_options_desc": { + "message": "Ընտրանքներ:" + }, "filtering_modal_apply_domains": { "message": "Կիրառել կանոնը բոլոր կայքերին" }, "filtering_modal_third_party": { "message": "Կիրառել միայն երրորդ կողմի հարցումներին" }, + "filtering_modal_remove_param": { + "message": "Հեռացնել հարցման պարամետրերը" + }, "filtering_modal_add_rule": { "message": "Ավելացնել կանոն" }, @@ -189,6 +627,33 @@ "filtering_modal_open_in_new_tab": { "message": "Բացել նոր ներդիրում" }, + "filtering_modal_show_full_url": { + "message": "Ցուցադրել ամբողջ URL" + }, + "filtering_modal_hide_full_url": { + "message": "Թաքցնել ամբողջ URL" + }, + "filtering_modal_show_full_rule": { + "message": "Ցուցադրել ամբողջական կանոն" + }, + "filtering_modal_hide_full_rule": { + "message": "Թաքցնել ամբողջական կանոն" + }, + "filtering_modal_show_full_element": { + "message": "Ցույց տալ ամբողջ տարր" + }, + "filtering_modal_hide_full_element": { + "message": "Թաքցնել ամբողջական տարր" + }, + "filtering_modal_copy_to_clipboard": { + "message": "Պատճենել" + }, + "filtering_modal_copied": { + "message": "Պատճենվել է" + }, + "filtering_modal_converted_to": { + "message": "Անցեց:" + }, "filtering_log_filter_regular": { "message": "Regular" }, @@ -222,54 +687,352 @@ "options_general_settings": { "message": "Գլխավոր կարգավորումներ" }, + "options_block_acceptable_ads": { + "message": "Արգելափակել որոնման գովազդները և վեբ կայքերի ինքնագովազդը" + }, + "options_block_acceptable_ads_desc": { + "message": "Հեռացնել ինքնակարգավորող գովազդները կայքերից և համատեքստային գովազդները որոնման արդյունքներից: Սովորեք ավելին<\/a>" + }, + "options_show_blocked_ads_count_title": { + "message": "Ցուցադրել արգելափակված գովազդների քանակը AdGuard-ի ընդլայնման պատկերակում" + }, "options_enable_autodetect_filter": { "message": "Ակտիվացնել առավել համապատասխանող զտիչները ինքնաբար" }, + "options_enable_autodetect_filter_desc": { + "message": "Լեզվաբառարանային ֆիլտրերը կշարունակեն համապատասխանաբար կայքի լեզվին" + }, "options_select_theme": { "message": "Ֆոն" }, + "options_theme_selector_system": { + "message": "Համակարգի լռելյայն" + }, + "options_theme_selector_light": { + "message": "Բաց ֆոն" + }, + "options_theme_selector_dark": { + "message": "Մութ ֆոն" + }, "options_export_settings": { "message": "Արտահանել կարգավորումները" }, "options_import_settings": { "message": "Ներմուծել կարգավորումները" }, + "options_report_bug": { + "message": "Հաղորդել սխալի մասին" + }, + "options_leave_feedback": { + "message": "Թողնել կարծիք" + }, + "options_privacy": { + "message": "Հետևելու պաշտպանություն" + }, "options_update_antibanner_filters": { "message": "Ստուգել զտիչի թարմացումները" }, "options_check_update": { "message": "Ստուգել թարմացումները" }, + "options_check_update_progress": { + "message": "Ստուգում..." + }, + "options_set_update_interval": { + "message": "Ավտոմատ թարմացման ֆիլտր" + }, + "options_set_update_interval_desc": { + "message": "Ցանկալի արգելափակումների համար, ֆիլտրերը հարկավոր է պարբերաբար թարմացնել" + }, "options_userfilter_export": { "message": "Արտահանել" }, "options_editor_save": { "message": "Պահպանել" }, + "options_editor_leave_title": { + "message": "Հեռանալ առանց պահպանելու՞:" + }, + "options_editor_leave_confirm": { + "message": "Այո, եղեք" + }, + "options_editor_leave_cancel": { + "message": "Վերադառնալ խմբագրման" + }, "options_userfilter_import": { "message": "Ներմուծել" }, + "options_userfilter_description_key": { + "message": "Կարող եք հավելել Ձեր կանոնները այստեղ։ Այս ընտրանքը խորհուրդ է տրվում միայն հմուտ օգտվողներին, որոնք ծանոթ են HTML\/CSS-ին։ Կարդացեք զտիչի կանոնների ձեռնարկը՝ իմանալու<\/a>, թե ինչպես գրել Ձեր սեփական զտիչի կանոնները։" + }, + "options_userfilter_subtitle_key": { + "message": "Հարմարեցրեք գովազդների արգելափակումը ձեր սեփական ֆիլտրավորման կանոններով" + }, + "options_userfilter_line_break_off": { + "message": "Տողերի բաժանում: Անջատված" + }, + "options_userfilter_line_break_on": { + "message": "Տողերի բաժանում:onor" + }, + "options_userfilter_leave_subtitle": { + "message": "Քո փոփոխությունները կանոններին կկորցվեն" + }, "options_open_changelog": { "message": "Փոփոխություններ" }, "options_safebrowsing_enabled": { "message": "Պաշտպանություն որսումից և վնասագրերից" }, + "options_safebrowsing_enabled_desc": { + "message": "Ապահովեք AdGuard Զննեք անվտանգության մոդուլը, որը պարզորոշում է հնարավոր վնասակար և կեղծիքային կայքերը` դրանք տիեկելով առցանց տվյալների բազայի վրա.Էլ ավելի տեղեկություններով<\/a>" + }, "options_site": { "message": "Պաշտոնական կայք" }, + "options_discuss": { + "message": "Խմբագրել AdGuard" + }, + "options_do_you_like_question": { + "message": "Դուք հավանեցի՞ք AdGuard-ը:" + }, + "options_footer_like_us_cta": { + "message": "Գնահատեք դա։" + }, + "options_miscellaneous_settings": { + "message": "Լրացուցիչ կարգավորումներ" + }, + "options_rule_syntax": { + "message": "Կանոնների շարահյուսություն" + }, + "options_rule_limits": { + "message": "Կանոնների սահմանները" + }, + "options_rule_limits_description": { + "message": "Chrome-ը սահմանափակում է կիրառելի կանոնների քանակը" + }, + "options_rule_limits_dynamic": { + "message": "Dynamic rules" + }, + "options_rule_limits_dynamic_user_rules": { + "message": "Օգտագործող-ավելացված կանոններ, օրինակ՝ Օգտագործողի կանոններ<\/user_rules>, Թույլատրված կայքեր<\/allowlist>, Անձնական Ֆիլտրեր<\/custom_filters>, և Արագ Շտկման ֆիլտր<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Անվտանգ չէ դինամիկ կանոններ (օգտագործված որոշ avanz մարդիկ, օրինակ՝ $$redirect կամ $$cookie) — ներառված է օգտվող-ավելացված կանոններում" + }, + "options_rule_limits_dynamic_regex": { + "message": "Regex կանոնները — ներառված են օգտվող-ավելացված կանոններում" + }, + "options_rule_limits_static_rulesets": { + "message": "Ստատիկ կանոնակարգեր" + }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Ներառված ֆիլտրեր<\/a>, օրինակ՝ արգելել ձանձրացնելները կամ լեզվապետական ֆիլտրերը" + }, + "options_rule_limits_static_rules": { + "message": "Ստատիկ կանոններ" + }, + "options_rule_limits_static_rules_all": { + "message": "Правила от вградените филтри<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Regex կանոնները — ներառված են վերը նշվածում" + }, + "options_rule_limits_numbers": { + "message": "%current% \/ %maximum%" + }, + "options_rule_limits_warning_title": { + "message": "Բրաուզերը փոփոխել է ակտիվ ֆիլտրերի ցուցակը" + }, + "options_rule_limits_warning_explanation_title": { + "message": "Ի՞նչ է պատահել։" + }, + "options_rule_limits_warning_explanation_description": { + "message": "Ակտիվ կառուցված կանոնների սահմանը գերազանցվել է թարմացումից կամ նոր ընդլայնում ավելացնելուց հետո։ Մասնավորապես Manifest V3-ի համաձայն, ձեր Chrome բրաուզերը արձագանքեց՝ անջատելով ընդլայնողի բոլոր կառուցված ֆիլտրերը, բացառությամբ ինքնաբերաբար ընտրածների:" + }, + "options_rule_limits_warning_list_enabled_before_title": { + "message": "Զտիչները միացված են թարմացումից առաջ" + }, + "options_rule_limits_warning_list_enabled_now_title": { + "message": "Ֆիլտրերը գործող են այժմ" + }, + "options_rule_limits_warning_actions_title": { + "message": "Ձեր հնարավոր գործողությունները" + }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Ընտրություն 1: Խնդրում ենք հեռացնել անփորձ \"գովազդ արգելափակման\" ընդարձակումը ձեր բրաուզերից: Վերականգնելու համար վերականգնել ֆիլտրերը:<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Ընտրություն 2: Տեղադրեք AdGuard Ad Blocker հավելվածը՝ այն չունի ֆիլտրացման կանոնների սահմանափակումներ։ Ստեղծեք AdGuard հավելվածը<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Տվյալ 3։ Եթե Դուք գոհ եք ներկայիս ակտիվ ֆիլտրից, փակեք այս զգուշացումը:<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Տվյալ 3։ Եթե Դուք գոհ եք ներկայիս ակտիվ ֆիլտրերից, փակեք այս զգուշացումը:<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Դուք հասել եք ակտիվ տեղադրված օրենքների սահմանին։ Ձեր բրաուզերը փոփոխել է ակտիվ տեղադրված ֆիլտրերի ցուցակը։ Ֆիլտրերի թիվը, որոնք հնարավորինս ապահովել են, փոփոխվել է %expected% -ից %current% -ի:" + }, + "options_limits_warning_static_filters": { + "message": "Դուք հասել եք ակտիվ ներառված ֆիլտրերի սահմանափակմանը։ %maximum% -ից %current% ֆիլտրերն ակտիվացված են։ Նոր կանոնները ակտիվացնելու համար, անջատեք որոշ ներառված ֆիլտրեր։" + }, + "options_limits_warning_static_rules": { + "message": "Դուք հասել եք ակտիվ ներառված կանոնների սահմանափակմանը։ %maximum% -ից %current% կանոններն ակտիվացված են։ Նոր կանոնները ակտիվացնելու համար, անջատեք որոշ ներառված ֆիլտրեր։" + }, + "options_limits_warning_static_regex_rules": { + "message": "Դուք հասել եք ակտիվ ներառված regex կանոնների սահմանափակմանը։ %maximum% -ից %current% regex կանոններն ակտիվացված են։ Նոր կանոնները ակտիվացնելու համար, անջատեք որոշ ներառված ֆիլտրեր։" + }, + "options_limits_warning_dynamic_rules": { + "message": "Դուք հասել եք օգտվող-ավելացված կանոնների սահմանափակմանը։ %maximum% -ը %current% կանոններից է ակտիվ։" + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Դուք հասնեցիք օգտվողի ավելացված վտանգավոր կանոնների սահմանագծին։ %maximum% -ը %current% կարևոր կանոններից ակտիվացված է։" + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Դուք հասել եք օգտվող-ավելացված regex կանոնների սահմանափակմանը։ %maximum% -ը %current% regex կանոններից է ակտիվ։" + }, + "options_show_adguard_full_version_title": { + "message": "Ցուցադրել տեղեկությունը AdGuard-ի ամբողջական տարբերակում" + }, + "options_show_app_updated_notification": { + "message": "Ծանուցեք ընդլայնումների թարմացումների մասին" + }, + "options_open_log": { + "message": "Զտիչների մատյան" + }, + "options_reset_stats": { + "message": "Մաքրել վիճակագրությունը" + }, "options_reset_stats_done": { "message": "Վիճակագրությունը վերակայված է" }, + "options_reset_settings": { + "message": "Վերակայել կարգավորումները" + }, + "options_reset_settings_done": { + "message": "Կարգավորումները վերակայված են" + }, + "options_reset_settings_error": { + "message": "Սխալ ծրագրավորվել է, երբ վերակայել կարգավորումները" + }, + "options_collect_hit_stats_title": { + "message": "Մասնակցեք AdGuard-ի զտիչների մշակմանը" + }, + "options_collect_hit_stats_desc": { + "message": "Ուղարկեք անանոն ստատիստիկան հայտարարությունների ֆիլտրերի օգտագործման մասին<\/a>, որպեսզի օգնելու AdGuard-ին կատարել նոր ֆիլտրեր" + }, + "options_show_context_menu_title": { + "message": "Հավելել AdGuard տարրը դիտարկիչի համատեքստային ցանկում" + }, "options_use_optimized_filters": { "message": "Կիրառեք օպտիմիզացված զտիչներ" }, + "options_use_optimized_filters_desc": { + "message": "Օգտագործեք կարճացված տարբերակներ ֆիլտրերի, որոնք ունեն միայն ամենահայտնի կանոնները, որպեսզի խնայեք տրաֆիկ։ Ավելի լավ է նախատեսված մոբիլային դիտարկիչների համար" + }, + "options_privacy_title": { + "message": "Հետևելու պաշտպանություն" + }, + "options_privacy_desc": { + "message": "Պաշտպանեք ձեր ինքնությունը և մասնավոր անձնական տեղեկությունը հազարավոր առցանց հետևորդներից՝ արգելափակելով առավել տարածված հետևման մեթոդները։" + }, + "options_hide_referrer_title": { + "message": "Թաքցնել Referer-ը երրորդ կողմերից" + }, + "options_hide_referrer_desc": { + "message": "Մանավանդ չարժե երրորդ կողմերին իմանալ, թե որ կայք եք այցելում։" + }, "options_hide_search_queries_title": { "message": "Թաքցնել որոնման հարցումները" }, + "options_hide_search_queries_desc": { + "message": "Թաքցրեք որոնման հարցումները, որոնք վերաբերում են այցելված կայքերին" + }, + "options_send_not_track_title": { + "message": "Վեբ կայքերին խնդրեք ձեզ չհետաքրքրել" + }, + "options_send_not_track_desc": { + "message": "Ուղարկել Գլոբալ գաղտնիության վերահսկում<\/gpc> և Չեք վերահսկում<\/dnt> ազդանշանները, որոնք այցելեք վեբ կայքերին" + }, + "options_stripped_tracking_parameters": { + "message": "Հետևելու պարամետրերը հեռացվել են" + }, + "options_modified_first_party_cookie": { + "message": "Առաջատիպի կուկին փոխվել է" + }, + "options_modified_third_party_cookie": { + "message": "Երրորդ կողմի կուկին փոխվել է" + }, + "options_remove_client_data_title": { + "message": "Հեռացնել X-Client-Data վերնագիրը" + }, + "options_remove_client_data_desc": { + "message": "Հակադարձեք Google Chrome- ի կողմից իր տարբերակի և փոփոխությունների մասին տեղեկությունների ուղարկմանը Google դոմեններին" + }, + "options_disable_webrtc_title": { + "message": "Անջատել WebRTC" + }, + "options_disable_webrtc_desc": { + "message": "WebRTC կարող է բացահայտել ձեր IP հասցեն, նույնիսկ եթե օգտագործում եք պրոկսի կամ VPN: WebRTC- ի դադարեցումը կարող է վնասել որոշ կայքերին" + }, + "options_strip_tracking_params_title": { + "message": "Մաքրել URL-ի հետևող պարամետրերը" + }, + "options_strip_tracking_params_description": { + "message": "Հեռացնել պարամետրերը վեբ հարցումներից AdGuard URL Tracking ֆիլտրով" + }, + "options_block_known_trackers_title": { + "message": "Արգելափակել հետագծողները" + }, + "options_block_known_trackers_description": { + "message": "Հակադարձեք հետևողներին և վեբ անալիզի գործիքներ AdGuard Tracking Protection ֆիլտրով" + }, "options_third_party_title": { "message": "Ինքնաոչնչացնել երրորդ կողմի cookie-ները" }, + "options_third_party_desc": { + "message": "Բացառել երրորդ կողմի cookie-ների կյանքը (րոպեներով)" + }, + "options_first_party_title": { + "message": "Առաջատարի կուկին ինքնավերացմանը ենթարկելով (չի համաձայնեցվում)" + }, + "options_first_party_desc": { + "message": "Բացառել առաջին կողմի cookie-ների կյանքը (րոպեներով)" + }, + "popup_abuse_site": { + "message": "Խնդրում ենք հայտնել խնդրի մասին" + }, + "popup_open_filtering_log": { + "message": "Բացել զտիչների մատյան" + }, + "popup_tab_actions": { + "message": "Գործողություններ" + }, + "popup_tab_statistics": { + "message": "Վիճակագրություն" + }, + "popup_statistics_time_day": { + "message": "Վերջին օր" + }, + "popup_statistics_time_week": { + "message": "Վերջին շաբաթ" + }, + "popup_statistics_time_month": { + "message": "Վերջին ամիս" + }, + "popup_statistics_time_year": { + "message": "Վերջին տարի" + }, + "popup_switch_button": { + "message": "Պաշտպանության անջատիչ" + }, + "popup_limits_exceeded_warning": { + "message": "Ձեր բրաուզերը փոխել է ակտիվ ներմուծված ֆիլտրերի ցանկը" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "AdGuard-ը չի կարող պայքարել նյարդայնացնող պաստառների, թռուցիկների և տեսահոլովակների հետ:" + }, "short_name": { "message": "AdGuard" }, @@ -279,43 +1042,208 @@ "options_privacy_policy": { "message": "Գաղտնիության քաղաքականություն" }, + "options_acknowledgment": { + "message": "Շնորհակալություններ" + }, "options_github": { "message": "GitHub" }, "options_about_version": { "message": "Տարբերակ՝" }, + "options_copyright": { + "message": "Բոլոր իրավունքները պաշտպանված են։" + }, + "options_remove_filter_confirm_modal_title": { + "message": "Հեռացնե՞լ այս զտիչը։" + }, "options_remove_filter_confirm_modal_ok_button": { "message": "Հեռացնել" }, + "options_nav_better_than_extension": { + "message": "Ինչու՞ AdGuard ծրագիրը լավն է քան ընդլայնումը:" + }, + "options_nav_compare": { + "message": "Համեմատել" + }, "options_filters_search": { "message": "Որոնում" }, + "options_about_title": { + "message": "AdGuard զննարկչի երկարացում" + }, + "group_description_adblocking": { + "message": "Կոնֆիգուրացրեք գովազդների արգելումը այստեղ, որպեսզի վերջնականապես զբաղվեք նյարդային պաստառներով, թռուցիկներով, տեսանյութային գովազդներով և նման բաներով:" + }, + "group_description_stealth": { + "message": "Պաշտպանեք ձեր ինքնությունը և զգայուն անձնական տվյալները հազարավոր օնլայն հետևիչներից, արգելելով բոլոր հայտնի տարածված մեթոդները" + }, + "group_description_social": { + "message": "Կաքեք ցանկալի \"Like\"\/\"Share\" կոճակները և այլ սոցիալական մեդիայի վիդջեթներ" + }, + "group_description_annoyances": { + "message": "Հեռացրեք պոպ-up պատուհանները և այլ անհանգիստ ծանուցումները, ինչպիսիք են կուքի ծանուցումները" + }, + "group_description_security": { + "message": "Կապպեկեք ինքներդ ձեզ վնասակար ծրագրերից, ֆիշինգից և այլ օնլայն վտանգներից" + }, + "group_description_miscellaneous": { + "message": "Ավելի շատ կարգավորումներ ձեր վեբ զննման համար AdGuard-ով" + }, + "group_description_custom": { + "message": "Ստեղծեք ձեր սեփական զտիչները, որ կարողանաք կատարյալ հարմարեցնել վեբ զտումը ձեր նախասիրություններին։" + }, + "group_description_lang": { + "message": "Մի սահմանափակեք ձեզ — արգելեք գովազդները ցանկացած լեզվով կայքերում" + }, "fullscreen_user_rules_title": { "message": "Օգտագործողի ֆիլտր" }, + "options_user_rules_editor_stub_title": { + "message": "Խմբագիրն բացված է այլ պատուհանում" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Ձեր կանոնները այստեղ կհայտնվեն այն բանից հետո, երբ փակեք այն" + }, + "options_user_rules_editor_stub_go_to_editor_button": { + "message": "Գնալ խմբագրիչ" + }, + "options_editor_open_fullscreen_button_tooltip": { + "message": "Բացեք խմբագրիչը նոր պատուհանում" + }, + "options_editor_close_fullscreen_button_tooltip": { + "message": "Ելք անել պատուհանային ռեժիմից" + }, + "options_clear_stats_confirm_modal_title": { + "message": "Մաքրել վիճակագրությունը:" + }, + "options_clear_stats_confirm_modal_clear_button": { + "message": "Մաքրել" + }, + "options_reset_settings_confirm_modal_title": { + "message": "Վերակայել կարգավորումները:" + }, "options_reset_settings_confirm_modal_clear_button": { "message": "Վերակայել" }, "options_confirm_modal_cancel_button": { "message": "Չեղարկել" }, + "filtering_log_details_modal_beautify_button": { + "message": "Գեղեցիկացնել" + }, + "filtering_log_details_modal_back_button": { + "message": "Վերադառնալ խնդրանքին" + }, + "filtering_log_details_modal_try_again": { + "message": "Կրկին փորձեք" + }, + "filtering_log_tag_tooltip_first_party": { + "message": "Առաջին կողմի հարցումներ" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Երրորդ կողմի պահանջներ" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Հարցումներ, որոնք մշակված են առանց ֆիլտրելու" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Թույլատրված և բացահայտված հարցումներ" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Արգելափակված հարցումներ" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Փոփոխված պահանջներ" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Հարցումներ, որոնք ազդել են օգտագործողի կանոններով" + }, + "filtering_log_tag_tooltip_html": { + "message": "Փաստաթղթեր և ենթափաստաթղթեր" + }, + "filtering_log_tag_tooltip_css": { + "message": "Անջատիչներ" + }, + "filtering_log_tag_tooltip_js": { + "message": "Սկրիպթեր" + }, + "filtering_log_tag_tooltip_xhr": { + "message": "XMLHttpRequests և fetch հարցումներ" + }, + "filtering_log_tag_tooltip_img": { + "message": "Նկարներ" + }, "filtering_log_tag_tooltip_media": { "message": "Մեդիա" }, + "filtering_log_tag_tooltip_other": { + "message": "Նշաններ, pings, WebRTC, WebSocket..." + }, + "filtering_log_badge_tooltip_third_party": { + "message": "Երրորդ կողմի հարցում" + }, + "filtering_log_badge_tooltip_http_req_method": { + "message": "HTTP հարցման մեթոդ" + }, + "filtering_log_badge_tooltip_http_status_code": { + "message": "HTTP կարգավիճակի կոդ" + }, + "filtering_log_assumed_rule_description": { + "message": "Սա ենթադրյալ կանոն է: Անհրաժեշտ մանրամասների համար հայացք նետեք մեր Տեղեկատվական բազա<\/a>" + }, "options_stealth_general_title": { "message": "General" }, + "options_stealth_cookies_title": { + "message": "Կուներ" + }, "options_stealth_miscellaneous_title": { "message": "Խառը" }, + "options_coming_soon": { + "message": "Շուտով" + }, + "blocking_pages_malware": { + "message": "Այս կայքէջը %host%<\/strong> արդեն արձանագրվել է որպես վնասակար և արգելափակվել է ձեր անվտանգության նախասիրությունների հիման վրա։" + }, + "blocking_pages_phishing": { + "message": "Այս կայքէջը %host%<\/strong> արձանագրվել է որպես կեղծ էջ եւ արդեն արգելափակվել է ձեր անվտանգության նախասիրությունների հիման վրա։" + }, "blocking_pages_advanced_button": { "message": "Ընդլայնված" }, + "blocking_pages_more_info_button": { + "message": "Լրացուցիչ տեղեկություններ" + }, + "blocking_pages_page_title": { + "message": "Մուտքը արգելված է" + }, + "blocking_pages_safe_header_title": { + "message": "AdGuard-ը արգելափակել է մուտքը դեպի այս էջ" + }, + "blocking_pages_rule_header_title": { + "message": "Արգելափակված է AdGuard-ի կողմից" + }, + "blocking_pages_rule_content_title": { + "message": "AdGuard-ը կանխել է այս էջը բեռնվելուց հետևյալ ֆիլտրի կանոնի պատճառով" + }, + "blocking_pages_btn_go_back": { + "message": "Վերադառնալ" + }, + "blocking_pages_btn_proceed": { + "message": "Ամեն դեպքում շարունակել" + }, + "text_collapser_show_default": { + "message": "Ցուցադրել ամբողջական տեքստ" + }, + "text_collapser_hide_default": { + "message": "Թաքցնել ամբողջական տեքստ" + }, "close_button_title": { "message": "Փակել" }, - "name": { - "message": "AdGuard AdBlocker" + "filtering_modal_declarative_rule": { + "message": "ԴՆՌ կանոն:" } -} \ No newline at end of file +} diff --git a/Extension/_locales/id/messages.json b/Extension/_locales/id/messages.json index d761aa5d5e..47b4ffd73e 100644 --- a/Extension/_locales/id/messages.json +++ b/Extension/_locales/id/messages.json @@ -816,6 +816,13 @@ "options_rule_limits_dynamic_user_rules": { "message": "Aturan yang ditambahkan pengguna, seperti aturan pengguna<\/user_rules>, situs yang diizinkan<\/allowlist>, filter kustom<\/custom_filters>, dan filter perbaikan cepat<\/quick_fixes>" }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Aturan dinamis tidak aman (digunakan untuk beberapa modifier lanjutan, seperti $$redirect atau $$cookie) — termasuk dalam peraturan ditambah pengguna" + }, + "options_rule_limits_dynamic_regex": { + "message": "Aturan regex — termasuk dalam aturan yang ditambahkan pengguna" + }, "options_rule_limits_static_rulesets": { "message": "Aturan statis" }, @@ -879,6 +886,9 @@ "options_limits_warning_dynamic_rules": { "message": "Anda telah mencapai batas aturan yang ditambahkan pengguna. %maximum% dari %current% aturan aktif." }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Anda telah mencapai batas aturan yang ditambahkan pengguna yang tidak aman. %maximum% dari %current% aturan yang tidak aman aktif." + }, "options_limits_warning_dynamic_regex_rules": { "message": "Anda telah mencapai batas aturan regex yang ditambahkan pengguna. %maximum% dari %current% aturan regex aktif." }, diff --git a/Extension/_locales/lt/messages.json b/Extension/_locales/lt/messages.json index 8f67940247..8c25d5b6c7 100644 --- a/Extension/_locales/lt/messages.json +++ b/Extension/_locales/lt/messages.json @@ -89,12 +89,30 @@ "options_popup_check_false_description": { "message": "Klaida pridedant naudotojo filtrą" }, + "options_add_custom_filter_modal_title": { + "message": "Pridėti pasirinktinį filtrą" + }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Filtro patikra..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Nepavyko pridėti pasirinktino filtro" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "Prašome bandyti dar kartą arba susisiekti su palaikymo tarnyba." + }, "options_add_custom_filter_modal_add_button": { "message": "PRIDĖTI" }, + "options_add_custom_filter_modal_filter_name": { + "message": "Filtro pavadinimas:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Patikimas" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "Kai kurios filtravimo taisyklės gali ženkliai pakeisti jūsų naršymo patirtį ir pažeisti jūsų privatumo. Įsitikinkite, kad naudojate tik filtrus iš patikimų kūrėjų" + }, "options_popup_try_again_button": { "message": "Pabandyti iš naujo" }, @@ -132,12 +150,21 @@ "options_allowlist": { "message": "Baltasis sąrašas" }, + "options_allowlist_desc": { + "message": "AdGuard nefiltruoja svetainių iš leidimų sąrašo" + }, "options_allowlist_invert": { "message": "Invertuoti baltąjį sąrašą" }, + "options_allowlist_invert_desc": { + "message": "Leisti reklamas visur, išskyrus leidimų sąrašą" + }, "options_allowlist_alert_invert": { "message": "Leidinių sąrašas yra apverstas. Skelbimai blokuojami tik į jį įtrauktose svetainėse. Išjungti<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Jūsų pakeitimai į Leidimų sąrašą bus prarasti" + }, "options_userfilter": { "message": "Naudotojo filtras" }, @@ -216,6 +243,9 @@ "options_add_custom_filter": { "message": "Pridėti naudotojo filtrą" }, + "options_filters_custom_disabled_cws": { + "message": "Pasirinktinių filtrų netrukus vėl bus. Išsamiau mūsų tinklaraštyje" + }, "options_empty_custom_filter": { "message": "Dar neturite tinkintų filtrų" }, @@ -231,6 +261,12 @@ "options_popup_import_error_required_privacy_permission": { "message": "Kad importuotumėte šį nustatymų failą, leiskite AdGuard pakeisti Jūsų privatumo nustatymus." }, + "options_popup_import_success_title": { + "message": "Nustatymai importuoti" + }, + "options_popup_import_error_title": { + "message": "Nepavyko importuoti nustatymų" + }, "options_popup_import_error_file_description": { "message": "Kažkas negerai" }, @@ -243,15 +279,30 @@ "popup_site_filtering_state_secure_page": { "message": "Saugus puslapis" }, + "popup_site_filtering_state_loading": { + "message": "Įkeliama..." + }, + "popup_site_filtering_state_enabling": { + "message": "Įjungiama apsauga..." + }, "popup_site_filtering_state_enabled": { "message": "Apsauga įjungta" }, + "popup_site_filtering_state_disabling": { + "message": "Išjungti apsaugą..." + }, "popup_site_filtering_state_disabled": { "message": "Apsauga išjungta" }, + "popup_site_filtering_state_pausing": { + "message": "Apsaugos laikinas sustabdymas..." + }, "popup_site_filtering_state_paused": { "message": "Apsauga laikinai sustabdyta" }, + "popup_site_filtering_state_resuming": { + "message": "Apsaugos atkūrimas..." + }, "popup_site_filtering_state_subtitle_all_websites": { "message": "visoms svetainėms" }, @@ -261,15 +312,30 @@ "popup_tab_blocked_count": { "message": "Užblokuota: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Iš viso užblokuota: %num%" + }, "popup_statistics_total": { "message": "Iš viso" }, "popup_statistics_all_categories": { "message": "Visi" }, + "popup_statistics_category_advertising": { + "message": "Reklama" + }, "popup_statistics_category_trackers": { "message": "Sekimo priemonių" }, + "popup_statistics_category_social_media": { + "message": "Socialiniai tinklai" + }, + "popup_statistics_category_cdn": { + "message": "CDN" + }, + "popup_statistics_category_other": { + "message": "Kiti" + }, "popup_statistics_week_days_mon": { "message": "Pr" }, @@ -360,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "Sužinoti daugiau" }, + "popup_block_site_ads_option": { + "message": "Blokuoti reklamas rankiniu būdu" + }, "popup_security_report": { "message": "Patikrinti svetainės saugumą" }, + "popup_reset_page_user_rules": { + "message": "Pašalinti naudotojo taisykles šioje svetainėje" + }, + "context_block_site_ads": { + "message": "Blokuoti reklamas rankiniu būdu" + }, "context_security_report": { "message": "Patikrinti svetainės saugumą" }, "context_complaint_website": { "message": "Pranešti apie problemą" }, + "context_site_filtering_disabled": { + "message": "AdGuard negali filtruoti šio puslapio" + }, "context_disable_protection": { "message": "Pristabdyti AdGuard apsaugą" }, @@ -408,6 +486,9 @@ "filters_download_loading": { "message": "Palaukite, vyksta filtrų duomenų bazės įkėlimas..." }, + "post_install_loading": { + "message": "Kraunamas plėtinys..." + }, "filtering_modal_element": { "message": "Elementas:" }, @@ -426,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Ieškoti skirtukuose" }, + "filtering_log_preserve_log_off": { + "message": "Nesaugoti žurnalo" + }, + "filtering_log_preserve_log_on": { + "message": "Išsaugoti žurnalą" + }, "filtering_refresh_tab_short": { "message": "Atnaujinti" }, @@ -453,6 +540,9 @@ "filtering_table_filter": { "message": "Filtras" }, + "filtering_table_empty_reload_page_desc": { + "message": "Nieko nerasta. Išjungti filtrus<\/reset> arba atidaryti puslapį<\/refresh> norėdami peržiūrėti žurnalo įrašus." + }, "filtering_modal_info_title": { "message": "Užklausos detalės" }, @@ -471,6 +561,9 @@ "filtering_modal_rules": { "message": "Taisyklės:" }, + "filtering_modal_privacy": { + "message": "Sekimo apsauga:" + }, "filtering_modal_filter": { "message": "Filtras:" }, @@ -498,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Būsena:" }, + "filtering_modal_status_text_error": { + "message": "Nepavyko įkelti peržiūros. Prašome bandyti dar kartą" + }, "filtering_modal_status_text_loading": { "message": "Įkeliama..." }, @@ -594,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Blokuoti paieškos reklamų ir svetainių reklamas" }, + "options_block_acceptable_ads_desc": { + "message": "Pašalinti savęs reklamojančius skelbimus iš svetainių ir kontekstinius skelbimus iš paieškos rezultatų. Išsamiau<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Rodyti blokuojamų reklamų skaičių ant AdGuard plėtinio piktogramos" }, "options_enable_autodetect_filter": { "message": "Aktyvuoti tinkamiausius filtrus automatiškai" }, + "options_enable_autodetect_filter_desc": { + "message": "Kalbai būdingi filtrai bus įjungti atsižvelgiant į svetainės kalbą" + }, "options_select_theme": { "message": "Tema" }, @@ -624,6 +726,9 @@ "options_leave_feedback": { "message": "Palikite atsiliepimą" }, + "options_privacy": { + "message": "Sekimo apsauga" + }, "options_update_antibanner_filters": { "message": "Patikrinti filtro atnaujinimus" }, @@ -636,18 +741,42 @@ "options_set_update_interval": { "message": "Filtrų atnaujinimo intervalas" }, + "options_set_update_interval_desc": { + "message": "Norint efektyviau blokuoti, filtrai turi būti reguliariai atnaujinami" + }, "options_userfilter_export": { "message": "Eksportas" }, "options_editor_save": { "message": "Išsaugoti" }, + "options_editor_leave_title": { + "message": "Ar išeiti nesaugant?" + }, + "options_editor_leave_confirm": { + "message": "Taip, išeiti" + }, + "options_editor_leave_cancel": { + "message": "Atgal į redagavimą" + }, "options_userfilter_import": { "message": "Importas" }, "options_userfilter_description_key": { "message": "Čia galite įtraukti savo taisykles. Ši parinktis rekomenduojama patyrusiems vartotojams, susipažinusiems su HTML\/CSS. Perskaitykite filtravimo taisyklių pamoką <\/a>, kad sužinotumėte, kaip rašyti savo filtro taisykles." }, + "options_userfilter_subtitle_key": { + "message": "Tikslinkite reklamų blokavimą su savo filtravimo taisyklėmis" + }, + "options_userfilter_line_break_off": { + "message": "Eilutės lūžis: išjungta" + }, + "options_userfilter_line_break_on": { + "message": "Eilučių lūžis: įjungta" + }, + "options_userfilter_leave_subtitle": { + "message": "Jūsų pakeitimai taisyklėms bus prarasti" + }, "options_open_changelog": { "message": "Pakeitimų sąrašas" }, @@ -672,18 +801,46 @@ "options_miscellaneous_settings": { "message": "Įvairūs" }, + "options_rule_syntax": { + "message": "Taisyklės sintaksė" + }, "options_rule_limits": { "message": "Taisyklių ribos" }, + "options_rule_limits_description": { + "message": "Chrome riboja taikomų taisyklių skaičių" + }, "options_rule_limits_dynamic": { "message": "Dinaminės taisyklės" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Naudotojo pridėtos taisyklės, tokios kaip naudotojo taisyklės<\/user_rules>, leidžiamos svetainės<\/allowlist>, pasirinktini filtrai<\/custom_filters> ir greitų taisyklių filtras<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Nesaugios dinaminės taisyklės (naudojamos kai kuriems išplėstiniams modifikatoriams, pvz., $$redirect arba $$cookie) – įtraukta į naudotojo pridėtas taisykles" + }, + "options_rule_limits_dynamic_regex": { + "message": "Regex taisyklės – įtrauktos į naudotojo pridėtas taisykles" + }, "options_rule_limits_static_rulesets": { "message": "Statiniai taisyklių rinkiniai" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Integruoti filtrai<\/a>, tokie kaip erzinančių filtravimas arba kalbai būdingi filtrai" + }, "options_rule_limits_static_rules": { "message": "Statinės taisyklės" }, + "options_rule_limits_static_rules_all": { + "message": "Taisyklės iš integruotų filtrų<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Reguliariosios išraiškos taisyklės — įtrauktos į aukščiau" + }, + "options_rule_limits_numbers": { + "message": "%current% iš %maximum%" + }, "options_rule_limits_warning_title": { "message": "Naršyklė pakeitė aktyvių filtrų sąrašą" }, @@ -702,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "Jūsų galimi veiksmai" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "1 parinktis. Iš naršyklės ištrinkite nereikalingus reklamas blokuojančius plėtinius. Norėdami iš naujo suaktyvinti filtrus, nurodytus skiltyje \"Filtrai įjungti prieš naujinimą\", spustelėkite iš naujo suaktyvinti filtrus.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "2 parinktis. Įdiekite „AdGuard“ skelbimų blokavimo programą: joje nėra jokių filtravimo taisyklių apribojimų. Gaukite AdGuard programą<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "3 parinktis. Jei esate patenkinti šiuo metu įgalintu numatytuoju filtru, uždarykite šį įspėjimą.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "3 parinktis. Jei esate patenkinti šiuo metu įgalintais numatytaisiais filtrais, uždarykite šį įspėjimą.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Pasiekėte aktyvių integruotų filtrų limitą. Jūsų naršyklė pakeitė aktyvių integruotų filtrų sąrašą. Įjungtų filtrų skaičius pasikeitė nuo %expected% iki %current%." + }, + "options_limits_warning_static_filters": { + "message": "Pasiekėte aktyvių integruotų filtrų limitą. %maximum% iš %current% filtrų yra įjungti. Norėdami suaktyvinti naujas taisykles, išjunkite kai kuriuos integruotus filtrus." + }, + "options_limits_warning_static_rules": { + "message": "Pasiekėte aktyvių integruotų taisyklių limitą. %maximum% iš %current% taisyklių yra įjungtos. Norėdami suaktyvinti naujas taisykles, išjunkite kai kuriuos integruotus filtrus." + }, + "options_limits_warning_static_regex_rules": { + "message": "Pasiekėte aktyvių integruotų reguliariųjų reiškinių taisyklių ribą. %maximum% iš %current% reguliariųjų reiškinių taisyklių yra įjungtos. Norėdami suaktyvinti naujas taisykles, išjunkite kai kuriuos integruotus filtrus." + }, + "options_limits_warning_dynamic_rules": { + "message": "Pasiekėte naudotojų pridėtų taisyklių limitą. %maximum% iš %current% taisyklių yra įjungtos." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Pasiekėte naudotojo pridėtų nesaugių taisyklių limitą. %maximum% iš %current% nesaugių taisyklių yra įjungtos." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Pasiekėte naudotojų pridėtų reguliariųjų reiškinių taisyklių limitą. %maximum% iš %current% reguliariųjų reiškinių taisyklių yra įjungtos." + }, "options_show_adguard_full_version_title": { "message": "Rodyti informaciją AdGuard pilnoje versijoje" }, @@ -729,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Pagalba kuriant AdGuard filtrus" }, + "options_collect_hit_stats_desc": { + "message": "Siųskite anoniminius statistinius duomenis apie skelbimų filtrų naudojimą<\/a>, kad padėtumėte AdGuard tobulinti savo filtrus." + }, "options_show_context_menu_title": { "message": "Pridėti AdGuard elementą į naršyklės kontekstinį meniu" }, @@ -738,15 +931,30 @@ "options_use_optimized_filters_desc": { "message": "Filtrai, optimizuoti mobiliesiems įrenginiams" }, + "options_privacy_title": { + "message": "Sekimo apsauga" + }, + "options_privacy_desc": { + "message": "Apsaugokite savo tapatybę ir jautrią asmeninę informaciją nuo tūkstančių internetinių seklių, blokuodami populiariausius stebėjimo metodus" + }, "options_hide_referrer_title": { "message": "Slėpti Referrer nuo trečiųjų šalių" }, + "options_hide_referrer_desc": { + "message": "Užkirsti kelią trečiosioms šalims žinoti, kokioje svetainėje lankotės" + }, "options_hide_search_queries_title": { "message": "Slėpti paieškos užklausas" }, + "options_hide_search_queries_desc": { + "message": "Slėpti užklausas, susijusias su svetainėmis, kurios buvo aplankytos iš paieškos sistemų" + }, "options_send_not_track_title": { "message": "Paprašykite svetainių jūsų nesekti" }, + "options_send_not_track_desc": { + "message": "Siųsti Global Privacy Control<\/gpc> ir Do Not Track<\/dnt> signalus į svetaines, kuriose lankotės" + }, "options_stripped_tracking_parameters": { "message": "Stebėjimo parametrai pašalinti" }, @@ -759,21 +967,39 @@ "options_remove_client_data_title": { "message": "Pašalinti X-Client-Data antraštę" }, + "options_remove_client_data_desc": { + "message": "Blokuoti Google Chrome nuo informacijos apie versiją ir pakeitimus siuntimo Google domenams" + }, "options_disable_webrtc_title": { "message": "Blokuoti WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC gali leisti jūsų IP adresą net jei naudojate tarpinį serverį arba VPN. WebRTC išjungimas gali sutrikdyti kai kurias svetaines" + }, "options_strip_tracking_params_title": { "message": "Šalinti stebėjimo parametrus" }, + "options_strip_tracking_params_description": { + "message": "Pašalinkite parametrus iš žiniatinklio užklausų naudodami AdGuard URL stebėjimo filtrą" + }, "options_block_known_trackers_title": { "message": "Blokuoti stebėjimo priemones" }, + "options_block_known_trackers_description": { + "message": "Blokuoti seklius ir žiniatinklio analizės įrankius su AdGuard sekimo apsaugos filtru" + }, "options_third_party_title": { "message": "Trečiųjų šalių slapukų sunaikinimas" }, + "options_third_party_desc": { + "message": "Apriboti trečiųjų šalių slapukų gyvavimo trukmę (minutėmis)" + }, "options_first_party_title": { "message": "Pagrindinių slapukų sunaikinimas (nerekomenduojama)" }, + "options_first_party_desc": { + "message": "Apriboti pirmosios šalies slapukų gyvavimo trukmę (minutėmis)" + }, "popup_abuse_site": { "message": "Pranešti apie problemą" }, @@ -801,6 +1027,12 @@ "popup_switch_button": { "message": "Apsaugos perjungimas" }, + "popup_limits_exceeded_warning": { + "message": "Naršyklė pakeitė aktyvių filtrų sąrašą" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Taisyklių limitas viršytas „AdGuard“ naršyklės plėtinyje. Prašome patikrinti savo filtrus ir išjungti tuos, kurių jums nereikia" + }, "short_name": { "message": "AdGuard AdBlocker" }, @@ -840,12 +1072,39 @@ "options_about_title": { "message": "AdGuard naršyklės plėtinys" }, + "group_description_adblocking": { + "message": "Čia sukonfigūruokite skelbimų blokavimą, kad galėtumėte susidoroti su erzinančiomis reklamjuostėmis, iškylančiais langais, vaizdo įrašų skelbimais ir panašiai, vieną ir visiems laikams" + }, + "group_description_stealth": { + "message": "Apsaugokite savo tapatybę ir jautrią asmeninę informaciją nuo tūkstančių internetinių seklių, blokuodami visus žinomus populiarius stebėjimo metodus" + }, + "group_description_social": { + "message": "Slėpti nepageidaujamus \"Patinka\"\/\"Bendrinti\" mygtukus ir kitus socialinės žiniasklaidos valdiklius" + }, + "group_description_annoyances": { + "message": "Pašalinti iššokančius langus ir kitus erzinančius pranešimus, pvz., įspėjimus apie slapukus" + }, + "group_description_security": { + "message": "Apsaugokite save nuo kenkėjiškų programų, sukčiavimo ir kitų internetinių grėsmių" + }, + "group_description_miscellaneous": { + "message": "Daugiau nustatymų, kad galėtumėte dar labiau konfigūruoti naršymą internete su AdGuard" + }, "group_description_custom": { "message": "Sukurkite savo filtrus, kad patikslintumėte žiniatinklio filtravimą pagal savo pageidavimus." }, + "group_description_lang": { + "message": "Neribokite savęs – užblokuokite skelbimus svetainėse, bet kuria kalba" + }, "fullscreen_user_rules_title": { "message": "Vartotojo taisyklės" }, + "options_user_rules_editor_stub_title": { + "message": "Redaktorius atidarytas kitoje lango" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Jūsų taisyklės čia pasirodys po to, kai uždarysite" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Eikite į redaktorių" }, @@ -879,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Pabandyti iš naujo" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Pirmosios šalies užklausos" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Trečiųjų šalių užklausos" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Užklausos, apdorotos be filtravimo" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Leidžiamos ir atblokuotos užklausos" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Užblokuotos užklausos" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Pakeistos užklausos" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Užklausos, kurioms įtakos turi naudotojo taisyklės" + }, "filtering_log_tag_tooltip_html": { "message": "Dokumentai ir subdokumentai" }, @@ -897,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Žiniasklaida" }, + "filtering_log_tag_tooltip_other": { + "message": "Šriftai, pingai, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Trečiųjų šalių prašymait" }, @@ -906,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP būsenos kodas" }, + "filtering_log_assumed_rule_description": { + "message": "Tai yra laikina taisyklė. Daugiau informacijos rasite mūsų Žinių bazėje<\/a>" + }, "options_stealth_general_title": { "message": "Bendras" }, @@ -915,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "Įvairūs" }, + "options_coming_soon": { + "message": "Ateina netrukus" + }, "blocking_pages_malware": { "message": "Apie šį tinklalapį %host%<\/strong> pranešta kaip apie kenkėjiškų programų puslapį ir jis buvo užblokuotas, atsižvelgiant į Jūsų saugos nuostatas." }, @@ -953,5 +1242,8 @@ }, "close_button_title": { "message": "Uždaryti" + }, + "filtering_modal_declarative_rule": { + "message": "DNR taisyklė:" } -} \ No newline at end of file +} diff --git a/Extension/_locales/mk/messages.json b/Extension/_locales/mk/messages.json index 394b6d555e..ccbc5f1d9a 100644 --- a/Extension/_locales/mk/messages.json +++ b/Extension/_locales/mk/messages.json @@ -150,12 +150,21 @@ "options_allowlist": { "message": "Листа на дозволени" }, + "options_allowlist_desc": { + "message": "AdGuard не филтрира веб-локации од списокот со дозволи" + }, "options_allowlist_invert": { "message": "Превртете ја листата на дозволени" }, + "options_allowlist_invert_desc": { + "message": "Дозволете ги рекламите насекаде освен од листата на дозволени" + }, "options_allowlist_alert_invert": { "message": "Списокот на дозволи е превртен. Рекламите се блокирани само на веб-локациите додадени на него. Оневозможи<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Вашите промени во спискот со дозволи ќе бидат изгубени" + }, "options_userfilter": { "message": "Правила на корисникот" }, @@ -252,6 +261,9 @@ "options_popup_import_error_required_privacy_permission": { "message": "За да ја увезете оваа датотека со поставки, дозволете AdGuard да ги промени вашите поставки поврзани со приватноста." }, + "options_popup_import_success_title": { + "message": "Поставките се увезени" + }, "options_popup_import_error_title": { "message": "Не успеа да се увезат поставките" }, @@ -300,6 +312,9 @@ "popup_tab_blocked_count": { "message": "Блокирани: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Вкупно блокирано: %num%" + }, "popup_statistics_total": { "message": "Вкупно" }, @@ -411,15 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "ДОЗНАЈ ПОВЕЌЕ" }, + "popup_block_site_ads_option": { + "message": "Блокирајте го рачно" + }, "popup_security_report": { "message": "Проверете ја безбедноста на веб-страницата" }, "popup_reset_page_user_rules": { "message": "Избриши Кориснички правила за оваа веб-страница" }, + "context_block_site_ads": { + "message": "Блокирајте го рачно" + }, "context_security_report": { "message": "Проверете ја безбедноста на веб-страницата" }, + "context_complaint_website": { + "message": "Пријавете проблем" + }, + "context_site_filtering_disabled": { + "message": "AdGuard не може да филтрира оваа страница" + }, "context_disable_protection": { "message": "Паузирајте ја заштитата на AdGuard" }, @@ -459,6 +486,9 @@ "filters_download_loading": { "message": "Ве молиме почекајте додека се вчитува базата на податоци за филтри..." }, + "post_install_loading": { + "message": "Вчитување на екстензијата..." + }, "filtering_modal_element": { "message": "Елемент:" }, @@ -477,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Пребарување низ картичките" }, + "filtering_log_preserve_log_off": { + "message": "Не запишувај во дневник" + }, + "filtering_log_preserve_log_on": { + "message": "Запишувај во дневник" + }, "filtering_refresh_tab_short": { "message": "Освежи" }, @@ -504,6 +540,9 @@ "filtering_table_filter": { "message": "Филтер" }, + "filtering_table_empty_reload_page_desc": { + "message": "Ништо не е пронајдено. Оневозможете ги филтрите<\/reset> или преземете ја страницата повторно<\/refresh> за да ги видите записите во дневникот." + }, "filtering_modal_info_title": { "message": "Побарајте детали" }, @@ -552,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Статус:" }, + "filtering_modal_status_text_error": { + "message": "Не успеа да се вчита прегледот. Ве молиме обидете се повторно" + }, "filtering_modal_status_text_loading": { "message": "Вчитување..." }, @@ -648,12 +690,18 @@ "options_block_acceptable_ads": { "message": "Блокирајте ги рекламите за пребарување и самопромоцијата на веб-страниците" }, + "options_block_acceptable_ads_desc": { + "message": "Избришете ги само-промотивните реклами од веб-страниците и контекстните реклами од резултатите од пребарувањето. Дознај повеќе<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "Наведете го бројот на блокирани реклами на иконата за проширување на AdGuard" }, "options_enable_autodetect_filter": { "message": "Автоматски активирајте ги најсоодветните филтри" }, + "options_enable_autodetect_filter_desc": { + "message": "Филтрите специфични за јазикот ќе се вклучат во зависност од јазикот на страницата" + }, "options_select_theme": { "message": "Тема" }, @@ -693,12 +741,24 @@ "options_set_update_interval": { "message": "Автоматско ажурирање филтри" }, + "options_set_update_interval_desc": { + "message": "За поефикасно блокирање, филтрите треба редовно да се ажурираат" + }, "options_userfilter_export": { "message": "Извези" }, "options_editor_save": { "message": "Зачувај" }, + "options_editor_leave_title": { + "message": "Се откажувате без да зачувате?" + }, + "options_editor_leave_confirm": { + "message": "Да, откажи" + }, + "options_editor_leave_cancel": { + "message": "Назад на уредување" + }, "options_userfilter_import": { "message": "Увези" }, @@ -708,6 +768,15 @@ "options_userfilter_subtitle_key": { "message": "Користете правила за попрецизно блокирање" }, + "options_userfilter_line_break_off": { + "message": "Прекин на линија: оневозможено" + }, + "options_userfilter_line_break_on": { + "message": "Прекин на линија: овозможено" + }, + "options_userfilter_leave_subtitle": { + "message": "Вашите промени во правилата ќе бидат изгубени" + }, "options_open_changelog": { "message": "Промени" }, @@ -738,15 +807,34 @@ "options_rule_limits": { "message": "Ограничувања на правилата" }, + "options_rule_limits_description": { + "message": "Chrome ги ограничува правилата што можат да се применат" + }, "options_rule_limits_dynamic": { "message": "Динамични правила" }, + "options_rule_limits_dynamic_user_rules": { + "message": "Правила додадени од корисникот, како кориснички правила<\/user_rules>, веб-страници од списокот со дозволи<\/allowlist>, прилагодени филтри<\/custom_filters>, и филтер за Брзи Поправки<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Небезбедни динамички правила (се користат за некои напредни модификатори, како $$redirect или $$cookie) — вклучени во правилата додадени од корисникот" + }, + "options_rule_limits_dynamic_regex": { + "message": "Regex правила — вклучени во правилата додадени од корисникот" + }, "options_rule_limits_static_rulesets": { "message": "Статични правила" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Вградени филтри<\/a>, како што се блокирање на вознежувања или филтри специфични за јазик" + }, "options_rule_limits_static_rules": { "message": "Статични правила" }, + "options_rule_limits_static_rules_all": { + "message": "Правила од вградени филтри<\/a>" + }, "options_rule_limits_static_rules_regex": { "message": "Регекс правила — вклучени во горните" }, @@ -771,6 +859,39 @@ "options_rule_limits_warning_actions_title": { "message": "Вашите можни дејства" }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Опција 1. Избришете ги непотребните екстензии за блокирање реклами од вашиот прелистувач. За повторно да ги активирате филтрите споменати во делот \"Филтри овозможени пред ажурирањето\", кликнете повторно активирајте ги филтрите.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Опција 2. Инсталирајте ја апликацијата AdGuard блокатор на реклами: таа нема ограничувања за правилата за филтрирање. Преземете го AdGuard блокатор на реклами<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Опција 3. Ако сте задоволни со моментално овозможениот стандарден филтер, затворете го ова предупредување.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Опција 3. Ако сте задоволни со моментално овозможените стандардни филтри, затворете го ова предупредување.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Го достигнавте лимитот на активни вградени филтри. Вашиот прелистувач ја измени листата на активни вградени филтри. Бројот на овозможени филтри се промени од %expected% на %current%." + }, + "options_limits_warning_static_filters": { + "message": "Го достигнавте лимитот на активни вградени филтри. %maximum% од %current% филтри се овозможени. За да активирате нови правила, оневозможете некои вградени филтри." + }, + "options_limits_warning_static_rules": { + "message": "Го достигнавте лимитот на активни вградени правила. %maximum% од %current% правила се овозможени. За да активирате нови правила, оневозможете некои вградени филтри." + }, + "options_limits_warning_static_regex_rules": { + "message": "Го достигнавте лимитот на активни вградени регуларни изрази. %maximum% од %current% регуларни изрази се овозможени. За да активирате нови правила, оневозможете некои вградени филтри." + }, + "options_limits_warning_dynamic_rules": { + "message": "Го достигнавте лимитот на правила додадени од корисникот. %maximum% од %current% правила се овозможени." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Ја достигнавте границата на небезбедни правила додадени од корисникот. %maximum% од %current% Небезбедните правила се овозможени." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Го достигнавте лимитот на регуларни изрази додадени од корисникот. %maximum% од %current% регуларни изрази се овозможени." + }, "options_show_adguard_full_version_title": { "message": "Прикажи информации за целосната верзија на AdGuard" }, @@ -798,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "Помогнете со развојот на филтрите AdGuard" }, + "options_collect_hit_stats_desc": { + "message": "Испратете анонимна статистика за користење на филтри за реклами<\/a> за да му помогнете на AdGuard да ги подобри своите филтри." + }, "options_show_context_menu_title": { "message": "Додајте ставка AdGuard во контекстното мени на прелистувачот" }, @@ -810,15 +934,27 @@ "options_privacy_title": { "message": "Заштита од следење" }, + "options_privacy_desc": { + "message": "Заштитете го вашиот идентитет и чувствителните лични информации од илјадници онлајн тракери со блокирање на најпопуларните методи за следење" + }, "options_hide_referrer_title": { "message": "Сокриј го упатувачот од трети страни" }, + "options_hide_referrer_desc": { + "message": "Спречете трети лица да знаат која веб-страница ја посетувате" + }, "options_hide_search_queries_title": { "message": "Сокријте ги вашите пребарувања" }, + "options_hide_search_queries_desc": { + "message": "Сокријте ги барањата за веб-страниците што ги посетивте од пребарувачот" + }, "options_send_not_track_title": { "message": "Побарајте од веб-локациите да не ве следат" }, + "options_send_not_track_desc": { + "message": "Испратете ги сигналите за Глобална контрола на приватноста<\/gpc> и Не следи<\/dnt> на веб-локациите што ги посетувате" + }, "options_stripped_tracking_parameters": { "message": "Параметрите за следење се отстранети" }, @@ -831,21 +967,39 @@ "options_remove_client_data_title": { "message": "Отстранете го заглавието на X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "Блокирајте го Google Chrome да испраќа информации за неговата верзија и модификации до Google домени" + }, "options_disable_webrtc_title": { "message": "Оневозможи WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC може да ја открие вашата IP адреса дури и ако користите прокси или VPN. Оневозможувањето на WebRTC може да прекине некои веб-страници" + }, "options_strip_tracking_params_title": { "message": "Отстранете ги параметрите за следење" }, + "options_strip_tracking_params_description": { + "message": "Отстранете ги параметрите од веб-барањата со Филтерот за следење URL на AdGuard" + }, "options_block_known_trackers_title": { "message": "Блокирајте тракери" }, + "options_block_known_trackers_description": { + "message": "Блокирајте тракери и алатки за веб-аналитика со Филтерот за заштита од следење на AdGuard" + }, "options_third_party_title": { "message": "Самоуништување на колачиња од трета страна" }, + "options_third_party_desc": { + "message": "Ограничете го животниот век на колачињата од трета страна (минути)" + }, "options_first_party_title": { "message": "Самоуништување на колачиња од прва страна (не се препорачува)" }, + "options_first_party_desc": { + "message": "Ограничете го животниот век на колачињата од прва страна (минути)" + }, "popup_abuse_site": { "message": "Пријавете проблем" }, @@ -876,6 +1030,9 @@ "popup_limits_exceeded_warning": { "message": "Прелистувачот го измени списокот со активни вградени филтри" }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Лимитот на правила е надминат во AdGuard екстензијата за прелистувач. Ве молиме проверете ги вашите филтри и оневозможете ги оние што не ви се потребни" + }, "short_name": { "message": "AdGuard" }, @@ -915,12 +1072,39 @@ "options_about_title": { "message": "Екстензија на прелистувачот AdGuard" }, + "group_description_adblocking": { + "message": "Конфигурирајте го блокирањето реклами овде за да се справите со досадни банери, скокачки прозорци, видео реклами и слично, еднаш засекогаш" + }, + "group_description_stealth": { + "message": "Заштитете го вашиот идентитет и чувствителните лични информации од илјадници онлајн тракери со блокирање на сите познати популарни методи за следење" + }, + "group_description_social": { + "message": "Скријте ги несаканите копчиња \"Ми се допаѓа\"\/\"Сподели\" и други виџети за социјални медиуми" + }, + "group_description_annoyances": { + "message": "Отстранете ги скокачките прозорци и другите досадни известувања како известувања за колачиња" + }, + "group_description_security": { + "message": "Заштитете се од злонамерен софтвер, фишинг и други онлајн закани" + }, + "group_description_miscellaneous": { + "message": "Повеќе поставки за дополнително да го конфигурирате сурфањето на веб со AdGuard" + }, "group_description_custom": { "message": "Создадете ваши сопствени филтри за да го прилагодите филтрирањето на веб по ваша желба." }, + "group_description_lang": { + "message": "Не се ограничувајте — блокирајте ги рекламите на веб-локациите на кој било јазик" + }, "fullscreen_user_rules_title": { "message": "Кориснички правила" }, + "options_user_rules_editor_stub_title": { + "message": "Уредникот отворен во друго прозорец" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Вашите правила ќе се појават овде откако ќе го затворите" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "Одете до уредникот" }, @@ -954,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "Обиди се повторно" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Барања од прва страна" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Барања од трета страна" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Барањата се обработуваат без филтрирање" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Дозволени и деблокирани барања" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Блокирани барања" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Изменети барања" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Барања погодени од кориснички правила" + }, "filtering_log_tag_tooltip_html": { "message": "Документи и поддокументи" }, @@ -972,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "Мултимедија" }, + "filtering_log_tag_tooltip_other": { + "message": "Фонтови, пингови, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "Барање од трета страна" }, @@ -981,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "HTTP статусен код" }, + "filtering_log_assumed_rule_description": { + "message": "Ова е предпоставено правило. За повеќе детали, видете ја нашата База на знаење<\/a>" + }, "options_stealth_general_title": { "message": "Општо" }, @@ -1031,5 +1242,20 @@ }, "close_button_title": { "message": "Затвори" + }, + "filtering_modal_applied_rules": { + "message": "| Применето правило: | Применети правила:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_assumed_rules": { + "message": "| Предпоставено правило: | Предпоставени правила:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_original_rules": { + "message": "| Оригинално правило: | Оригинални правила:", + "description": "WARNING: correct number of plural forms is required" + }, + "filtering_modal_declarative_rule": { + "message": "DNR правило:" } } \ No newline at end of file diff --git a/Extension/_locales/ms/messages.json b/Extension/_locales/ms/messages.json index 3b8ff164e9..179c357a2c 100644 --- a/Extension/_locales/ms/messages.json +++ b/Extension/_locales/ms/messages.json @@ -11,12 +11,30 @@ "options_filters_list_search_display_option_disabled": { "message": "Dinyahaktifkan" }, + "options_filters_empty_title": { + "message": "Tiada yang ditemui" + }, "options_antibanner_custom_filter_already_exists": { "message": "Penapis tersendiri ini telah pun ditambahkan" }, + "options_filters_annoyances_consent_title": { + "message": "Sila baca dengan teliti sebelum menghidupkan penapis gangguan" + }, + "options_filters_annoyances_consent_description": { + "message": "Anda sedang menghidupkan satu atau lebih penapis gangguan. Mereka menyekat unsur yang tidak berkaitan dengan kandungan laman web atau yang berkaitan tetapi mengganggu pengalaman pengguna anda. Pemilik laman web mungkin menganggap unsur ini wajib: jika anda menyekat mereka, anda mungkin melanggar terma mereka; beberapa fungsi laman web mungkin tidak tersedia atau mungkin tidak berfungsi dengan baik. Anda memahami dan bersetuju bahawa anda bertanggungjawab sepenuhnya untuk mematuhi terma penggunaan laman web yang anda lawati dan bahawa AdGuard tidak bertanggungjawab atas kepatuhan anda terhadap terma penggunaan laman web yang anda lawati." + }, + "options_filters_annoyances_consent_question": { + "message": "Hidupkan penapis ini?" + }, + "options_filters_annoyances_consent_filter_policy": { + "message": "Untuk maklumat lanjut tentang apa yang disekat oleh penapis gangguan AdGuard, lihat Dasar penapis<\/a>" + }, "options_filters_annoyances_consent_enable_button": { "message": "Dayakan" }, + "popup_header_cta_link": { + "message": "Bagaimana untuk meningkatkan perlindungan" + }, "popup_header_update_filters": { "message": "Semak kemaskini penyaring" }, @@ -44,12 +62,18 @@ "options_popup_version_update_disable_notification": { "message": "Nyahdayakan pemberitahuan" }, + "popup_adguard_footer_title": { + "message": "Lindungi peranti mudah alih anda" + }, "options_popup_call_to_action": { "message": "Masukkan URL yang sah atau laluan fail penapis ke dalam medan di atas." }, "options_popup_description": { "message": "Anda akan melanggan penapis itu." }, + "options_popup_url_title": { + "message": "Langganan penapis baru" + }, "options_popup_url_placeholder": { "message": "Masukkan URL atau laluan" }, @@ -65,9 +89,30 @@ "options_popup_check_false_description": { "message": "Ralat ketika menambah penapis tersuai anda" }, + "options_add_custom_filter_modal_title": { + "message": "Tambah penapis tersuai" + }, + "options_add_custom_filter_modal_checking_filter": { + "message": "Menyemak penapis anda..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "Gagal untuk menambah penapis khusus" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "Sila cuba lagi atau hubungi sokongan" + }, + "options_add_custom_filter_modal_add_button": { + "message": "TAMBAH" + }, + "options_add_custom_filter_modal_filter_name": { + "message": "Nama penapis:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "Dipercayai" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "Beberapa peraturan penapis boleh mengubah pengalaman pelayaran anda dengan ketara dan menjejaskan privasi anda. Pastikan untuk hanya menggunakan penapis dari pemaju yang anda percayai" + }, "options_popup_try_again_button": { "message": "Cuba lagi" }, @@ -105,21 +150,39 @@ "options_allowlist": { "message": "Senarai Putih" }, + "options_allowlist_desc": { + "message": "AdGuard tidak menyaring laman web dari senarai putih" + }, "options_allowlist_invert": { "message": "Songsangkan Senarai Putih" }, + "options_allowlist_invert_desc": { + "message": "Nyahhalang iklan di mana-mana kecuali untuk senarai putih" + }, "options_allowlist_alert_invert": { "message": "Senarai Putih telah disongsangkan. Iklan hanya disekat pada laman sesawang yang ditambah di situ. Menyahdayakan<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "Perubahan anda kepada Senarai Putih akan hilang" + }, "options_userfilter": { "message": "Penyaring pengguna" }, "filtering_log_modified_rules": { "message": "Peraturan diubah suai: %rules_count%" }, + "filtering_log_stealth_rules": { + "message": "Peraturan perlindungan jejak: %rules_count%" + }, + "filtering_log_privacy_applied_rules": { + "message": "Perlindungan jejak diterapkan" + }, "filtering_log_in_allowlist": { "message": "Laman ini telah dibenarkan" }, + "filtering_log_hide_referrer": { + "message": "Perujuk tersembunyi daripada pihak ketiga" + }, "filtering_log_hide_search_queries": { "message": "Permintaan carian anda tersembunyi" }, @@ -174,9 +237,15 @@ "options_filters_filter_trusted_tag_desc": { "message": "Anda memilih untuk mempercayai penyaring ini." }, + "options_filters_info_mv3_total_rules": { + "message": "Jumlah peraturan: %num%" + }, "options_add_custom_filter": { "message": "Tambah penapis tersuai" }, + "options_filters_custom_disabled_cws": { + "message": "Penyaringan khusus akan kembali tidak lama lagi. Ketahui lebih lanjut di blog kami" + }, "options_empty_custom_filter": { "message": "Maaf, anda tiada sebarang penapis tersuai lagi" }, @@ -189,6 +258,15 @@ "options_editor_indicator_saved": { "message": "Disimpan" }, + "options_popup_import_error_required_privacy_permission": { + "message": "Untuk mengimport fail tetapan ini, benarkan AdGuard untuk mengubah tetapan berkaitan privasi anda." + }, + "options_popup_import_success_title": { + "message": "Tetapan diimport" + }, + "options_popup_import_error_title": { + "message": "Gagal untuk mengimport tetapan" + }, "options_popup_import_error_file_description": { "message": "Sesuatu tidak kena." }, @@ -201,27 +279,54 @@ "popup_site_filtering_state_secure_page": { "message": "Halaman selamat" }, + "popup_site_filtering_state_loading": { + "message": "Memuatkan..." + }, + "popup_site_filtering_state_enabling": { + "message": "Menghidupkan perlindungan..." + }, "popup_site_filtering_state_enabled": { "message": "Perlindungan didayakan" }, + "popup_site_filtering_state_disabling": { + "message": "Nyahhidupkan perlindungan..." + }, "popup_site_filtering_state_disabled": { "message": "Perlindungan dinyahdayakan" }, + "popup_site_filtering_state_pausing": { + "message": "Menghentikan perlindungan..." + }, "popup_site_filtering_state_paused": { "message": "Perlindungan dijeda" }, + "popup_site_filtering_state_resuming": { + "message": "Menghidupkan semula perlindungan..." + }, + "popup_site_filtering_state_subtitle_all_websites": { + "message": "untuk semua laman web" + }, "popup_site_exception_information": { "message": "Penyaring dinyahaktif kerana ia mampu menganggu kelancaran laman sesawang ini." }, "popup_tab_blocked_count": { "message": "Disekat: %num%" }, + "popup_tab_blocked_all_count": { + "message": "Jumlah disekat: %num%" + }, "popup_statistics_total": { "message": "Jumlah" }, + "popup_statistics_all_categories": { + "message": "Semua" + }, "popup_statistics_category_advertising": { "message": "Pengiklanan" }, + "popup_statistics_category_trackers": { + "message": "Pengesan" + }, "popup_statistics_category_social_media": { "message": "Media sosial" }, @@ -321,12 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "BELAJAR LEBIH" }, + "popup_block_site_ads_option": { + "message": "Sekat iklan secara manual" + }, "popup_security_report": { "message": "Laporan keselamatan laman web" }, + "popup_reset_page_user_rules": { + "message": "Padam peraturan pengguna untuk laman web ini" + }, + "context_block_site_ads": { + "message": "Sekat iklan secara manual" + }, "context_security_report": { "message": "Laporan keselamatan laman web" }, + "context_complaint_website": { + "message": "Laporkan masalah" + }, + "context_site_filtering_disabled": { + "message": "AdGuard tidak dapat menyaring halaman ini" + }, "context_disable_protection": { "message": "Henti sebentar perlindungan AdGuard" }, @@ -339,6 +459,9 @@ "context_open_settings": { "message": "Tetapan AdGuard" }, + "context_open_log": { + "message": "Log penapisan" + }, "context_site_exception": { "message": "Laman web ini dalam pengecualian" }, @@ -363,6 +486,9 @@ "filters_download_loading": { "message": "Sila tunggu sebentar sementara pangkalan data penyaring dimuatkan..." }, + "post_install_loading": { + "message": "Memuatkan sambungan..." + }, "filtering_modal_element": { "message": "Unsur:" }, @@ -381,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "Cari dalam tab" }, + "filtering_log_preserve_log_off": { + "message": "Jangan rekod log" + }, + "filtering_log_preserve_log_on": { + "message": "Rekod log" + }, "filtering_refresh_tab_short": { "message": "Menyegar semula" }, @@ -408,6 +540,9 @@ "filtering_table_filter": { "message": "Penapis" }, + "filtering_table_empty_reload_page_desc": { + "message": "Tiada yang ditemui. Nyahdayakan penapis<\/reset> atau muat semula halaman<\/refresh> untuk melihat rekod log." + }, "filtering_modal_info_title": { "message": "Butiran permintaan" }, @@ -426,6 +561,9 @@ "filtering_modal_rules": { "message": "Peraturan:" }, + "filtering_modal_privacy": { + "message": "Perlindungan privasi:" + }, "filtering_modal_filter": { "message": "Penyaring:" }, @@ -453,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "Status:" }, + "filtering_modal_status_text_error": { + "message": "Gagal untuk memuatkan pratonton. Sila cuba lagi" + }, "filtering_modal_status_text_loading": { "message": "Memuatkan..." }, @@ -474,6 +615,9 @@ "filtering_modal_third_party": { "message": "Tetapkan kepada permintaan pihak ketiga sahaja" }, + "filtering_modal_remove_param": { + "message": "Singkir parameter carian" + }, "filtering_modal_add_rule": { "message": "Tambah peraturan" }, @@ -489,12 +633,27 @@ "filtering_modal_hide_full_url": { "message": "Sembunyikan URL penuh" }, + "filtering_modal_show_full_rule": { + "message": "Tunjukkan peraturan penuh" + }, + "filtering_modal_hide_full_rule": { + "message": "Sembunyikan peraturan penuh" + }, + "filtering_modal_show_full_element": { + "message": "Tunjukkan elemen penuh" + }, + "filtering_modal_hide_full_element": { + "message": "Sembunyikan elemen penuh" + }, "filtering_modal_copy_to_clipboard": { "message": "Salin ke papan klip" }, "filtering_modal_copied": { "message": "Disalin" }, + "filtering_modal_converted_to": { + "message": "Dipindahkan ke:" + }, "filtering_log_filter_regular": { "message": "Biasa" }, @@ -528,12 +687,33 @@ "options_general_settings": { "message": "Tetapan Umum" }, + "options_block_acceptable_ads": { + "message": "Sekat iklan carian dan promosi sendiri laman web" + }, + "options_block_acceptable_ads_desc": { + "message": "Padam iklan promosi diri dari laman web dan iklan kontekstual dari hasil carian. Ketahui lebih lanjut<\/a>" + }, + "options_show_blocked_ads_count_title": { + "message": "Paparkan jumlah iklan dihalang pada ikon sambungan AdGuard" + }, "options_enable_autodetect_filter": { "message": "Aktifkan penyaring yang paling sesuai secara automatik" }, + "options_enable_autodetect_filter_desc": { + "message": "Penapis yang khusus untuk bahasa akan dihidupkan bergantung kepada bahasa laman" + }, + "options_select_theme": { + "message": "Tema" + }, "options_theme_selector_system": { "message": "Sistem" }, + "options_theme_selector_light": { + "message": "Cerah" + }, + "options_theme_selector_dark": { + "message": "Gelap" + }, "options_export_settings": { "message": "Eksport tetapan" }, @@ -543,39 +723,175 @@ "options_report_bug": { "message": "Laporkan pepijat" }, + "options_leave_feedback": { + "message": "Tinggalkan maklum balas" + }, + "options_privacy": { + "message": "Perlindungan Penjejakan" + }, "options_update_antibanner_filters": { "message": "Semak kemaskini penyaring" }, "options_check_update": { "message": "Menyemak kemas kini" }, + "options_check_update_progress": { + "message": "Menyemak..." + }, "options_set_update_interval": { "message": "Selang kemas kini penapis" }, + "options_set_update_interval_desc": { + "message": "Untuk penyekatan yang lebih berkesan, penapis perlu dikemas kini secara berkala" + }, "options_userfilter_export": { "message": "Eksport" }, "options_editor_save": { "message": "Simpan" }, + "options_editor_leave_title": { + "message": "Tinggalkan tanpa menyimpan?" + }, + "options_editor_leave_confirm": { + "message": "Ya, tinggalkan" + }, + "options_editor_leave_cancel": { + "message": "Kembali ke pengeditan" + }, "options_userfilter_import": { "message": "Import" }, + "options_userfilter_subtitle_key": { + "message": "Tingkatkan pemblokiran iklan dengan peraturan penyaringan anda sendiri" + }, + "options_userfilter_line_break_off": { + "message": "Jarak baris: Dimatikan" + }, + "options_userfilter_line_break_on": { + "message": "Jarak baris: Diaktifkan" + }, + "options_userfilter_leave_subtitle": { + "message": "Perubahan anda kepada peraturan akan hilang" + }, "options_open_changelog": { "message": "Log perubahan" }, "options_safebrowsing_enabled": { "message": "Perlindungan dari malware dan phishing" }, + "options_safebrowsing_enabled_desc": { + "message": "Hidupkan modul Keselamatan Pelayaran AdGuard yang mengesan laman berpotensi berniat jahat dan pancingan data dengan memeriksa mereka terhadap pangkalan data dalam talian. Baca lebih lanjut<\/a>" + }, "options_site": { "message": "Laman Web Rasmi" }, "options_discuss": { "message": "Bincangkan AdGuard" }, + "options_do_you_like_question": { + "message": "Anda suka AdGuard?" + }, + "options_footer_like_us_cta": { + "message": "Nilaikan kami!" + }, "options_miscellaneous_settings": { "message": "Tetapan tambahan" }, + "options_rule_syntax": { + "message": "Sintaks" + }, + "options_rule_limits": { + "message": "Had peraturan" + }, + "options_rule_limits_description": { + "message": "Chrome menghadkan jumlah peraturan yang boleh diterapkan" + }, + "options_rule_limits_dynamic": { + "message": "Peraturan dinamik" + }, + "options_rule_limits_dynamic_user_rules": { + "message": "Peraturan yang ditambah pengguna, seperti peraturan pengguna<\/user_rules>, laman web yang disenaraikan putih<\/allowlist>, penapis tersuai<\/custom_filters>, dan penapis Pembetulan Cepat<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "Peraturan dinamik tidak selamat (digunakan untuk beberapa pengubah suai lanjutan, seperti $$redirect atau $$cookie) — termasuk dalam peraturan tambah pengguna" + }, + "options_rule_limits_dynamic_regex": { + "message": "Peraturan regex — termasuk dalam peraturan yang ditambah oleh pengguna" + }, + "options_rule_limits_static_rulesets": { + "message": "Set peraturan statik" + }, + "options_rule_limits_static_rulesets_builtin": { + "message": "Penapis terbina dalam<\/a>, seperti Sekat gangguan atau Penapis bahasa yang khusus" + }, + "options_rule_limits_static_rules": { + "message": "Peraturan statik" + }, + "options_rule_limits_static_rules_all": { + "message": "Peraturan dari penapis terbina dalam<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "Peraturan regex — termasuk di atas" + }, + "options_rule_limits_numbers": { + "message": "%current% daripada %maximum%" + }, + "options_rule_limits_warning_title": { + "message": "Pelayar telah mengubah senarai penapis yang aktif" + }, + "options_rule_limits_warning_explanation_title": { + "message": "Apa yang terjadi?" + }, + "options_rule_limits_warning_explanation_description": { + "message": "Had peraturan terbina dalam yang aktif telah melepasi selepas kemas kini atau menambah penyambung baru. Mengikut Manifest V3, pelayar Chrome anda bertindak dengan menyahtandakan semua penapis terbina dalam penyambung kecuali yang lalai." + }, + "options_rule_limits_warning_list_enabled_before_title": { + "message": "Penapis yang dihidupkan sebelum kemas kini" + }, + "options_rule_limits_warning_list_enabled_now_title": { + "message": "Penapis yang dihidupkan sekarang" + }, + "options_rule_limits_warning_actions_title": { + "message": "Tindakan anda yang mungkin" + }, + "options_rule_limits_warning_actions_delete_filters": { + "message": "Pilihan 1. Padam penyambung penyekat iklan yang tidak perlu dari pelayar anda. Untuk mengaktifkan semula penyaring yang dinyatakan dalam seksyen “Penyaring dihidupkan sebelum kemas kini”, klik aktifkan semula penyaring.<\/a>" + }, + "options_rule_limits_warning_actions_install_app": { + "message": "Pilihan 2. Pasang aplikasi Penghalang Iklan AdGuard: ia tidak mempunyai sekatan pada peraturan penyaringan. Dapatkan aplikasi AdGuard<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_one_filter": { + "message": "Pilihan 3. Jika anda berpuas hati dengan penyaring lalai yang sedang diaktifkan pada masa ini, tutup amaran ini.<\/a>" + }, + "options_rule_limits_warning_actions_close_warning_multiple_filters": { + "message": "Pilihan 3. Jika anda berpuas hati dengan penyaring lalai yang sedang diaktifkan pada masa ini, tutup amaran ini.<\/a>" + }, + "options_all_limits_exceeded_warning": { + "message": "Anda telah mencapai had peraturan terbina dalam aktif. Penyaring aktif telah diubah dari %expected% kepada %current%." + }, + "options_limits_warning_static_filters": { + "message": "Anda telah mencapai had penyaring terbina dalam aktif. %maximum% daripada %current% penyaring telah dihidupkan. Untuk mengaktifkan peraturan baru, nyahaktifkan beberapa penyaring terbina dalam." + }, + "options_limits_warning_static_rules": { + "message": "Anda telah mencapai had peraturan terbina dalam aktif. %maximum% daripada %current% peraturan telah dihidupkan. Untuk mengaktifkan peraturan baru, nyahaktifkan beberapa penyaring terbina dalam." + }, + "options_limits_warning_static_regex_rules": { + "message": "Anda telah mencapai had peraturan regex yang ditambah pengguna. %maximum% daripada %current% peraturan regex telah dihidupkan." + }, + "options_limits_warning_dynamic_rules": { + "message": "Anda telah mencapai had peraturan yang ditambah pengguna. %maximum% daripada %current% peraturan telah dihidupkan." + }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "Anda telah mencapai had peraturan tidak selamat yang ditambah pengguna. %maximum% daripada %current% peraturan tidak selamat telah dihidupkan." + }, + "options_limits_warning_dynamic_regex_rules": { + "message": "Anda telah mencapai had peraturan regex yang ditambah pengguna. %maximum% daripada %current% peraturan regex telah dihidupkan." + }, + "options_show_adguard_full_version_title": { + "message": "Papar maklumat tentang versi penuh AdGuard" + }, "options_show_app_updated_notification": { "message": "Beritahu tentang kemas kini sambungan" }, @@ -588,21 +904,54 @@ "options_reset_stats_done": { "message": "Statistik telah dipadam" }, + "options_reset_settings": { + "message": "Tetap semula tetapan" + }, + "options_reset_settings_done": { + "message": "Tetapan telah diset semula" + }, + "options_reset_settings_error": { + "message": "Ralat mengimport tetapan" + }, + "options_collect_hit_stats_title": { + "message": "Ambil bahagian dalam pembangunan penapis AdGuard" + }, + "options_collect_hit_stats_desc": { + "message": "Hantar statistik tanpa nama mengenai penggunaan penapis iklan<\/a> untuk membantu AdGuard meningkatkan penapisnya" + }, + "options_show_context_menu_title": { + "message": "Tambah item AdGuard ke menu konteks pelayar web" + }, "options_use_optimized_filters": { "message": "Guna penyaring dioptimum" }, "options_use_optimized_filters_desc": { "message": "Menggunakan versi penapis yang lebih pendek dengan hanya peraturan yang paling popular untuk menjimatkan trafik. Lebih sesuai untuk penyemak imbas mudah alih" }, + "options_privacy_title": { + "message": "Perlindungan Penjejakan" + }, + "options_privacy_desc": { + "message": "Lindungi identiti dan maklumat peribadi sensitif anda dari ribuan penjejak atas talian dengan menyekat cara penjejakan paling popular" + }, "options_hide_referrer_title": { "message": "Sembunyi Referer daripada pihak-ketiga" }, + "options_hide_referrer_desc": { + "message": "Halang pihak ketiga daripada mengetahui laman web yang anda lawati" + }, "options_hide_search_queries_title": { "message": "Sembunyi permintaan carian anda" }, + "options_hide_search_queries_desc": { + "message": "Sembunyikan parameter untuk laman web yang dilawati dari enjin carian" + }, "options_send_not_track_title": { "message": "Minta tapak web untuk tidak menjejaki anda" }, + "options_send_not_track_desc": { + "message": "Hantar isyarat Kawalan Privasi Global<\/gpc> dan Jangan Kesan<\/dnt> kepada laman web yang anda lawati" + }, "options_stripped_tracking_parameters": { "message": "Parameter penjejakan disingkirkan" }, @@ -615,18 +964,39 @@ "options_remove_client_data_title": { "message": "Singkirkan pengepala X-Client-Data" }, + "options_remove_client_data_desc": { + "message": "Sekat Google Chrome daripada menghantar maklumat versi dan pengubahsuaiannya kepada lingkungan Google" + }, "options_disable_webrtc_title": { "message": "Sekat WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC boleh membocorkan alamat IP anda walaupun anda menggunakan proksi atau VPN. Melumpuhkan WebRTC boleh memecahkan beberapa laman web" + }, "options_strip_tracking_params_title": { "message": "Singkir parameter penjejakan" }, + "options_strip_tracking_params_description": { + "message": "Singkir parameter dari permintaan web dengan penapis Penjejakan URL AdGuard" + }, + "options_block_known_trackers_title": { + "message": "Sekat penjejak" + }, + "options_block_known_trackers_description": { + "message": "Sekat penjejak dan alat analisis web dengan penapis Perlindungan Penjejakan AdGuard" + }, "options_third_party_title": { "message": "Cookies pihak-ketiga musnah-sendiri" }, + "options_third_party_desc": { + "message": "Hadkan jangka hayat kuki pihak ketiga (minit)" + }, "options_first_party_title": { "message": "Musnah-sendiri cookies pihak-pertama (tidak disarankan)" }, + "options_first_party_desc": { + "message": "Hadkan jangka hayat kuki pihak pertama (minit)" + }, "popup_abuse_site": { "message": "Laporkan isu" }, @@ -654,6 +1024,12 @@ "popup_switch_button": { "message": "Suis perlindungan" }, + "popup_limits_exceeded_warning": { + "message": "Pelayar anda telah mengubah senarai penyaring terbina dalam aktif" + }, + "snack_on_websites_limits_exceeded_warning": { + "message": "Had peraturan telah melebihi dalam Penyambung Pelayar AdGuard. Sila semak penyaring anda dan nyahdayakan yang anda tidak perlukan" + }, "short_name": { "message": "AdGuard" }, @@ -675,27 +1051,162 @@ "options_copyright": { "message": "Semua hakcipta terpelihara." }, + "options_remove_filter_confirm_modal_title": { + "message": "Padam penapis ini?" + }, "options_remove_filter_confirm_modal_ok_button": { "message": "Buang" }, + "options_nav_better_than_extension": { + "message": "Kenapa AdGuard lebih bagus daripada aplikasi lain?" + }, + "options_nav_compare": { + "message": "Bandingkan" + }, "options_filters_search": { "message": "Carian" }, + "options_about_title": { + "message": "Penyambung Pelayar AdGuard" + }, + "group_description_adblocking": { + "message": "Konfigurasikan penyekatan iklan di sini untuk menangani sepanduk, pop-up, iklan video dan sebagainya yang menjengkelkan, sekali dan untuk selamanya" + }, + "group_description_stealth": { + "message": "Lindungi identiti dan maklumat peribadi sensitif anda dari ribuan penjejak atas talian dengan menyekat semua cara penjejakan yang diketahui" + }, + "group_description_social": { + "message": "Sembunyikan butang \"Like\"\/\"Share\" yang tidak diingini dan widget media sosial yang lain" + }, + "group_description_annoyances": { + "message": "Padamkan tetingkap timbul dan pemberitahuan menjengkelkan lain seperti pemberitahuan kuki" + }, + "group_description_security": { + "message": "Lindungi diri anda daripada malware, pancingan data dan ancaman dalam talian yang lain" + }, + "group_description_miscellaneous": { + "message": "Lebih banyak tetapan untuk menyesuaikan pengalaman melayari web anda dengan AdGuard dengan lebih jauh" + }, + "group_description_custom": { + "message": "Buat penyaring anda sendiri untuk menyesuaikan penyaring web mengikut pilihan anda." + }, + "group_description_lang": { + "message": "Jangan hadkan diri anda — sekat iklan di laman web dalam mana-mana bahasa" + }, + "fullscreen_user_rules_title": { + "message": "Peraturan pengguna" + }, + "options_user_rules_editor_stub_title": { + "message": "Editor dibuka dalam tetingkap lain" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "Peraturan anda akan muncul di sini selepas anda menutupnya" + }, + "options_user_rules_editor_stub_go_to_editor_button": { + "message": "Pergi ke editor" + }, + "options_editor_open_fullscreen_button_tooltip": { + "message": "Buka Editor dalam tetingkap baru" + }, + "options_editor_close_fullscreen_button_tooltip": { + "message": "Keluar dari mod tetingkap" + }, + "options_clear_stats_confirm_modal_title": { + "message": "Padam statistik?" + }, "options_clear_stats_confirm_modal_clear_button": { "message": "Padam" }, + "options_reset_settings_confirm_modal_title": { + "message": "Tetap semula tetapan?" + }, "options_reset_settings_confirm_modal_clear_button": { "message": "Tetapkan semula" }, + "options_confirm_modal_cancel_button": { + "message": "Batal" + }, + "filtering_log_details_modal_beautify_button": { + "message": "Perindah" + }, + "filtering_log_details_modal_back_button": { + "message": "Kembali ke permintaan" + }, "filtering_log_details_modal_try_again": { "message": "Cuba lagi" }, + "filtering_log_tag_tooltip_first_party": { + "message": "Permintaan pihak pertama" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "Permintaan pihak ketiga" + }, + "filtering_log_tag_tooltip_regular": { + "message": "Permintaan yang diproses tanpa penyaringan" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "Permintaan yang dibenarkan dan tidak disekat" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "Permintaan yang disekat" + }, + "filtering_log_tag_tooltip_modified": { + "message": "Permintaan yang diubahsuai" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "Permintaan yang terjejas oleh peraturan pengguna" + }, + "filtering_log_tag_tooltip_html": { + "message": "Dokumen dan subdokumen" + }, + "filtering_log_tag_tooltip_css": { + "message": "Lembaran gaya" + }, + "filtering_log_tag_tooltip_js": { + "message": "Skrip" + }, + "filtering_log_tag_tooltip_xhr": { + "message": "Permintaan XMLHttpRequests dan permintaan fetch" + }, + "filtering_log_tag_tooltip_img": { + "message": "Imej" + }, + "filtering_log_tag_tooltip_media": { + "message": "Media" + }, + "filtering_log_tag_tooltip_other": { + "message": "Fon, ping, WebRTC, WebSocket..." + }, + "filtering_log_badge_tooltip_third_party": { + "message": "Permintaan pihak ketiga" + }, + "filtering_log_badge_tooltip_http_req_method": { + "message": "Kaedah permintaan HTTP" + }, + "filtering_log_badge_tooltip_http_status_code": { + "message": "Kod status HTTP" + }, + "filtering_log_assumed_rule_description": { + "message": "Ini adalah peraturan yang diandaikan. Untuk maklumat lanjut, lihat Pangkalan Pengetahuan<\/a>" + }, "options_stealth_general_title": { "message": "Umum" }, + "options_stealth_cookies_title": { + "message": "Kuki" + }, "options_stealth_miscellaneous_title": { "message": "Lain-lain" }, + "options_coming_soon": { + "message": "Akan datang" + }, + "blocking_pages_malware": { + "message": "Laman web ini di %host%<\/strong> telah dilaporkan sebagai laman malware dan telah disekat berdasarkan pilihan keselamatan anda." + }, + "blocking_pages_phishing": { + "message": "Laman web ini di %host%<\/strong> telah dilaporkan sebagai laman pancingan data dan telah disekat berdasarkan pilihan keselamatan anda." + }, "blocking_pages_advanced_button": { "message": "Lanjutan" }, @@ -711,13 +1222,25 @@ "blocking_pages_rule_header_title": { "message": "Disekat oleh AdGuard" }, + "blocking_pages_rule_content_title": { + "message": "AdGuard telah menghalang halaman ini daripada dimuatkan disebabkan oleh peraturan penapis berikut" + }, "blocking_pages_btn_go_back": { "message": "Pulang" }, "blocking_pages_btn_proceed": { "message": "Teruskan sahaja" }, + "text_collapser_show_default": { + "message": "Tunjukkan teks penuh" + }, + "text_collapser_hide_default": { + "message": "Sembunyikan teks penuh" + }, "close_button_title": { "message": "Tutup" + }, + "filtering_modal_declarative_rule": { + "message": "Peraturan DNR:" } -} \ No newline at end of file +} diff --git a/Extension/_locales/th/messages.json b/Extension/_locales/th/messages.json index 917320edeb..958b57dc03 100644 --- a/Extension/_locales/th/messages.json +++ b/Extension/_locales/th/messages.json @@ -89,12 +89,30 @@ "options_popup_check_false_description": { "message": "เกิดข้อผิดพลาดขณะเพิ่มตัวกรองที่กำหนดเองของคุณ." }, + "options_add_custom_filter_modal_title": { + "message": "เพิ่มตัวกรองกำหนดเอง" + }, + "options_add_custom_filter_modal_checking_filter": { + "message": "กำลังตรวจสอบตัวกรองของคุณ..." + }, + "options_add_custom_filter_modal_error_title": { + "message": "ไม่สามารถเพิ่มตัวกรองได้" + }, + "options_add_custom_filter_modal_error_subtitle": { + "message": "กรุณาลองอีกครั้งหรือติดต่อฝ่ายสนับสนุน" + }, "options_add_custom_filter_modal_add_button": { "message": "เพิ่ม" }, + "options_add_custom_filter_modal_filter_name": { + "message": "ชื่อตัวกรอง:" + }, "options_add_custom_filter_modal_filter_trusted": { "message": "เชื่อถือได้" }, + "options_add_custom_filter_modal_filter_trusted_description": { + "message": "กฎกรองบางข้ออาจเปลี่ยนแปลงประสบการณ์การท่องเว็บของคุณอย่างมีนัยสำคัญและเสี่ยงต่อความเป็นส่วนตัวของคุณ โปรดใช้กฎกรองจากนักพัฒนาที่คุณไว้วางใจเท่านั้น" + }, "options_popup_try_again_button": { "message": "ลองอีกครั้ง" }, @@ -132,12 +150,21 @@ "options_allowlist": { "message": "รายการที่อนุญาต" }, + "options_allowlist_desc": { + "message": "AdGuard ไม่กรองเว็บไซต์จากรายการที่อนุญาต" + }, "options_allowlist_invert": { "message": "สลับรายการที่อนุญาต" }, + "options_allowlist_invert_desc": { + "message": "เปิดโฆษณาได้ทุกที่ยกเว้นสำหรับรายการที่อนุญาต" + }, "options_allowlist_alert_invert": { "message": "รายการที่อนุญาตถูกกลับด้าน โฆษณาจะถูกปิดกั้นเฉพาะในเว็บไซต์ที่เพิ่มเข้าไป ปิดการใช้งาน<\/a>" }, + "options_allowlist_leave_subtitle": { + "message": "การเปลี่ยนแปลงของคุณใน Allowlist จะหายไป" + }, "options_userfilter": { "message": "ตัวกรองผู้ใช้" }, @@ -216,6 +243,9 @@ "options_add_custom_filter": { "message": "เพิ่มตัวกรองเอง" }, + "options_filters_custom_disabled_cws": { + "message": "ตัวกรองกำหนดเองจะกลับมาในอีกไม่ช้า เรียนรู้เพิ่มเติมที่บล็อกของเรา" + }, "options_empty_custom_filter": { "message": "ขออภัย แต่คุณยังไม่ได้เลือกตัวกรองที่กำหนดเองเลย" }, @@ -231,6 +261,12 @@ "options_popup_import_error_required_privacy_permission": { "message": "หากต้องการนำเข้าไฟล์การตั้งค่านี้ ให้อนุญาตให้ AdGuard เปลี่ยนการตั้งค่าที่เกี่ยวข้องกับความเป็นส่วนตัวของคุณ" }, + "options_popup_import_success_title": { + "message": "นำเข้าการตั้งค่าแล้ว" + }, + "options_popup_import_error_title": { + "message": "ไม่สามารถนำเข้าการตั้งค่าได้" + }, "options_popup_import_error_file_description": { "message": "บางอย่างผิดปกติ." }, @@ -276,12 +312,27 @@ "popup_tab_blocked_count": { "message": "ปิดกั้นแล้ว: %num%" }, + "popup_tab_blocked_all_count": { + "message": "ปิดกั้นแล้วรวม: %num%" + }, "popup_statistics_total": { "message": "รวม" }, + "popup_statistics_all_categories": { + "message": "ทั้งหมด" + }, + "popup_statistics_category_advertising": { + "message": "การโฆษณา" + }, "popup_statistics_category_trackers": { "message": "ตัวติดตาม" }, + "popup_statistics_category_social_media": { + "message": "สื่อสังคม" + }, + "popup_statistics_category_cdn": { + "message": "CDN" + }, "popup_statistics_category_other": { "message": "อื่น ๆ" }, @@ -375,18 +426,27 @@ "options_popup_version_update_offer_button_text": { "message": "เรียนรู้เพิ่มเติม" }, + "popup_block_site_ads_option": { + "message": "Block ads manually" + }, "popup_security_report": { "message": "รายงานความปลอดภัยของเว็บไซต์" }, "popup_reset_page_user_rules": { "message": "ลบกฎการใช้งานของเว็บไซต์นี้" }, + "context_block_site_ads": { + "message": "Block ads manually" + }, "context_security_report": { "message": "รายงานความปลอดภัยของเว็บไซต์" }, "context_complaint_website": { "message": "รายงานปัญหา" }, + "context_site_filtering_disabled": { + "message": "AdGuard ไม่สามารถกรองหน้านี้ได้" + }, "context_disable_protection": { "message": "หยุดการปกป้องจาก AdGuard ชั่วคราว" }, @@ -399,6 +459,9 @@ "context_open_settings": { "message": "การตั้งค่า AdGuard" }, + "context_open_log": { + "message": "บันทึกการกรอง" + }, "context_site_exception": { "message": "เว็บไซต์นี้อยู่ในข้อยกเว้น" }, @@ -423,6 +486,9 @@ "filters_download_loading": { "message": "โปรดรอขณะที่กำลังโหลดฐานข้อมูลตัวกรอง..." }, + "post_install_loading": { + "message": "กำลังโหลดส่วนขยาย..." + }, "filtering_modal_element": { "message": "องค์ประกอบ:" }, @@ -441,6 +507,12 @@ "filtering_log_search_tabs_placeholder": { "message": "ค้นหาในแท็บ" }, + "filtering_log_preserve_log_off": { + "message": "อย่าบันทึกบันทึก" + }, + "filtering_log_preserve_log_on": { + "message": "บันทึกบันทึก" + }, "filtering_refresh_tab_short": { "message": "รีเฟรช" }, @@ -468,6 +540,9 @@ "filtering_table_filter": { "message": "ตัวกรอง" }, + "filtering_table_empty_reload_page_desc": { + "message": "ไม่พบอะไร ปิดใช้งานตัวกรอง<\/reset> หรือ โหลดหน้าใหม่<\/refresh> เพื่อดูรายการที่บันทึกไว้" + }, "filtering_modal_info_title": { "message": "ขอรายละเอียด" }, @@ -516,6 +591,9 @@ "filtering_modal_status_text_desc": { "message": "สถานะ:" }, + "filtering_modal_status_text_error": { + "message": "ไม่สามารถโหลดตัวอย่างได้ โปรดลองอีกครั้ง" + }, "filtering_modal_status_text_loading": { "message": "กำลังโหลด..." }, @@ -612,12 +690,18 @@ "options_block_acceptable_ads": { "message": "ปิดกั้นโฆษณาบนการค้นหาและการโปรโมตตนเองของเว็บไซต์" }, + "options_block_acceptable_ads_desc": { + "message": "ลบโฆษณาที่ส่งเสริมตนเองจากเว็บไซต์และโฆษณาเชิงบริบทจากผลการค้นหา เรียนรู้เพิ่มเติม<\/a>" + }, "options_show_blocked_ads_count_title": { "message": "ระบุจำนวนโฆษณาที่ถูกปิดกั้นบนไอคอนส่วนขยาย AdGuard" }, "options_enable_autodetect_filter": { "message": "เปิดใช้งานตัวกรองที่เหมาะสมที่สุดโดยอัตโนมัติ" }, + "options_enable_autodetect_filter_desc": { + "message": "ตัวกรองเฉพาะภาษาจะถูกเปิดใช้งานขึ้นอยู่กับภาษาของเว็บไซต์" + }, "options_select_theme": { "message": "ธีม" }, @@ -657,18 +741,42 @@ "options_set_update_interval": { "message": "กรองช่วงเวลาการอัปเดต" }, + "options_set_update_interval_desc": { + "message": "เพื่อให้ตัวกรองทำงานได้อย่างมีประสิทธิภาพ โปรดอัพเดตตัวกรองอย่างสม่ำเสมอ" + }, "options_userfilter_export": { "message": "ส่งออก" }, "options_editor_save": { "message": "บันทึก" }, + "options_editor_leave_title": { + "message": "ออกโดยไม่บันทึกค่า?" + }, + "options_editor_leave_confirm": { + "message": "ใช่ ออก" + }, + "options_editor_leave_cancel": { + "message": "Back to editing" + }, "options_userfilter_import": { "message": "นำเข้า" }, "options_userfilter_description_key": { "message": "คุณสามารถเพิ่มกฎของคุณเองได้ที่นี่ ตัวเลือกนี้แนะนำสำหรับผู้ใช้ขั้นสูงที่คุ้นเคยกับ HTML\/CSS อ่าน บทแนะนำกฎการกรอง<\/a> เพื่อเรียนรู้วิธีเขียนกฎตัวกรองของคุณเอง" }, + "options_userfilter_subtitle_key": { + "message": "ปรับแต่งการบล็อกโฆษนาโดยใช้กฎกรองของคุณเอง" + }, + "options_userfilter_line_break_off": { + "message": "Line break: Disabled" + }, + "options_userfilter_line_break_on": { + "message": "การแบ่งบรรทัด: เปิดใช้งาน" + }, + "options_userfilter_leave_subtitle": { + "message": "การเปลี่ยนแปลงของคุณในกฎจะหายไป" + }, "options_open_changelog": { "message": "การเปลี่ยนแปลง" }, @@ -693,18 +801,43 @@ "options_miscellaneous_settings": { "message": "การตั้งค่าเพิ่มเติม" }, + "options_rule_syntax": { + "message": "ไวยากรณ์กฎ" + }, "options_rule_limits": { "message": "ข้อจำกัดกฎ" }, + "options_rule_limits_description": { + "message": "Chrome จำกัดจำนวนกฎที่สามารถใช้ได้" + }, "options_rule_limits_dynamic": { "message": "กฎไดนามิก" }, + "options_rule_limits_dynamic_user_rules": { + "message": "กฎที่เพิ่มโดยผู้ใช้ เช่น กฎของผู้ใช้<\/user_rules>, เว็บไซต์ที่อนุญาต<\/allowlist>, ฟิลเตอร์กำหนดเอง<\/custom_filters>, และ ฟิลเตอร์แก้ไขด่วน<\/quick_fixes>" + }, + "options_rule_limits_dynamic_unsafe": { + "description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed", + "message": "กฎแบบไดนามิกที่ไม่ปลอดภัย (ใช้สำหรับการปรับเปลี่ยนขั้นสูงบางอย่าง เช่น $$redirect หรือ $$cookie) — รวมอยู่ในกฎที่ผู้ใช้เพิ่ม" + }, + "options_rule_limits_dynamic_regex": { + "message": "กฎ Regex — รวมอยู่ในกฎที่ผู้ใช้เพิ่ม" + }, "options_rule_limits_static_rulesets": { "message": "กฎเกณฑ์คงที่" }, + "options_rule_limits_static_rulesets_builtin": { + "message": "ตัวกรองในตัว<\/a>, เช่น การบล็อกความรำคาญหรือ ตัวกรองเฉพาะภาษา" + }, "options_rule_limits_static_rules": { "message": "กฎคงที่" }, + "options_rule_limits_static_rules_all": { + "message": "กฎเกณฑ์จาก ตัวกรองในตัว<\/a>" + }, + "options_rule_limits_static_rules_regex": { + "message": "กฎ Regex — รวมอยู่ในข้างต้น" + }, "options_rule_limits_numbers": { "message": "%current% ของ %maximum%" }, @@ -753,6 +886,9 @@ "options_limits_warning_dynamic_rules": { "message": "คุณถึงขีดจำกัดของกฎที่ผู้ใช้เพิ่มแล้ว กฎ %maximum% จาก %current% ได้รับการเปิดใช้งาน" }, + "options_limits_warning_dynamic_unsafe_rules": { + "message": "คุณถึงขีดจำกัดของกฎที่ผู้ใช้เพิ่มแล้ว กฎที่ไม่ปลอดภัย %maximum% จาก %current% ได้รับการเปิดใช้งาน।" + }, "options_limits_warning_dynamic_regex_rules": { "message": "คุณถึงขีดจำกัดของกฎ regex ที่ผู้ใช้เพิ่มแล้ว กฎ regex %maximum% จาก %current% ได้รับการเปิดใช้งาน" }, @@ -783,6 +919,9 @@ "options_collect_hit_stats_title": { "message": "ช่วยเหลือในการพัฒนาตัวกรอง AdGuard" }, + "options_collect_hit_stats_desc": { + "message": "ส่ง สถิติการใช้ตัวกรองโฆษณาแบบไม่ระบุตัวตน<\/a> เพื่อช่วย AdGuard ปรับปรุงฟิลเตอร์ของตน" + }, "options_show_context_menu_title": { "message": "เพิ่มรายการ AdGuard ในเมนูบริบทของเบราว์เซอร์" }, @@ -795,15 +934,27 @@ "options_privacy_title": { "message": "การป้องกันการติดตาม" }, + "options_privacy_desc": { + "message": "ปกป้องตัวตนและข้อมูลส่วนบุคคลที่ละเอียดอ่อนจากผู้ติดตามออนไลน์นับพันโดยการปิดกั้นวิธีการติดตามที่ยอดนิยมที่สุด" + }, "options_hide_referrer_title": { "message": " ซ่อนผู้อ้างอิงจากบุคคลที่สาม" }, + "options_hide_referrer_desc": { + "message": "ป้องกันไม่ให้บุคคลที่สามรู้ว่าคุณกำลังเยี่ยมชมเว็บไซต์ใด" + }, "options_hide_search_queries_title": { "message": "ซ่อนคำค้นหาของคุณ" }, + "options_hide_search_queries_desc": { + "message": "ซ่อนการค้นหาสำหรับเว็บไซต์ที่เข้าถึงจากเครื่องมือค้นหา" + }, "options_send_not_track_title": { "message": "ส่งส่วนหัว อย่า-ติด-ตาม" }, + "options_send_not_track_desc": { + "message": "ส่งสัญญาณ Global Privacy Control<\/gpc> และ Do Not Track<\/dnt> ไปยังเว็บไซต์ที่คุณเยี่ยมชม" + }, "options_stripped_tracking_parameters": { "message": "ลบพารามิเตอร์การติดตามออกแล้ว" }, @@ -816,21 +967,39 @@ "options_remove_client_data_title": { "message": "เอา X-Client-Data header ออก" }, + "options_remove_client_data_desc": { + "message": "บล็อก Google Chrome ไม่ให้ส่งข้อมูลรุ่นและการแก้ไขไปยังโดเมน Google" + }, "options_disable_webrtc_title": { "message": "ปิดกั้น WebRTC" }, + "options_disable_webrtc_desc": { + "message": "WebRTC อาจรั่วไหลที่อยู่ IP ของคุณแม้ว่าคุณจะใช้พร็อกซีหรือ VPN การปิดใช้งาน WebRTC อาจทำให้เว็บไซต์บางแห่งเสียหาย" + }, "options_strip_tracking_params_title": { "message": "เอาพารามิเตอร์การติดตามออก" }, + "options_strip_tracking_params_description": { + "message": "ลบพารามิเตอร์จากคำขอเว็บด้วยตัวกรองการติดตาม URL ของ AdGuard" + }, "options_block_known_trackers_title": { "message": "ปิดกั้นตัวติดตามที่รู้จัก" }, + "options_block_known_trackers_description": { + "message": "บล็อกตัวติดตามและเครื่องมือวิเคราะห์เว็บด้วยตัวกรองการป้องกันการติดตามของ AdGuard" + }, "options_third_party_title": { "message": "ทำลายคุกกี้บุคคลที่สามด้วยตนเอง" }, + "options_third_party_desc": { + "message": "จำกัดอายุการใช้งานของคุกกี้ของบุคคลที่สาม (นาที)" + }, "options_first_party_title": { "message": "คุกกี้บุคคลที่ทำลายตนเองครั้งแรก (ไม่แนะนำ)" }, + "options_first_party_desc": { + "message": "จำกัดอายุการใช้งานของคุกกี้บุคคลที่หนึ่ง (นาที)" + }, "popup_abuse_site": { "message": "แจ้งปัญหา" }, @@ -861,6 +1030,9 @@ "popup_limits_exceeded_warning": { "message": "เบราว์เซอร์ของคุณได้แก้ไขรายการตัวกรองที่ใช้งานอยู่ภายใน" }, + "snack_on_websites_limits_exceeded_warning": { + "message": "เกินกฎในส่วนขยายของเบราว์เซอร์ AdGuard โปรดตรวจสอบตัวกรองของคุณและปิดใช้งานตัวกรองที่คุณไม่ต้องการ" + }, "short_name": { "message": "AdGuard" }, @@ -900,12 +1072,39 @@ "options_about_title": { "message": "ส่วนขยายเบราว์เซอร์ AdGuard" }, + "group_description_adblocking": { + "message": "กำหนดค่าการบล็อกโฆษณาที่นี่เพื่อจัดการกับแบนเนอร์ ป๊อปอัป โฆษณาวิดีโอ และอื่น ๆ อย่างเด็ดขาด" + }, + "group_description_stealth": { + "message": "ปกป้องตัวตนและข้อมูลส่วนบุคคลที่ละเอียดอ่อนของคุณจากผู้ติดตามออนไลน์หลายพันคนโดยการบล็อกวิธีการติดตามที่รู้จักทั้งหมด" + }, + "group_description_social": { + "message": "ซ่อนปุ่ม \"ถูกใจ\"\/\"แชร์\" ที่ไม่ต้องการและวิดเจ็ตของโซเชียลมีเดียอื่นๆ" + }, + "group_description_annoyances": { + "message": "ลบหน้าต่างป๊อปอัปและการแจ้งเตือนที่น่ารำคาญอื่น ๆ เช่น การแจ้งเตือนเกี่ยวกับคุกกี้" + }, + "group_description_security": { + "message": "Protect yourself from malware, phishing and other online threats" + }, + "group_description_miscellaneous": { + "message": "การตั้งค่าเพิ่มเติมเพื่อกำหนดค่าการท่องเว็บของคุณด้วย AdGuard ให้ดียิ่งขึ้น" + }, "group_description_custom": { "message": "สร้างตัวกรองของคุณเองเพื่อปรับแต่งการกรองเว็บตามที่คุณต้องการ." }, + "group_description_lang": { + "message": "Don't limit yourself — block ads on websites in any languages" + }, "fullscreen_user_rules_title": { "message": "ตัวกรองผู้ใช้" }, + "options_user_rules_editor_stub_title": { + "message": "โปรแกรมแก้ไขเปิดอยู่ในหน้าต่างอื่น" + }, + "options_user_rules_editor_stub_subtitle": { + "message": "กฎของคุณจะแสดงที่นี่หลังจากที่คุณปิดมัน" + }, "options_user_rules_editor_stub_go_to_editor_button": { "message": "ไปที่เอดิเตอร์" }, @@ -939,6 +1138,27 @@ "filtering_log_details_modal_try_again": { "message": "ลองอีกครั้ง" }, + "filtering_log_tag_tooltip_first_party": { + "message": "คำขอของบุคคลที่หนึ่ง" + }, + "filtering_log_tag_tooltip_third_party": { + "message": "คำขอของบุคคลที่สาม" + }, + "filtering_log_tag_tooltip_regular": { + "message": "คำขอที่ประมวลผลโดยไม่มีการกรอง" + }, + "filtering_log_tag_tooltip_allowed": { + "message": "คำขอที่อนุญาตและยกเลิกการปิดกั้น" + }, + "filtering_log_tag_tooltip_blocked": { + "message": "คำขอที่ถูกบล็อค" + }, + "filtering_log_tag_tooltip_modified": { + "message": "คำขอที่ถูกปรับเปลี่ยน" + }, + "filtering_log_tag_tooltip_user_rules": { + "message": "คำขอที่ถูกส่งผลกระทบโดยกฎของผู้ใช้" + }, "filtering_log_tag_tooltip_html": { "message": "เอกสารและเอกสารย่อย" }, @@ -957,6 +1177,9 @@ "filtering_log_tag_tooltip_media": { "message": "สื่อ" }, + "filtering_log_tag_tooltip_other": { + "message": "Fonts, pings, WebRTC, WebSocket..." + }, "filtering_log_badge_tooltip_third_party": { "message": "คำขอของบุคคลที่สาม" }, @@ -966,6 +1189,9 @@ "filtering_log_badge_tooltip_http_status_code": { "message": "โค้ดสถานะ HTTP" }, + "filtering_log_assumed_rule_description": { + "message": "นี่คือกฎที่ใช้กันทั่วไป สำหรับรายละเอียดดูที่ฐานข้อมูลความรู้<\/a>ของเรา" + }, "options_stealth_general_title": { "message": "ทั่วไป" }, @@ -975,6 +1201,9 @@ "options_stealth_miscellaneous_title": { "message": "เบ็ดเตล็ด" }, + "options_coming_soon": { + "message": "กำลังจะมา" + }, "blocking_pages_malware": { "message": "หน้าเว็บนี้ที่ %host%<\/strong> ได้รับการรายงานว่าเป็นหน้ามัลแวร์และถูกปิดกั้นตามการตั้งค่าความปลอดภัยของคุณ" }, @@ -1013,5 +1242,8 @@ }, "close_button_title": { "message": "ปิด" + }, + "filtering_modal_declarative_rule": { + "message": "กฎ DNR:" } -} \ No newline at end of file +} diff --git a/Extension/_locales/zh_TW/messages.json b/Extension/_locales/zh_TW/messages.json index cb9004e783..89ac5cce9d 100644 --- a/Extension/_locales/zh_TW/messages.json +++ b/Extension/_locales/zh_TW/messages.json @@ -658,7 +658,7 @@ "message": "常規的" }, "filtering_log_filter_allowed": { - "message": "已允許的" + "message": "被允許的" }, "filtering_log_filter_blocked": { "message": "已封鎖的" @@ -673,7 +673,7 @@ "message": "已處理的" }, "filtering_log_status_allowed": { - "message": "已允許的" + "message": "被允許的" }, "filtering_log_status_blocked": { "message": "已封鎖的" @@ -1148,7 +1148,7 @@ "message": "未經過濾處理的請求" }, "filtering_log_tag_tooltip_allowed": { - "message": "已允許和未封鎖的請求" + "message": "被允許和未被封鎖的請求" }, "filtering_log_tag_tooltip_blocked": { "message": "封鎖的請求" From 09dbb75c2eb0d3e77acfd3f5d5308624742e07c7 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 17 Feb 2025 18:18:48 +0300 Subject: [PATCH 05/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40913d2f5a..9e241a9f2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.39", + "version": "5.1.40", "description": "AdGuard Extension", "type": "module", "scripts": { From 344e0b9ecc52f4325b12362e9e5e1f328166eb13 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Mon, 17 Feb 2025 18:39:48 +0300 Subject: [PATCH 06/29] AG-33907 fix scripts and scriptlets execution delay in mv2. #2855 Squashed commit of the following: commit e622cb4feb7fa8474758d2beb0e2119de3ee9ec1 Merge: 4f3acf89a 09dbb75c2 Author: Slava Leleka Date: Mon Feb 17 10:21:00 2025 -0500 Merge branch 'master' into fix/AG-33907-01 commit 4f3acf89a22920fcc8d6688f4323cc83df30b582 Merge: ad1298f75 8cd0bd166 Author: Slava Leleka Date: Mon Feb 17 09:50:49 2025 -0500 merge the parent branch into the current branch, resolve conflicts commit ad1298f750cb60b17c78beb2718ae11fde5424ea Author: Slava Leleka Date: Mon Feb 17 09:49:21 2025 -0500 update deps commit 51fc018060c5734db99aed682076dff6f633d661 Merge: ecfddd085 4360099a8 Author: Slava Leleka Date: Sun Feb 16 23:23:34 2025 -0500 merge parent branch into the branch commit ecfddd085cc8a5502f0ef6219f6b342c30263742 Merge: 3002f5432 0111263b5 Author: Slava Leleka Date: Tue Feb 11 23:41:36 2025 -0500 merge the parent branch into the current branch, resolve conflicts commit 3002f5432d8817c441374170a2e0c6dbdf54e359 Merge: ad71c46bb 90288d2d7 Author: Slava Leleka Date: Mon Feb 10 22:33:52 2025 -0500 Merge branch 'master' into fix/AG-33907-01 commit ad71c46bb9a9326e73ca17b73f308261c40dcddc Author: Slava Leleka Date: Mon Feb 10 20:45:57 2025 -0500 fix scripts and scriptlets injection delay in mv2 --- CHANGELOG.md | 2 ++ package.json | 6 +++--- pnpm-lock.yaml | 50 +++++++++++++++++++++++++------------------------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec08ce5a78..e05881b538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `$popup,third-party` modifiers cause document blocking [#3012]. - Don't show lines for absent metadata when adding a custom filter [#3057]. - Filtering log does not observe tab changes, openings, or closings. +- Scriptlets and scripts are executed too late on website reload or navigation in MV2 [#2855]. ### Removed @@ -51,6 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [Unreleased]: https://github.com/AdguardTeam/AdguardBrowserExtension/compare/v5.0.188...HEAD +[#2855]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2855 [#2908]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2908 [#2950]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2950 [#3002]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3002 diff --git a/package.json b/package.json index 9e241a9f2d..45b7f65f39 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ }, "pnpm": { "overrides": { - "@adguard/tswebextension>@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz" + "@adguard/tswebextension>@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz" } }, "dependencies": { @@ -121,8 +121,8 @@ "@adguard/logger": "^1.1.1", "@adguard/scriptlets": "^2.1.4", "@adguard/translate": "^1.0.2", - "@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz", - "@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tswebextension/tswebextension.tgz", + "@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz", + "@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz", "@xstate/react": "^4.1.3", "ace-builds": "^1.17.0", "assert": "^2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d52e27f12..5077a029f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@adguard/tswebextension>@adguard/tsurlfilter': https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz + '@adguard/tswebextension>@adguard/tsurlfilter': https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz dependencies: '@adguard/agtree': @@ -24,11 +24,11 @@ dependencies: specifier: ^1.0.2 version: 1.0.2 '@adguard/tsurlfilter': - specifier: https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz - version: '@github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' + specifier: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz + version: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' '@adguard/tswebextension': - specifier: https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tswebextension/tswebextension.tgz - version: '@github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)' + specifier: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz + version: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)' '@xstate/react': specifier: ^4.1.3 version: 4.1.3(@types/react@17.0.83)(react@17.0.2)(xstate@5.19.0) @@ -8798,22 +8798,9 @@ packages: version: 0.8.0 dev: false - '@github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz} - name: '@adguard/dnr-rulesets' - version: 2.0.0 - hasBin: true - dependencies: - '@adguard/logger': 1.1.1 - commander: 12.1.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - zod: 3.23.8 - dev: true - - '@github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz} - id: '@github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz' + '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz} + id: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz' name: '@adguard/tsurlfilter' version: 3.2.0-alpha.0 engines: {node: '>=20'} @@ -8837,9 +8824,9 @@ packages: zod-validation-error: 3.4.0(zod@3.21.4) dev: false - '@github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tswebextension/tswebextension.tgz} - id: '@github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tswebextension/tswebextension.tgz' + '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz} + id: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz' name: '@adguard/tswebextension' version: 3.0.0-alpha.1 engines: {node: '>=20'} @@ -8850,7 +8837,7 @@ packages: '@adguard/extended-css': 2.1.1 '@adguard/logger': 1.1.1 '@adguard/scriptlets': 2.1.4 - '@adguard/tsurlfilter': '@github.com/AdguardTeam/tsurlfilter/raw/77d0db1b4a7d5e34c4c29186e5312fdfc6e18d8c/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' + '@adguard/tsurlfilter': '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' bowser: 2.11.0 chrome-types: 0.1.325 commander: 11.0.0 @@ -8869,6 +8856,19 @@ packages: - '@adguard/re2-wasm' dev: false + '@github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz} + name: '@adguard/dnr-rulesets' + version: 2.0.0 + hasBin: true + dependencies: + '@adguard/logger': 1.1.1 + commander: 12.1.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + zod: 3.23.8 + dev: true + github.com/105th/jsdiff/2be2e7df90e8eebd99f0385c7b1dc16c2f4dcc1a: resolution: {tarball: https://codeload.github.com/105th/jsdiff/tar.gz/2be2e7df90e8eebd99f0385c7b1dc16c2f4dcc1a} name: diff From e8fce47b33c996a813e8f1dba1706b267ad9fbec Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 17 Feb 2025 18:40:41 +0300 Subject: [PATCH 07/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 45b7f65f39..f47393097d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.40", + "version": "5.1.41", "description": "AdGuard Extension", "type": "module", "scripts": { From 0d5f4e841e1bab92524f7210dfeb8b74ccd2b2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20T=C3=B3ta?= Date: Mon, 17 Feb 2025 18:57:48 +0300 Subject: [PATCH 08/29] AG-39861 Move storages back to Browser Extension MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Squashed commit of the following: commit 527fb8c8219114148b385cd238e2396988c8172c Merge: 671a9bf9e e8fce47b3 Author: scripthunter7 Date: Mon Feb 17 16:46:46 2025 +0100 Merge branch 'master' into fix/AG-39861 commit 671a9bf9e40cb60fe3af8a6ef46f5aa45021921b Author: scripthunter7 Date: Mon Feb 17 16:26:33 2025 +0100 Revert "Dummy commit for builds" This reverts commit 64ae95ff4dbb19f17c631cad65362ef1c489465e. commit 64ae95ff4dbb19f17c631cad65362ef1c489465e Author: scripthunter7 Date: Mon Feb 17 16:26:24 2025 +0100 Dummy commit for builds commit cf37168f2cbd16ebe6595064841f8e9ecfe1dc6e Author: scripthunter7 Date: Mon Feb 17 12:12:18 2025 +0100 update packages commit 22d9306b9babc0f83d62e06f13f167bb8d426c94 Merge: fa8a473d8 4360099a8 Author: scripthunter7 Date: Mon Feb 17 12:11:38 2025 +0100 Merge branch 'master' into fix/AG-39861 commit fa8a473d8c28e5489c4bb6252bd78c2c56203c1b Author: Dávid Tóta Date: Fri Feb 14 17:45:18 2025 +0300 AG-39861 Add initializer promise to IDBStorage Squashed commit of the following: commit 6a3fbbb659defef0401ac013f2b11a00a694aa2f Author: scripthunter7 Date: Thu Feb 13 13:28:49 2025 +0100 initializer promise for idb storage commit c4490bcf60f47c04e10ef520a64f4558496367ae Merge: 05e1849d4 54f43b45e Author: scripthunter7 Date: Thu Feb 13 12:37:46 2025 +0100 Merge branch 'master' into fix/AG-39861 commit 05e1849d49737e9bcf2023a9c088c322ade8f8c8 Author: scripthunter7 Date: Thu Feb 13 10:29:29 2025 +0100 add missing import commit 2daef6555e61e48a8ff516a2b780052914144883 Author: scripthunter7 Date: Thu Feb 13 10:29:15 2025 +0100 update packages commit dc7f2b0bac52f221e175400fdea7a7f7b35d79ee Author: scripthunter7 Date: Thu Feb 13 10:10:02 2025 +0100 test runner utility commit 790753245e2efeffa510b33cbaf70e29525d3ee6 Author: scripthunter7 Date: Wed Feb 12 22:37:17 2025 +0100 remove type commit ac0259918fffe47470b2ba6b2f75716df7b95346 Author: scripthunter7 Date: Wed Feb 12 22:33:12 2025 +0100 improve test script commit 2d02a020b9a2355e8ad4ea40e713ac709c5b3ed0 Author: scripthunter7 Date: Wed Feb 12 20:25:54 2025 +0100 move storages back to extension --- Extension/src/background/api/update/main.ts | 3 +- .../background/storages/browser-storage.ts | 143 +++++++ .../src/background/storages/hybrid-storage.ts | 382 ++++++++++++++++++ .../src/background/storages/idb-storage.ts | 262 ++++++++++++ .../background/storages/shared-instances.ts | 8 +- .../background/storages/storage-interface.ts | 53 +++ package.json | 20 +- pnpm-lock.yaml | 161 ++++++-- tests/helpers/mocks/storage.ts | 52 ++- tests/src/background/api/update.test.ts | 5 +- .../storages/browser-storage.test.ts | 111 +++++ .../storages/filters-adapter.test.ts | 9 +- .../storages/hybrid-storage.test.ts | 275 +++++++++++++ .../background/storages/idb-storage.test.ts | 89 ++++ tools/run-tests.ts | 61 +++ 15 files changed, 1571 insertions(+), 63 deletions(-) create mode 100644 Extension/src/background/storages/browser-storage.ts create mode 100644 Extension/src/background/storages/hybrid-storage.ts create mode 100644 Extension/src/background/storages/idb-storage.ts create mode 100644 Extension/src/background/storages/storage-interface.ts create mode 100644 tests/src/background/storages/browser-storage.test.ts create mode 100644 tests/src/background/storages/hybrid-storage.test.ts create mode 100644 tests/src/background/storages/idb-storage.test.ts create mode 100644 tools/run-tests.ts diff --git a/Extension/src/background/api/update/main.ts b/Extension/src/background/api/update/main.ts index 2305eb4238..e6ee325f26 100644 --- a/Extension/src/background/api/update/main.ts +++ b/Extension/src/background/api/update/main.ts @@ -21,8 +21,6 @@ import isUndefined from 'lodash-es/isUndefined'; import isObject from 'lodash-es/isObject'; import { trimEnd } from 'lodash-es'; -import { HybridStorage } from '@adguard/tswebextension/core-storages'; - import { logger } from '../../../common/logger'; import { getErrorMessage } from '../../../common/error'; import { @@ -56,6 +54,7 @@ import { IDBUtils } from '../../utils/indexed-db'; import { defaultSettings } from '../../../common/settings'; import { InstallApi } from '../install'; import { PopupStatsCategories } from '../page-stats'; +import { HybridStorage } from '../../storages/hybrid-storage'; import { FiltersStorage as FiltersStorageV1, diff --git a/Extension/src/background/storages/browser-storage.ts b/Extension/src/background/storages/browser-storage.ts new file mode 100644 index 0000000000..98a8dfb219 --- /dev/null +++ b/Extension/src/background/storages/browser-storage.ts @@ -0,0 +1,143 @@ +/** + * @file + * This file is part of AdGuard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension). + * + * AdGuard Browser Extension is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AdGuard Browser Extension 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 AdGuard Browser Extension. If not, see . + */ +import type { Storage } from 'webextension-polyfill'; + +import { type ExtendedStorageInterface } from './storage-interface'; + +/** + * Wrapper for StorageArea with dev-friendly interface. + * + * @template Data The type of the value stored in the storage. + */ +export class BrowserStorage implements ExtendedStorageInterface { + private storage: Storage.StorageArea; + + /** + * Constructs an instance of the BrowserStorage class. + * + * @param storage The storage area to use. + */ + constructor(storage: Storage.StorageArea) { + this.storage = storage; + } + + /** + * Sets data to storage. + * + * @param key Storage key. + * @param value Storage value. + */ + public async set(key: string, value: Data): Promise { + await this.storage.set({ [key]: value }); + } + + /** + * Returns data from storage. + * + * @param key Storage key. + * + * @returns Storage value. + */ + public async get(key: string): Promise { + return this.storage.get(key).then((data) => data[key] as Data); + } + + /** + * Removes data from storage. + * + * @param key Storage key. + */ + public async remove(key: string): Promise { + await this.storage.remove(key); + } + + /** + * Sets multiple key-value pairs in the storage. + * + * @param data The key-value pairs to set. + * + * @returns True if all operations were successful, false otherwise. + * + * @example + * ```ts + * const storage = new Storage(); + * await storage.setMultiple({ + * key1: 'value1', + * key2: 'value2', + * }); + * ``` + */ + // TODO: Implement some kind of transaction to ensure atomicity, if possible + // Note: We only use this method for Firefox if "Never Remember History" is enabled + public async setMultiple(data: Record): Promise { + try { + await this.storage.set(data); + return true; + } catch (e) { + return false; + } + } + + /** + * Removes multiple key-value pairs from the storage. + * + * @param keys The keys to remove. + * + * @returns True if all operations were successful, false otherwise. + */ + public async removeMultiple(keys: string[]): Promise { + await this.storage.remove(keys); + return true; + } + + /** + * Get the entire contents of the storage. + * + * @returns Promise that resolves with the entire contents of the storage. + */ + public async entries(): Promise> { + return this.storage.get(null) as Promise>; + } + + /** + * Get all keys from the storage. + * + * @returns Promise that resolves with all keys from the storage. + */ + public async keys(): Promise { + return Object.keys(await this.entries()); + } + + /** + * Checks if the storage has a key. + * + * @param key The key to check. + * + * @returns True if the key exists, false otherwise. + */ + public async has(key: string): Promise { + return this.storage.get(key).then((data) => key in data); + } + + /** + * Clears the storage. + */ + public async clear(): Promise { + await this.storage.clear(); + } +} diff --git a/Extension/src/background/storages/hybrid-storage.ts b/Extension/src/background/storages/hybrid-storage.ts new file mode 100644 index 0000000000..98714d78e7 --- /dev/null +++ b/Extension/src/background/storages/hybrid-storage.ts @@ -0,0 +1,382 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** + * @file + * This file is part of AdGuard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension). + * + * AdGuard Browser Extension is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AdGuard Browser Extension 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 AdGuard Browser Extension. If not, see . + */ +/** + * This file implements a hybrid storage solution that abstracts over different storage mechanisms, + * providing a unified API for storage operations. It automatically chooses between IndexedDB storage and + * a fallback storage mechanism based on the environment's capabilities. + */ +import type { Storage } from 'webextension-polyfill'; +import { nanoid } from 'nanoid'; +import { SuperJSON, type SuperJSONResult } from 'superjson'; +import { deleteDB, openDB } from 'idb'; + +import { type ExtendedStorageInterface } from './storage-interface'; +import { BrowserStorage } from './browser-storage'; +import { IDBStorage } from './idb-storage'; + +// TODO: SuperJSONValue is not exported from superjson, so we have to redefine it here. +// https://github.com/flightcontrolhq/superjson/issues/309 +type SuperJSONValue = any; + +/** + * Implements a hybrid storage mechanism that can switch between IndexedDB and a fallback storage + * based on browser capabilities and environment constraints. This class adheres to the StorageInterface, + * allowing for asynchronous get and set operations. + * + * @template Data The type of the value stored in the storage. + */ +export class HybridStorage implements ExtendedStorageInterface { + /** + * A flag indicating whether IndexedDB support has already been checked. + */ + private static isIDBCapabilityChecked = false; + + /** + * A promise that resolves to whether IndexedDB is supported in the environment. + * This promise is used to cache the result of the support check to prevent multiple checks. + */ + private static idbCapabilityCheckerPromise: Promise | null = null; + + /** + * A flag that stores the result of the IndexedDB support check. + * If true, IndexedDB is supported in the environment. + */ + private static idbSupported = false; + + /** + * Prefix for the test IndexedDB database name. + * This test database is used to check if IndexedDB is supported in the current environment. + */ + private static readonly TEST_IDB_NAME_PREFIX = 'test_'; + + /** + * Version number for the test IndexedDB database. + */ + private static readonly TEST_IDB_VERSION = 1; + + /** + * The key used to store metadata in SuperJSON-serialized data. + */ + private static readonly SUPERJSON_META_KEY = 'meta'; + + /** + * Holds the instance of the selected storage mechanism. + * + * @note We use SuperJSON to serialize and deserialize the data when using the fallback storage mechanism, + * because it only supports storing JSON-serializable data. + */ + private storage: IDBStorage | BrowserStorage | null = null; + + /** + * The storage area to use when IndexedDB is not supported. + */ + private fallbackStorage: Storage.StorageArea; + + /** + * Constructs an instance of the HybridStorage class. + * + * @param fallbackStorage The storage area to use when IndexedDB is not supported. + */ + constructor(fallbackStorage: Storage.StorageArea) { + this.fallbackStorage = fallbackStorage; + } + + /** + * Checks if the given storage is an instance of IDBStorage. + * + * @param storage The storage instance to check. + * + * @returns True if the storage is an instance of IDBStorage, false otherwise. + */ + private static isIdbStorage( + storage: IDBStorage | BrowserStorage, + ): storage is IDBStorage { + return storage instanceof IDBStorage; + } + + /** + * Determines the appropriate storage mechanism to use. If IndexedDB is supported, it uses IDBStorage; + * otherwise, it falls back to a generic Storage mechanism. This selection is made once and cached + * for subsequent operations. + * + * @returns The storage instance to be used for data operations. + */ + private async getStorage(): Promise | BrowserStorage> { + if (this.storage) { + return this.storage; + } + + if (await HybridStorage.isIDBSupported()) { + this.storage = new IDBStorage(); + } else { + this.storage = new BrowserStorage(this.fallbackStorage); + } + + return this.storage; + } + + /** + * Serializes the given data using SuperJSON. + * + * @param data The data to serialize. + * + * @returns The serialized data. + */ + public static serialize = (data: SuperJSONValue): SuperJSONResult => SuperJSON.serialize(data); + + /** + * Deserializes the given data using SuperJSON. + * + * @param data The data to deserialize. + * + * @returns The deserialized data. + */ + public static deserialize = (data: SuperJSONResult): SuperJSONValue => SuperJSON.deserialize(data); + + /** + * Checks if the given value is a SuperJSONResult. + * + * @param value The value to check. + * + * @returns True if the value is a SuperJSONResult, false otherwise. + */ + private static isSuperJSONResult(value: unknown): value is SuperJSONResult { + return typeof value === 'object' && value !== null && HybridStorage.SUPERJSON_META_KEY in value; + } + + /** + * Checks if IndexedDB is supported in the current environment. + * This is determined by trying to open a test database; if successful, IndexedDB is supported. + * The result of this check is cached to prevent multiple checks. + * + * @returns True if IndexedDB is supported, false otherwise. + */ + public static async isIDBSupported(): Promise { + if (HybridStorage.isIDBCapabilityChecked) { + return HybridStorage.idbSupported; + } + + if (HybridStorage.idbCapabilityCheckerPromise) { + return HybridStorage.idbCapabilityCheckerPromise; + } + + HybridStorage.idbCapabilityCheckerPromise = (async (): Promise => { + try { + const testDbName = `${HybridStorage.TEST_IDB_NAME_PREFIX}${nanoid()}`; + const testDb = await openDB(testDbName, HybridStorage.TEST_IDB_VERSION); + testDb.close(); + await deleteDB(testDbName); + HybridStorage.idbSupported = true; + } catch (e) { + HybridStorage.idbSupported = false; + } + + HybridStorage.isIDBCapabilityChecked = true; + return HybridStorage.idbSupported; + })(); + + return HybridStorage.idbCapabilityCheckerPromise; + } + + /** + * Asynchronously sets a value for a given key in the selected storage mechanism. + * + * @param key The key under which the value is stored. + * @param value The value to be stored. + * + * @returns A promise that resolves when the operation is complete. + */ + async set(key: string, value: Data): Promise { + const storage = await this.getStorage(); + + // If the selected storage mechanism is IndexedDB, we store the value as is, + // as IndexedDB can store complex objects. + if (HybridStorage.isIdbStorage(storage)) { + return storage.set(key, value); + } + + const serialized = HybridStorage.serialize(value); + + // If the serialized value contains a meta key, it means that the value provided + // contains special data that are not JSON-serializable and require SuperJSON serialization, + // like typed arrays, dates, and other complex objects. + // In this case, we store the SuperJSON-serialized value. + if (HybridStorage.SUPERJSON_META_KEY in serialized) { + return storage.set(key, serialized); + } + + // If the serialized value does not contain a meta key, it means that the value + // provided was a primitive value or a plain object that is JSON-serializable, + // and it does not contain any special data that requires SuperJSON serialization. + // In this case, we store the value as is. + return storage.set(key, value); + } + + /** + * Asynchronously retrieves the value for a given key from the selected storage mechanism. + * + * @param key The key whose value is to be retrieved. + * + * @returns A promise that resolves with the retrieved value, or undefined if the key does not exist. + */ + async get(key: string): Promise { + const storage = await this.getStorage(); + + // If the selected storage mechanism is IndexedDB, we return the value as is, + // as IndexedDB can store complex objects. + if (HybridStorage.isIdbStorage(storage)) { + return storage.get(key); + } + + const value = await storage.get(key); + + // Do not attempt to deserialize undefined values. + if (value === undefined) { + return undefined; + } + + // If the value is a SuperJSON-serialized object, we need to deserialize it. + if (HybridStorage.isSuperJSONResult(value)) { + return HybridStorage.deserialize(value); + } + + // Otherwise, we return the value as is. + return value as Data; + } + + /** + * Asynchronously removes the value for a given key from the selected storage mechanism. + * + * @param key The key whose value is to be removed. + */ + async remove(key: string): Promise { + const storage = await this.getStorage(); + await storage.remove(key); + } + + /** + * Atomic set operation for multiple key-value pairs. + * This method are using transaction to ensure atomicity, if any of the operations fail, + * the entire operation is rolled back. This helps to prevent data corruption / inconsistency. + * + * @param data The key-value pairs to set. + * + * @returns True if all operations were successful, false otherwise. + * + * @example + * ```ts + * const storage = new HybridStorage(); + * await storage.setMultiple({ + * key1: 'value1', + * key2: 'value2', + * }); + * ``` + */ + public async setMultiple(data: Record): Promise { + const storage = await this.getStorage(); + if (HybridStorage.isIdbStorage(storage)) { + return (await storage.setMultiple(data)) ?? false; + } + + const cloneData = Object.entries(data).reduce((acc, [key, value]) => { + const serialized = SuperJSON.serialize(value); + + // If the serialized value contains a meta key, it means that the value provided + // contains special data that are not JSON-serializable and require SuperJSON serialization, + // like typed arrays, dates, and other complex objects. + // In this case, we store the SuperJSON-serialized value. + if (HybridStorage.SUPERJSON_META_KEY in serialized) { + acc[key] = serialized; + return acc; + } + + // If the serialized value does not contain a meta key, it means that the value + // provided was a primitive value or a plain object that is JSON-serializable, + // and it does not contain any special data that requires SuperJSON serialization. + // In this case, we store the value as is. + acc[key] = value; + + return acc; + }, {} as Record); + + return (await storage.setMultiple(cloneData)) ?? false; + } + + /** + * Removes multiple key-value pairs from the storage. + * + * @param keys The keys to remove. + * + * @returns True if all operations were successful, false otherwise. + */ + public async removeMultiple(keys: string[]): Promise { + const storage = await this.getStorage(); + return (await storage.removeMultiple(keys)) ?? false; + } + + /** + * Get the entire contents of the storage. + * + * @returns Promise that resolves with the entire contents of the storage. + */ + public async entries(): Promise> { + const storage = await this.getStorage(); + + if (HybridStorage.isIdbStorage(storage)) { + return storage.entries(); + } + + const entries = await storage.entries(); + + return Object.entries(entries).reduce((acc, [key, value]) => { + acc[key] = HybridStorage.isSuperJSONResult(value) ? HybridStorage.deserialize(value) : value; + return acc; + }, {} as Record); + } + + /** + * Get all keys from the storage. + * + * @returns Promise that resolves with all keys from the storage. + */ + public async keys(): Promise { + const storage = await this.getStorage(); + return storage.keys(); + } + + /** + * Check if a key exists in the storage. + * + * @param key The key to check. + * + * @returns True if the key exists, false otherwise. + */ + public async has(key: string): Promise { + const storage = await this.getStorage(); + return storage.has(key); + } + + /** + * Clears the storage. + */ + public async clear(): Promise { + const storage = await this.getStorage(); + await storage.clear(); + } +} diff --git a/Extension/src/background/storages/idb-storage.ts b/Extension/src/background/storages/idb-storage.ts new file mode 100644 index 0000000000..5a593b4225 --- /dev/null +++ b/Extension/src/background/storages/idb-storage.ts @@ -0,0 +1,262 @@ +/** + * @file + * This file is part of AdGuard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension). + * + * AdGuard Browser Extension is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AdGuard Browser Extension 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 AdGuard Browser Extension. If not, see . + */ + +import { type IDBPDatabase, openDB } from 'idb'; + +import { logger } from '../../common/logger'; + +import { type ExtendedStorageInterface } from './storage-interface'; + +/** + * Provides a storage mechanism using IndexedDB. This class implements the + * StorageInterface with asynchronous methods to interact with the database. + * + * @template Data The type of the value stored in the storage. + */ +export class IDBStorage implements ExtendedStorageInterface { + /** + * The default name of the store within the database. + */ + public static readonly DEFAULT_STORE_NAME = 'defaultStore'; + + /** + * The default version of the database. + */ + public static readonly DEFAULT_IDB_VERSION = 1; + + /** + * The default name of the database. + */ + public static readonly DEFAULT_IDB_NAME = 'adguardIDB'; + + /** + * Holds the instance of the IndexedDB database. + */ + private db: IDBPDatabase | null = null; + + /** + * Promise to get IndexedDB database. + */ + private dbGetterPromise: Promise | null = null; + + /** + * The name of the database. + */ + private name: string; + + /** + * The version of the database. Used for upgrades. + */ + private version: number; + + /** + * The name of the store within the database. + */ + private store: string; + + /** + * Constructs an instance of the IDBStorage class. + * + * @param [name=IDBStorage.DEFAULT_IDB_NAME] The name of the database. + * @param [version=1] The version of the database. + * @param [store=IDBStorage.DEFAULT_STORE_NAME] The name of the store within the database. + */ + constructor( + name = IDBStorage.DEFAULT_IDB_NAME, + version = IDBStorage.DEFAULT_IDB_VERSION, + store = IDBStorage.DEFAULT_STORE_NAME, + ) { + this.name = name; + this.version = version; + this.store = store; + } + + /** + * Ensures the database is opened before any operations. If the database + * is not already opened, it opens the database. + * + * @returns The opened database instance. + */ + private async getOpenedDb(): Promise { + if (this.db) { + return this.db; + } + + if (this.dbGetterPromise) { + return this.dbGetterPromise; + } + + this.dbGetterPromise = (async (): Promise => { + this.db = await openDB(this.name, this.version, { + upgrade: (db) => { + // Make sure the store exists + if (!db.objectStoreNames.contains(this.store)) { + db.createObjectStore(this.store); + } + }, + }); + + this.dbGetterPromise = null; + + return this.db; + })(); + + return this.dbGetterPromise; + } + + /** + * Retrieves a value by key from the store. + * + * @param key The key of the value to retrieve. + * + * @returns The value associated with the key. + */ + public async get(key: string): Promise { + const db = await this.getOpenedDb(); + return db.get(this.store, key); + } + + /** + * Sets a value in the store with the specified key. + * + * @param key The key under which to store the value. + * @param value The value to store. + */ + public async set(key: string, value: unknown): Promise { + const db = await this.getOpenedDb(); + await db.put(this.store, value, key); + } + + /** + * Removes a value from the store by key. + * + * @param key The key of the value to remove. + */ + public async remove(key: string): Promise { + const db = await this.getOpenedDb(); + await db.delete(this.store, key); + } + + /** + * Atomic set operation for multiple key-value pairs. + * This method is using transaction to ensure atomicity, if any of the operations fail, + * the entire operation is rolled back. This helps to prevent data corruption / inconsistency. + * + * @param data The key-value pairs to set. + * + * @returns True if all operations were successful, false otherwise. + * + * @example + * ```ts + * const storage = new IDBStorage(); + * await storage.setMultiple({ + * key1: 'value1', + * key2: 'value2', + * }); + * ``` + */ + public async setMultiple(data: Record): Promise { + const db = await this.getOpenedDb(); + const tx = db.transaction(this.store, 'readwrite'); + + try { + await Promise.all(Object.entries(data).map(([key, value]) => tx.store.put(value, key))); + await tx.done; + } catch (e) { + logger.error('Error while setting multiple keys in the storage:', e); + tx.abort(); + return false; + } + + return true; + } + + /** + * Removes multiple key-value pairs from the storage. + * + * @param keys The keys to remove. + * + * @returns True if all operations were successful, false otherwise. + */ + public async removeMultiple(keys: string[]): Promise { + const db = await this.getOpenedDb(); + const tx = db.transaction(this.store, 'readwrite'); + + try { + await Promise.all(keys.map((key) => tx.store.delete(key))); + await tx.done; + } catch (e) { + logger.error('Error while removing multiple keys from the storage:', e); + tx.abort(); + return false; + } + + return true; + } + + /** + * Get the entire contents of the storage. + * + * @returns Promise that resolves with the entire contents of the storage. + */ + public async entries(): Promise> { + const db = await this.getOpenedDb(); + const entries: Record = {}; + const tx = db.transaction(this.store, 'readonly'); + + // eslint-disable-next-line no-restricted-syntax + for await (const cursor of tx.store) { + const key = String(cursor.key); + entries[key] = cursor.value; + } + + return entries; + } + + /** + * Get all keys in the storage. + * + * @returns Promise that resolves with all keys in the storage. + */ + public async keys(): Promise { + const db = await this.getOpenedDb(); + const idbKeys = await db.getAllKeys(this.store); + return idbKeys.map((key) => key.toString()); + } + + /** + * Check if a key exists in the storage. + * + * @param key The key to check. + * + * @returns True if the key exists, false otherwise. + */ + public async has(key: string): Promise { + const db = await this.getOpenedDb(); + const idbKey = await db.getKey(this.store, key); + return idbKey !== undefined; + } + + /** + * Clears the storage. + */ + public async clear(): Promise { + const db = await this.getOpenedDb(); + await db.clear(this.store); + } +} diff --git a/Extension/src/background/storages/shared-instances.ts b/Extension/src/background/storages/shared-instances.ts index 6a5f7dddd7..05e6eefe90 100644 --- a/Extension/src/background/storages/shared-instances.ts +++ b/Extension/src/background/storages/shared-instances.ts @@ -17,11 +17,9 @@ */ import browser from 'webextension-polyfill'; -import { - BrowserStorage, - HybridStorage, - IDBStorage, -} from '@adguard/tswebextension/core-storages'; +import { BrowserStorage } from './browser-storage'; +import { HybridStorage } from './hybrid-storage'; +import { IDBStorage } from './idb-storage'; /** * Storage instance for accessing `browser.storage.local`. diff --git a/Extension/src/background/storages/storage-interface.ts b/Extension/src/background/storages/storage-interface.ts new file mode 100644 index 0000000000..f508e790ad --- /dev/null +++ b/Extension/src/background/storages/storage-interface.ts @@ -0,0 +1,53 @@ +/** + * @file + * This file is part of AdGuard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension). + * + * AdGuard Browser Extension is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AdGuard Browser Extension 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 AdGuard Browser Extension. If not, see . + */ + +/** + * Common storage interface with basic operations. + */ +export interface StorageInterface< + K extends PropertyKey = string, + V = unknown, + Mode extends 'sync' | 'async' = 'sync', +> { + set(key: K, value: V): Mode extends 'async' ? Promise : void + + get(key: K): Mode extends 'async' ? Promise : V | undefined + + remove(key: K): Mode extends 'async' ? Promise : void +} + +/** + * Extended storage interface with additional operations. + */ +export interface ExtendedStorageInterface< + K extends PropertyKey = string, + V = unknown, + Mode extends 'sync' | 'async' = 'sync', +> extends StorageInterface { + setMultiple(data: Record): Mode extends 'async' ? Promise : boolean + + removeMultiple(keys: K[]): Mode extends 'async' ? Promise : boolean + + entries(): Mode extends 'async' ? Promise> : Record + + keys(): Mode extends 'async' ? Promise : K[] + + has(key: K): Mode extends 'async' ? Promise : boolean + + clear(): Mode extends 'async' ? Promise : void +} diff --git a/package.json b/package.json index f47393097d..d6b2ba7228 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,13 @@ "beta": "cross-env BUILD_ENV=beta tsx tools/bundle.ts", "release": "cross-env BUILD_ENV=release tsx tools/bundle.ts", "adguard-api": "cross-env BUILD_ENV=dev tsx tools/bundle.ts adguard-api", - "test": "mkdir -p tests-reports && cross-env MANIFEST_ENV=2 vitest run && cross-env MANIFEST_ENV=3 vitest run", + "test:mv2": "cross-env MANIFEST_ENV=2 vitest run", + "test:mv3": "cross-env MANIFEST_ENV=3 vitest run", + "test": "tsx tools/run-tests.ts", "test:integration": "rimraf tmp && mkdir -p tests-reports && tsx tools/browser-test/index.ts", "locales": "tsx tools/locales.js", "resources": "tsx tools/resources.ts", - "resources:mv3": "pnpm add -D https://github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz && tsx tools/resources-mv3.ts", + "resources:mv3": "pnpm add -D https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/dnr-rulesets/adguard-dnr-rulesets.tgz && tsx tools/resources-mv3.ts", "lint": "eslint --cache --max-warnings=0 --ext .jsx,.js,.tsx,.ts . && pnpm check-types", "increment": "pnpm version patch --no-git-tag-version", "prepare": "husky install", @@ -31,7 +33,7 @@ "author": "adguard@adguard.com", "license": "GPL-3.0", "devDependencies": { - "@adguard/dnr-rulesets": "https://github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz", + "@adguard/dnr-rulesets": "https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/dnr-rulesets/adguard-dnr-rulesets.tgz", "@adguard/re2-wasm": "^1.2.0", "@types/chrome": "^0.0.268", "@types/crypto-js": "^4.1.1", @@ -71,13 +73,13 @@ "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", + "execa": "^9.5.2", "fake-indexeddb": "^6.0.0", "filesize": "^10.1.2", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "html-webpack-plugin": "^5.6.3", "husky": "^7.0.4", - "idb": "^8.0.2", "jsdom": "^25.0.1", "junit-report-builder": "^5.1.1", "lint-staged": "^13.2.1", @@ -112,7 +114,7 @@ }, "pnpm": { "overrides": { - "@adguard/tswebextension>@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz" + "@adguard/tswebextension>@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz" } }, "dependencies": { @@ -121,8 +123,8 @@ "@adguard/logger": "^1.1.1", "@adguard/scriptlets": "^2.1.4", "@adguard/translate": "^1.0.2", - "@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz", - "@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz", + "@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz", + "@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz", "@xstate/react": "^4.1.3", "ace-builds": "^1.17.0", "assert": "^2.0.0", @@ -133,6 +135,7 @@ "crypto-browserify": "^3.12.0", "crypto-js": "^4.2.0", "date-fns": "^2.29.3", + "idb": "^8.0.2", "js-beautify": "^1.14.7", "lodash-es": "^4.17.21", "lru-cache": "^11.0.2", @@ -158,5 +161,6 @@ "xstate": "^5.19.0", "zod": "^3.21.4", "zod-validation-error": "^3.4.0" - } + }, + "packageManager": "pnpm@8.15.1+sha512.831cf4c5f8b8374af71521d4d153db49d7086de615c2af7cb5e9d7eb8ba630ddac46fea495d643e552ef2e68a3aa99a3e5e9fbee8696702967504df5c59cb273" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5077a029f7..f89fc038cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@adguard/tswebextension>@adguard/tsurlfilter': https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz + '@adguard/tswebextension>@adguard/tsurlfilter': https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz dependencies: '@adguard/agtree': @@ -24,11 +24,11 @@ dependencies: specifier: ^1.0.2 version: 1.0.2 '@adguard/tsurlfilter': - specifier: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz - version: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' + specifier: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz + version: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' '@adguard/tswebextension': - specifier: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz - version: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)' + specifier: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz + version: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)' '@xstate/react': specifier: ^4.1.3 version: 4.1.3(@types/react@17.0.83)(react@17.0.2)(xstate@5.19.0) @@ -59,6 +59,9 @@ dependencies: date-fns: specifier: ^2.29.3 version: 2.29.3 + idb: + specifier: ^8.0.2 + version: 8.0.2 js-beautify: specifier: ^1.14.7 version: 1.14.7 @@ -137,8 +140,8 @@ dependencies: devDependencies: '@adguard/dnr-rulesets': - specifier: https://github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz - version: '@github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz' + specifier: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/dnr-rulesets/adguard-dnr-rulesets.tgz + version: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/dnr-rulesets/adguard-dnr-rulesets.tgz' '@adguard/re2-wasm': specifier: ^1.2.0 version: 1.2.0 @@ -256,6 +259,9 @@ devDependencies: eslint-plugin-react-hooks: specifier: ^4.6.0 version: 4.6.0(eslint@8.57.1) + execa: + specifier: ^9.5.2 + version: 9.5.2 fake-indexeddb: specifier: ^6.0.0 version: 6.0.0 @@ -274,9 +280,6 @@ devDependencies: husky: specifier: ^7.0.4 version: 7.0.4 - idb: - specifier: ^8.0.2 - version: 8.0.2 jsdom: specifier: ^25.0.1 version: 25.0.1 @@ -1726,11 +1729,20 @@ packages: dev: true optional: true + /@sec-ant/readable-stream@0.4.1: + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + dev: true + /@sindresorhus/merge-streams@2.3.0: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} dev: true + /@sindresorhus/merge-streams@4.0.0: + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + dev: true + /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} dependencies: @@ -4507,6 +4519,24 @@ packages: strip-final-newline: 3.0.0 dev: true + /execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.3 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + dev: true + /exenv@1.2.2: resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} dev: false @@ -4561,6 +4591,13 @@ packages: reusify: 1.0.4 dev: true + /figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + dependencies: + is-unicode-supported: 2.1.0 + dev: true + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4763,6 +4800,14 @@ packages: engines: {node: '>=10'} dev: true + /get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + dev: true + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -5094,6 +5139,11 @@ packages: engines: {node: '>=14.18.0'} dev: true + /human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} + dev: true + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: @@ -5124,6 +5174,7 @@ packages: /idb@8.0.2: resolution: {integrity: sha512-CX70rYhx7GDDQzwwQMDwF6kDRQi5vVs6khHUumDrMecBylKkwvZ8HWvKV08AGb7VbpoGCWUQ4aHzNDgoUiOIUg==} + dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5357,6 +5408,11 @@ packages: engines: {node: '>=8'} dev: true + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: true + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -5400,6 +5456,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + dev: true + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -5420,6 +5481,11 @@ packages: dependencies: which-typed-array: 1.1.11 + /is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + dev: true + /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: true @@ -6136,6 +6202,14 @@ packages: path-key: 4.0.0 dev: true + /npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + dev: true + /nth-check@1.0.2: resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} dependencies: @@ -6358,6 +6432,11 @@ packages: lines-and-columns: 1.2.4 dev: true + /parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + dev: true + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -7011,6 +7090,13 @@ packages: renderkid: 3.0.0 dev: true + /pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + dependencies: + parse-ms: 4.0.0 + dev: true + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true @@ -7807,6 +7893,11 @@ packages: engines: {node: '>=12'} dev: true + /strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + dev: true + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -8200,6 +8291,11 @@ packages: engines: {node: '>=18'} dev: true + /unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + dev: true + /uniq@1.0.1: resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} dev: true @@ -8755,6 +8851,11 @@ packages: engines: {node: '>=10'} dev: true + /yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + dev: true + /zip-stream@2.1.3: resolution: {integrity: sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==} engines: {node: '>= 6'} @@ -8798,9 +8899,22 @@ packages: version: 0.8.0 dev: false - '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz} - id: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz' + '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/dnr-rulesets/adguard-dnr-rulesets.tgz': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/dnr-rulesets/adguard-dnr-rulesets.tgz} + name: '@adguard/dnr-rulesets' + version: 2.0.0 + hasBin: true + dependencies: + '@adguard/logger': 1.1.1 + commander: 12.1.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + zod: 3.23.8 + dev: true + + '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz} + id: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz' name: '@adguard/tsurlfilter' version: 3.2.0-alpha.0 engines: {node: '>=20'} @@ -8824,9 +8938,9 @@ packages: zod-validation-error: 3.4.0(zod@3.21.4) dev: false - '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz} - id: '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tswebextension/tswebextension.tgz' + '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz} + id: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz' name: '@adguard/tswebextension' version: 3.0.0-alpha.1 engines: {node: '>=20'} @@ -8837,7 +8951,7 @@ packages: '@adguard/extended-css': 2.1.1 '@adguard/logger': 1.1.1 '@adguard/scriptlets': 2.1.4 - '@adguard/tsurlfilter': '@github.com/AdguardTeam/tsurlfilter/raw/1a888a8324bc774e99dd87434e7e251750bf4382/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' + '@adguard/tsurlfilter': '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' bowser: 2.11.0 chrome-types: 0.1.325 commander: 11.0.0 @@ -8856,19 +8970,6 @@ packages: - '@adguard/re2-wasm' dev: false - '@github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/6f4e1c026de36ba9d424cbc1e191a86c4cfd212d/packages/dnr-rulesets/adguard-dnr-rulesets.tgz} - name: '@adguard/dnr-rulesets' - version: 2.0.0 - hasBin: true - dependencies: - '@adguard/logger': 1.1.1 - commander: 12.1.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - zod: 3.23.8 - dev: true - github.com/105th/jsdiff/2be2e7df90e8eebd99f0385c7b1dc16c2f4dcc1a: resolution: {tarball: https://codeload.github.com/105th/jsdiff/tar.gz/2be2e7df90e8eebd99f0385c7b1dc16c2f4dcc1a} name: diff diff --git a/tests/helpers/mocks/storage.ts b/tests/helpers/mocks/storage.ts index 9e734384e0..d0f594bd0b 100644 --- a/tests/helpers/mocks/storage.ts +++ b/tests/helpers/mocks/storage.ts @@ -13,24 +13,54 @@ export class EmulatedLocalStorage implements Storage.StorageArea { onChanged = {} as Events.Event<(changes: Storage.StorageAreaOnChangedChangesType) => void>; + /** + * Get data from the storage + */ get(keys?: string | string[] | Record | null | undefined): Promise> { - if (!keys) { + if (keys === null) { return Promise.resolve(this.data); } if (typeof keys === 'string') { - return Promise.resolve({ [keys]: this.data[keys] }); + const data = this.data[keys]; + return Promise.resolve(data !== undefined ? { [keys]: data } : {}); + } + + if (Array.isArray(keys)) { + return Promise.resolve(keys.reduce((result, key) => { + const data = this.data[key]; + if (data !== undefined) { + result[key] = data; + } + return result; + }, {} as Record)); + } + + // `null` already handled above + if (typeof keys === 'object') { + return Promise.resolve(Object.entries(keys).reduce((result, [key]) => { + const data = this.data[key]; + if (data !== undefined) { + result[key] = data; + } + return result; + }, {} as Record)); } - // TODO: other key options return Promise.resolve({}); } + /** + * Set data in storage + */ set(items: Record): Promise { Object.assign(this.data, items); return Promise.resolve(); } + /** + * Remove data from storage + */ remove(keys: string | string[]): Promise { if (typeof keys === 'string') { delete this.data[keys]; @@ -43,6 +73,9 @@ export class EmulatedLocalStorage implements Storage.StorageArea { return Promise.resolve(); } + /** + * Clear all data from storage + */ clear(): Promise { this.data = {}; return Promise.resolve(); @@ -50,23 +83,22 @@ export class EmulatedLocalStorage implements Storage.StorageArea { } /** - * Bounds global sinon-chrome stub for {@link browser.storage.local} with new one {@link EmulatedLocalStorage} - * - * returned storage instance allows to manipulate data without triggering spies + * Mocks the browser.storage.local API with an instance of EmulatedLocalStorage * - * @param initData - init storage data + * @param initData - Optional initial data for the mock storage * - * @returns storage instance + * @returns Mocked storage instance */ export const mockLocalStorage = (initData?: Record): Storage.StorageArea => { const localStorage = new EmulatedLocalStorage(initData); + // Override the sinon-chrome storage API with mocked methods browser.storage.local.get.callsFake((keys) => localStorage.get(keys)); - browser.storage.local.set.callsFake((keys) => localStorage.set(keys)); + browser.storage.local.set.callsFake((items) => localStorage.set(items)); browser.storage.local.remove.callsFake((keys) => localStorage.remove(keys)); browser.storage.local.clear.callsFake(() => localStorage.clear()); - // reset spy history + // Reset spy history to avoid unwanted side effects in tests browser.storage.local.get.resetHistory(); browser.storage.local.set.resetHistory(); browser.storage.local.remove.resetHistory(); diff --git a/tests/src/background/api/update.test.ts b/tests/src/background/api/update.test.ts index 735f7c36fc..f77ffb36f5 100644 --- a/tests/src/background/api/update.test.ts +++ b/tests/src/background/api/update.test.ts @@ -10,8 +10,7 @@ import { type MockInstance, } from 'vitest'; -import { HybridStorage } from '@adguard/tswebextension/core-storages'; - +import { HybridStorage } from '../../../../Extension/src/background/storages/hybrid-storage'; import { UpdateApi } from '../../../../Extension/src/background/api'; import { mockLocalStorage, @@ -148,7 +147,7 @@ describe('Update Api (without indexedDB)', () => { await UpdateApi.update(runInfo); - const settings = await storage.get(); + const settings = await storage.get(null); // Some properties in the data are stored as strings, but we need to compare them as objects, not as strings expect(deepJsonParse(settings)).toStrictEqual(deepJsonParse(data.to)); diff --git a/tests/src/background/storages/browser-storage.test.ts b/tests/src/background/storages/browser-storage.test.ts new file mode 100644 index 0000000000..6b084a1fcf --- /dev/null +++ b/tests/src/background/storages/browser-storage.test.ts @@ -0,0 +1,111 @@ +import browser, { Storage } from 'webextension-polyfill'; +import { + afterEach, + beforeEach, + describe, + expect, + test, + vi, +} from 'vitest'; + +import { BrowserStorage } from '../../../../Extension/src/background/storages/browser-storage'; +import { mockLocalStorage } from '../../../helpers'; + +describe('BrowserStorage', () => { + let storageLocal: Storage.StorageArea; + let storage: BrowserStorage; + + beforeEach(() => { + storageLocal = mockLocalStorage(); + storage = new BrowserStorage(browser.storage.local); + }); + + afterEach(async () => { + await storageLocal.clear(); + await storage.clear(); + vi.clearAllMocks(); + }); + + test('set and get', async () => { + await storage.set('key1', 'value1'); + const value = await storage.get('key1'); + expect(value).toBe('value1'); + }); + + test('remove', async () => { + await storage.set('key2', 'value2'); + await expect(storage.get('key2')).resolves.toBe('value2'); + await storage.remove('key2'); + await expect(storage.get('key2')).resolves.toBeUndefined(); + }); + + test('setMultiple', async () => { + const data = { key3: 'value3', key4: 'value4' }; + const result = await storage.setMultiple(data); + expect(result).toBe(true); + const value3 = await storage.get('key3'); + const value4 = await storage.get('key4'); + expect(value3).toBe('value3'); + expect(value4).toBe('value4'); + }); + + test('removeMultiple', async () => { + await storage.set('key5', 'value5'); + await storage.set('key6', 'value6'); + const result = await storage.removeMultiple(['key5', 'key6']); + expect(result).toBe(true); + const value5 = await storage.get('key5'); + const value6 = await storage.get('key6'); + expect(value5).toBeUndefined(); + expect(value6).toBeUndefined(); + }); + + test('entries', async () => { + await storage.set('key7', 'value7'); + await storage.set('key8', 'value8'); + const entries = await storage.entries(); + expect(entries).toEqual({ key7: 'value7', key8: 'value8' }); + }); + + test('keys', async () => { + await storage.set('key9', 'value9'); + await storage.set('key10', 'value10'); + const keys = await storage.keys(); + expect(keys).toEqual(expect.arrayContaining(['key9', 'key10'])); + }); + + test('has', async () => { + await storage.set('key11', 'value11'); + const hasKey = await storage.has('key11'); + expect(hasKey).toBe(true); + const hasKey12 = await storage.has('key12'); + expect(hasKey12).toBe(false); + }); + + test('clear', async () => { + await storage.set('key13', 'value13'); + await storage.set('key14', 'value14'); + await storage.clear(); + const entries = await storage.entries(); + expect(entries).toEqual({}); + }); + + test('setMultiple handles errors', async () => { + const descriptor = Object.getOwnPropertyDescriptor(storage, 'storage'); + + if (descriptor === undefined) { + throw new Error('Storage descriptor is undefined'); + } + + // Simulate an error in browser.storage.local.set + const mock = vi.spyOn(descriptor.value, 'set').mockRejectedValueOnce( + new Error('Error while setting multiple keys in the storage'), + ); + + const data = { key1: 'value1', errorKey: 'value2' }; + const result = await storage.setMultiple(data); + expect(result).toBe(false); + + mock.mockRestore(); + }); +}); diff --git a/tests/src/background/storages/filters-adapter.test.ts b/tests/src/background/storages/filters-adapter.test.ts index 0f790cf4be..fb0ffb0a60 100644 --- a/tests/src/background/storages/filters-adapter.test.ts +++ b/tests/src/background/storages/filters-adapter.test.ts @@ -68,7 +68,7 @@ describe.skipIf(__IS_MV3__)('FiltersStoragesAdapter (MV2)', () => { it('has', async () => { await FiltersStoragesAdapter.set(1, filter); await expect(FiltersStoragesAdapter.has(1)).resolves.toBeTruthy(); - await expect(FiltersStoragesAdapter.has(2)).resolves.toBeFalsy(); + await expect(FiltersStoragesAdapter.has(999)).resolves.toBeFalsy(); }); it('remove', async () => { @@ -167,13 +167,12 @@ describe.skipIf(!__IS_MV3__)('FiltersStoragesAdapter (MV3)', () => { it('has', async () => { await FiltersStoragesAdapter.set(1, filter); await expect(FiltersStoragesAdapter.has(1)).resolves.toBeTruthy(); - await expect(FiltersStoragesAdapter.has(2)).resolves.toBeFalsy(); + await expect(FiltersStoragesAdapter.has(999)).resolves.toBeFalsy(); }); it('has works for static filters', async () => { - // Actually, we do not have the filter with ID 10 in the TSWebExtension storage, - // so we just need to check that the method was called with the correct argument - await expect(FiltersStoragesAdapter.has(2)).resolves.toBeFalsy(); + // We just need to check that the method was called with the correct argument + await FiltersStoragesAdapter.has(2); expect(tsWebExtensionFiltersStorageHasSpy).toHaveBeenCalledWith(2); }); diff --git a/tests/src/background/storages/hybrid-storage.test.ts b/tests/src/background/storages/hybrid-storage.test.ts new file mode 100644 index 0000000000..83c9fd2ce7 --- /dev/null +++ b/tests/src/background/storages/hybrid-storage.test.ts @@ -0,0 +1,275 @@ +import browser, { Storage } from 'webextension-polyfill'; +import { cloneDeep } from 'lodash-es'; +import { + afterEach, + beforeAll, + beforeEach, + describe, + expect, + test, + vi, +} from 'vitest'; + +import { HybridStorage } from '../../../../Extension/src/background/storages/hybrid-storage'; +import { IDBStorage } from '../../../../Extension/src/background/storages/idb-storage'; +import { BrowserStorage } from '../../../../Extension/src/background/storages/browser-storage'; +import { mockLocalStorage } from '../../../helpers'; + +vi.mock('idb', { spy: true }); + +describe('HybridStorage', () => { + let storageLocal: Storage.StorageArea; + let storage: HybridStorage; + + beforeEach(() => { + storageLocal = mockLocalStorage(); + }); + + afterEach(async () => { + await storageLocal.clear(); + await storage.clear(); + vi.clearAllMocks(); + }); + + describe('When IndexedDB is supported', () => { + beforeEach(() => { + storage = new HybridStorage(browser.storage.local); + }); + + test('IDBStorage is used when IndexedDB is supported', async () => { + const dummyStorage = new HybridStorage(browser.storage.local); + + // We need to make some operation to trigger the IndexedDB check, because its lazy + // and only happens when the storage is used + expect(dummyStorage).toBeInstanceOf(HybridStorage); + await expect(dummyStorage.keys()).resolves.toEqual([]); + + const descriptor = Object.getOwnPropertyDescriptor(dummyStorage, 'storage'); + expect(descriptor?.value).toBeInstanceOf(IDBStorage); + }); + + // HybridStorage.isIDBSupported creates a test database to check if IndexedDB is supported, + // and we need to check if its deleted after the check + test('test database deleted', async () => { + const dummyStorage = new HybridStorage(browser.storage.local); + + // We need to make some operation to trigger the IndexedDB check, because its lazy + // and only happens when the storage is used + expect(dummyStorage).toBeInstanceOf(HybridStorage); + await expect(dummyStorage.keys()).resolves.toEqual([]); + + // Test database name: prefix + random nanoid, but nanoid is mocked to return 1 + const descriptor = Object.getOwnPropertyDescriptor(dummyStorage, 'TEST_IDB_NAME_PREFIX'); + const testDbName = `${descriptor?.value}1`; + const databases = await indexedDB.databases(); + + expect(databases).not.toContainEqual(expect.objectContaining({ name: testDbName })); + }); + + test('set and get', async () => { + await storage.set('key1', 'value1'); + const value = await storage.get('key1'); + expect(value).toBe('value1'); + }); + + test('remove', async () => { + await storage.set('key2', 'value2'); + await expect(storage.get('key2')).resolves.toBe('value2'); + await storage.remove('key2'); + await expect(storage.get('key2')).resolves.toBeUndefined(); + }); + + test('setMultiple', async () => { + const data = { key3: 'value3', key4: 'value4' }; + const result = await storage.setMultiple(data); + expect(result).toBe(true); + const value3 = await storage.get('key3'); + const value4 = await storage.get('key4'); + expect(value3).toBe('value3'); + expect(value4).toBe('value4'); + }); + + test('removeMultiple', async () => { + await storage.set('key5', 'value5'); + await storage.set('key6', 'value6'); + const result = await storage.removeMultiple(['key5', 'key6']); + expect(result).toBe(true); + const value5 = await storage.get('key5'); + const value6 = await storage.get('key6'); + expect(value5).toBeUndefined(); + expect(value6).toBeUndefined(); + }); + + test('entries', async () => { + await storage.set('key7', 'value7'); + await storage.set('key8', 'value8'); + const entries = await storage.entries(); + expect(entries).toEqual({ key7: 'value7', key8: 'value8' }); + }); + + test('keys', async () => { + await storage.set('key9', 'value9'); + await storage.set('key10', 'value10'); + const keys = await storage.keys(); + expect(keys).toEqual(expect.arrayContaining(['key9', 'key10'])); + }); + + test('has', async () => { + await storage.set('key11', 'value11'); + const hasKey = await storage.has('key11'); + expect(hasKey).toBe(true); + const hasKey12 = await storage.has('key12'); + expect(hasKey12).toBe(false); + }); + + test('clear', async () => { + await storage.set('key13', 'value13'); + await storage.set('key14', 'value14'); + await storage.clear(); + const entries = await storage.entries(); + expect(entries).toEqual({}); + }); + }); + + describe('When IndexedDB is not supported', () => { + beforeAll(() => { + // Reset static cache members, otherwise previous tests will affect this one + + /** + * Change a value via Object.defineProperty. + * + * @param obj Reference to the object. + * @param key Key to change. + * @param value New value. + */ + const changeValue = (obj: object, key: PropertyKey, value: unknown): void => { + const descriptor = Object.getOwnPropertyDescriptor(obj, key); + if (descriptor) { + Object.defineProperty(obj, key, Object.assign(descriptor, { value })); + } + }; + + changeValue(HybridStorage, 'isIDBCapabilityChecked', false); + changeValue(HybridStorage, 'idbCapabilityCheckerPromise', null); + changeValue(HybridStorage, 'idbSupported', false); + }); + + beforeEach(() => { + // Mock idb.openDB to throw an error, simulating that IndexedDB is not supported + // vi.spyOn(idb, 'openDB').mockImplementation(() => { + // throw new Error('IndexedDB not supported'); + // }); + vi.spyOn(HybridStorage, 'isIDBSupported').mockResolvedValue(false); + + storage = new HybridStorage(browser.storage.local); + }); + + test('BrowserStorage is used when IndexedDB is not supported', async () => { + const dummyStorage = new HybridStorage(browser.storage.local); + + // We need to make some operation to trigger the IndexedDB check, because its lazy + // and only happens when the storage is used + expect(dummyStorage).toBeInstanceOf(HybridStorage); + await expect(dummyStorage.keys()).resolves.toEqual([]); + + const descriptor = Object.getOwnPropertyDescriptor(dummyStorage, 'storage'); + expect(descriptor?.value).toBeInstanceOf(BrowserStorage); + }); + + // IndexedDB supports more data types, so if we use BrowserStorage, we need to use a + // serialization library like SuperJSON to handle these data types. + // In this test, we just check that this extra serialization step is working correctly. + test('set and get handles special values, like Uint8Array', async () => { + const uint8Array = new Uint8Array([1, 2, 3]); + await storage.set('key1', uint8Array); + const value = await storage.get('key1'); + + // Reference should be different, but the value should be the same + expect(value).not.toBe(uint8Array); + expect(value).toEqual(cloneDeep(uint8Array)); + }); + + test('set and get', async () => { + await storage.set('key1', 'value1'); + const value = await storage.get('key1'); + expect(value).toBe('value1'); + }); + + test('set and get with non-JSON-serializable data', async () => { + const arr = new Uint8Array([1, 2, 3]); + await storage.set('key1', arr); + const value = await storage.get('key1'); + expect(value).toEqual(arr); + }); + + test('remove', async () => { + await storage.set('key2', 'value2'); + await expect(storage.get('key2')).resolves.toBe('value2'); + await storage.remove('key2'); + await expect(storage.get('key2')).resolves.toBeUndefined(); + }); + + test('setMultiple', async () => { + const data = { key3: 'value3', key4: 'value4' }; + const result = await storage.setMultiple(data); + expect(result).toBe(true); + const value3 = await storage.get('key3'); + const value4 = await storage.get('key4'); + expect(value3).toBe('value3'); + expect(value4).toBe('value4'); + }); + + test('removeMultiple', async () => { + await storage.set('key5', 'value5'); + await storage.set('key6', 'value6'); + const result = await storage.removeMultiple(['key5', 'key6']); + expect(result).toBe(true); + const value5 = await storage.get('key5'); + const value6 = await storage.get('key6'); + expect(value5).toBeUndefined(); + expect(value6).toBeUndefined(); + }); + + test('entries', async () => { + await storage.set('key7', 'value7'); + await storage.set('key8', 'value8'); + const entries = await storage.entries(); + expect(entries).toEqual({ key7: 'value7', key8: 'value8' }); + }); + + test('keys', async () => { + await storage.set('key9', 'value9'); + await storage.set('key10', 'value10'); + const keys = await storage.keys(); + expect(keys).toEqual(expect.arrayContaining(['key9', 'key10'])); + }); + + test('has', async () => { + await storage.set('key11', 'value11'); + const hasKey = await storage.has('key11'); + expect(hasKey).toBe(true); + const hasKey12 = await storage.has('key12'); + expect(hasKey12).toBe(false); + }); + + test('clear', async () => { + await storage.set('key13', 'value13'); + await storage.set('key14', 'value14'); + await storage.clear(); + const entries = await storage.entries(); + expect(entries).toEqual({}); + }); + + test('should read data correctly if browser storage already has data', async () => { + // Important: browser storage may contain data that is not SuperJSON-serialized, + // in this case, we still need to read it correctly + const browserStorage = new BrowserStorage(browser.storage.local); + await browserStorage.set('key15', 'value15'); + await browserStorage.set('key16', 'value16'); + + const hybridStorage = new HybridStorage(browser.storage.local); + const entries = await hybridStorage.entries(); + expect(entries).toEqual(await browser.storage.local.get(null)); + }); + }); +}); diff --git a/tests/src/background/storages/idb-storage.test.ts b/tests/src/background/storages/idb-storage.test.ts new file mode 100644 index 0000000000..c28d4027a7 --- /dev/null +++ b/tests/src/background/storages/idb-storage.test.ts @@ -0,0 +1,89 @@ +import { + afterEach, + beforeEach, + describe, + expect, + test, + vi, +} from 'vitest'; + +import { IDBStorage } from '../../../../Extension/src/background/storages/idb-storage'; + +describe('IDBStorage', () => { + let storage: IDBStorage; + + beforeEach(() => { + storage = new IDBStorage(); + }); + + afterEach(async () => { + await storage.clear(); + vi.clearAllMocks(); + }); + + test('set and get', async () => { + await storage.set('key1', 'value1'); + const value = await storage.get('key1'); + expect(value).toBe('value1'); + }); + + test('remove', async () => { + await storage.set('key1', 'value1'); + await storage.remove('key1'); + const value = await storage.get('key1'); + expect(value).toBeUndefined(); + }); + + test('setMultiple', async () => { + const data = { key1: 'value1', key2: 'value2' }; + const result = await storage.setMultiple(data); + expect(result).toBe(true); + const value1 = await storage.get('key1'); + const value2 = await storage.get('key2'); + expect(value1).toBe('value1'); + expect(value2).toBe('value2'); + }); + + test('removeMultiple', async () => { + await storage.set('key1', 'value1'); + await storage.set('key2', 'value2'); + const result = await storage.removeMultiple(['key1', 'key2']); + expect(result).toBe(true); + const value1 = await storage.get('key1'); + const value2 = await storage.get('key2'); + expect(value1).toBeUndefined(); + expect(value2).toBeUndefined(); + }); + + test('entries', async () => { + await storage.set('key1', 'value1'); + await storage.set('key2', 'value2'); + const entries = await storage.entries(); + expect(entries).toEqual({ key1: 'value1', key2: 'value2' }); + }); + + test('keys', async () => { + await storage.set('key1', 'value1'); + await storage.set('key2', 'value2'); + const keys = await storage.keys(); + expect(keys).toEqual(expect.arrayContaining(['key1', 'key2'])); + }); + + test('has', async () => { + await storage.set('key1', 'value1'); + const hasKey = await storage.has('key1'); + expect(hasKey).toBe(true); + const hasKey1 = await storage.has('key2'); + expect(hasKey1).toBe(false); + }); + + test('clear', async () => { + await storage.set('key1', 'value1'); + await storage.set('key2', 'value2'); + await storage.clear(); + const entries = await storage.entries(); + expect(entries).toEqual({}); + }); + + // TODO: Add tests to check error handling in setMultiple and removeMultiple +}); diff --git a/tools/run-tests.ts b/tools/run-tests.ts new file mode 100644 index 0000000000..dbcbaae8ea --- /dev/null +++ b/tools/run-tests.ts @@ -0,0 +1,61 @@ +/** + * @file + * This file is part of AdGuard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension). + * + * AdGuard Browser Extension is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AdGuard Browser Extension 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 AdGuard Browser Extension. If not, see . + */ +/* eslint-disable no-console */ +import { execa } from 'execa'; + +const args = process.argv.slice(2); + +/** + * This is a small script that runs tests in both MV2 and MV3. + * It is useful when you want to run tests for both versions at the same time, + * e.g. + * `pnpm run test ` + * `pnpm run test -- -t ` + */ +async function runTests() { + let mv2Failed = false; + let mv3Failed = false; + + try { + console.log(`Running: pnpm test:mv2 ${args.join(' ')}`); + await execa('pnpm', ['test:mv2', ...args], { stdio: 'inherit' }); + } catch (error) { + mv2Failed = true; + } + + try { + console.log(`Running: pnpm test:mv3 ${args.join(' ')}`); + await execa('pnpm', ['test:mv3', ...args], { stdio: 'inherit' }); + } catch (error) { + mv3Failed = true; + } + + if (mv2Failed || mv3Failed) { + if (mv2Failed) { + console.error('MV2 has failing tests'); + } + + if (mv3Failed) { + console.error('MV3 has failing tests'); + } + + process.exit(1); + } +} + +runTests(); From 22849aafffc7455907051ab0dd185c315457f6e6 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 17 Feb 2025 18:58:34 +0300 Subject: [PATCH 09/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d6b2ba7228..20fbc2012e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.41", + "version": "5.1.42", "description": "AdGuard Extension", "type": "module", "scripts": { From 48ae95665623d12d03487c40e89c787779d8b717 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Mon, 17 Feb 2025 19:34:08 +0300 Subject: [PATCH 10/29] AG-39527 do not inject cosmetic rules into the Assistant frame in MV3 Squashed commit of the following: commit ff3daf01c1af2177956b136b7b2183adf904c716 Merge: b3456b40c 22849aaff Author: Slava Leleka Date: Mon Feb 17 11:18:05 2025 -0500 merge the parent branch into the current branch, resolve conflicts commit b3456b40c27d925292a5a4b02a6ae2a84a5a367d Merge: 6bb70770b e8fce47b3 Author: Slava Leleka Date: Mon Feb 17 10:43:52 2025 -0500 merge the parent branch into the current branch, resolve conflicts commit 6bb70770b4dba641aecce1c17ff92bec18c67abf Author: Slava Leleka Date: Mon Feb 17 10:26:20 2025 -0500 revert deps commit 2f873bb86f5d92764ed95405840c85b3c4b341c9 Merge: 15d8b120d de0a9de52 Author: Slava Leleka Date: Mon Feb 17 10:19:59 2025 -0500 resolve conflicts commit 15d8b120db2af0ef36b8390a52e07e9324c8f7e6 Merge: 3277f3684 d064fe5c8 Author: Slava Leleka Date: Mon Feb 17 10:18:39 2025 -0500 Merge branch 'master' into fix/AG-39527-01 commit 3277f36841ab55a84f18ec27d71c8ed19289854e Merge: 6c919efa7 8cd0bd166 Author: Slava Leleka Date: Mon Feb 17 10:15:11 2025 -0500 merge the parent branch into the current branch, resolve conflicts commit de0a9de52f9973134715aceb69fc1be8078f7fc4 Author: Slava Leleka Date: Tue Feb 11 23:16:58 2025 -0500 update deps commit 2176ac131e2a410164a396b352a8ff365ea28f73 Merge: 88763a638 0111263b5 Author: Slava Leleka Date: Tue Feb 11 23:14:51 2025 -0500 merge the parent branch into the current branch, resolve conflicts commit 88763a6381bf239c404ea99fcd9cd7616ecbe113 Merge: 6c919efa7 90288d2d7 Author: Slava Leleka Date: Mon Feb 10 22:57:17 2025 -0500 Merge branch 'master' into fix/AG-39527-01 commit 6c919efa782a11af47574bd71e9972dc28cb9a90 Author: Slava Leleka Date: Thu Feb 6 11:04:19 2025 -0500 update deps commit a309541e603077478a59a3c11107329f1f5c05d0 Author: Slava Leleka Date: Thu Feb 6 11:01:56 2025 -0500 fix changelog --- CHANGELOG.md | 1 + package.json | 6 +++--- pnpm-lock.yaml | 50 +++++++++++++++++++++++++------------------------- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e05881b538..65a809b1e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Don't show lines for absent metadata when adding a custom filter [#3057]. - Filtering log does not observe tab changes, openings, or closings. - Scriptlets and scripts are executed too late on website reload or navigation in MV2 [#2855]. +- Do not inject cosmetic rules into the Assistant frame in MV3. ### Removed diff --git a/package.json b/package.json index 20fbc2012e..6d999d5368 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ }, "pnpm": { "overrides": { - "@adguard/tswebextension>@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz" + "@adguard/tswebextension>@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz" } }, "dependencies": { @@ -123,8 +123,8 @@ "@adguard/logger": "^1.1.1", "@adguard/scriptlets": "^2.1.4", "@adguard/translate": "^1.0.2", - "@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz", - "@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz", + "@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz", + "@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tswebextension/tswebextension.tgz", "@xstate/react": "^4.1.3", "ace-builds": "^1.17.0", "assert": "^2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f89fc038cf..a9bcdab9e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@adguard/tswebextension>@adguard/tsurlfilter': https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz + '@adguard/tswebextension>@adguard/tsurlfilter': https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz dependencies: '@adguard/agtree': @@ -24,11 +24,11 @@ dependencies: specifier: ^1.0.2 version: 1.0.2 '@adguard/tsurlfilter': - specifier: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz - version: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' + specifier: https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz + version: '@github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' '@adguard/tswebextension': - specifier: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz - version: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)' + specifier: https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tswebextension/tswebextension.tgz + version: '@github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)' '@xstate/react': specifier: ^4.1.3 version: 4.1.3(@types/react@17.0.83)(react@17.0.2)(xstate@5.19.0) @@ -2464,8 +2464,8 @@ packages: optional: true dependencies: react: 17.0.2 - use-isomorphic-layout-effect: 1.1.2(@types/react@17.0.83)(react@17.0.2) - use-sync-external-store: 1.2.0(react@17.0.2) + use-isomorphic-layout-effect: 1.2.0(@types/react@17.0.83)(react@17.0.2) + use-sync-external-store: 1.4.0(react@17.0.2) xstate: 5.19.0 transitivePeerDependencies: - '@types/react' @@ -3019,8 +3019,8 @@ packages: engines: {node: '>=8'} dev: true - /call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 @@ -3037,7 +3037,7 @@ packages: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.2.7 dev: false @@ -3837,7 +3837,7 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 dev: false @@ -4775,7 +4775,7 @@ packages: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -8339,11 +8339,11 @@ packages: resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} dev: true - /use-isomorphic-layout-effect@1.1.2(@types/react@17.0.83)(react@17.0.2): - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + /use-isomorphic-layout-effect@1.2.0(@types/react@17.0.83)(react@17.0.2): + resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -8352,10 +8352,10 @@ packages: react: 17.0.2 dev: false - /use-sync-external-store@1.2.0(react@17.0.2): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + /use-sync-external-store@1.4.0(react@17.0.2): + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 dependencies: react: 17.0.2 dev: false @@ -8912,9 +8912,9 @@ packages: zod: 3.23.8 dev: true - '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz} - id: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz' + '@github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz} + id: '@github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz' name: '@adguard/tsurlfilter' version: 3.2.0-alpha.0 engines: {node: '>=20'} @@ -8938,9 +8938,9 @@ packages: zod-validation-error: 3.4.0(zod@3.21.4) dev: false - '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)': - resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz} - id: '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tswebextension/tswebextension.tgz' + '@github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tswebextension/tswebextension.tgz(@adguard/re2-wasm@1.2.0)': + resolution: {tarball: https://github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tswebextension/tswebextension.tgz} + id: '@github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tswebextension/tswebextension.tgz' name: '@adguard/tswebextension' version: 3.0.0-alpha.1 engines: {node: '>=20'} @@ -8951,7 +8951,7 @@ packages: '@adguard/extended-css': 2.1.1 '@adguard/logger': 1.1.1 '@adguard/scriptlets': 2.1.4 - '@adguard/tsurlfilter': '@github.com/AdguardTeam/tsurlfilter/raw/494becc192bbbcc12431af85e5758c1c217333a7/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' + '@adguard/tsurlfilter': '@github.com/AdguardTeam/tsurlfilter/raw/b2459633394916300bce024390fc758c33f473a2/packages/tsurlfilter/tsurlfilter.tgz(@adguard/re2-wasm@1.2.0)' bowser: 2.11.0 chrome-types: 0.1.325 commander: 11.0.0 From 97a9bb673da72e275e8f59ca5e6529af43f9e82f Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 17 Feb 2025 19:34:54 +0300 Subject: [PATCH 11/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d999d5368..2650a507e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.42", + "version": "5.1.43", "description": "AdGuard Extension", "type": "module", "scripts": { From 53993bfacc8fbe6e33351f20f27724c773ff387c Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Mon, 17 Feb 2025 22:33:58 +0300 Subject: [PATCH 12/29] remove explicit packageManager Squashed commit of the following: commit da6578095616a3c5cd2e96a34cb713be19b53ef0 Author: Slava Leleka Date: Mon Feb 17 14:26:30 2025 -0500 remove explicit packageManager --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 2650a507e9..8307ca5e92 100644 --- a/package.json +++ b/package.json @@ -161,6 +161,5 @@ "xstate": "^5.19.0", "zod": "^3.21.4", "zod-validation-error": "^3.4.0" - }, - "packageManager": "pnpm@8.15.1+sha512.831cf4c5f8b8374af71521d4d153db49d7086de615c2af7cb5e9d7eb8ba630ddac46fea495d643e552ef2e68a3aa99a3e5e9fbee8696702967504df5c59cb273" + } } From 5097e57329c326540354e2039010db4b5d7e8dec Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 17 Feb 2025 22:34:40 +0300 Subject: [PATCH 13/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8307ca5e92..fbd08fd134 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.43", + "version": "5.1.44", "description": "AdGuard Extension", "type": "module", "scripts": { From b495aeab86eef755c1412f066a36189d23842e11 Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Tue, 18 Feb 2025 17:40:51 +0300 Subject: [PATCH 14/29] AG-40043: enable custom filters for MV2 only Squashed commit of the following: commit 8e223b52ce63d6438bdfd981bcb4fb383368f9b9 Author: Dmitriy Seregin Date: Tue Feb 18 17:22:54 2025 +0300 simplify condition commit 960bf2cbcf49b7bf566309d58b7758e0ee9ebc93 Author: Dmitriy Seregin Date: Tue Feb 18 15:50:23 2025 +0300 fix commit 14c680b479a87747a4cd3477db827e3f4931aa96 Author: Dmitriy Seregin Date: Tue Feb 18 14:59:23 2025 +0300 fixed linter commit 637a7c29784ba801ae8c1683487d324aae0697bd Author: Dmitriy Seregin Date: Tue Feb 18 14:48:00 2025 +0300 fixes commit 1e7f62fb36aac5c5fc65e611db75db8cb62263c4 Author: Dmitriy Seregin Date: Tue Feb 18 13:49:24 2025 +0300 AG-40043: enable custom filters for MV2 only --- .eslintrc.cjs | 11 +- .../src/background/api/filters/categories.ts | 16 +- .../src/background/api/filters/common.ts | 5 +- .../src/background/api/filters/custom.ts | 335 +++++++++--------- .../background/api/filters/custom/loader.ts | 71 ++-- .../src/background/api/filters/update.ts | 8 +- Extension/src/background/api/settings/main.ts | 10 +- Extension/src/background/app/app-mv2.ts | 4 +- Extension/src/background/engine/engine-mv2.ts | 58 ++- .../custom-filters-service-mv2.ts | 245 +++++++------ .../services/custom-filters/index.ts | 3 +- Extension/src/background/services/index.ts | 2 +- .../options/components/Filters/Group.jsx | 8 +- .../src/pages/options/stores/SettingsStore.js | 56 +-- .../fixtures/getCustomExportFixture.ts | 70 ++-- tests/helpers/fixtures/settingsSchemaV2.ts | 48 +-- tests/src/background/api/settings.test.ts | 8 +- tools/bundle/webpack.common.ts | 11 +- tsconfig.base.json | 3 +- tsconfig.with_types_mv2.json | 3 +- tsconfig.with_types_mv3.json | 3 +- 21 files changed, 504 insertions(+), 474 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 95bf8b1411..7c0be65823 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -123,11 +123,12 @@ module.exports = { 'position': 'after', }, // Place custom-filters-service alias after internal - { - 'pattern': 'custom-filters-service', - 'group': 'internal', - 'position': 'after', - }, + // TODO: Uncomment this block when custom filters will be supported for MV3. + // { + // 'pattern': 'custom-filters-service', + // 'group': 'internal', + // 'position': 'after', + // }, // Place rules-limits-service alias after internal { 'pattern': 'rules-limits-service', diff --git a/Extension/src/background/api/filters/categories.ts b/Extension/src/background/api/filters/categories.ts index 8b8b8495f6..4288cdfa6d 100644 --- a/Extension/src/background/api/filters/categories.ts +++ b/Extension/src/background/api/filters/categories.ts @@ -83,12 +83,16 @@ export class Categories { */ public static getCategories(): CategoriesData { const groups = Categories.getGroups(); - const filters = Categories.getFilters().filter((f) => { - // Exclude Quick Fixes filter and custom filters from filters list - // TODO: remove this check when Quick Fixes Filter and custom filters will be supported for MV3 again - return f.filterId !== AntiBannerFiltersId.QuickFixesFilterId - && !CustomFilterHelper.isCustomFilter(f.filterId); - }); + let filters = Categories.getFilters(); + + // Exclude Quick Fixes filter and custom filters from filters list + // TODO: remove this check when Quick Fixes Filter and custom filters will be supported for MV3 again + if (__IS_MV3__) { + filters = filters.filter((f) => { + return f.filterId !== AntiBannerFiltersId.QuickFixesFilterId + && !CustomFilterHelper.isCustomFilter(f.filterId); + }); + } const categories = groups.map((group) => ({ ...group, diff --git a/Extension/src/background/api/filters/common.ts b/Extension/src/background/api/filters/common.ts index 2c41ed9f59..4ae5cfb741 100644 --- a/Extension/src/background/api/filters/common.ts +++ b/Extension/src/background/api/filters/common.ts @@ -224,8 +224,9 @@ export class CommonFilterApi { shouldWaitFullUpdate: isPatchUpdateFailed, }); - // Note: we should array of rules here, because they contain preprocessed directives, - // e.g. including another filter via `!#include` directive. + // Note: we should join array of rules here, because they contain + // preprocessed directives, e.g. including another filter via `!#include` + // directive. await FiltersStorage.set(filterUpdateOptions.filterId, filter.join('\n')); await RawFiltersStorage.set(filterUpdateOptions.filterId, rawFilter); diff --git a/Extension/src/background/api/filters/custom.ts b/Extension/src/background/api/filters/custom.ts index dd0cd0b2d7..de8e28cdc0 100644 --- a/Extension/src/background/api/filters/custom.ts +++ b/Extension/src/background/api/filters/custom.ts @@ -17,25 +17,26 @@ */ import MD5 from 'crypto-js/md5'; -// import { DownloadResult } from '@adguard/filters-downloader/browser'; +import { DownloadResult } from '@adguard/filters-downloader/browser'; import { BrowserUtils } from '../../utils/browser-utils'; -import { CUSTOM_FILTERS_START_ID } from '../../../common/constants'; +import { AntibannerGroupsId, CUSTOM_FILTERS_START_ID } from '../../../common/constants'; import { logger } from '../../../common/logger'; import { CustomFilterMetadata, customFilterMetadataStorageDataValidator } from '../../schema'; import { customFilterMetadataStorage } from '../../storages/custom-filter-metadata'; import { filterStateStorage } from '../../storages/filter-state'; -// import { groupStateStorage } from '../../storages/group-state'; +import { groupStateStorage } from '../../storages/group-state'; import { filterVersionStorage } from '../../storages/filter-version'; import { RawFiltersStorage } from '../../storages/raw-filters'; import { FiltersStorage } from '../../storages/filters'; import { type Network } from '../network/main'; import { CustomFilterHelper } from '../../../common/custom-filter-helper'; -// import { createPromiseWithTimeout } from '../../utils/timeouts'; +import { createPromiseWithTimeout } from '../../utils/timeouts'; -// import type { FilterUpdateOptions } from './update'; +import type { FilterUpdateOptions } from './update'; import { FilterParsedData, FilterParser } from './parser'; import { type FilterMetadata } from './main'; +import { CustomFilterLoader } from './custom/loader'; /** * Data transfer object for {@link CustomFilterApi} methods. @@ -88,10 +89,10 @@ export type GetRemoteCustomFilterResult = { parsed: FilterParsedData, }; -// const emptyDownloadResult: DownloadResult = { -// filter: [], -// rawFilter: '', -// }; +const emptyDownloadResult: DownloadResult = { + filter: [], + rawFilter: '', +}; /** * API for managing custom filters data. @@ -202,98 +203,99 @@ export class CustomFilterApi { * * @returns Created filter metadata. */ - // TODO: Uncomment when custom filters will be supported for MV3 again - // public static async createFilter(filterData: CustomFilterDTO): Promise { - // const { customUrl, trusted, enabled } = filterData; - - // // download and parse custom filter data - // const { - // rawRules, - // rules, - // parsed, - // checksum, - // } = await CustomFilterApi.getRemoteFilterData(customUrl); - - // // create new filter id - // const filterId = CustomFilterApi.genFilterId(); - - // logger.info(`Create new custom filter with id ${filterId}`); - - // const name = filterData.title ? filterData.title : parsed.name; - - // const { - // description, - // homepage, - // expires, - // timeUpdated, - // version, - // diffPath, - // } = parsed; - - // const filterMetadata: CustomFilterMetadata = { - // filterId, - // displayNumber: 0, - // groupId: AntibannerGroupsId.CustomFiltersGroupId, - // name, - // description, - // homepage, - // version, - // checksum, - // tags: [0], - // customUrl, - // trusted, - // expires: Number(expires), - // timeUpdated: new Date(timeUpdated).getTime(), - // }; - - // customFilterMetadataStorage.set(filterMetadata); - - // filterVersionStorage.set(filterId, { - // version, - // diffPath, - // expires: filterMetadata.expires, - // lastUpdateTime: filterMetadata.timeUpdated, - // lastCheckTime: Date.now(), - // lastScheduledCheckTime: Date.now(), - // }); - - // filterStateStorage.set(filterId, { - // loaded: true, - // installed: true, - // enabled, - // }); - - // await FiltersStorage.set(filterId, rules); - // await RawFiltersStorage.set(filterId, rawRules); - - // const group = groupStateStorage.get(filterMetadata.groupId); - - // // If group has never been enabled - enables it. - // if (group && !group.touched) { - // groupStateStorage.enableGroups([filterMetadata.groupId]); - // } - - // return filterMetadata; - // } + public static async createFilter(filterData: CustomFilterDTO): Promise { + const { customUrl, trusted, enabled } = filterData; + + // download and parse custom filter data + const { + rawRules, + rules, + parsed, + checksum, + } = await CustomFilterApi.getRemoteFilterData(customUrl); + + // create new filter id + const filterId = CustomFilterApi.genFilterId(); + + logger.info(`Create new custom filter with id ${filterId}`); + + const name = filterData.title ? filterData.title : parsed.name; + + const { + description, + homepage, + expires, + timeUpdated, + version, + diffPath, + } = parsed; + + const filterMetadata: CustomFilterMetadata = { + filterId, + displayNumber: 0, + groupId: AntibannerGroupsId.CustomFiltersGroupId, + name, + description, + homepage, + version, + checksum, + tags: [0], + customUrl, + trusted, + expires: Number(expires), + timeUpdated: new Date(timeUpdated).getTime(), + }; + + customFilterMetadataStorage.set(filterMetadata); + + filterVersionStorage.set(filterId, { + version, + diffPath, + expires: filterMetadata.expires, + lastUpdateTime: filterMetadata.timeUpdated, + lastCheckTime: Date.now(), + lastScheduledCheckTime: Date.now(), + }); + + filterStateStorage.set(filterId, { + loaded: true, + installed: true, + enabled, + }); + + // Note: we should join array of rules here, because they contain + // preprocessed directives, e.g. including another filter via `!#include` + // directive. + await FiltersStorage.set(filterId, rules.join('\n')); + await RawFiltersStorage.set(filterId, rawRules); + + const group = groupStateStorage.get(filterMetadata.groupId); + + // If group has never been enabled - enables it. + if (group && !group.touched) { + groupStateStorage.enableGroups([filterMetadata.groupId]); + } + + return filterMetadata; + } /** * Creates new custom filters from the passed DTO array. * * @param filtersData Array of {@link CustomFilterDTO}. */ - // TODO: Uncomment when custom filters will be supported for MV3 again - // public static async createFilters(filtersData: CustomFilterDTO[]): Promise { - // const tasks = filtersData.map((filterData) => CustomFilterApi.createFilter(filterData)); + public static async createFilters(filtersData: CustomFilterDTO[]): Promise { + const tasks = filtersData.map((filterData) => CustomFilterApi.createFilter(filterData)); - // const promises = await Promise.allSettled(tasks); + const promises = await Promise.allSettled(tasks); - // // Handles errors - // promises.forEach((promise) => { - // if (promise.status === 'rejected') { - // logger.error('Cannot create filter due to: ', promise.reason); - // } - // }); - // } + // Handles errors + promises.forEach((promise) => { + if (promise.status === 'rejected') { + logger.error('Cannot create filter due to: ', promise.reason); + } + }); + } /** * Updates custom filter data by id. @@ -308,36 +310,35 @@ export class CustomFilterApi { * @returns Updated filter metadata or null, if filter is not existed * or new version is not available. */ - // TODO: Uncomment when custom filters will be supported for MV3 again - // public static async updateFilter( - // filterUpdateOptions: FilterUpdateOptions, - // ): Promise { - // logger.info(`Update Custom filter ${filterUpdateOptions.filterId} ...`); + public static async updateFilter( + filterUpdateOptions: FilterUpdateOptions, + ): Promise { + logger.info(`Update Custom filter ${filterUpdateOptions.filterId} ...`); - // const filterMetadata = customFilterMetadataStorage.getById(filterUpdateOptions.filterId); + const filterMetadata = customFilterMetadataStorage.getById(filterUpdateOptions.filterId); - // if (!filterMetadata) { - // logger.error(`Cannot find custom filter ${filterUpdateOptions.filterId} metadata`); - // return null; - // } + if (!filterMetadata) { + logger.error(`Cannot find custom filter ${filterUpdateOptions.filterId} metadata`); + return null; + } - // const { customUrl } = filterMetadata; + const { customUrl } = filterMetadata; - // const rawFilter = await RawFiltersStorage.get(filterUpdateOptions.filterId); - // const filterRemoteData = await CustomFilterApi.getRemoteFilterData( - // customUrl, - // rawFilter, - // filterUpdateOptions.ignorePatches, - // ); + const rawFilter = await RawFiltersStorage.get(filterUpdateOptions.filterId); + const filterRemoteData = await CustomFilterApi.getRemoteFilterData( + customUrl, + rawFilter, + filterUpdateOptions.ignorePatches, + ); - // if (!CustomFilterApi.isFilterNeedUpdate(filterMetadata, filterRemoteData)) { - // logger.info(`Custom filter ${filterUpdateOptions.filterId} is already updated`); - // return null; - // } + if (!CustomFilterApi.isFilterNeedUpdate(filterMetadata, filterRemoteData)) { + logger.info(`Custom filter ${filterUpdateOptions.filterId} is already updated`); + return null; + } - // logger.info(`Successfully update custom filter ${filterUpdateOptions.filterId}`); - // return CustomFilterApi.updateFilterData(filterMetadata, filterRemoteData); - // } + logger.info(`Successfully update custom filter ${filterUpdateOptions.filterId}`); + return CustomFilterApi.updateFilterData(filterMetadata, filterRemoteData); + } /** * Removes custom filter data from storages, @@ -477,8 +478,9 @@ export class CustomFilterApi { customFilterMetadataStorage.set(newFilterMetadata); - // Note: we should array of rules here, because they contain preprocessed directives, - // e.g. including another filter via `!#include` directive. + // Note: we should join array of rules here, because they contain + // preprocessed directives, e.g. including another filter via `!#include` + // directive. await FiltersStorage.set(filterId, rules.join('\n')); await RawFiltersStorage.set(filterId, rawRules); @@ -562,51 +564,52 @@ export class CustomFilterApi { * * @returns Downloaded and parsed filter data. */ - // TODO: Uncomment when custom filters will be supported for MV3 again - // private static async getRemoteFilterData( - // url: string, - // rawFilter?: string, - // force?: boolean, - // ): Promise { - // logger.info(`Get custom filter data from ${url}`); - - // const downloadResult = await CustomFilterLoader.downloadRulesWithTimeout(url, rawFilter, force); - - // const parsed = FilterParser.parseFilterDataFromHeader(downloadResult.filter); - - // const { version } = parsed; - - // const checksum = !version || !BrowserUtils.isSemver(version) - // ? CustomFilterApi.getChecksum(downloadResult.filter) - // : null; - - // return { - // rawRules: downloadResult.rawFilter, - // rules: downloadResult.filter, - // parsed, - // checksum, - // }; - // } - - // /** - // * Limits custom filter rules downloading with timeout. - // * - // * @param url Custom filter download url. - // * @param rawFilter Optional raw filter rules. - // * @param force Optional flag to choose download filter in whole or by patches. - // * @throws Error if filter was not downloaded in {@link DOWNLOAD_LIMIT_MS}. - // * @returns Downloaded custom filter rules. - // */ - // public static async downloadRulesWithTimeout( - // url: string, - // rawFilter?: string, - // force?: boolean, - // ): Promise { - // return createPromiseWithTimeout( - // CustomFilterApi.network.downloadFilterRulesBySubscriptionUrl(url, rawFilter, force) - // .then((val) => val || emptyDownloadResult), - // CustomFilterApi.DOWNLOAD_LIMIT_MS, - // 'Fetch timeout is over', - // ); - // } + private static async getRemoteFilterData( + url: string, + rawFilter?: string, + force?: boolean, + ): Promise { + logger.info(`Get custom filter data from ${url}`); + + const downloadResult = await CustomFilterLoader.downloadRulesWithTimeout(url, rawFilter, force); + + const parsed = FilterParser.parseFilterDataFromHeader(downloadResult.filter); + + const { version } = parsed; + + const checksum = !version || !BrowserUtils.isSemver(version) + ? CustomFilterApi.getChecksum(downloadResult.filter) + : null; + + return { + rawRules: downloadResult.rawFilter, + rules: downloadResult.filter, + parsed, + checksum, + }; + } + + /** + * Limits custom filter rules downloading with timeout. + * + * @param url Custom filter download url. + * @param rawFilter Optional raw filter rules. + * @param force Optional flag to choose download filter in whole or by patches. + * + * @returns Downloaded custom filter rules. + * + * @throws Error if filter was not downloaded in {@link DOWNLOAD_LIMIT_MS}. + */ + public static async downloadRulesWithTimeout( + url: string, + rawFilter?: string, + force?: boolean, + ): Promise { + return createPromiseWithTimeout( + CustomFilterApi.network.downloadFilterRulesBySubscriptionUrl(url, rawFilter, force) + .then((val) => val || emptyDownloadResult), + CustomFilterApi.DOWNLOAD_LIMIT_MS, + 'Fetch timeout is over', + ); + } } diff --git a/Extension/src/background/api/filters/custom/loader.ts b/Extension/src/background/api/filters/custom/loader.ts index 6ae3eb2f71..3bba4e2144 100644 --- a/Extension/src/background/api/filters/custom/loader.ts +++ b/Extension/src/background/api/filters/custom/loader.ts @@ -15,45 +15,46 @@ * You should have received a copy of the GNU General Public License * along with AdGuard Browser Extension. If not, see . */ -// TODO: Uncomment when custom filters will be supported for MV3 again -// import { type DownloadResult } from '@adguard/filters-downloader/browser'; +import { type DownloadResult } from '@adguard/filters-downloader/browser'; -// import { createPromiseWithTimeout } from '../../../utils/timeouts'; -// import { network } from '../../network'; +import { createPromiseWithTimeout } from '../../../utils/timeouts'; +import { network } from '../../network'; -// const emptyDownloadResult: DownloadResult = { -// filter: [], -// rawFilter: '', -// }; +const emptyDownloadResult: DownloadResult = { + filter: [], + rawFilter: '', +}; /** * Helper class for custom filters downloading with specified request time limitation. */ -// export class CustomFilterLoader { -// /** -// * Custom filter rules downloading limit in ms. -// */ -// private static DOWNLOAD_LIMIT_MS = 3 * 1000; +export class CustomFilterLoader { + /** + * Custom filter rules downloading limit in ms. + */ + private static DOWNLOAD_LIMIT_MS = 3 * 1000; -// /** -// * Limits custom filter rules downloading with timeout. -// * -// * @param url Custom filter download url. -// * @param rawFilter Optional raw filter rules. -// * @param force Optional flag to choose download filter in whole or by patches. -// * @throws Error if filter was not downloaded in {@link DOWNLOAD_LIMIT_MS}. -// * @returns Downloaded custom filter rules. -// */ -// public static async downloadRulesWithTimeout( -// url: string, -// rawFilter?: string, -// force?: boolean, -// ): Promise { -// return createPromiseWithTimeout( -// network.downloadFilterRulesBySubscriptionUrl(url, rawFilter, force) -// .then((val) => val || emptyDownloadResult), -// CustomFilterLoader.DOWNLOAD_LIMIT_MS, -// 'Fetch timeout is over', -// ); -// } -// } + /** + * Limits custom filter rules downloading with timeout. + * + * @param url Custom filter download url. + * @param rawFilter Optional raw filter rules. + * @param force Optional flag to choose download filter in whole or by patches. + * + * @returns Downloaded custom filter rules. + * + * @throws Error if filter was not downloaded in {@link DOWNLOAD_LIMIT_MS}. + */ + public static async downloadRulesWithTimeout( + url: string, + rawFilter?: string, + force?: boolean, + ): Promise { + return createPromiseWithTimeout( + network.downloadFilterRulesBySubscriptionUrl(url, rawFilter, force) + .then((val) => val || emptyDownloadResult), + CustomFilterLoader.DOWNLOAD_LIMIT_MS, + 'Fetch timeout is over', + ); + } +} diff --git a/Extension/src/background/api/filters/update.ts b/Extension/src/background/api/filters/update.ts index dc29a363c7..f57d17b8f1 100644 --- a/Extension/src/background/api/filters/update.ts +++ b/Extension/src/background/api/filters/update.ts @@ -230,11 +230,15 @@ export class FilterUpdateApi { const updatedFiltersMetadata: FilterMetadata[] = []; const updateTasks = filterUpdateOptionsList.map(async (filterData) => { + // TODO: Remove this block when custom filters will be supported for MV3 + if (__IS_MV3__) { + return; + } + let filterMetadata: CustomFilterMetadata | RegularFilterMetadata | null = null; if (CustomFilterApi.isCustomFilter(filterData.filterId)) { - // TODO: Uncomment this block when custom filters will be supported for MV3 - // filterMetadata = await CustomFilterApi.updateFilter(filterData); + filterMetadata = await CustomFilterApi.updateFilter(filterData); } else { filterMetadata = await CommonFilterApi.updateFilter(filterData); } diff --git a/Extension/src/background/api/settings/main.ts b/Extension/src/background/api/settings/main.ts index fefe951d31..66e55945bf 100644 --- a/Extension/src/background/api/settings/main.ts +++ b/Extension/src/background/api/settings/main.ts @@ -516,13 +516,10 @@ export class SettingsApi { /** * Imports filters settings from object of {@link FiltersConfig}. - * Ignoring custom filters since AG-39385. - * TODO: uncomment when custom filters will be supported for MV3. */ private static async importFilters({ [FiltersOption.EnabledFilters]: enabledFilters, [FiltersOption.EnabledGroups]: enabledGroups, - // eslint-disable-next-line @typescript-eslint/no-unused-vars [FiltersOption.CustomFilters]: customFilters, [FiltersOption.UserFilter]: userFilter, [FiltersOption.Allowlist]: allowlist, @@ -543,8 +540,11 @@ export class SettingsApi { await SettingsApi.loadBuiltInFiltersMv2(builtInFilters); } - // TODO: Uncomment this block when custom filters will be supported for MV3 - // await CustomFilterApi.createFilters(customFilters); + // TODO: Uncomment this block when custom filters will be supported for MV3. + // Ignoring custom filters for MV3 since AG-39385. + if (!__IS_MV3__) { + await CustomFilterApi.createFilters(customFilters); + } groupStateStorage.enableGroups(enabledGroups); diff --git a/Extension/src/background/app/app-mv2.ts b/Extension/src/background/app/app-mv2.ts index 5c789f1374..c16794cc24 100644 --- a/Extension/src/background/app/app-mv2.ts +++ b/Extension/src/background/app/app-mv2.ts @@ -67,6 +67,7 @@ import { getRunInfo } from '../utils'; import { contextMenuEvents, settingsEvents } from '../events'; import { KeepAlive } from '../keep-alive'; import { SafebrowsingService } from '../services/safebrowsing'; +import { CustomFiltersService } from '../services/custom-filters/custom-filters-service-mv2'; /** * Logs initialization times for debugging purposes. @@ -219,8 +220,7 @@ export class App { await FiltersService.init(); // Adds listeners specified for custom filters - // TODO: Uncomment this class when custom filters will be supported for MV3. - // CustomFiltersService.init(); + CustomFiltersService.init(); // Adds listeners for allowlist events AllowlistService.init(); diff --git a/Extension/src/background/engine/engine-mv2.ts b/Extension/src/background/engine/engine-mv2.ts index 90c90af985..165971549d 100644 --- a/Extension/src/background/engine/engine-mv2.ts +++ b/Extension/src/background/engine/engine-mv2.ts @@ -38,7 +38,6 @@ import { DocumentBlockApi, network, filteringLogApi, - CustomFilterApi, } from '../api'; import { NotifierType } from '../../common/constants'; @@ -123,37 +122,34 @@ export class Engine implements TsWebExtensionEngine { const filters: ConfigurationMV2['filters'] = []; - const tasks = enabledFilters - // TODO: Remove filtering when support of custom filters will be added back. - .filter((filterId) => !CustomFilterApi.isCustomFilter(filterId)) - .map(async (filterId) => { - try { - const [content, sourceMap] = await Promise.all([ - FiltersStorage.getFilterList(filterId), - FiltersStorage.getSourceMap(filterId), - ]); - - if (!content) { - logger.error(`Failed to get filter ${filterId}`); - return; - } - - if (!sourceMap) { - logger.warn(`Source map is not found for filter ${filterId}`); - } - - const trusted = FiltersApi.isFilterTrusted(filterId); - - filters.push({ - filterId, - content, - trusted, - sourceMap, - }); - } catch (e) { - logger.error(`Failed to get filter ${filterId}`, e); + const tasks = enabledFilters.map(async (filterId) => { + try { + const [content, sourceMap] = await Promise.all([ + FiltersStorage.getFilterList(filterId), + FiltersStorage.getSourceMap(filterId), + ]); + + if (!content) { + logger.error(`Failed to get filter ${filterId}`); + return; + } + + if (!sourceMap) { + logger.warn(`Source map is not found for filter ${filterId}`); } - }); + + const trusted = FiltersApi.isFilterTrusted(filterId); + + filters.push({ + filterId, + content, + trusted, + sourceMap, + }); + } catch (e) { + logger.error(`Failed to get filter ${filterId}`, e); + } + }); await Promise.all(tasks); diff --git a/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts b/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts index 3a481738ea..9b628c563c 100644 --- a/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts +++ b/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts @@ -16,133 +16,132 @@ * along with AdGuard Browser Extension. If not, see . */ -// import browser, { type WebNavigation } from 'webextension-polyfill'; - -// import { executeScript } from 'scripting-service'; - -// import { -// MAIN_FRAME_ID, -// isHttpOrWsRequest, -// tabsApi as tsWebExtTabsApi, -// } from '../../tswebextension'; -// import { SUBSCRIBE_OUTPUT } from '../../../../../constants'; -// import { NotifierType, BACKGROUND_TAB_ID } from '../../../common/constants'; -// import { -// MessageType, -// LoadCustomFilterInfoMessage, -// SubscribeToCustomFilterMessage, -// RemoveAntiBannerFilterMessage, -// } from '../../../common/messages'; -// import { CustomFilterApi, GetCustomFilterInfoResult } from '../../api/filters/custom'; -// import { messageHandler } from '../../message-handler'; -// import { notifier } from '../../notifier'; -// import { engine } from '../../engine'; -// import type { CustomFilterMetadata } from '../../schema'; +import browser, { type WebNavigation } from 'webextension-polyfill'; + +import { + MAIN_FRAME_ID, + isHttpOrWsRequest, + tabsApi as tsWebExtTabsApi, +} from '../../tswebextension'; +import { SUBSCRIBE_OUTPUT } from '../../../../../constants'; +import { NotifierType, BACKGROUND_TAB_ID } from '../../../common/constants'; +import { + MessageType, + LoadCustomFilterInfoMessage, + SubscribeToCustomFilterMessage, + RemoveAntiBannerFilterMessage, +} from '../../../common/messages'; +import { CustomFilterApi, GetCustomFilterInfoResult } from '../../api/filters/custom'; +import { messageHandler } from '../../message-handler'; +import { notifier } from '../../notifier'; +import { engine } from '../../engine'; +import type { CustomFilterMetadata } from '../../schema'; +import { executeScript } from '../scripting/scripting-service-mv2'; /** * Service for processing events with custom filters. * TODO: Uncomment this class when custom filters will be supported for MV3. */ export class CustomFiltersService { - // /** - // * Init handlers. - // */ - // static init(): void { - // messageHandler.addListener(MessageType.LoadCustomFilterInfo, CustomFiltersService.onCustomFilterInfoLoad); - // eslint-disable-next-line max-len - // messageHandler.addListener(MessageType.SubscribeToCustomFilter, CustomFiltersService.onCustomFilterSubscription); - // messageHandler.addListener(MessageType.RemoveAntiBannerFilter, CustomFiltersService.onCustomFilterRemove); - - // browser.webNavigation.onCommitted.addListener(CustomFiltersService.injectSubscriptionScript); - // } - - // /** - // * Returns custom filter info for modal window. - // * - // * @param message Message data. - // * - // * @returns Custom filter info. - // */ - // static async onCustomFilterInfoLoad(message: LoadCustomFilterInfoMessage): Promise { - // const { url, title } = message.data; - - // return CustomFilterApi.getFilterInfo(url, title); - // } - - // /** - // * Add new custom filter. - // * - // * @param message Message data. - // * - // * @returns Custom filter metadata. - // */ - // static async onCustomFilterSubscription(message: SubscribeToCustomFilterMessage): Promise { - // const { filter } = message.data; - - // const { customUrl, name, trusted } = filter; - - // // Creates a filter and enables the group if necessary. - // const filterMetadata = await CustomFilterApi.createFilter({ - // customUrl, - // title: name, - // trusted, - // enabled: true, - // }); - - // engine.debounceUpdate(); - - // notifier.notifyListeners(NotifierType.CustomFilterAdded); - // return filterMetadata; - // } - - // /** - // * Removes a custom filter. - // * - // * If the filter was enabled, the engine will be updated. - // * - // * @param message Message data. - // */ - // static async onCustomFilterRemove(message: RemoveAntiBannerFilterMessage): Promise { - // const { filterId } = message.data; - - // const wasEnabled = await CustomFilterApi.removeFilter(filterId); - // if (wasEnabled) { - // engine.debounceUpdate(); - // } - // } - - // /** - // * Inject custom filter subscription content script to tab. - // * - // * @param details OnCommitted event request details. - // */ - // static async injectSubscriptionScript(details: WebNavigation.OnCommittedDetailsType): Promise { - // const { tabId, frameId } = details; - - // if (tabId === BACKGROUND_TAB_ID) { - // return; - // } - - // const frame = tsWebExtTabsApi.getTabFrame(tabId, frameId); - - // if (!frame) { - // return; - // } - - // const isDocumentFrame = frameId === MAIN_FRAME_ID; - - // if (!isDocumentFrame || !isHttpOrWsRequest(frame.url)) { - // return; - // } - - // try { - // await executeScript(tabId, { - // files: [`/${SUBSCRIBE_OUTPUT}.js`], - // runAt: 'document_start', - // frameId, - // }); - // } catch (e) { - // // do nothing - // } - // } + /** + * Init handlers. + */ + static init(): void { + messageHandler.addListener(MessageType.LoadCustomFilterInfo, CustomFiltersService.onCustomFilterInfoLoad); + // eslint-disable-next-line max-len + messageHandler.addListener(MessageType.SubscribeToCustomFilter, CustomFiltersService.onCustomFilterSubscription); + messageHandler.addListener(MessageType.RemoveAntiBannerFilter, CustomFiltersService.onCustomFilterRemove); + + browser.webNavigation.onCommitted.addListener(CustomFiltersService.injectSubscriptionScript); + } + + /** + * Returns custom filter info for modal window. + * + * @param message Message data. + * + * @returns Custom filter info. + */ + static async onCustomFilterInfoLoad(message: LoadCustomFilterInfoMessage): Promise { + const { url, title } = message.data; + + return CustomFilterApi.getFilterInfo(url, title); + } + + /** + * Add new custom filter. + * + * @param message Message data. + * + * @returns Custom filter metadata. + */ + static async onCustomFilterSubscription(message: SubscribeToCustomFilterMessage): Promise { + const { filter } = message.data; + + const { customUrl, name, trusted } = filter; + + // Creates a filter and enables the group if necessary. + const filterMetadata = await CustomFilterApi.createFilter({ + customUrl, + title: name, + trusted, + enabled: true, + }); + + engine.debounceUpdate(); + + notifier.notifyListeners(NotifierType.CustomFilterAdded); + return filterMetadata; + } + + /** + * Removes a custom filter. + * + * If the filter was enabled, the engine will be updated. + * + * @param message Message data. + */ + static async onCustomFilterRemove(message: RemoveAntiBannerFilterMessage): Promise { + const { filterId } = message.data; + + const wasEnabled = await CustomFilterApi.removeFilter(filterId); + if (wasEnabled) { + engine.debounceUpdate(); + } + } + + /** + * Inject custom filter subscription content script to tab. + * + * @param details OnCommitted event request details. + */ + static async injectSubscriptionScript(details: WebNavigation.OnCommittedDetailsType): Promise { + const { tabId, frameId } = details; + + if (tabId === BACKGROUND_TAB_ID) { + return; + } + + const frame = tsWebExtTabsApi.getTabFrame(tabId, frameId); + + if (!frame) { + return; + } + + const isDocumentFrame = frameId === MAIN_FRAME_ID; + + if (!isDocumentFrame || !isHttpOrWsRequest(frame.url)) { + return; + } + + try { + await executeScript(tabId, { + files: [`/${SUBSCRIBE_OUTPUT}.js`], + runAt: 'document_start', + frameId, + }); + } catch (e) { + // do nothing + } + } } diff --git a/Extension/src/background/services/custom-filters/index.ts b/Extension/src/background/services/custom-filters/index.ts index dd055eb1f9..15588dc8e6 100644 --- a/Extension/src/background/services/custom-filters/index.ts +++ b/Extension/src/background/services/custom-filters/index.ts @@ -27,4 +27,5 @@ * * By default, MV3 will be used. */ -export { CustomFiltersService } from 'custom-filters-service'; +// TODO: Uncomment this line when custom filters will be supported for MV3. +// export { CustomFiltersService } from 'custom-filters-service'; diff --git a/Extension/src/background/services/index.ts b/Extension/src/background/services/index.ts index 23d8b4f205..71ab9abb94 100644 --- a/Extension/src/background/services/index.ts +++ b/Extension/src/background/services/index.ts @@ -19,7 +19,7 @@ export * from './filtering-log'; export * from './settings'; export * from './allowlist'; export * from './fullscreen-user-rules-editor'; -export * from './custom-filters'; +export * from './custom-filters/custom-filters-service-mv2'; export * from './userrules'; export * from './event'; export * from './ui'; diff --git a/Extension/src/pages/options/components/Filters/Group.jsx b/Extension/src/pages/options/components/Filters/Group.jsx index f64f8244c9..9f718840a7 100644 --- a/Extension/src/pages/options/components/Filters/Group.jsx +++ b/Extension/src/pages/options/components/Filters/Group.jsx @@ -75,7 +75,7 @@ const renderEnabledFilters = (enabledFilters) => { return reactTranslator.getMessage('options_filters_no_enabled'); }; -const CustomFiltersGroup = ({ +const DisabledCustomFiltersGroup = ({ groupName, groupId, enabledFilters, @@ -134,9 +134,10 @@ const Group = ({ 'group--disabled': !checkboxValue, }); - if (groupId === AntibannerGroupsId.CustomFiltersGroupId) { + // TODO: Remove this component when custom filters will be supported for MV3. + if (__IS_MV3__ && groupId === AntibannerGroupsId.CustomFiltersGroupId) { return ( - groupId !== AntibannerGroupsId.CustomFiltersGroupId) - .filter((filter) => { - if (Number.isInteger(this.selectedGroupId)) { - return filter.groupId === this.selectedGroupId; - } + return selectedFilters.filter((filter) => { + // TODO: Do not show custom filters in MV3 in the list of filters, + // until we add them back. (AG-39385) + if (__IS_MV3__ && filter.groupId === AntibannerGroupsId.CustomFiltersGroupId) { + return false; + } + + // If selected group of filters, prevent showing filters from + // other groups. + if (Number.isInteger(this.selectedGroupId) && filter.groupId !== this.selectedGroupId) { + return false; + } + + const nameIsMatching = filter.name.match(searchQuery); + if (nameIsMatching) { return true; - }) - .filter((filter) => { - const nameIsMatching = filter.name.match(searchQuery); - if (nameIsMatching) { - return true; - } + } - if (filter.tagsDetails) { - const tagKeywordIsMatching = filter.tagsDetails.some((tag) => `#${tag.keyword}`.match(searchQuery)); - if (tagKeywordIsMatching) { - return true; - } + if (filter.tagsDetails) { + const tagKeywordIsMatching = filter.tagsDetails.some((tag) => `#${tag.keyword}`.match(searchQuery)); + if (tagKeywordIsMatching) { + return true; } + } - // AG-10491 - if (filter.trusted && filter.trusted === true) { - const trustedTagMatching = `#${TRUSTED_TAG_KEYWORD}`.match(searchQuery); - if (trustedTagMatching) { - return true; - } + // AG-10491 + if (filter.trusted) { + const trustedTagMatching = `#${TRUSTED_TAG_KEYWORD}`.match(searchQuery); + if (trustedTagMatching) { + return true; } + } - return false; - }); + return false; + }); } @computed diff --git a/tests/helpers/fixtures/getCustomExportFixture.ts b/tests/helpers/fixtures/getCustomExportFixture.ts index a7041dc03c..1ba0666866 100644 --- a/tests/helpers/fixtures/getCustomExportFixture.ts +++ b/tests/helpers/fixtures/getCustomExportFixture.ts @@ -8,9 +8,12 @@ import { UserFilterOption, AllowlistOption, StealthOption, + CustomFilterOption, } from '../../../Extension/src/background/schema'; import { CUSTOM_FILTERS_START_ID } from '../../../Extension/src/common/constants'; +import { filterNameFixture } from './filterWithMetadata'; + // IMPORTANT: for all these objects with different protocol versions, the custom // filters urls must be unique in order to properly emulate receiving them from // the remote url. @@ -90,18 +93,25 @@ export const getImportedSettingsFromV1Fixture = () => { configV1[RootOption.Stealth][StealthOption.SelfDestructThirdPartyCookiesTime] = JSON.parse(configV1['stealth']['stealth-block-third-party-cookies-time']); // Fill up optional fields - // TODO: Uncomment this when we will return custom filters (AG-39385). - // configV1[RootOption.Filters][FiltersOption.CustomFilters][1]!.title = filterNameFixture; - // configV1[RootOption.Filters][FiltersOption.CustomFilters][1]!.trusted = false; - // configV1[RootOption.Filters][FiltersOption.CustomFilters][1]!.enabled = false; - // Since we remove downloading remove custom filters in AG-39385, we cannot - // support import of them. - // TODO: Remove this when we will return custom filters. (AG-39385). - configV1[RootOption.Filters][FiltersOption.CustomFilters] = []; + // TODO: Uncomment this condition when we will return custom filters to MV3 (AG-39385). + if (__IS_MV3__) { + // Since we remove downloading remove custom filters in AG-39385, we cannot + // support import of them. + configV1[RootOption.Filters][FiltersOption.CustomFilters] = []; + } else { + configV1[RootOption.Filters][FiltersOption.CustomFilters][1]!.title = filterNameFixture; + configV1[RootOption.Filters][FiltersOption.CustomFilters][1]!.trusted = false; + configV1[RootOption.Filters][FiltersOption.CustomFilters][1]!.enabled = false; + } + const enabledFilters = configV1[RootOption.Filters][FiltersOption.EnabledFilters]; + // TODO: Remove this filtering when we will return custom filters. (AG-39385). - configV1[RootOption.Filters][FiltersOption.EnabledFilters] = enabledFilters - .filter((id) => id < CUSTOM_FILTERS_START_ID); + if (__IS_MV3__) { + // Exclude custom filters from enabled filters. + configV1[RootOption.Filters][FiltersOption.EnabledFilters] = enabledFilters + .filter((id) => id < CUSTOM_FILTERS_START_ID); + } Object.assign( configV1[RootOption.Filters], @@ -136,8 +146,8 @@ export const getImportedSettingsFromV1Fixture = () => { return id !== 14 && id !== 15 && id !== 241; }); + // TODO: Uncomment this when we will return Quick Fixes filter again to MV3 (AG-39385). // Insert before last element to correct order in strict equal tests. - // TODO: Uncomment if we will return Quick Fixes filter again (AG-39385). // configV1.filters['enabled-filters'].splice( // configV1.filters['enabled-filters'].length - 1, // 0, @@ -180,27 +190,27 @@ export const getExportedSettingsProtocolV2Fixture = (): Config => ({ // App Banners, Other Annoyances and Widgets // 15 - AdGuard DNS filter - not supported in MV3. // 241 - EasyList Cookie List, author does not support MV3. - // TODO: Insert 24 if we will return Quick Fixes filter again (AG-39385). - // TODO: Insert 1000, 1001 if we will return support for custom filters again (AG-39385). + // TODO: Insert 24 if we will return Quick Fixes filter again to MV3 (AG-39385). + // TODO: Insert 1000, 1001 if we will return support for custom filters again to MV3 (AG-39385). ? [1, 2, 3, 4, 7, 13, 17] - // TODO: Insert 1000, 1001 if we will return support for custom filters again (AG-39385). - : [1, 2, 3, 4, 7, 13, 14, 15, 17, 241], + : [1, 2, 3, 4, 7, 13, 14, 15, 17, 241, 1000, 1001], [FiltersOption.EnabledGroups]: [0, 1, 2, 3, 4, 5, 6, 7], - // TODO: Uncomment if we will return support for custom filters again (AG-39385). - // [FiltersOption.CustomFilters]: [{ - // // eslint-disable-next-line max-len - // [CustomFilterOption.CustomUrl]: 'https://testcases.agrd.dev/Filters/element-hiding-rules/test-element-hiding-rules.txt', - // [CustomFilterOption.Title]: 'Rules for element hiding rules test', - // [CustomFilterOption.Trusted]: true, - // [CustomFilterOption.Enabled]: true, - // }, - // { - // // eslint-disable-next-line max-len - // [CustomFilterOption.CustomUrl]: 'https://testcases.agrd.dev/Filters/generichide-rules/generichide-rules.txt', - // [CustomFilterOption.Trusted]: true, - // [CustomFilterOption.Enabled]: true, - // }], - [FiltersOption.CustomFilters]: [], + // TODO: Uncomment this condition when we will return support for custom filters again to MV3 (AG-39385). + [FiltersOption.CustomFilters]: __IS_MV3__ + ? [] + : [{ + // eslint-disable-next-line max-len + [CustomFilterOption.CustomUrl]: 'https://testcases.agrd.dev/Filters/element-hiding-rules/test-element-hiding-rules.txt', + [CustomFilterOption.Title]: 'Rules for element hiding rules test', + [CustomFilterOption.Trusted]: true, + [CustomFilterOption.Enabled]: true, + }, + { + // eslint-disable-next-line max-len + [CustomFilterOption.CustomUrl]: 'https://testcases.agrd.dev/Filters/generichide-rules/generichide-rules.txt', + [CustomFilterOption.Trusted]: true, + [CustomFilterOption.Enabled]: true, + }], [FiltersOption.UserFilter]: { [UserFilterOption.Enabled]: true, // eslint-disable-next-line max-len diff --git a/tests/helpers/fixtures/settingsSchemaV2.ts b/tests/helpers/fixtures/settingsSchemaV2.ts index 49412951c9..0c323b5a3f 100644 --- a/tests/helpers/fixtures/settingsSchemaV2.ts +++ b/tests/helpers/fixtures/settingsSchemaV2.ts @@ -69,34 +69,34 @@ export const getExportedSettingsV2 = () => ({ 'enabled-filters': __IS_MV3__ // 14 - AdGuard Annoyances filter has been splitted into 5 other filters: Cookie Notices, Popups, Mobile // App Banners, Other Annoyances and Widgets - // TODO: uncomment this when quick fixes filter and custom filters will be supported for MV3 + // TODO: uncomment this when quick fixes filter and custom filters + // will be supported for MV3 (AG-39385). // ? [1, 2, 3, 4, 6, 11, 16, 17, 24, 224, 1001, 1002] ? [1, 2, 3, 4, 6, 11, 16, 17, 224] - // TODO: Uncomment this when we will return custom filters (AG-39385). - : [1, 2, 3, 4, 6, 11, 14, 16, 17, 224], + : [1, 2, 3, 4, 6, 11, 14, 16, 17, 224, 1001, 1002], 'enabled-groups': [0, 1, 2, 3, 4, 5, 6, 7, ], - 'custom-filters': [ - // TODO: Uncomment this when we will return custom filters (AG-39385). - // { - // 'customUrl': 'https://testcases.agrd.dev/Filters/css-rules/css-rules.txt', - // 'title': 'Rules for CSS tests', - // 'trusted': false, - // 'enabled': false, - // }, - // { - // 'customUrl': 'https://testcases.agrd.dev/Filters/element-hiding-rules/test-element-hiding-rules.txt', - // 'title': 'Rules for element hiding rules test', - // 'trusted': false, - // 'enabled': true, - // }, - // { - // 'customUrl': 'https://testcases.agrd.dev/Filters/generichide-rules/generichide-rules.txt', - // 'title': 'Rules for generic hide tests', - // 'trusted': true, - // 'enabled': true, - // }, - ], + // TODO: Remove this condition when we will return custom filters to MV3 (AG-39385). + 'custom-filters': __IS_MV3__ + ? [] + : [{ + 'customUrl': 'https://testcases.agrd.dev/Filters/css-rules/css-rules.txt', + 'title': 'Rules for CSS tests', + 'trusted': false, + 'enabled': false, + }, + { + 'customUrl': 'https://testcases.agrd.dev/Filters/element-hiding-rules/test-element-hiding-rules.txt', + 'title': 'Rules for element hiding rules test', + 'trusted': false, + 'enabled': true, + }, + { + 'customUrl': 'https://testcases.agrd.dev/Filters/generichide-rules/generichide-rules.txt', + 'title': 'Rules for generic hide tests', + 'trusted': true, + 'enabled': true, + }], 'user-filter': { 'enabled': true, 'rules': '||example.com^$document\nexample.org###h1', diff --git a/tests/src/background/api/settings.test.ts b/tests/src/background/api/settings.test.ts index b17e86bd5f..35728e1177 100644 --- a/tests/src/background/api/settings.test.ts +++ b/tests/src/background/api/settings.test.ts @@ -23,6 +23,7 @@ import { import { App } from '../../../../Extension/src/background/app'; import { ExtensionSpecificSettingsOption, + FiltersOption, RootOption, SettingOption, } from '../../../../Extension/src/background/schema'; @@ -39,6 +40,7 @@ import { mockLocalStorage, getSettingsV1, getExportedSettingsV2, + filterNameFixture, } from '../../../helpers'; vi.mock('../../../../Extension/src/background/engine'); @@ -196,8 +198,10 @@ describe('Settings Api', () => { const importedSettingsString = await SettingsApi.export(); // Fill up optional fields - // TODO: Uncomment this when we will return custom filters (AG-39385). - // userConfig[RootOption.Filters][FiltersOption.CustomFilters][1]!.title = filterNameFixture; + // TODO: Remove this condition when we will return custom filters to MV3(AG-39385). + if (!__IS_MV3__) { + userConfig[RootOption.Filters][FiltersOption.CustomFilters][1]!.title = filterNameFixture; + } expect(JSON.parse(importedSettingsString)).toStrictEqual(userConfig); }, EXTENDED_TIMEOUT_MS); diff --git a/tools/bundle/webpack.common.ts b/tools/bundle/webpack.common.ts index 42aef7cdac..c04ef50f74 100644 --- a/tools/bundle/webpack.common.ts +++ b/tools/bundle/webpack.common.ts @@ -271,11 +271,12 @@ export const genCommonConfig = (browserConfig: BrowserConfig, isWatchMode = fals __dirname, `../../Extension/src/background/services/filters/filters-service-mv${manifestVersion}.ts`, ), - 'custom-filters-service': path.resolve( - __dirname, - // eslint-disable-next-line max-len - `../../Extension/src/background/services/custom-filters/custom-filters-service-mv${manifestVersion}.ts`, - ), + // TODO: Uncomment this block when custom filters will be supported for MV3. + // 'custom-filters-service': path.resolve( + // __dirname, + // eslint-disable-next-line max-len + // `../../Extension/src/background/services/custom-filters/custom-filters-service-mv${manifestVersion}.ts`, + // ), 'rules-limits-service': path.resolve( __dirname, `../../Extension/src/background/services/rules-limits/rules-limits-service-mv${manifestVersion}.ts`, diff --git a/tsconfig.base.json b/tsconfig.base.json index da0ceaf0f6..2e9494ea75 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -33,7 +33,8 @@ "scripting-service": ["./Extension/src/background/services/scripting/scripting-service-mv3.ts"], "settings-service": ["./Extension/src/background/services/settings/settings-service-mv3.ts"], "filters-service": ["./Extension/src/background/services/filters/filters-service-mv3.ts"], - "custom-filters-service": ["./Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts"], + // TODO: Uncomment this line when custom filters will be supported for MV3. + // "custom-filters-service": ["./Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts"], "rules-limits-service": ["./Extension/src/background/services/rules-limits/rules-limits-service-mv3.ts"] } } diff --git a/tsconfig.with_types_mv2.json b/tsconfig.with_types_mv2.json index 438cf22f00..fd24208f7c 100644 --- a/tsconfig.with_types_mv2.json +++ b/tsconfig.with_types_mv2.json @@ -12,7 +12,8 @@ "scripting-service": ["./Extension/src/background/services/scripting/scripting-service-mv2.ts"], "settings-service": ["./Extension/src/background/services/settings/settings-service-mv2.ts"], "filters-service": ["./Extension/src/background/services/filters/filters-service-mv2.ts"], - "custom-filters-service": ["./Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts"], + // TODO: Uncomment this line when custom filters will be supported for MV3. + // "custom-filters-service": ["./Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts"], "rules-limits-service": ["./Extension/src/background/services/rules-limits/rules-limits-service-mv2.ts"] } } diff --git a/tsconfig.with_types_mv3.json b/tsconfig.with_types_mv3.json index 111dc4c8c6..e0cb65e446 100644 --- a/tsconfig.with_types_mv3.json +++ b/tsconfig.with_types_mv3.json @@ -15,7 +15,8 @@ "scripting-service": ["./Extension/src/background/services/scripting/scripting-service-mv3.ts"], "settings-service": ["./Extension/src/background/services/settings/settings-service-mv3.ts"], "filters-service": ["./Extension/src/background/services/filters/filters-service-mv3.ts"], - "custom-filters-service": ["./Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts"], + // TODO: Uncomment this line when custom filters will be supported for MV3. + // "custom-filters-service": ["./Extension/src/background/services/custom-filters/custom-filters-service-mv3.ts"], "rules-limits-service": ["./Extension/src/background/services/rules-limits/rules-limits-service-mv3.ts"] } } From a197e2d13edf3612051a1b96e3af400ce9169d2f Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 18 Feb 2025 17:41:45 +0300 Subject: [PATCH 15/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fbd08fd134..d96a4cfa16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.44", + "version": "5.1.45", "description": "AdGuard Extension", "type": "module", "scripts": { From de37d57ca73b653357fab2d015d0c575a0ce5736 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Tue, 18 Feb 2025 18:08:18 +0300 Subject: [PATCH 16/29] AG-40043 fix custom_filters reporting in mv2 Squashed commit of the following: commit 9ac90ba599377e2302a53e545a044855d1d866c8 Author: Slava Leleka Date: Tue Feb 18 09:55:27 2025 -0500 fix cursor auto-fix commit cd2f3fc9ee8fc5ef4161fa65935596161d268f96 Author: Slava Leleka Date: Tue Feb 18 09:54:24 2025 -0500 fix custom_filters reporting in mv2 --- Extension/src/background/api/ui/pages.ts | 38 ++++++++++++++---------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Extension/src/background/api/ui/pages.ts b/Extension/src/background/api/ui/pages.ts index f1255e4f61..8a2208164c 100644 --- a/Extension/src/background/api/ui/pages.ts +++ b/Extension/src/background/api/ui/pages.ts @@ -31,10 +31,18 @@ import { ForwardParams, } from '../../../common/forward'; import { UrlUtils } from '../../utils/url'; -import { browserStorage, settingsStorage } from '../../storages'; +import { + browserStorage, + groupStateStorage, + settingsStorage, +} from '../../storages'; import { SettingOption } from '../../schema'; import { BrowserUtils } from '../../utils/browser-utils'; -import { AntiBannerFiltersId, FILTERING_LOG_WINDOW_STATE } from '../../../common/constants'; +import { + AntiBannerFiltersId, + AntibannerGroupsId, + FILTERING_LOG_WINDOW_STATE, +} from '../../../common/constants'; import { WindowsApi, TabsApi } from '../../../common/api/extension'; import { Prefs } from '../../prefs'; import { CustomFilterApi, FiltersApi } from '../filters'; @@ -242,7 +250,7 @@ export class PagesApi { const params: ForwardParams = { action: ForwardAction.IssueReport, from, - product_type: 'Extension', + product_type: 'Ext', manifest_version: encodeURIComponent(manifestDetails.manifest_version), product_version: encodeURIComponent(manifestDetails.version), url: encodeURIComponent(siteUrl), @@ -265,18 +273,18 @@ export class PagesApi { params.filters = encodeURIComponent(commonFilterIds.join('.')); } - // Ignoring custom filters since AG-39385. - // TODO: uncomment when custom filters will be supported again. - // const isCustomFiltersEnabled = groupStateStorage.get(AntibannerGroupsId.CustomFiltersGroupId)?.enabled; - // if (isCustomFiltersEnabled) { - // const customFilterUrls = CustomFilterApi.getFiltersData() - // .filter(({ enabled }) => enabled) - // .map(({ customUrl }) => UrlUtils.trimFilterFilepath(customUrl)); - - // if (customFilterUrls.length > 0) { - // params.custom_filters = encodeURIComponent(customFilterUrls.join(',')); - // } - // } + const isCustomFiltersEnabled = groupStateStorage.get(AntibannerGroupsId.CustomFiltersGroupId)?.enabled; + // Ignoring custom filters in MV3 since AG-39385. + // TODO: fix the condition when custom filters will be supported for MV3 + if (isCustomFiltersEnabled && !__IS_MV3__) { + const customFilterUrls = CustomFilterApi.getFiltersData() + .filter(({ enabled }) => enabled) + .map(({ customUrl }) => UrlUtils.trimFilterFilepath(customUrl)); + + if (customFilterUrls.length > 0) { + params.custom_filters = encodeURIComponent(customFilterUrls.join(',')); + } + } Object.assign( params, From 83e6fa9eabfe1e621c129c7d1574506bdf3b7d9a Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 18 Feb 2025 18:09:10 +0300 Subject: [PATCH 17/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d96a4cfa16..174cdd00f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.45", + "version": "5.1.46", "description": "AdGuard Extension", "type": "module", "scripts": { From da1978e9f79b285cf0800bf8c2597a8ec0b11a2c Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Tue, 18 Feb 2025 20:33:01 +0300 Subject: [PATCH 18/29] AG-40060: fallback if storage.session is not available Squashed commit of the following: commit 18de8f437a0a18bd8a3b97bbf4a95830202cc60b Merge: 9bdc5d52c 83e6fa9ea Author: Dmitriy Seregin Date: Tue Feb 18 18:16:47 2025 +0300 Merge branch 'master' into fix/AG-40060 commit 9bdc5d52c043d533d9cad90e60a7632362d66092 Author: Dmitriy Seregin Date: Tue Feb 18 17:44:49 2025 +0300 fixed docs commit df2fec1f267ac7c86623cc21f81abe9194539494 Author: Dmitriy Seregin Date: Tue Feb 18 17:18:42 2025 +0300 AG-40060: fallback if storage.session is not available --- Extension/src/background/app/app-mv2.ts | 10 ++++---- Extension/src/background/app/app-mv3.ts | 10 ++++---- .../src/background/content-script-injector.ts | 23 +++++++++++++++++++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/Extension/src/background/app/app-mv2.ts b/Extension/src/background/app/app-mv2.ts index c16794cc24..d9ec48b9ad 100644 --- a/Extension/src/background/app/app-mv2.ts +++ b/Extension/src/background/app/app-mv2.ts @@ -178,13 +178,13 @@ export class App { await UiApi.init(); /** - * Injects content scripts into already open tabs. + * Injects content scripts into already opened tabs. * * Does injection when all requirements are met: - * - Statistics collection is disabled. - * - Content scripts have not been injected in the current session. - * - * This prevents conflicts from multiple `cssHitCounters` and avoids unnecessary injections. + * - Statistics collection is disabled - prevents conflicts from multiple + * `cssHitCounters`; + * - Content scripts have not been injected in the current session - + * avoids unnecessary injections. */ if ( SettingsApi.getSetting(SettingOption.DisableCollectHits) diff --git a/Extension/src/background/app/app-mv3.ts b/Extension/src/background/app/app-mv3.ts index ac975c111a..61885106e5 100644 --- a/Extension/src/background/app/app-mv3.ts +++ b/Extension/src/background/app/app-mv3.ts @@ -153,13 +153,13 @@ export class App { await rulesLimitsService.init(); /** - * Injects content scripts into already open tabs. + * Injects content scripts into already opened tabs. * * Does injection when all requirements are met: - * - Statistics collection is disabled. - * - Content scripts have not been injected in the current session. - * - * This prevents conflicts from multiple `cssHitCounters` and avoids unnecessary injections. + * - Statistics collection is disabled - prevents conflicts from multiple + * `cssHitCounters`; + * - Content scripts have not been injected in the current session - + * avoids unnecessary injections. */ if ( SettingsApi.getSetting(SettingOption.DisableCollectHits) diff --git a/Extension/src/background/content-script-injector.ts b/Extension/src/background/content-script-injector.ts index 07b5be8724..abd8a59472 100644 --- a/Extension/src/background/content-script-injector.ts +++ b/Extension/src/background/content-script-injector.ts @@ -211,11 +211,30 @@ export class ContentScriptInjector { return true; } + /** + * Checks if session storage is available in the browser. If session storage + * is available then we suppose that background (event page for firefox or + * service worker for chromium) can die and we need to check if content + * scripts were injected to exclude double injection. + * + * If session storage is not available (in MV2), we suppose that background + * will not die and we don't need to check if content scripts were injected. + * + * @returns `true` if session storage is available, otherwise `false`. + */ + private static isSessionStorageAvailable(): boolean { + return browser.storage?.session !== undefined; + } + /** * Sets the injected flag in session storage. * This method updates the session storage to indicate that content scripts have been injected. */ public static async setInjected(): Promise { + if (!ContentScriptInjector.isSessionStorageAvailable()) { + return; + } + try { await browser.storage.session.set({ [ContentScriptInjector.INJECTED_KEY]: true }); } catch (e) { @@ -232,6 +251,10 @@ export class ContentScriptInjector { * @returns True if content scripts were injected; otherwise, false. */ public static async isInjected(): Promise { + if (!ContentScriptInjector.isSessionStorageAvailable()) { + return false; + } + let isInjected = false; try { const result = await browser.storage.session.get(ContentScriptInjector.INJECTED_KEY); From 5c478182aaf304380993b22dbf0c98d494866415 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 18 Feb 2025 20:33:53 +0300 Subject: [PATCH 19/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 174cdd00f7..dd26c761c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.46", + "version": "5.1.47", "description": "AdGuard Extension", "type": "module", "scripts": { From eef383f4ddfb5547b057abeb61e467127d0d54fc Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Wed, 19 Feb 2025 13:37:44 +0300 Subject: [PATCH 20/29] AG-39777: correct usage set -e flag && use branch-overrides for donothing in master by cron Squashed commit of the following: commit 82672b7bfa22570085e5564d3a79c1c6f33f397a Merge: 5a6e198ce 5c478182a Author: Dmitriy Seregin Date: Wed Feb 19 13:31:53 2025 +0300 Merge branch 'master' into fix/AG-39777 commit 5a6e198ceb2acd1790a1dcaf5807a03096264372 Author: Dmitriy Seregin Date: Mon Feb 17 18:14:55 2025 +0300 fix commit 9ee93b47de02b32aaf0dbc825247259debfab667 Author: Dmitriy Seregin Date: Mon Feb 17 18:00:44 2025 +0300 cleanup commit 8f3b6c48276e470ecdff7eb4abdfc887e6e5a46a Author: Dmitriy Seregin Date: Mon Feb 17 17:58:00 2025 +0300 AG-39777: correct usage set -e flag && use branch-overrides for donothing in master by cron --- bamboo-specs/auto-build.yaml | 484 ++++++++++++++++++--------------- bamboo-specs/auto-publish.yaml | 12 +- 2 files changed, 273 insertions(+), 223 deletions(-) diff --git a/bamboo-specs/auto-build.yaml b/bamboo-specs/auto-build.yaml index 79a057cc04..aa040be976 100644 --- a/bamboo-specs/auto-build.yaml +++ b/bamboo-specs/auto-build.yaml @@ -12,27 +12,17 @@ variables: # Stable branch name for auto-update only filters. stableBranchName: release/mv3-filters +# Since auto-build is being run only for a stable branch now (specified in +# `bamboo.stableBranchName`) we should skip the build stage for other branches. stages: - - Tests: + - DoNothing: manual: false final: false jobs: - - Lint - - Unit tests - - Locales check - - Update filters and build: - manual: false - final: false - jobs: - - Update filters and build - - Integration tests: - manual: false - final: false - jobs: - - Integration tests + - DoNothing -Lint: - key: LINT +DoNothing: + key: NOTHING other: clean-working-dir: true docker: @@ -46,226 +36,28 @@ Lint: interpreter: SHELL scripts: - |- - set -x set -e - ls -la - - # Fix mixed logs. - exec 2>&1 - - # Set cache directory - pnpm config set store-dir ${bamboo.cachePnpm} - - pnpm install ${bamboo.varsPnpm} - - ./bamboo-specs/scripts/timeout-wrapper.sh 80s pnpm lint - final-tasks: - - script: - interpreter: SHELL - scripts: - - ./bamboo-specs/scripts/cleanup.sh - requirements: - - adg-docker: 'true' - -Unit tests: - key: UNITTESTS - other: - clean-working-dir: true - docker: - image: ${bamboo.dockerNode} - volumes: - ${system.PNPM_DIR}: "${bamboo.cachePnpm}" - tasks: - - checkout: - force-clean-build: true - - script: - interpreter: SHELL - scripts: - - |- - set -x - set -e - ls -la - - # Fix mixed logs. - exec 2>&1 - - # Set cache directory - pnpm config set store-dir ${bamboo.cachePnpm} - - pnpm install ${bamboo.varsPnpm} - - ./bamboo-specs/scripts/timeout-wrapper.sh 300s pnpm test - final-tasks: - - test-parser: - type: junit - # mv3 postfix because we run auto-builds only for mv3 branch. - test-results: 'tests-reports/unit-tests-mv3.xml' - - script: - interpreter: SHELL - scripts: - - ./bamboo-specs/scripts/cleanup.sh - requirements: - - adg-docker: 'true' - -Locales check: - key: LOCALESCHECK - other: - clean-working-dir: true - docker: - image: ${bamboo.dockerNode} - volumes: - ${system.PNPM_DIR}: "${bamboo.cachePnpm}" - tasks: - - checkout: - force-clean-build: true - - script: - interpreter: SHELL - scripts: - - |- set -x - set -e - ls -la - - # Fix mixed logs. - exec 2>&1 - - # Set cache directory - pnpm config set store-dir ${bamboo.cachePnpm} - - pnpm install ${bamboo.varsPnpm} - - pnpm locales validate --min - final-tasks: - - script: - interpreter: SHELL - scripts: - - ./bamboo-specs/scripts/cleanup.sh - requirements: - - adg-docker: 'true' + BRANCH="${bamboo.planRepository.branchName}" -Update filters and build: - key: UPDATEFILTERSANDBUILD - other: - clean-working-dir: true - docker: - image: ${bamboo.dockerNode} - volumes: - ${system.PNPM_DIR}: "${bamboo.cachePnpm}" - tasks: - - checkout: - force-clean-build: true - - script: - interpreter: SHELL - scripts: - - |- - set -x - set -e - - # Fix mixed logs - exec 2>&1 - ls -la - - # Validate that current branch is valid for build. - if [ "${bamboo.planRepository.branchName}" != "${bamboo.stableBranchName}" ]; then - # Throw error if current branch is not ${bamboo.stableBranchName}, - # because we do not deploy new releases not from release branch. - echo "auto-build is not supported on branch ${bamboo.stableBranchName}" - exit 1; - fi - - # Set cache directory - pnpm config set store-dir ${bamboo.cachePnpm} - - pnpm install ${bamboo.varsPnpm} - - # Update patch version because resources was changed. - pnpm increment - - # Update filters before build. - OPENAI_API_KEY=${bamboo.openAiExtensionBuildTokenPassword} pnpm resources:mv3 - - # Create artifacts directory if it doesn't exist. - mkdir -p artifacts - - # Build release and beta versions of the extension. - pnpm beta chrome-mv3 - pnpm release chrome-mv3 - - # Move zip artifacts to the artifacts directory, because we will - # publish zip versions of the extension. - mv build/beta/chrome-mv3.zip artifacts/chrome-mv3-beta.zip - mv build/release/chrome-mv3.zip artifacts/chrome-mv3-release.zip - - any-task: - plugin-key: com.atlassian.bamboo.plugins.vcs:task.vcs.commit - configuration: - commitMessage: 'skipci: Filters update & increment patch version' - selectedRepository: defaultRepository - - inject-variables: - # Doesn't matter which channel we use, because version is the same - # for both channels. - file: build/release/build.txt - scope: RESULT - namespace: inject - final-tasks: - - script: - interpreter: SHELL - scripts: - - ./bamboo-specs/scripts/cleanup.sh - artifacts: - # For integration tests and publish. + echo "Build and deployment is not supported on branch ${BRANCH}, skipping" + # Since the artifact is being published from a non-master branch, it should + # still be available in the master branch. + artifacts: &artifacts - name: chrome-mv3-beta.zip location: artifacts pattern: chrome-mv3-beta.zip shared: true required: true - # For integration tests and publish. - name: chrome-mv3-release.zip location: artifacts pattern: chrome-mv3-release.zip shared: true required: true - requirements: - - adg-docker: 'true' - -Integration tests: - key: INTEGRATIONTESTS - other: - clean-working-dir: true - docker: - image: ${bamboo.dockerPlaywright} - volumes: - ${system.PNPM_DIR}: "${bamboo.cachePnpm}" - tasks: - - artifact-download: - artifacts: - - name: chrome-mv3-release.zip - - artifact-download: - artifacts: - - name: chrome-mv3-beta.zip - - script: - interpreter: SHELL - scripts: - - |- - # Call the common script for both release and beta. - ./bamboo-specs/scripts/timeout-wrapper.sh 300s bash ./bamboo-specs/scripts/integration-tests.sh release - ./bamboo-specs/scripts/timeout-wrapper.sh 300s bash ./bamboo-specs/scripts/integration-tests.sh beta - final-tasks: - - test-parser: - type: junit - test-results: 'tests-reports/integration-tests-*.xml' - - script: - interpreter: SHELL - scripts: - - ./bamboo-specs/scripts/cleanup.sh - requirements: + requirements: &requirements - adg-docker: 'true' - -# run release build at 7:00 every Monday, Wednesday, Friday -# https://confluence.atlassian.com/bamboo/constructing-a-cron-expression-in-bamboo-289277372.html -triggers: - - cron: - expression: 0 0 7 ? * MON,WED,FRI + - extension: 'true' branches: create: manually @@ -283,3 +75,253 @@ notifications: labels: [] other: concurrent-build-plugin: system-default + +# Run plan only for 'stable/test' branch. +# Override is needed to skip the build stage for other branches, +# because even if branches are not supposed to be run for PRs (due to 'create: manually' above), +# build was triggered by 'cron' anyway. +branch-overrides: + - + # Note: it should be equal with `bamboo.stableBranchName` + release/mv3-filters: + stages: + - Tests: + manual: false + final: false + jobs: + - Lint + - Unit tests + - Locales check + - Update filters and build: + manual: false + final: false + jobs: + - Update filters and build + - Integration tests: + manual: false + final: false + jobs: + - Integration tests + + Lint: + key: LINT + other: + clean-working-dir: true + docker: + image: ${bamboo.dockerNode} + volumes: + ${system.PNPM_DIR}: "${bamboo.cachePnpm}" + tasks: + - checkout: + force-clean-build: true + - script: + interpreter: SHELL + scripts: + - |- + set -x + set -e + ls -la + + # Fix mixed logs. + exec 2>&1 + + # Set cache directory + pnpm config set store-dir ${bamboo.cachePnpm} + + pnpm install ${bamboo.varsPnpm} + + ./bamboo-specs/scripts/timeout-wrapper.sh 80s pnpm lint + final-tasks: + - script: + interpreter: SHELL + scripts: + - ./bamboo-specs/scripts/cleanup.sh + requirements: + - adg-docker: 'true' + + Unit tests: + key: UNITTESTS + other: + clean-working-dir: true + docker: + image: ${bamboo.dockerNode} + volumes: + ${system.PNPM_DIR}: "${bamboo.cachePnpm}" + tasks: + - checkout: + force-clean-build: true + - script: + interpreter: SHELL + scripts: + - |- + set -x + set -e + ls -la + + # Fix mixed logs. + exec 2>&1 + + # Set cache directory + pnpm config set store-dir ${bamboo.cachePnpm} + + pnpm install ${bamboo.varsPnpm} + + ./bamboo-specs/scripts/timeout-wrapper.sh 300s pnpm test + final-tasks: + - test-parser: + type: junit + # mv3 postfix because we run auto-builds only for mv3 branch. + test-results: 'tests-reports/unit-tests-mv3.xml' + - script: + interpreter: SHELL + scripts: + - ./bamboo-specs/scripts/cleanup.sh + requirements: + - adg-docker: 'true' + + Locales check: + key: LOCALESCHECK + other: + clean-working-dir: true + docker: + image: ${bamboo.dockerNode} + volumes: + ${system.PNPM_DIR}: "${bamboo.cachePnpm}" + tasks: + - checkout: + force-clean-build: true + - script: + interpreter: SHELL + scripts: + - |- + set -x + set -e + ls -la + + # Fix mixed logs. + exec 2>&1 + + # Set cache directory + pnpm config set store-dir ${bamboo.cachePnpm} + + pnpm install ${bamboo.varsPnpm} + + pnpm locales validate --min + final-tasks: + - script: + interpreter: SHELL + scripts: + - ./bamboo-specs/scripts/cleanup.sh + requirements: + - adg-docker: 'true' + + + Update filters and build: + key: UPDATEFILTERSANDBUILD + other: + clean-working-dir: true + docker: + image: ${bamboo.dockerNode} + volumes: + ${system.PNPM_DIR}: "${bamboo.cachePnpm}" + tasks: + - checkout: + force-clean-build: true + - script: + interpreter: SHELL + scripts: + - |- + set -x + set -e + + # Fix mixed logs + exec 2>&1 + ls -la + + # Validate that current branch is valid for build. + if [ "${bamboo.planRepository.branchName}" != "${bamboo.stableBranchName}" ]; then + # Throw error if current branch is not ${bamboo.stableBranchName}, + # because we do not deploy new releases not from release branch. + echo "auto-build is not supported on branch ${bamboo.stableBranchName}" + exit 1; + fi + + # Set cache directory + pnpm config set store-dir ${bamboo.cachePnpm} + + pnpm install ${bamboo.varsPnpm} + + # Update patch version because resources was changed. + pnpm increment + + # Update filters before build. + OPENAI_API_KEY=${bamboo.openAiExtensionBuildTokenPassword} pnpm resources:mv3 + + # Create artifacts directory if it doesn't exist. + mkdir -p artifacts + + # Build release and beta versions of the extension. + pnpm beta chrome-mv3 + pnpm release chrome-mv3 + + # Move zip artifacts to the artifacts directory, because we will + # publish zip versions of the extension. + mv build/beta/chrome-mv3.zip artifacts/chrome-mv3-beta.zip + mv build/release/chrome-mv3.zip artifacts/chrome-mv3-release.zip + - any-task: + plugin-key: com.atlassian.bamboo.plugins.vcs:task.vcs.commit + configuration: + commitMessage: 'skipci: Filters update & increment patch version' + selectedRepository: defaultRepository + - inject-variables: + # Doesn't matter which channel we use, because version is the same + # for both channels. + file: build/release/build.txt + scope: RESULT + namespace: inject + final-tasks: + - script: + interpreter: SHELL + scripts: + - ./bamboo-specs/scripts/cleanup.sh + artifacts: *artifacts + requirements: *requirements + + Integration tests: + key: INTEGRATIONTESTS + other: + clean-working-dir: true + docker: + image: ${bamboo.dockerPlaywright} + volumes: + ${system.PNPM_DIR}: "${bamboo.cachePnpm}" + tasks: + - artifact-download: + artifacts: + - name: chrome-mv3-release.zip + - artifact-download: + artifacts: + - name: chrome-mv3-beta.zip + - script: + interpreter: SHELL + scripts: + - |- + # Call the common script for both release and beta. + ./bamboo-specs/scripts/timeout-wrapper.sh 300s bash ./bamboo-specs/scripts/integration-tests.sh release + ./bamboo-specs/scripts/timeout-wrapper.sh 300s bash ./bamboo-specs/scripts/integration-tests.sh beta + final-tasks: + - test-parser: + type: junit + test-results: 'tests-reports/integration-tests-*.xml' + - script: + interpreter: SHELL + scripts: + - ./bamboo-specs/scripts/cleanup.sh + requirements: + - adg-docker: 'true' + + # run release build at 7:00 every Monday, Wednesday, Friday + # https://confluence.atlassian.com/bamboo/constructing-a-cron-expression-in-bamboo-289277372.html + triggers: + - cron: + expression: 0 0 7 ? * MON,WED,FRI \ No newline at end of file diff --git a/bamboo-specs/auto-publish.yaml b/bamboo-specs/auto-publish.yaml index 87b66be57d..608fea06a8 100644 --- a/bamboo-specs/auto-publish.yaml +++ b/bamboo-specs/auto-publish.yaml @@ -97,11 +97,19 @@ AutoDeployAndPublish Beta: # The 'set -e' command ensures that the script will exit immediately if any subsequent command fails. set +e ./bamboo-deploy-publisher/deploy.sh browser-extension-webstore-beta-publish-expedited-review - if [ $? -ne 0 ]; then + + # Capture exit code + EXIT_CODE=$? + + # Enable errexit as it was set before + set -e + + # If expedited review process exited with non-zero status, + # try normal review. + if [ $EXIT_CODE -ne 0 ]; then echo "Expedited review failed, trying normal review" ./bamboo-deploy-publisher/deploy.sh browser-extension-webstore-beta-publish fi - set -e - checkout: browser-extension - any-task: plugin-key: com.atlassian.bamboo.plugins.vcs:task.vcs.tagging From 0baea955650a0c5365fc4b80bf5f13207ce3cd0b Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 19 Feb 2025 13:38:47 +0300 Subject: [PATCH 21/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd26c761c9..65a3475df1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.47", + "version": "5.1.48", "description": "AdGuard Extension", "type": "module", "scripts": { From 57fb0e454ba8aa6a2680cdb7babdddbe9be6cc19 Mon Sep 17 00:00:00 2001 From: Dmitriy Seregin Date: Wed, 19 Feb 2025 15:29:32 +0300 Subject: [PATCH 22/29] increase timeout for lint stage --- bamboo-specs/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bamboo-specs/tests.yaml b/bamboo-specs/tests.yaml index 4a58c54b80..736827c294 100644 --- a/bamboo-specs/tests.yaml +++ b/bamboo-specs/tests.yaml @@ -139,7 +139,7 @@ Lint: pnpm install ${bamboo.varsPnpm} - ./bamboo-specs/scripts/timeout-wrapper.sh 80s pnpm lint + ./bamboo-specs/scripts/timeout-wrapper.sh 90s pnpm lint final-tasks: - script: interpreter: SHELL From dd4b5634e272c403064f8c7d294860115f0853f3 Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Thu, 20 Feb 2025 13:58:14 +0300 Subject: [PATCH 23/29] AG-40108: inject content-script for subscribe to custom filters via manifest Squashed commit of the following: commit 5ae53ba73f54a4bea177999b54b346e11e2d4904 Author: Dmitriy Seregin Date: Thu Feb 20 00:54:44 2025 +0300 AG-40107: inject content-script for subscribe to custom filters declarative via manifest, not imperative via executeScript --- .../src/background/content-script-injector.ts | 3 +- .../custom-filters-service-mv2.ts | 49 +------------------ tools/bundle/chrome/manifest.chrome.ts | 13 +++++ tools/bundle/edge/manifest.edge.ts | 13 +++++ tools/bundle/firefox/manifest.firefox.ts | 13 +++++ tools/bundle/opera/manifest.opera.ts | 13 +++++ 6 files changed, 55 insertions(+), 49 deletions(-) diff --git a/Extension/src/background/content-script-injector.ts b/Extension/src/background/content-script-injector.ts index abd8a59472..d77c138d31 100644 --- a/Extension/src/background/content-script-injector.ts +++ b/Extension/src/background/content-script-injector.ts @@ -36,7 +36,8 @@ import { TabsApi } from '../common/api/extension/tabs'; import { createPromiseWithTimeout } from './utils/timeouts'; /** - * Helper class for injecting content script into tabs, opened before extension initialization. + * Helper class for injecting content script into tabs, opened before extension + * initialization. */ export class ContentScriptInjector { /** diff --git a/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts b/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts index 9b628c563c..373e5db1c9 100644 --- a/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts +++ b/Extension/src/background/services/custom-filters/custom-filters-service-mv2.ts @@ -16,15 +16,7 @@ * along with AdGuard Browser Extension. If not, see . */ -import browser, { type WebNavigation } from 'webextension-polyfill'; - -import { - MAIN_FRAME_ID, - isHttpOrWsRequest, - tabsApi as tsWebExtTabsApi, -} from '../../tswebextension'; -import { SUBSCRIBE_OUTPUT } from '../../../../../constants'; -import { NotifierType, BACKGROUND_TAB_ID } from '../../../common/constants'; +import { NotifierType } from '../../../common/constants'; import { MessageType, LoadCustomFilterInfoMessage, @@ -36,11 +28,9 @@ import { messageHandler } from '../../message-handler'; import { notifier } from '../../notifier'; import { engine } from '../../engine'; import type { CustomFilterMetadata } from '../../schema'; -import { executeScript } from '../scripting/scripting-service-mv2'; /** * Service for processing events with custom filters. - * TODO: Uncomment this class when custom filters will be supported for MV3. */ export class CustomFiltersService { /** @@ -51,8 +41,6 @@ export class CustomFiltersService { // eslint-disable-next-line max-len messageHandler.addListener(MessageType.SubscribeToCustomFilter, CustomFiltersService.onCustomFilterSubscription); messageHandler.addListener(MessageType.RemoveAntiBannerFilter, CustomFiltersService.onCustomFilterRemove); - - browser.webNavigation.onCommitted.addListener(CustomFiltersService.injectSubscriptionScript); } /** @@ -109,39 +97,4 @@ export class CustomFiltersService { engine.debounceUpdate(); } } - - /** - * Inject custom filter subscription content script to tab. - * - * @param details OnCommitted event request details. - */ - static async injectSubscriptionScript(details: WebNavigation.OnCommittedDetailsType): Promise { - const { tabId, frameId } = details; - - if (tabId === BACKGROUND_TAB_ID) { - return; - } - - const frame = tsWebExtTabsApi.getTabFrame(tabId, frameId); - - if (!frame) { - return; - } - - const isDocumentFrame = frameId === MAIN_FRAME_ID; - - if (!isDocumentFrame || !isHttpOrWsRequest(frame.url)) { - return; - } - - try { - await executeScript(tabId, { - files: [`/${SUBSCRIBE_OUTPUT}.js`], - runAt: 'document_start', - frameId, - }); - } catch (e) { - // do nothing - } - } } diff --git a/tools/bundle/chrome/manifest.chrome.ts b/tools/bundle/chrome/manifest.chrome.ts index d3b73086ee..8deb2cd289 100644 --- a/tools/bundle/chrome/manifest.chrome.ts +++ b/tools/bundle/chrome/manifest.chrome.ts @@ -20,6 +20,7 @@ import { DEVTOOLS_OUTPUT, MIN_SUPPORTED_VERSION, POPUP_OUTPUT, + SUBSCRIBE_OUTPUT, } from '../../../constants'; import { OPTIONS_PAGE } from '../../../Extension/src/common/constants'; @@ -39,6 +40,18 @@ export const chromeManifest = { 'page': `${BACKGROUND_OUTPUT}.html`, 'persistent': true, }, + 'content_scripts': [{ + 'all_frames': true, + 'js': [ + `${SUBSCRIBE_OUTPUT}.js`, + ], + 'matches': [ + 'http://*/*', + 'https://*/*', + ], + 'match_about_blank': false, + 'run_at': 'document_end', + }], 'options_page': OPTIONS_PAGE, 'devtools_page': `${DEVTOOLS_OUTPUT}.html`, 'permissions': [ diff --git a/tools/bundle/edge/manifest.edge.ts b/tools/bundle/edge/manifest.edge.ts index c47b7974c5..e3f852f3e0 100644 --- a/tools/bundle/edge/manifest.edge.ts +++ b/tools/bundle/edge/manifest.edge.ts @@ -20,6 +20,7 @@ import { DEVTOOLS_OUTPUT, MIN_SUPPORTED_VERSION, POPUP_OUTPUT, + SUBSCRIBE_OUTPUT, } from '../../../constants'; import { OPTIONS_PAGE } from '../../../Extension/src/common/constants'; @@ -36,6 +37,18 @@ export const edgeManifest = { 'page': `${BACKGROUND_OUTPUT}.html`, 'persistent': true, }, + 'content_scripts': [{ + 'all_frames': true, + 'js': [ + `${SUBSCRIBE_OUTPUT}.js`, + ], + 'matches': [ + 'http://*/*', + 'https://*/*', + ], + 'match_about_blank': false, + 'run_at': 'document_end', + }], 'web_accessible_resources': [ '/web-accessible-resources/*', ], diff --git a/tools/bundle/firefox/manifest.firefox.ts b/tools/bundle/firefox/manifest.firefox.ts index 3ebc55dfae..e6fb957a93 100644 --- a/tools/bundle/firefox/manifest.firefox.ts +++ b/tools/bundle/firefox/manifest.firefox.ts @@ -26,6 +26,7 @@ import { BACKGROUND_OUTPUT, MIN_SUPPORTED_VERSION, POPUP_OUTPUT, + SUBSCRIBE_OUTPUT, } from '../../../constants'; const appId = FIREFOX_APP_IDS_MAP[BUILD_ENV]; @@ -43,6 +44,18 @@ export const firefoxManifest = { 'page': `${BACKGROUND_OUTPUT}.html`, 'persistent': false, }, + 'content_scripts': [{ + 'all_frames': true, + 'js': [ + `${SUBSCRIBE_OUTPUT}.js`, + ], + 'matches': [ + 'http://*/*', + 'https://*/*', + ], + 'match_about_blank': false, + 'run_at': 'document_end', + }], 'browser_action': { 'default_icon': { '19': 'assets/icons/on-19.png', diff --git a/tools/bundle/opera/manifest.opera.ts b/tools/bundle/opera/manifest.opera.ts index 211e50d917..5ac6014ca8 100644 --- a/tools/bundle/opera/manifest.opera.ts +++ b/tools/bundle/opera/manifest.opera.ts @@ -20,6 +20,7 @@ import { DEVTOOLS_OUTPUT, MIN_SUPPORTED_VERSION, POPUP_OUTPUT, + SUBSCRIBE_OUTPUT, } from '../../../constants'; import { OPTIONS_PAGE } from '../../../Extension/src/common/constants'; @@ -32,6 +33,18 @@ export const operaManifest = { 'default_title': '__MSG_name__', 'default_popup': `${POPUP_OUTPUT}.html`, }, + 'content_scripts': [{ + 'all_frames': true, + 'js': [ + `${SUBSCRIBE_OUTPUT}.js`, + ], + 'matches': [ + 'http://*/*', + 'https://*/*', + ], + 'match_about_blank': false, + 'run_at': 'document_end', + }], 'web_accessible_resources': [ '/web-accessible-resources/*', ], From 69f07c21392d64be1911c742203cdb4c2bd19708 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 20 Feb 2025 13:59:32 +0300 Subject: [PATCH 24/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 65a3475df1..bba423959b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.48", + "version": "5.1.49", "description": "AdGuard Extension", "type": "module", "scripts": { From 4835c73793350b47aed049439fe72d61bec7c53c Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Thu, 20 Feb 2025 18:33:53 +0300 Subject: [PATCH 25/29] fix changelog duplicates Squashed commit of the following: commit cb624bb7f09da1fcd5b231af6b2c3aa0ceed20f9 Author: Slava Leleka Date: Thu Feb 20 10:18:50 2025 -0500 fix changelog duplicates --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65a809b1e8..608bb1a39a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,9 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Handling missing children data in the deserializer for certain nodes. -- Wrong protection state is shown after navigating from excluded website to another one [#3048]. -- Once allowlisted tab considers all following websites in the tab as allowlisted [#3020]. +- Once allowlisted tab considers all following websites in the tab as allowlisted [#3020] [#3048]. - Handling missing children data in the deserializer for certain nodes. - A rule from a disabled filter list disables another rule [#3002]. - Notify user that rule was not applied because of the chrome limitations [#3004]. From 4e36884c2f6620d5607da03d6930b7d690f17e99 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 20 Feb 2025 18:34:50 +0300 Subject: [PATCH 26/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bba423959b..3f7eff7c32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.49", + "version": "5.1.50", "description": "AdGuard Extension", "type": "module", "scripts": { From bf70598c489b12a5f523a8e49b4a714776bfc639 Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Thu, 20 Feb 2025 21:28:27 +0300 Subject: [PATCH 27/29] AG-40131: context menu is not working Squashed commit of the following: commit fba8b03f1ea56844eb9ca9736e461140df9a2ca3 Author: Dmitriy Seregin Date: Thu Feb 20 21:20:32 2025 +0300 increase timeout for lint commit a36559681f905f40b5f118bb23617ccd32f48e69 Merge: e62261516 4e36884c2 Author: Dmitriy Seregin Date: Thu Feb 20 21:06:25 2025 +0300 Merge branch 'master' into fix/AG-40131 commit e62261516f6fc03729ad27cfdd199ef7cb648964 Author: Dmitriy Seregin Date: Thu Feb 20 17:21:08 2025 +0300 fixes commit befb9f716ca26e371616601c915a4fb4b7d6e471 Merge: 177ca2d44 69f07c213 Author: Dmitriy Seregin Date: Thu Feb 20 14:00:11 2025 +0300 Merge branch 'master' into fix/AG-40131 commit 177ca2d441a4a19ca25bcea90879b6beba7ec453 Author: Dmitriy Seregin Date: Thu Feb 20 13:56:08 2025 +0300 AG-40131: context menu is not working --- Extension/src/background/app/app-mv2.ts | 14 +++++--------- Extension/src/background/app/app-mv3.ts | 7 ++++++- Extension/src/background/events/context-menu.ts | 15 +++++++++++---- bamboo-specs/tests.yaml | 2 +- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Extension/src/background/app/app-mv2.ts b/Extension/src/background/app/app-mv2.ts index d9ec48b9ad..efad517ff6 100644 --- a/Extension/src/background/app/app-mv2.ts +++ b/Extension/src/background/app/app-mv2.ts @@ -118,21 +118,17 @@ export class App { }); /** - * Initializes all app services - * and handle webextension API events for first install and update scenario. + * Initializes all app services and handle webextension API events for first + * install and update scenario. */ public static async init(): Promise { // removes listeners on re-initialization, because new ones will be registered during process App.removeListeners(); - await App.asyncInit(); - } + // This call is moved to top in order to keep consistent with MV3 version, + // where it's needed to register critical event handlers in a sync way. + UiService.syncInit(); - /** - * Initializes all app services - * and handle webextension API events for first install and update scenario. - */ - private static async asyncInit(): Promise { await trackInitTimesForDebugging(); // TODO: Remove after migration to MV3 diff --git a/Extension/src/background/app/app-mv3.ts b/Extension/src/background/app/app-mv3.ts index 61885106e5..983de282f7 100644 --- a/Extension/src/background/app/app-mv3.ts +++ b/Extension/src/background/app/app-mv3.ts @@ -92,14 +92,19 @@ export class App { // removes listeners on re-initialization, because new ones will be registered during process App.removeListeners(); + // First initialize critical sync event handlers. App.syncInit(); + + // Then "lazy" call for all other stuff. await App.asyncInit(); } /** * Initializes **sync** modules. * - * Important: should be called before {@link App.init}. + * Important: should be called before async part inside {@link App.init}, + * because in MV3 handlers should be registered on the top level in sync + * functions. */ private static syncInit(): void { UiService.syncInit(); diff --git a/Extension/src/background/events/context-menu.ts b/Extension/src/background/events/context-menu.ts index cbc4e831f5..eca73bb62f 100644 --- a/Extension/src/background/events/context-menu.ts +++ b/Extension/src/background/events/context-menu.ts @@ -15,6 +15,9 @@ * You should have received a copy of the GNU General Public License * along with AdGuard Browser Extension. If not, see . */ + +import { logger } from '../../common/logger'; + export const enum ContextMenuAction { SiteProtectionDisabled = 'context_site_protection_disabled', SiteFilteringDisabled = 'context_site_filtering_disabled', @@ -48,7 +51,7 @@ export class ContextMenuEvents { * * @throws Basic {@link Error} if a listener was registered for the event. */ - public addListener(event: T, listener: ContextMenuListener): void { + public addListener(event: ContextMenuAction, listener: ContextMenuListener): void { if (this.listenersMap.has(event)) { throw new Error(`${event} listener has already been registered`); } @@ -62,11 +65,15 @@ export class ContextMenuEvents { * * @returns Promise with the result of the listener. */ - public async publishEvent(event: T): Promise { + public async publishEvent(event: ContextMenuAction): Promise { const listener = this.listenersMap.get(event); - if (listener) { - return Promise.resolve(listener()); + + if (!listener) { + logger.error(`ContextMenuEvent not found listener for ${event}!`); + return; } + + return Promise.resolve(listener()); } /** diff --git a/bamboo-specs/tests.yaml b/bamboo-specs/tests.yaml index 4a58c54b80..736827c294 100644 --- a/bamboo-specs/tests.yaml +++ b/bamboo-specs/tests.yaml @@ -139,7 +139,7 @@ Lint: pnpm install ${bamboo.varsPnpm} - ./bamboo-specs/scripts/timeout-wrapper.sh 80s pnpm lint + ./bamboo-specs/scripts/timeout-wrapper.sh 90s pnpm lint final-tasks: - script: interpreter: SHELL From d325b22e785395c02d91c079a0292861f59abf5e Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 20 Feb 2025 21:29:14 +0300 Subject: [PATCH 28/29] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f7eff7c32..bf1146a970 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "browser-extension", - "version": "5.1.50", + "version": "5.1.51", "description": "AdGuard Extension", "type": "module", "scripts": { From a6c4b39d65429501e1f1e1fefa0f2d99e628f77b Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Thu, 20 Feb 2025 14:57:51 -0500 Subject: [PATCH 29/29] merge the parent branch into the current branch, resolve conflicts --- package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package.json b/package.json index 81f19f3c4c..520dc01f1c 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,6 @@ { "name": "browser-extension", -<<<<<<< HEAD "version": "5.2.0", -======= - "version": "5.1.51", ->>>>>>> master "description": "AdGuard Extension", "type": "module", "scripts": {