diff --git a/plugins/BotTracking/changes.json b/plugins/BotTracking/changes.json deleted file mode 100644 index 86854889dc7d4ec0da01845f41bbfbfc577d7b15..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/changes.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "title": "New: AI Chatbot Tracking - Content Requests", - "description": "Gain deeper visibility into how AI chatbots interact with your content. See which pages and documents AI systems access, compare AI and human content engagement, and identify content that attracts different levels of interest from each audience.", - "link_name": "Explore AI Content Requests or set up AI Chatbot tracking", - "link": "/index.php?module=CoreHome&action=index&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsContentRequests&idSite=1", - "version": "5.12.0" - }, - { - "title": "AI Chatbot Tracking", - "description": "Matomo introduces AI Chatbot tracking. See how AI Chatbots such as ChatGPT access your site and content, and gain insights that traditional analytics usually miss. These reports use server-side logs to identify chatbot traffic. To enable this feature, setup via a supported server integration is required.", - "link_name": "Learn here how to set up chatbot tracking", - "link": "/index.php?module=BotTracking&action=siteWithoutData&idSite=1", - "version": "5.8.0" - } -] diff --git a/plugins/BotTracking/config/config.php b/plugins/BotTracking/config/config.php deleted file mode 100644 index 0b67a5fe4742a02757d939368cc05d4c246502f8..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/config/config.php +++ /dev/null @@ -1,3 +0,0 @@ -{{ 'BotTracking_SiteWithoutDataStepByStepGuide'|translate }} -

{{ 'BotTracking_NoDataAmazonCloudFrontInstructions1'|translate }}

-
-
    -
  1. {{ 'BotTracking_NoDataAmazonCloudFrontInstructions2'|translate }}
  2. -
  3. {{ 'BotTracking_NoDataAmazonCloudFrontInstructions3'|translate }}
  4. -
  5. {{ 'BotTracking_NoDataAmazonCloudFrontInstructions4'|translate }}
  6. -
-
-

{{ 'BotTracking_NoDataLinkSourceCode'|translate(externallink(urlSourceCode), '')|raw }}

-

{{ 'BotTracking_NoDataLinkKnowledgeBase'|translate(externallink(urlKnowledgeBase), '')|raw }}

diff --git a/plugins/BotTracking/templates/_noDataCloudflare.twig b/plugins/BotTracking/templates/_noDataCloudflare.twig deleted file mode 100644 index 86b6000701737ca7a408f8953bc0eb8824da76fa..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/templates/_noDataCloudflare.twig +++ /dev/null @@ -1,11 +0,0 @@ -

{{ 'BotTracking_SiteWithoutDataStepByStepGuide'|translate }}

-

{{ 'BotTracking_NoDataCloudflareInstructions1'|translate }}

-
-
    -
  1. {{ 'BotTracking_NoDataCloudflareInstructions2'|translate }}
  2. -
  3. {{ 'BotTracking_NoDataCloudflareInstructions3'|translate }}
  4. -
  5. {{ 'BotTracking_NoDataCloudflareInstructions4'|translate }}
  6. -
-
-

{{ 'BotTracking_NoDataLinkSourceCode'|translate(externallink(urlSourceCode), '')|raw }}

-

{{ 'BotTracking_NoDataLinkKnowledgeBase'|translate(externallink(urlKnowledgeBase), '')|raw }}

diff --git a/plugins/BotTracking/templates/_noDataWordPress.twig b/plugins/BotTracking/templates/_noDataWordPress.twig deleted file mode 100644 index 183dd9ab83cdfd89fb813cbe3d95703f2af1cef3..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/templates/_noDataWordPress.twig +++ /dev/null @@ -1,11 +0,0 @@ -

{{ 'BotTracking_SiteWithoutDataStepByStepGuide'|translate }}

-

{{ 'BotTracking_NoDataWordPressInstructions1'|translate }}

-
-
    -
  1. {{ 'BotTracking_NoDataWordPressInstructions2'|translate }}
  2. -
  3. {{ 'BotTracking_NoDataWordPressInstructions3'|translate }}
  4. -
  5. {{ 'BotTracking_NoDataWordPressInstructions4'|translate }}
  6. -
-
-

{{ 'BotTracking_NoDataLinkSourceCode'|translate(externallink(urlSourceCode), '')|raw }}

-

{{ 'BotTracking_NoDataLinkKnowledgeBase'|translate(externallink(urlKnowledgeBase), '')|raw }}

diff --git a/plugins/BotTracking/templates/siteWithoutData.twig b/plugins/BotTracking/templates/siteWithoutData.twig deleted file mode 100644 index 9a7cc597d2a3e1e2dc752ca3b40ba4227052b779..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/templates/siteWithoutData.twig +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "dashboard.twig" %} - -{% block notification %} - {% include "@CoreHome/_notifications.twig" %} -{% endblock %} - -{% set bodyId = 'bot-tracking-site-without-data' %} - -{% block topcontrols %} - {% if not isSingleSite %} - {% include "@CoreHome/_siteSelectHeader.twig" %} - {% endif %} -{% endblock %} - -{% block content %} -
-{% endblock %} diff --git a/plugins/BotTracking/tests/Fixtures/BotTraffic.php b/plugins/BotTracking/tests/Fixtures/BotTraffic.php deleted file mode 100644 index 0c3dcbc8cdaca2d88932d1b22d4193cda67e9025..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Fixtures/BotTraffic.php +++ /dev/null @@ -1,322 +0,0 @@ -setUpWebsite(); - $this->trackBotRequests(); - $this->trackRealTimeBotRequests(); - $this->trackAcquiredVisits(); - $this->trackHumanPageOverlaps(); - $this->trackEventOnlyPage(); - $this->trackHumanPageviewInBotFreePeriod(); - } - - public function tearDown(): void - { - // nothing to clean up - } - - private function setUpWebsite(): void - { - if (!self::siteCreated($this->idSite)) { - self::createWebsite($this->dateTime, 1, 'https://example.com'); - } - } - - private function trackBotRequests(): void - { - $pages = [ - 'https://example.com/article/1/page/1', - 'https://example.com/article/1/page/2', - 'https://example.com/article/2', - 'https://example.com/article/3', - 'https://example.com/article/4/page/1', - 'https://example.com/article/4/page/2', - 'https://example.com/overview', - ]; - - $downloads = [ - 'https://example.com/resources/doc.pdf', - 'https://example.com/resources/guide.pdf', - 'https://example.com/resources/whitepaper.pdf', - 'https://example.com/resources/datasheet.pdf', - 'https://example.com/resources/case-study.pdf', - ]; - - // Each tuple: [userAgent, url, httpStatus, bytes|null, isDownload, serverTimeMs|null] - // - // - serverTimeMs: integer milliseconds passed as `pf_srv` to the tracker, or null to omit - // the parameter entirely (leaving response_time_ms as SQL NULL in log_bot_request). - // At least a handful of requests intentionally omit server time so that - // nb_server_time < requests for some URLs, exercising the avg computation guard. - // - // - bytes: integer bytes passed as `bw_bytes`, or null to omit the parameter entirely - // (leaving response_size_bytes as SQL NULL). A couple of tuples use null bytes to produce - // at least one URL where nb_response_size < requests. - $dailyPlans = [ - 0 => [ - ['ChatGPT-User/1.0', $pages[0], 200, 12005, false, 250], - ['Gemini-Deep-Research/1.0', $pages[1], 200, 29658, false, 1500], - ['Perplexity-User/1.0', $downloads[0], 503, 1365955, true, 3200], - ['Google-NotebookLM/1.0', $downloads[1], 404, 36522, true, null], - ['ChatGPT-User/1.0', $pages[0], 200, 12584, false, 180], - ['Gemini-Deep-Research/1.0', $pages[1], 200, 36598, false, 950], - ['Perplexity-User/1.0', $downloads[0], 200, 99562, true, null], - ['Google-NotebookLM/1.0', $pages[2], 200, 25489, false, 2100], - ], - 1 => [ - // Extra broken entries placed early so their hour offset stays within Feb 3 - // (each tuple index N maps to addHour((N+1)*2); N≥9 would spill into Feb 4). - // doc.pdf 404 and guide.pdf 503 ensure ranking_limit tests (limit=2) produce - // an "Others" row for the Broken report on this day. - ['MistralAI-User/2.0', $downloads[0], 404, null, true, null], - ['Perplexity-User/1.0', $downloads[1], 503, null, true, 150], - ['MistralAI-User/2.0', $pages[2], 200, 32485, false, 1800], - ['Claude-User/3.0', $downloads[2], 200, 123456, true, 4500], - ['ChatGPT-User/1.0', $pages[1], 500, null, false, 320], - // Same URL as the 500 above but a 200 — proves total_broken_requests = 1 (not COUNT=2) after F18 fix - ['Gemini-Deep-Research/1.0', $pages[1], 200, 29658, false, 1200], - ['ChatGPT-User/1.0', $downloads[1], 200, 33658, true, 750], - ['Perplexity-User/1.0', $pages[2], 200, 36985, false, 2800], - ['Perplexity-User/1.0', $pages[2], 200, 36985, false, 3100], - ['MistralAI-User/2.0', $pages[3], 200, 85236, false, null], - ['Claude-User/3.0', $downloads[3], 200, 12456, true, 600], - ['Claude-User/3.0', $downloads[4], 200, 35562, true, 1200], - ], - 2 => [ - ['Perplexity-User/1.0', $downloads[3], 200, 84269, true, 900], - ['Gemini-Deep-Research/1.0', $pages[3], 200, 3265, false, 400], - ['Google-NotebookLM/1.0', $pages[6], 200, 33366, false, 1100], - ['ChatGPT-User/1.0', $pages[3], 200, 5454, false, null], - ['Perplexity-User/1.0', $downloads[2], 200, 69856, true, 2200], - ['Gemini-Deep-Research/1.0', $pages[4], 200, 63256, false, 3800], - ['Google-NotebookLM/1.0', $pages[6], 200, 25486, false, 850], - ], - 3 => [ - ['MistralAI-User/2.0', $pages[4], 200, 12568, false, 1400], - ['Google-NotebookLM/1.0', $downloads[4], 404, 25648, true, null], - ['ChatGPT-User/1.0', $pages[4], 200, 12548, false, 670], - ['Claude-User/3.0', $pages[5], 503, null, false, 200], - ['Perplexity-User/1.0', $downloads[0], 200, 225445, true, 5000], - ['MistralAI-User/2.0', $pages[2], 200, 12456, false, 1650], - ['Google-NotebookLM/1.0', $downloads[1], 200, 258741, true, 2900], - ], - 4 => [ - ['Perplexity-User/1.0', $downloads[1], 200, 36985, true, 480], - ['Gemini-Deep-Research/1.0', $pages[5], 200, 95147, false, 3300], - ['ChatGPT-User/1.0', $pages[0], 200, 25412, false, 210], - ['Claude-User/3.0', $pages[3], 200, 36985, false, null], - ['Perplexity-User/1.0', $downloads[4], 200, 145811, true, 1700], - ], - ]; - - foreach ($dailyPlans as $dayOffset => $requests) { - foreach ($requests as $index => $request) { - [$userAgent, $url, $status, $bytes, $isDownload, $serverTimeMs] = $request; - $date = Date::factory($this->dateTime) - ->addDay($dayOffset) - ->addHour(($index + 1) * 2) - ->getDatetime(); - - if ($isDownload) { - $this->logBotDownload($userAgent, $url, $status, $bytes, $date, $serverTimeMs); - } else { - $this->logBot($userAgent, $url, $status, $bytes, $date, $serverTimeMs); - } - } - } - } - - private function trackRealTimeBotRequests(): void - { - $now = Date::factory('now'); - - // Each tuple: [minutes before now, userAgent, url, httpStatus, bytes|null, isDownload, serverTimeMs|null]. - $requests = [ - [10, 'ChatGPT-User/1.0', 'https://example.com/realtime/a', 200, 10000, false, 150], - [20, 'ChatGPT-User/1.0', 'https://example.com/realtime/b', 404, 12000, false, 250], - [25, 'Claude-User/3.0', 'https://example.com/realtime/doc.pdf', 503, null, true, 300], - [40, 'MistralAI-User/2.0', 'https://example.com/realtime/missing.pdf', 404, null, true, null], - [60, 'Perplexity-User/1.0', 'https://example.com/realtime/a', 200, 11000, false, 180], - [90, 'Claude-User/3.0', 'https://example.com/realtime/c', 200, 13000, false, 210], - [300, 'Gemini-Deep-Research/1.0', 'https://example.com/realtime/a', 500, 14000, false, 450], - [780, 'ChatGPT-User/1.0', 'https://example.com/realtime/out-of-window', 200, 15000, false, 120], - ]; - - foreach ($requests as $request) { - [$minutesAgo, $userAgent, $url, $status, $bytes, $isDownload, $serverTimeMs] = $request; - $date = $now->subPeriod($minutesAgo, 'minute')->getDatetime(); - - if ($isDownload) { - $this->logBotDownload($userAgent, $url, $status, $bytes, $date, $serverTimeMs); - } else { - $this->logBot($userAgent, $url, $status, $bytes, $date, $serverTimeMs); - } - } - } - - private function trackAcquiredVisits(): void - { - $sources = [ - 'https://chatgpt.com/thread/12345', - 'https://perplexity.ai/share/6789', - 'https://copilot.microsoft.com/answer/abc', - 'https://claude.ai/share/987', - 'https://gemini.google.com/share/notes', - 'https://chat.qwen.ai/share/insight', - 'https://chatgpt.com/thread/8888', - 'https://perplexity.ai/share/2222', - 'https://copilot.microsoft.com/answer/xyz', - 'https://claude.ai/share/1111', - ]; - - // Each in-week AI-landing page gets a DISTINCT number of acquired visits on a single day, so - // every Favoured Pages row has a unique Discrepancy Score (no ties). Core truncates these - // records by score and its sort leaves tied scores in a PHP/DB-dependent order, so distinct - // scores keep the ranking-limit tests deterministic; keeping each page on one day also makes - // its weekly count unambiguous when day blobs are summed. There is also a visit on every bot - // day (Feb 2-6) so each day is archived and its bot requests count in the week/month totals. - $plans = [ - [0, 'https://example.com/article-1', 1], // 2025-02-02 (prior week; keeps Feb 2 archived) - [1, 'https://example.com/article-1', 1], // 2025-02-03 - [2, 'https://example.com/article-2', 2], // 2025-02-04 - [3, 'https://example.com/article-3', 3], // 2025-02-05 - [4, 'https://example.com/article-4', 4], // 2025-02-06 - ]; - - $referrerIndex = 0; - foreach ($plans as [$dayOffset, $url, $visits]) { - for ($i = 0; $i < $visits; $i++) { - $date = Date::factory($this->dateTime) - ->addDay($dayOffset) - ->addHour($referrerIndex + 1) - ->getDatetime(); - $tracker = self::getTracker($this->idSite, $date, true); - $tracker->setUrl($url); - $tracker->setUrlReferrer($sources[$referrerIndex % count($sources)]); - self::checkResponse($tracker->doTrackPageView('Article From AI Chatbot ' . ($referrerIndex + 1))); - $referrerIndex++; - } - } - } - - /** - * Tracks human pageviews to URLs the bots also request, so the Favoured Pages records have rows - * where BOTH metrics are non-zero. example.com/article/2 spans Feb 3-5 on the human side and is - * also bot-requested on several of those days, giving Row Evolution a real multi-day series for - * both sides. The "www." URL collides, after Matomo's action-name normalization, with the bot - * label example.com/article/3 — confirming both sides key on the same log_action.name. - */ - private function trackHumanPageOverlaps(): void - { - // [url, dayOffset, number of human visits] — these URLs are also requested by bots in - // trackBotRequests(). Day offset 1 = 2025-02-03 (the date the system tests query for `day`); - // offsets 1-3 all fall inside the queried `week`. - $overlaps = [ - ['https://example.com/article/2', 1, 2], - ['https://example.com/article/2', 2, 2], - ['https://example.com/article/2', 3, 1], - ['https://www.example.com/article/3', 1, 1], - ]; - - foreach ($overlaps as [$url, $dayOffset, $visits]) { - for ($i = 0; $i < $visits; $i++) { - $date = Date::factory($this->dateTime) - ->addDay($dayOffset) - ->addHour($i + 1) - ->getDatetime(); - $tracker = self::getTracker($this->idSite, $date, true); - $tracker->setUrl($url); - self::checkResponse($tracker->doTrackPageView('Human Overlap Page ' . ($i + 1))); - } - } - } - - /** - * Tracks a human event on a page that gets NO pageview (and no bot request). The Favoured Pages - * reports must not count this URL as a human pageview — events are excluded, mirroring the Actions - * Pages report (see AIChatbotFavouredPages::queryHumanPageviews / Actions' not-an-event clause). - */ - private function trackEventOnlyPage(): void - { - $date = Date::factory($this->dateTime) - ->addDay(1) // 2025-02-03, the date the system tests query - ->addHour(5) - ->getDatetime(); - $tracker = self::getTracker($this->idSite, $date, true); - $tracker->setUrl('https://example.com/event-only'); - self::checkResponse($tracker->doTrackEvent('Media', 'Play')); - } - - /** - * A human pageview on 2025-02-20 — well after the bot requests (Feb 2-6), so that period has no - * AI chatbot activity. Used to assert the Favoured Pages records stay empty there (the human - * pageviews scan is skipped when there are no bot requests). - */ - private function trackHumanPageviewInBotFreePeriod(): void - { - $date = Date::factory($this->dateTime)->addDay(18)->getDatetime(); - $tracker = self::getTracker($this->idSite, $date, true); - $tracker->setUrl('https://example.com/bot-free-page'); - self::checkResponse($tracker->doTrackPageView('Bot Free Page')); - } - - private function logBot(string $userAgent, string $url, int $statusCode, ?int $bytes, string $dateTime, ?int $serverTimeMs): void - { - $tracker = self::getTracker($this->idSite, $dateTime, true); - $tracker->setUrl($url); - $this->applyCommonTrackingParameters($tracker, $userAgent, $statusCode, $bytes, $serverTimeMs); - self::checkResponse($tracker->doTrackPageView('')); - } - - private function logBotDownload(string $userAgent, string $url, int $statusCode, ?int $bytes, string $dateTime, ?int $serverTimeMs): void - { - $tracker = self::getTracker($this->idSite, $dateTime, true); - $this->applyCommonTrackingParameters($tracker, $userAgent, $statusCode, $bytes, $serverTimeMs); - self::checkResponse($tracker->doTrackAction($url, 'download')); - } - - /** - * Applies the tracking parameters shared between page and download bot requests: - * user-agent, recMode flag, http_status, and the optional bw_bytes / pf_srv parameters. - * - * When $bytes or $serverTimeMs is null the corresponding parameter is intentionally omitted - * so that response_size_bytes / response_time_ms stores SQL NULL in log_bot_request — - * this exercises nb_response_size < requests and nb_server_time < requests in the averages guard. - */ - private function applyCommonTrackingParameters(MatomoTracker $tracker, string $userAgent, int $statusCode, ?int $bytes, ?int $serverTimeMs): void - { - $tracker->setUserAgent($userAgent); - $tracker->setCustomTrackingParameter('recMode', '1'); - $tracker->setCustomTrackingParameter('http_status', (string) $statusCode); - if ($bytes !== null) { - $tracker->setCustomTrackingParameter('bw_bytes', (string) $bytes); - } - if ($serverTimeMs !== null) { - $tracker->setCustomTrackingParameter('pf_srv', (string) $serverTimeMs); - } - } -} diff --git a/plugins/BotTracking/tests/Integration/AIChatbotFavouredPagesArchivingTest.php b/plugins/BotTracking/tests/Integration/AIChatbotFavouredPagesArchivingTest.php deleted file mode 100644 index b974e5ae1ad7a40e0c3f7f8903d24c406c9f5723..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Integration/AIChatbotFavouredPagesArchivingTest.php +++ /dev/null @@ -1,128 +0,0 @@ -getAIChatbotHumanFavouredPages(1, 'day', '2025-02-03'); - - self::assertInstanceOf(DataTable::class, $table); - self::assertGreaterThan(0, $table->getRowsCount(), 'expected the archived favoured-pages record to have rows'); - - // Score materialised during archiving and read straight back. - $row = $table->getFirstRow(); - self::assertNotFalse($row->getColumn(Metrics::COLUMN_DISCREPANCY_SCORE)); - - // The per-page 0-100 index must not be summed into the report totals row. The aggregation op - // is not stored in the blob; the API re-applies it on read (skipScoreInReportTotals) — that - // read-time behaviour is what this asserts. - $ops = $table->getMetadata(DataTable::COLUMN_AGGREGATION_OPS_METADATA_NAME); - self::assertSame('skip', $ops[Metrics::COLUMN_DISCREPANCY_SCORE] ?? null); - } - - public function testEventOnlyPageIsNotCountedAsHumanPageview(): void - { - $table = API::getInstance()->getAIChatbotHumanFavouredPages(1, 'day', '2025-02-03'); - - // example.com/event-only was tracked with an event but never a pageview (and no bot request). - // It must be absent: events are not human pageviews (mirrors the Actions Pages report). - self::assertFalse( - $table->getRowFromLabel('example.com/event-only'), - 'a page seen only as an event context must not appear as a human pageview' - ); - } - - public function testNoRecordsWhenPeriodHasNoBotActivity(): void - { - // 2025-02-20 has a human pageview but no AI chatbot requests: the human-pageviews scan is - // skipped and the favoured records are empty (nothing to favour against). - self::assertSame(0, API::getInstance()->getAIChatbotHumanFavouredPages(1, 'day', '2025-02-20')->getRowsCount()); - self::assertSame(0, API::getInstance()->getAIChatbotAIFavouredPages(1, 'day', '2025-02-20')->getRowsCount()); - } - - public function testNoRecordsForWeekWithNoBotActivity(): void - { - // The week of 2025-02-20 (Feb 17-23) has a human pageview but no AI chatbot requests on any - // day, so the non-day aggregation sums empty day blobs into empty week records — the skip - // propagates through buildForNonDayPeriod, not just the daily aggregate(). - self::assertSame(0, API::getInstance()->getAIChatbotHumanFavouredPages(1, 'week', '2025-02-20')->getRowsCount()); - self::assertSame(0, API::getInstance()->getAIChatbotAIFavouredPages(1, 'week', '2025-02-20')->getRowsCount()); - } - - public function testWeekReprocessesScoreOverSummedTraffic(): void - { - $week = API::getInstance()->getAIChatbotHumanFavouredPages(1, 'week', '2025-02-03'); - $row = $week->getRowFromLabel('example.com/article/2'); - - self::assertNotFalse($row, 'expected example.com/article/2 in the weekly favoured-pages record'); - - // Traffic columns are additive: the page got 2 + 2 + 1 human visits across Feb 3-5. - self::assertSame(5, (int) $row->getColumn(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS)); - - // The score is reprocessed on the weekly union, not summed from the daily blobs: article/2 - // is the busiest human page of the week (anchor), so for human=5 / ai=4 the bounded index is - // 100 * max(0,(5-4)/9) * 1 = 11.1 — never the sum of the per-day scores. - self::assertSame(11.1, (float) $row->getColumn(Metrics::COLUMN_DISCREPANCY_SCORE)); - } - - public function testMonthReprocessesScoreOverSummedTraffic(): void - { - $month = API::getInstance()->getAIChatbotHumanFavouredPages(1, 'month', '2025-02-03'); - $row = $month->getRowFromLabel('example.com/article/2'); - - self::assertNotFalse($row, 'expected example.com/article/2 in the monthly favoured-pages record'); - - // Human pageviews sum across the month from the week blobs (all 5 land in Feb 3-5). - self::assertSame(5, (int) $row->getColumn(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS)); - - // The score is reprocessed on the month union built from the WEEK blobs, never summed from - // them: article/2 is bot-requested in two different weeks (Feb 2 and Feb 3-9), so over the - // month its AI requests meet or exceed its 5 human pageviews and the human-favoured lean - // clamps to 0 — a recomputed 0.0, not the weekly 11.1 and not the sum of the weekly scores. - self::assertSame(0.0, (float) $row->getColumn(Metrics::COLUMN_DISCREPANCY_SCORE)); - } - - public function testAiFavouredRecordIsArchivedSeparately(): void - { - $table = API::getInstance()->getAIChatbotAIFavouredPages(1, 'day', '2025-02-03'); - - self::assertInstanceOf(DataTable::class, $table); - self::assertGreaterThan(0, $table->getRowsCount()); - - $ops = $table->getMetadata(DataTable::COLUMN_AGGREGATION_OPS_METADATA_NAME); - self::assertSame('skip', $ops[Metrics::COLUMN_DISCREPANCY_SCORE] ?? null); - } -} - -AIChatbotFavouredPagesArchivingTest::$fixture = new BotTraffic(); diff --git a/plugins/BotTracking/tests/Integration/AIChatbotFavouredPagesPartialArchiveTest.php b/plugins/BotTracking/tests/Integration/AIChatbotFavouredPagesPartialArchiveTest.php deleted file mode 100644 index c6db9b71448909b8bc7d22eca0df2f9180f15a5e..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Integration/AIChatbotFavouredPagesPartialArchiveTest.php +++ /dev/null @@ -1,104 +0,0 @@ -getAIChatbotHumanFavouredPages(1, 'range', '2025-02-03,2025-02-09'); - - $fullNames = $this->favouredBlobNames(); - self::assertContains(Archiver::AI_CHATBOTS_HUMAN_FAVOURED_PAGES_RECORD, $fullNames); - self::assertContains(Archiver::AI_CHATBOTS_AI_FAVOURED_PAGES_RECORD, $fullNames); - - $maxIdArchive = $this->maxBlobIdArchive(); - - // Change a day inside the range, then re-archive that day, so the range must re-aggregate. - $tracker = Fixture::getTracker(1, '2025-02-04 09:00:00'); - $tracker->setUrl('https://example.com/article/2'); - Fixture::checkResponse($tracker->doTrackPageView('Partial archive page')); - - Cache::flushAll(); - API::getInstance()->getAIChatbotHumanFavouredPages(1, 'day', '2025-02-04'); // re-archive the changed day (trigger still set) - unset($_GET['trigger']); - - // Invalidate the range and re-query ONLY the human-favoured report, which triggers partial - // archiving with that single record as the requested report. - StaticContainer::get(ArchiveInvalidator::class)->markArchivesAsInvalidated([1], ['2025-02-03,2025-02-09'], 'range'); - API::getInstance()->getAIChatbotHumanFavouredPages(1, 'range', '2025-02-03,2025-02-09'); - - // The new partial archive must (re)build only the requested human-favoured record; the guard - // must skip the AI-favoured one. - $partialNames = $this->favouredBlobNames($maxIdArchive); - self::assertContains(Archiver::AI_CHATBOTS_HUMAN_FAVOURED_PAGES_RECORD, $partialNames); - self::assertNotContains(Archiver::AI_CHATBOTS_AI_FAVOURED_PAGES_RECORD, $partialNames); - } - - private function maxBlobIdArchive(): int - { - return (int) Db::fetchOne('SELECT MAX(idarchive) FROM ' . Common::prefixTable('archive_blob_2025_02')); - } - - /** - * Favoured-pages blob record names archived in Feb 2025, optionally only from archives created - * after $idArchiveGreaterThan. - * - * @return string[] - */ - private function favouredBlobNames(int $idArchiveGreaterThan = 0): array - { - $sql = 'SELECT DISTINCT name FROM ' . Common::prefixTable('archive_blob_2025_02') - . ' WHERE idarchive > ? AND period = ? AND date1 = ? AND date2 = ? AND name LIKE ?'; - $rows = Db::fetchAll($sql, [ - $idArchiveGreaterThan, - Range::PERIOD_ID, - '2025-02-03', - '2025-02-09', - 'BotTracking_AIChatbots%FavouredPages', - ]); - - return array_column($rows, 'name'); - } -} - -AIChatbotFavouredPagesPartialArchiveTest::$fixture = new BotTraffic(); diff --git a/plugins/BotTracking/tests/Integration/Dao/BotRequestsDaoTest.php b/plugins/BotTracking/tests/Integration/Dao/BotRequestsDaoTest.php deleted file mode 100644 index ea9f22d6a8909fd09f7316967b61fd7fbf8e4246..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Integration/Dao/BotRequestsDaoTest.php +++ /dev/null @@ -1,291 +0,0 @@ -idSite = Fixture::createWebsite('2025-01-01 00:00:00'); - $this->dao = new BotRequestsDao(); - } - - public function testGetTableName(): void - { - $tableName = BotRequestsDao::getTableName(); - self::assertEquals('log_bot_request', $tableName); - - $tableName = BotRequestsDao::getPrefixedTableName(); - self::assertStringContainsString('log_bot_request', $tableName); - } - - public function testCreateTableAddsRealTimeLookupIndex(): void - { - $this->dao->dropTable(); - $this->dao->createTable(); - - self::assertSame( - ['idsite', 'server_time'], - $this->getIndexColumns('index_idsite_server_time') - ); - } - - public function testInsertCreatesRecord(): void - { - $data = [ - 'idsite' => $this->idSite, - 'server_time' => '2025-10-28 12:00:00', - 'idaction_url' => 123, - 'bot_name' => 'ChatGPT-User', - 'bot_type' => BotDetector::BOT_TYPE_AI_CHATBOT, - 'http_status_code' => 200, - 'response_size_bytes' => 2048, - 'response_time_ms' => 125, - 'source' => 'cloudflare', - ]; - - $idRequest = $this->dao->insert($data); - - self::assertGreaterThan(0, $idRequest); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idrequest = ?"; - $record = Db::fetchRow($sql, [$idRequest]); - - self::assertNotEmpty($record); - self::assertEquals($this->idSite, $record['idsite']); - self::assertEquals('ChatGPT-User', $record['bot_name']); - self::assertEquals(BotDetector::BOT_TYPE_AI_CHATBOT, $record['bot_type']); - self::assertEquals(200, $record['http_status_code']); - } - - public function testInsertWithNullOptionalFields(): void - { - $data = [ - 'idsite' => $this->idSite, - 'server_time' => '2025-10-28 12:00:00', - 'bot_name' => 'Claude-User', - 'bot_type' => BotDetector::BOT_TYPE_AI_CHATBOT, - ]; - - $idRequest = $this->dao->insert($data); - - self::assertGreaterThan(0, $idRequest); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idrequest = ?"; - $record = Db::fetchRow($sql, [$idRequest]); - - self::assertNull($record['idaction_url']); - self::assertNull($record['http_status_code']); - self::assertNull($record['response_size_bytes']); - self::assertNull($record['response_time_ms']); - self::assertNull($record['source']); - } - - public function testDeleteOldRecordsDeletesRecordsBeforeDate(): void - { - $this->insertTestRecord('2025-10-20 10:00:00', 'Old-Bot-1'); - $this->insertTestRecord('2025-10-25 10:00:00', 'Old-Bot-2'); - $this->insertTestRecord('2025-10-28 10:00:00', 'Recent-Bot'); - - $deleteBeforeDate = Date::factory('2025-10-27 00:00:00'); - $deletedCount = $this->dao->deleteOldRecords($deleteBeforeDate); - - self::assertEquals(2, $deletedCount); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT COUNT(*) as count FROM `{$tableName}` WHERE idsite = ?"; - $remainingCount = Db::fetchOne($sql, [$this->idSite]); - - self::assertEquals(1, $remainingCount); - } - - public function testGetAIChatbotActivityForDateRangeAggregatesAIChatbotRows(): void - { - $pageA = $this->createAction('example.com/realtime/a', Action::TYPE_PAGE_URL); - $pageB = $this->createAction('example.com/realtime/b', Action::TYPE_PAGE_URL); - $pageC = $this->createAction('example.com/realtime/c', Action::TYPE_PAGE_URL); - $document = $this->createAction('example.com/realtime/doc.pdf', Action::TYPE_DOWNLOAD); - - $this->insertTestRecord('2026-01-01 10:00:00', 'ChatGPT-User', null, $pageA, 200); - $this->insertTestRecord('2026-01-01 10:10:00', 'ChatGPT-User', null, $pageA, 404); - $this->insertTestRecord('2026-01-01 10:20:00', 'ChatGPT-User', null, $pageB, 500); - $this->insertTestRecord('2026-01-01 10:30:00', 'ChatGPT-User', null, $document, 404); - $this->insertTestRecord('2026-01-01 10:40:00', 'Claude-User', null, $pageC, 200); - $this->insertTestRecord('2026-01-01 10:50:00', 'Claude-User', null, $document, 503); - - $this->insertTestRecord('2026-01-01 09:59:59', 'OutOfWindow-Bot', null, $pageA, 200); - $this->insertTestRecord('2026-01-01 10:00:00', 'Regular-Bot', null, $pageA, 200, 'crawler'); - $this->insertTestRecord('2026-01-01 10:00:00', 'OtherSite-Bot', $this->idSite + 1, $pageA, 200); - - $table = $this->dao->getAIChatbotActivityForDateRange([$this->idSite], '2026-01-01 10:00:00', '2026-01-01 12:00:00'); - $rows = $this->indexRowsByLabel($table); - - self::assertCount(2, $rows); - - self::assertSame(4, $rows['ChatGPT-User'][Metrics::COLUMN_REQUESTS]); - self::assertSame(2, $rows['ChatGPT-User'][Metrics::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS]); - self::assertSame(2, $rows['ChatGPT-User'][Metrics::METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS]); - self::assertSame(1, $rows['ChatGPT-User'][Metrics::METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS]); - - self::assertSame(2, $rows['Claude-User'][Metrics::COLUMN_REQUESTS]); - self::assertSame(1, $rows['Claude-User'][Metrics::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS]); - self::assertSame(0, $rows['Claude-User'][Metrics::METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS]); - self::assertSame(1, $rows['Claude-User'][Metrics::METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS]); - } - - public function testGetAIChatbotTopPageUrlsForDateRangeReturnsOnlyFlatPageUrls(): void - { - $pageA = $this->createAction('example.com/realtime/a', Action::TYPE_PAGE_URL); - $pageB = $this->createAction('example.com/realtime/b', Action::TYPE_PAGE_URL); - $pageC = $this->createAction('example.com/realtime/c', Action::TYPE_PAGE_URL); - $document = $this->createAction('example.com/realtime/doc.pdf', Action::TYPE_DOWNLOAD); - - $this->insertTestRecord('2026-01-01 10:00:00', 'ChatGPT-User', null, $pageA, 200); - $this->insertTestRecord('2026-01-01 10:10:00', 'ChatGPT-User', null, $pageA, 404); - $this->insertTestRecord('2026-01-01 10:20:00', 'ChatGPT-User', null, $pageB, 500); - $this->insertTestRecord('2026-01-01 10:30:00', 'Claude-User', null, $document, 404); - $this->insertTestRecord('2026-01-01 10:40:00', 'Claude-User', null, $pageC, 200); - $this->insertTestRecord('2026-01-01 09:59:59', 'OutOfWindow-Bot', null, $pageA, 200); - $this->insertTestRecord('2026-01-01 10:00:00', 'Regular-Bot', null, $pageA, 200, 'crawler'); - - $table = $this->dao->getAIChatbotTopPageUrlsForDateRange([$this->idSite], '2026-01-01 10:00:00', '2026-01-01 12:00:00'); - $rows = $table->getRows(); - - self::assertCount(3, $rows); - self::assertSame('example.com/realtime/a', $rows[0]->getColumn('label')); - self::assertSame(2, $rows[0]->getColumn(Metrics::COLUMN_REQUESTS)); - self::assertSame('example.com/realtime/b', $rows[1]->getColumn('label')); - self::assertSame(1, $rows[1]->getColumn(Metrics::COLUMN_REQUESTS)); - self::assertSame('example.com/realtime/c', $rows[2]->getColumn('label')); - self::assertSame(1, $rows[2]->getColumn(Metrics::COLUMN_REQUESTS)); - } - - public function testGetAIChatbotTopPageUrlsForDateRangeUsesConfiguredLimit(): void - { - $config = Config::getInstance(); - $previousConfig = $config->General['live_ai_chatbots_top_page_urls_maximum_rows'] ?? null; - $hadPreviousConfig = array_key_exists('live_ai_chatbots_top_page_urls_maximum_rows', $config->General); - $config->General['live_ai_chatbots_top_page_urls_maximum_rows'] = 2; - - try { - $pageA = $this->createAction('example.com/realtime/a', Action::TYPE_PAGE_URL); - $pageB = $this->createAction('example.com/realtime/b', Action::TYPE_PAGE_URL); - $pageC = $this->createAction('example.com/realtime/c', Action::TYPE_PAGE_URL); - - $this->insertTestRecord('2026-01-01 10:00:00', 'ChatGPT-User', null, $pageA, 200); - $this->insertTestRecord('2026-01-01 10:10:00', 'ChatGPT-User', null, $pageA, 200); - $this->insertTestRecord('2026-01-01 10:20:00', 'Claude-User', null, $pageB, 200); - $this->insertTestRecord('2026-01-01 10:30:00', 'Perplexity-User', null, $pageC, 200); - - $table = $this->dao->getAIChatbotTopPageUrlsForDateRange([$this->idSite], '2026-01-01 10:00:00', '2026-01-01 12:00:00'); - - self::assertCount(2, $table->getRows()); - } finally { - if ($hadPreviousConfig) { - $config->General['live_ai_chatbots_top_page_urls_maximum_rows'] = $previousConfig; - } else { - unset($config->General['live_ai_chatbots_top_page_urls_maximum_rows']); - } - } - } - - private function insertTestRecord( - $serverTime, - $botName, - $idSite = null, - ?int $idActionUrl = null, - ?int $httpStatusCode = null, - string $botType = BotDetector::BOT_TYPE_AI_CHATBOT - ): int { - if ($idSite === null) { - $idSite = $this->idSite; - } - - $data = [ - 'idsite' => $idSite, - 'server_time' => $serverTime, - 'bot_name' => $botName, - 'bot_type' => $botType, - 'idaction_url' => $idActionUrl, - 'http_status_code' => $httpStatusCode, - ]; - - return $this->dao->insert($data); - } - - private function createAction(string $name, int $type): int - { - $actionIds = TableLogAction::loadIdsAction([[$name, $type]]); - - return (int) reset($actionIds); - } - - /** - * @return array> - */ - private function indexRowsByLabel(\Piwik\DataTable $table): array - { - $rows = []; - foreach ($table->getRows() as $row) { - $rows[(string) $row->getColumn('label')] = $row->getColumns(); - } - - return $rows; - } - - /** - * @return string[] - */ - private function getIndexColumns(string $indexName): array - { - $tableName = BotRequestsDao::getPrefixedTableName(); - $rows = Db::fetchAll("SHOW INDEX FROM `{$tableName}`"); - $rows = array_filter($rows, function (array $row) use ($indexName): bool { - return $row['Key_name'] === $indexName; - }); - usort($rows, function (array $left, array $right): int { - return (int) $left['Seq_in_index'] <=> (int) $right['Seq_in_index']; - }); - - return array_column($rows, 'Column_name'); - } -} diff --git a/plugins/BotTracking/tests/Integration/NoRecentRequestsMessageTest.php b/plugins/BotTracking/tests/Integration/NoRecentRequestsMessageTest.php deleted file mode 100644 index 33a86834172a4c1bc3430f6826b5a7fc5bcf73b8..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Integration/NoRecentRequestsMessageTest.php +++ /dev/null @@ -1,115 +0,0 @@ -idSite = Fixture::createWebsite( - '2024-01-01 00:00:00', - 0, - 'Test Site', - 'https://example.com', - false, - null, - null, - 'America/Los_Angeles' - ); - } - - /** - * @dataProvider getShouldShowTestData - */ - public function testShouldShowNoRecentRequestsMessage( - string $testUtcNow, - string $testPeriod, - string $testDate, - string $requestServerTime, - string $siteTimezone, - bool $expectedShowShould - ): void { - Date::$now = strtotime($testUtcNow); - Site::setSiteFromArray($this->idSite, ['timezone' => $siteTimezone]); - - $dao = new BotRequestsDao(); - $dao->insert([ - 'idsite' => $this->idSite, - 'server_time' => $requestServerTime, - 'bot_name' => 'ChatGPT-User', - 'bot_type' => BotDetector::BOT_TYPE_AI_CHATBOT, - ]); - - $shouldShow = NoRecentRequestsMessage::shouldShow($this->idSite, $testPeriod, $testDate); - - self::assertSame($expectedShowShould, $shouldShow); - } - - public function testShouldShowWhenNoRequestsExist(): void - { - Date::$now = strtotime('2024-01-01 12:00:00'); - Site::setSiteFromArray($this->idSite, ['timezone' => 'UTC']); - - $shouldShow = NoRecentRequestsMessage::shouldShow($this->idSite, 'day', '2024-01-01'); - - self::assertTrue($shouldShow); - } - - /** - * @return iterable - */ - public function getShouldShowTestData(): iterable - { - yield 'today + request yesterday' => ['2024-01-01 12:00:00', 'day', '2024-01-01', '2023-12-31 12:00:00', 'UTC', false]; - yield 'today + request within last 7 days' => ['2024-01-07 12:00:00', 'day', '2024-01-08', '2024-01-01 12:00:00', 'UTC', false]; - yield 'today + request 1 week ago' => ['2024-01-08 12:00:00', 'day', '2024-01-08', '2024-01-01 12:00:00', 'UTC', true]; - yield 'today + request 1 month ago' => ['2024-01-01 12:00:00', 'day', '2024-01-01', '2023-12-01 12:00:00', 'UTC', true]; - - yield 'old day + request today' => ['2024-01-01 12:00:00', 'day', '2023-01-01', '2024-01-01 00:00:00', 'UTC', false]; - yield 'old day + old request' => ['2024-01-01 12:00:00', 'day', '2023-01-01', '2023-01-01 00:00:00', 'UTC', false]; - - yield 'last month within reach + request today' => ['2024-01-01 12:00:00', 'month', '2023-12-01', '2024-01-01 00:00:00', 'UTC', false]; - yield 'last month within reach + old request' => ['2024-01-01 12:00:00', 'month', '2023-12-01', '2023-01-01 00:00:00', 'UTC', true]; - yield 'last month out of reach + request today' => ['2024-01-21 12:00:00', 'month', '2023-12-01', '2024-01-21 00:00:00', 'UTC', false]; - yield 'last month out of reach + old request' => ['2024-01-21 12:00:00', 'month', '2023-12-01', '2023-01-01 00:00:00', 'UTC', false]; - - yield 'range within reach + request today' => ['2024-01-01 12:00:00', 'range', '2023-12-01,2023-12-30', '2024-01-01 00:00:00', 'UTC', false]; - yield 'range within reach + old request' => ['2024-01-01 12:00:00', 'range', '2023-12-01,2023-12-30', '2023-01-01 00:00:00', 'UTC', true]; - yield 'range out of reach + request today' => ['2024-01-21 12:00:00', 'range', '2023-12-01,2023-12-30', '2024-01-21 00:00:00', 'UTC', false]; - yield 'range out of reach + old request' => ['2024-01-21 12:00:00', 'range', '2023-12-01,2023-12-30', '2023-01-01 00:00:00', 'UTC', false]; - - yield 'site timezone positive UTC + recent request' => ['2023-12-31 16:00:00', 'day', '2024-01-01', '2023-12-25 16:00:00', 'UTC+8', false]; - yield 'site timezone positive UTC + old request' => ['2023-12-31 16:00:00', 'day', '2024-01-01', '2023-12-25 15:59:59', 'UTC+8', true]; - yield 'site timezone negative UTC + recent request' => ['2024-01-01 08:00:00', 'day', '2024-01-01', '2023-12-26 08:00:00', 'UTC-8', false]; - yield 'site timezone negative UTC + old request' => ['2024-01-01 08:00:00', 'day', '2024-01-01', '2023-12-26 07:59:59', 'UTC-8', true]; - } -} diff --git a/plugins/BotTracking/tests/Integration/RealTimeApiTest.php b/plugins/BotTracking/tests/Integration/RealTimeApiTest.php deleted file mode 100644 index d728393768eb5a18b13377a7ebf595f72976e42c..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Integration/RealTimeApiTest.php +++ /dev/null @@ -1,207 +0,0 @@ -idSite = Fixture::createWebsite('2026-01-01 00:00:00'); - } - - public function tearDown(): void - { - Date::$now = null; - - parent::tearDown(); - } - - public function testRealTimeApiRejectsLookbacksLongerThanTwelveHours(): void - { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('lastMinutes only accepts values between 1 and 720'); - - API::getInstance()->getAIChatbotsRealTime($this->idSite, 721); - } - - public function testRealTimeApiRejectsNonPositiveLookbacks(): void - { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('lastMinutes only accepts values between 1 and 720'); - - API::getInstance()->getTopPageUrlsRealTime($this->idSite, 0); - } - - public function testRealTimeApiReturnsDecoratedChatbotLabels(): void - { - $dao = new BotRequestsDao(); - $dao->insert([ - 'idsite' => $this->idSite, - 'server_time' => '2026-01-01 11:45:00', - 'idaction_url' => $this->createAction('example.com/realtime/a', Action::TYPE_PAGE_URL), - 'bot_name' => 'ChatGPT-User', - 'bot_type' => BotDetector::BOT_TYPE_AI_CHATBOT, - 'http_status_code' => 200, - ]); - - $table = API::getInstance()->getAIChatbotsRealTime($this->idSite, '30'); - $rows = $table->getRows(); - - self::assertCount(1, $rows); - self::assertSame('ChatGPT', $rows[0]->getColumn('label')); - self::assertSame(1, $rows[0]->getColumn(Metrics::COLUMN_REQUESTS)); - } - - public function testRealTimeReportsAreHiddenFromReportMetadata(): void - { - $metadata = MetadataApi::getInstance()->getReportMetadata($this->idSite); - $uniqueIds = array_column($metadata, 'uniqueId'); - - self::assertNotContains('BotTracking_getAIChatbotsRealTime', $uniqueIds); - self::assertNotContains('BotTracking_getTopPageUrlsRealTime', $uniqueIds); - } - - public function testRealTimeReportFooterShowsConfiguredLimit(): void - { - $config = Config::getInstance(); - $previousConfig = $config->General['live_ai_chatbots_top_page_urls_maximum_rows'] ?? null; - $hadPreviousConfig = array_key_exists('live_ai_chatbots_top_page_urls_maximum_rows', $config->General); - $config->General['live_ai_chatbots_top_page_urls_maximum_rows'] = 37; - - try { - Manager::getInstance()->loadPluginTranslations(); - - $_GET['idSite'] = (string) $this->idSite; - $_GET['date'] = 'today'; - $_GET['period'] = 'day'; - - $view = ViewDataTableFactory::build( - $defaultType = null, - 'BotTracking.getTopPageUrlsRealTime', - $controllerAction = 'BotTracking.getTopPageUrlsRealTime', - $forceDefault = false, - $loadViewDataTableParametersForUser = false - ); - - self::assertStringContainsString('37', $view->config->show_footer_message); - self::assertNotSame( - 'BotTracking_AIChatbotsRealTimeReportLimitFooter', - $view->config->show_footer_message - ); - } finally { - unset($_GET['idSite'], $_GET['date'], $_GET['period']); - - if ($hadPreviousConfig) { - $config->General['live_ai_chatbots_top_page_urls_maximum_rows'] = $previousConfig; - } else { - unset($config->General['live_ai_chatbots_top_page_urls_maximum_rows']); - } - } - } - - public function testHiddenRealTimeReportsAreAddedToGlossaryPageItems(): void - { - $glossaryItems = [ - 'metrics' => [ - 'title' => Piwik::translate('General_Metrics'), - 'entries' => [], - ], - 'reports' => [ - 'title' => Piwik::translate('General_Reports'), - 'entries' => [], - ], - ]; - - Piwik::postEvent('API.addGlossaryItems', array(&$glossaryItems)); - $reportNames = array_column($glossaryItems['reports']['entries'], 'name'); - $category = Piwik::translate('General_AIAssistants'); - - self::assertContains( - sprintf('%s (%s)', Piwik::translate('BotTracking_AIChatbotsLast30MinutesTitle'), $category), - $reportNames - ); - self::assertContains( - sprintf('%s (%s)', Piwik::translate('BotTracking_AIChatbotsLast8HoursTitle'), $category), - $reportNames - ); - self::assertContains( - sprintf('%s (%s)', Piwik::translate('BotTracking_TopPageUrlsLast30MinutesTitle'), $category), - $reportNames - ); - self::assertContains( - sprintf('%s (%s)', Piwik::translate('BotTracking_TopPageUrlsLast8HoursTitle'), $category), - $reportNames - ); - } - - public function testRequestsMetricAppearsInGlossaryMetrics(): void - { - $metrics = MetadataApi::getInstance()->getGlossaryMetrics($this->idSite); - $metric = $this->findMetric($metrics, Metrics::COLUMN_REQUESTS); - - self::assertNotNull($metric); - self::assertSame(Piwik::translate('BotTracking_ColumnRequests'), $metric['name']); - self::assertSame( - Piwik::translate('BotTracking_ColumnRequestsDocumentation'), - $metric['documentation'] - ); - } - - private function createAction(string $name, int $type): int - { - $actionIds = TableLogAction::loadIdsAction([[$name, $type]]); - - return (int) reset($actionIds); - } - - /** - * @param array> $metrics - * @return array|null - */ - private function findMetric(array $metrics, string $metricId): ?array - { - foreach ($metrics as $metric) { - if (($metric['id'] ?? null) === $metricId) { - return $metric; - } - } - - return null; - } -} diff --git a/plugins/BotTracking/tests/Integration/Tracker/BotRequestProcessorTest.php b/plugins/BotTracking/tests/Integration/Tracker/BotRequestProcessorTest.php deleted file mode 100644 index a857cc323d1888eac3303878d6a7adeea3581d13..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Integration/Tracker/BotRequestProcessorTest.php +++ /dev/null @@ -1,262 +0,0 @@ -idSite = Fixture::createWebsite('2025-01-01 00:00:00'); - - $this->requestProcessor = new BotRequestProcessor(new BotRequestsDao(), new NullLogger()); - } - - public function testProcessRequestParamsDetectsBotRequest(): void - { - $request = $this->makeRequest([ - 'idsite' => $this->idSite, - 'url' => 'https://example.com/test', - 'ua' => 'ChatGPT-User/1.0', - ]); - - $result = $this->requestProcessor->handleRequest($request); - - self::assertTrue($result); - } - - public function testProcessRequestParamsDoesNotDetectNonBotRequest(): void - { - $request = $this->makeRequest([ - 'idsite' => $this->idSite, - 'url' => 'https://example.com/test', - 'ua' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', - ]); - - $result = $this->requestProcessor->handleRequest($request); - - self::assertFalse($result); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT COUNT(*) as count FROM `{$tableName}` WHERE idsite = ?"; - $count = Db::fetchOne($sql, [$this->idSite]); - - self::assertEquals(0, $count); - } - - public function testRecordLogsHandlesOptionalParameters(): void - { - $request = $this->makeRequest([ - 'idsite' => $this->idSite, - 'url' => 'https://example.com/test', - 'ua' => 'Perplexity-User/1.0', - // No optional parameters - ]); - - $this->requestProcessor->handleRequest($request); - - // Verify data was stored with NULL optional fields - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idsite = ?"; - $records = Db::fetchAll($sql, [$this->idSite]); - - $this->assertCount(1, $records); - $record = $records[0]; - - self::assertNull($record['http_status_code']); - self::assertNull($record['response_size_bytes']); - self::assertNull($record['response_time_ms']); - self::assertNull($record['source']); - } - - public function testRecordLogsHandlesDownloadParameter(): void - { - $request = $this->makeRequest([ - 'idsite' => $this->idSite, - 'url' => 'https://example.com/page', - 'download' => 'https://example.com/document.pdf', - 'ua' => 'Claude-User/2.0', - ]); - - $this->requestProcessor->handleRequest($request); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idsite = ?"; - $records = Db::fetchAll($sql, [$this->idSite]); - - self::assertCount(1, $records); - self::assertNotNull($records[0]['idaction_url']); - - $tableName = Common::prefixTable('log_action'); - $action = Db::fetchAll("SELECT * FROM `{$tableName}` WHERE idaction = ?", [$records[0]['idaction_url']]); - self::assertCount(1, $action); - self::assertEquals('example.com/document.pdf', $action[0]['name']); - self::assertEquals(Action::TYPE_DOWNLOAD, $action[0]['type']); - } - - public function testExcludedQueryParametersAreStrippedFromPageUrl(): void - { - $idSite = Fixture::createWebsite( - '2025-01-01 00:00:00', - $ecommerce = 0, - $siteName = false, - $siteUrl = false, - $siteSearch = 1, - $searchKeywordParameters = null, - $searchCategoryParameters = null, - $timezone = null, - $type = null, - $excludeUnknownUrls = 0, - $excludedParameters = 'excluded' - ); - - $request = $this->makeRequest([ - 'idsite' => $idSite, - 'url' => 'https://example.com/test?keep=1&excluded=secret', - 'ua' => 'ChatGPT-User/1.0', - ]); - - $this->requestProcessor->handleRequest($request); - - self::assertEquals('example.com/test?keep=1', $this->getStoredActionName($idSite)); - } - - public function testGloballyExcludedQueryParametersAreStripped(): void - { - // gclid ships in the global url_query_parameter_to_exclude_from_url config - $request = $this->makeRequest([ - 'idsite' => $this->idSite, - 'url' => 'https://example.com/page?gclid=abc&x=1', - 'ua' => 'Claude-User/2.0', - ]); - - $this->requestProcessor->handleRequest($request); - - self::assertEquals('example.com/page?x=1', $this->getStoredActionName($this->idSite)); - } - - public function testDownloadUrlQueryParametersAreNotExcluded(): void - { - $idSite = Fixture::createWebsite( - '2025-01-01 00:00:00', - $ecommerce = 0, - $siteName = false, - $siteUrl = false, - $siteSearch = 1, - $searchKeywordParameters = null, - $searchCategoryParameters = null, - $timezone = null, - $type = null, - $excludeUnknownUrls = 0, - $excludedParameters = 'excluded' - ); - - $request = $this->makeRequest([ - 'idsite' => $idSite, - 'url' => 'https://example.com/page', - 'download' => 'https://example.com/document.pdf?excluded=secret', - 'ua' => 'Claude-User/2.0', - ]); - - $this->requestProcessor->handleRequest($request); - - // Downloads must behave like normal tracking, which does not exclude parameters - self::assertEquals('example.com/document.pdf?excluded=secret', $this->getStoredActionName($idSite)); - } - - /** - * @dataProvider getBotUserAgents - */ - public function testMultipleBotTypesAreDetected(string $userAgent, string $expectedBotName): void - { - $request = $this->makeRequest([ - 'idsite' => $this->idSite, - 'url' => 'https://example.com/test', - 'ua' => $userAgent, - ]); - - $this->requestProcessor->handleRequest($request); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT bot_name FROM `{$tableName}` WHERE idsite = ? ORDER BY idrequest DESC LIMIT 1"; - $botName = Db::fetchOne($sql, [$this->idSite]); - - self::assertEquals($expectedBotName, $botName); - } - - /** - * @return array - */ - public function getBotUserAgents(): array - { - return [ - ['ChatGPT-User/1.0', 'ChatGPT-User'], - ['MistralAI-User/2.0', 'MistralAI-User'], - ['Gemini-Deep-Research/1.0', 'Gemini-Deep-Research'], - ['Claude-User/3.0', 'Claude-User'], - ['Perplexity-User/1.0', 'Perplexity-User'], - ['Google-NotebookLM/1.0', 'Google-NotebookLM'], - ]; - } - - private function makeRequest(array $params): Request - { - $params = array_merge([ - 'rec' => 1, - ], $params); - - return new Request($params); - } - - private function getStoredActionName(int $idSite): ?string - { - $tableName = BotRequestsDao::getPrefixedTableName(); - $idActionUrl = Db::fetchOne( - "SELECT idaction_url FROM `{$tableName}` WHERE idsite = ? ORDER BY idrequest DESC LIMIT 1", - [$idSite] - ); - - if (empty($idActionUrl)) { - return null; - } - - $actionTable = Common::prefixTable('log_action'); - - return Db::fetchOne("SELECT name FROM `{$actionTable}` WHERE idaction = ?", [$idActionUrl]); - } -} diff --git a/plugins/BotTracking/tests/Integration/TrackerTest.php b/plugins/BotTracking/tests/Integration/TrackerTest.php deleted file mode 100644 index 5fdd5a4cdb34284a90e0236a695c74274daa4d58..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Integration/TrackerTest.php +++ /dev/null @@ -1,223 +0,0 @@ -setUserAgent($userAgent); - $t->setUrl('https://matomo.org/faq/123'); - $t->setCustomTrackingParameter('recMode', '1'); - - Fixture::checkResponse($t->doTrackPageView('')); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idsite = ?"; - $records = Db::fetchAll($sql, [1]); - - self::assertCount(1, $records); - self::assertEquals($expectedAgent, $records[0]['bot_name']); - self::assertEquals($expectedType, $records[0]['bot_type']); - - $tableName = Common::prefixTable('log_visit'); - $sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE idsite = ?"; - self::assertEquals(0, Db::fetchOne($sql, [1])); - - $tableName = Common::prefixTable('log_action'); - $sql = "SELECT COUNT(*) FROM `{$tableName}`"; - self::assertEquals(1, Db::fetchOne($sql)); - } - - /** - * @return array - */ - public function getBotUserAgents(): array - { - return [ - ['ChatGPT-User/1.0', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['chatgpt-user/1.0', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['CHATGPT-USER/1.0', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Mozilla/5.0 (compatible; ChatGPT-User/1.0)', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Mozilla/5.0 (compatible; ChatGPT-User/1.0; +https://openai.com)', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['MistralAI-User/2.0', 'MistralAI-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Gemini-Deep-Research/1.0', 'Gemini-Deep-Research', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Claude-User/3.0', 'Claude-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Perplexity-User/1.0', 'Perplexity-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Google-NotebookLM/1.0', 'Google-NotebookLM', BotDetector::BOT_TYPE_AI_CHATBOT], - ]; - } - - public function testActionIdsAreCorrectlyReused(): void - { - $t = Fixture::getTracker(1, '2025-02-02 12:00:00'); - $t->setUserAgent('ChatGPT-User/1.0'); - $t->setUrl('https://matomo.org/faq/123'); - $t->setCustomTrackingParameter('recMode', '1'); - - Fixture::checkResponse($t->doTrackPageView('')); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idsite = ?"; - $records = Db::fetchAll($sql, [1]); - - self::assertCount(1, $records); - self::assertEquals('ChatGPT-User', $records[0]['bot_name']); - self::assertEquals(BotDetector::BOT_TYPE_AI_CHATBOT, $records[0]['bot_type']); - - $tableName = Common::prefixTable('log_visit'); - $sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE idsite = ?"; - self::assertEquals(0, Db::fetchOne($sql, [1])); - - $tableName = Common::prefixTable('log_action'); - $sql = "SELECT COUNT(*) FROM `{$tableName}`"; - self::assertEquals(1, Db::fetchOne($sql)); - - // track another bot request to ensure now new action is created - $t = Fixture::getTracker(1, '2025-02-02 12:00:00'); - $t->setUserAgent('Gemini-Deep-Research/1.0'); - $t->setUrl('https://matomo.org/faq/123'); - $t->setCustomTrackingParameter('recMode', '1'); - - Fixture::checkResponse($t->doTrackPageView('')); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idsite = ?"; - $records = Db::fetchAll($sql, [1]); - - self::assertCount(2, $records); - self::assertEquals('Gemini-Deep-Research', $records[1]['bot_name']); - self::assertEquals(BotDetector::BOT_TYPE_AI_CHATBOT, $records[1]['bot_type']); - - $tableName = Common::prefixTable('log_visit'); - $sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE idsite = ?"; - self::assertEquals(0, Db::fetchOne($sql, [1])); - - $tableName = Common::prefixTable('log_action'); - $sql = "SELECT COUNT(*) FROM `{$tableName}`"; - self::assertEquals(1, Db::fetchOne($sql)); - } - - public function testVisitsAndBotsShareActions(): void - { - // track a normal visit - $t = Fixture::getTracker(1, '2025-02-02 12:00:00'); - $t->setUrl('https://matomo.org/faq/123'); - Fixture::checkResponse($t->doTrackPageView('')); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idsite = ?"; - $records = Db::fetchAll($sql, [1]); - self::assertCount(0, $records); - - $tableName = Common::prefixTable('log_visit'); - $sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE idsite = ?"; - self::assertEquals(1, Db::fetchOne($sql, [1])); - - $tableName = Common::prefixTable('log_action'); - $sql = "SELECT COUNT(*) FROM `{$tableName}`"; - self::assertEquals(1, Db::fetchOne($sql)); - - // track another bot request to ensure now new action is created - $t = Fixture::getTracker(1, '2025-02-02 12:00:00'); - $t->setUserAgent('Gemini-Deep-Research/1.0'); - $t->setUrl('https://matomo.org/faq/123'); - $t->setCustomTrackingParameter('recMode', '1'); - - Fixture::checkResponse($t->doTrackPageView('')); - - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT * FROM `{$tableName}` WHERE idsite = ?"; - $records = Db::fetchAll($sql, [1]); - - self::assertCount(1, $records); - self::assertEquals('Gemini-Deep-Research', $records[0]['bot_name']); - self::assertEquals(BotDetector::BOT_TYPE_AI_CHATBOT, $records[0]['bot_type']); - - $tableName = Common::prefixTable('log_visit'); - $sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE idsite = ?"; - self::assertEquals(1, Db::fetchOne($sql, [1])); - - $tableName = Common::prefixTable('log_action'); - $sql = "SELECT COUNT(*) FROM `{$tableName}`"; - self::assertEquals(1, Db::fetchOne($sql)); - } - - public function testVisitsAndBotsShareActionsWhenQueryParametersAreExcluded(): void - { - $idSite = Fixture::createWebsite( - '2014-02-04', - $ecommerce = 0, - $siteName = false, - $siteUrl = false, - $siteSearch = 1, - $searchKeywordParameters = null, - $searchCategoryParameters = null, - $timezone = null, - $type = null, - $excludeUnknownUrls = 0, - $excludedParameters = 'excluded' - ); - - $url = 'https://matomo.org/faq/123?keep=1&excluded=secret'; - - // track a normal visit with the excluded parameter - $t = Fixture::getTracker($idSite, '2025-02-02 12:00:00'); - $t->setUrl($url); - Fixture::checkResponse($t->doTrackPageView('')); - - // track a bot request with the same URL - $t = Fixture::getTracker($idSite, '2025-02-02 12:00:00'); - $t->setUserAgent('Gemini-Deep-Research/1.0'); - $t->setUrl($url); - $t->setCustomTrackingParameter('recMode', '1'); - Fixture::checkResponse($t->doTrackPageView('')); - - // the bot request must store the same cleaned URL the normal visit stored, - // so both resolve to a single shared action - $tableName = BotRequestsDao::getPrefixedTableName(); - $idActionUrl = Db::fetchOne("SELECT idaction_url FROM `{$tableName}` WHERE idsite = ?", [$idSite]); - - $actionTable = Common::prefixTable('log_action'); - $name = Db::fetchOne("SELECT name FROM `{$actionTable}` WHERE idaction = ?", [$idActionUrl]); - self::assertEquals('matomo.org/faq/123?keep=1', $name); - - $count = Db::fetchOne("SELECT COUNT(*) FROM `{$actionTable}` WHERE name = ? AND type = ?", [ - 'matomo.org/faq/123?keep=1', - \Piwik\Tracker\Action::TYPE_PAGE_URL, - ]); - self::assertEquals(1, $count); - } -} diff --git a/plugins/BotTracking/tests/System/ApiTest.php b/plugins/BotTracking/tests/System/ApiTest.php deleted file mode 100644 index 3aa6ae21beb08aa2fcf88bce1a1d97cd6cdeb3b8..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/ApiTest.php +++ /dev/null @@ -1,248 +0,0 @@ -runApiTests($api, $params); - } - - public function getApiForTesting() - { - return [ - [ - [ - 'BotTracking.get', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - ], - ], - [ - [ - 'BotTracking.getAIChatbotRequests', - ], - [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'otherRequestParameters' => [ - 'expanded' => 1, - 'secondaryDimension' => 'pages', - ], - 'testSuffix' => '_pages', - ], - ], - [ - [ - 'BotTracking.getAIChatbotRequests', - ], - [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'otherRequestParameters' => [ - 'flat' => 1, - ], - 'testSuffix' => '_flat', - ], - ], - [ - [ - 'BotTracking.getAIChatbotRequests', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'otherRequestParameters' => [ - 'expanded' => 1, - 'secondaryDimension' => 'documents', - ], - 'testSuffix' => '_documents', - ], - ], - [ - [ - 'BotTracking.getAIChatbotContentPages', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => '_content_pages', - ], - ], - [ - [ - 'BotTracking.getAIChatbotContentDocuments', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => '_content_documents', - ], - ], - [ - [ - 'BotTracking.getAIChatbotBrokenContent', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => '_broken_content', - ], - ], - [ - [ - 'BotTracking.getAIChatbotHumanFavouredPages', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => '_human_favoured', - 'otherRequestParameters' => [ - // Ensure the low-pop filter is disabled so the fixture's low-volume rows - // remain visible in the expected output. - 'enable_filter_excludelowpop' => 0, - ], - ], - ], - [ - [ - 'BotTracking.getAIChatbotAIFavouredPages', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => '_ai_favoured', - 'otherRequestParameters' => [ - 'enable_filter_excludelowpop' => 0, - ], - ], - ], - // Exercise the UI's effective query: exclude rows below a score of 1 and sort by the - // score. Guards the regression where the score-based low-population filter emptied the - // report (the score was recomputed after row deletion / absent when the filter ran). - [ - [ - 'BotTracking.getAIChatbotHumanFavouredPages', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => '_human_favoured_filtered', - 'otherRequestParameters' => [ - 'filter_excludelowpop' => 'discrepancy_score', - 'filter_excludelowpop_value' => '1', - 'filter_sort_column' => 'discrepancy_score', - ], - ], - ], - [ - [ - 'BotTracking.getAIChatbotAIFavouredPages', - ], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => '_ai_favoured_filtered', - 'otherRequestParameters' => [ - 'filter_excludelowpop' => 'discrepancy_score', - 'filter_excludelowpop_value' => '1', - 'filter_sort_column' => 'discrepancy_score', - ], - ], - ], - [ - [ - 'BotTracking.getAIChatbotsRealTime', - ], [ - 'idSite' => 1, - 'date' => 'today', - 'periods' => ['day'], - 'testSuffix' => '_realtime_chatbots_30', - 'otherRequestParameters' => [ - 'lastMinutes' => AIChatbotsRealTimeWidgets::LOOKBACK_30_MINUTES, - ], - ], - ], - [ - [ - 'BotTracking.getAIChatbotsRealTime', - ], [ - 'idSite' => 1, - 'date' => 'today', - 'periods' => ['day'], - 'testSuffix' => '_realtime_chatbots_8h', - 'otherRequestParameters' => [ - 'lastMinutes' => AIChatbotsRealTimeWidgets::LOOKBACK_480_MINUTES, - ], - ], - ], - [ - [ - 'BotTracking.getTopPageUrlsRealTime', - ], [ - 'idSite' => 1, - 'date' => 'today', - 'periods' => ['day'], - 'testSuffix' => '_realtime_top_pages_30', - 'otherRequestParameters' => [ - 'lastMinutes' => AIChatbotsRealTimeWidgets::LOOKBACK_30_MINUTES, - ], - ], - ], - [ - [ - 'BotTracking.getTopPageUrlsRealTime', - ], [ - 'idSite' => 1, - 'date' => 'today', - 'periods' => ['day'], - 'testSuffix' => '_realtime_top_pages_8h', - 'otherRequestParameters' => [ - 'lastMinutes' => AIChatbotsRealTimeWidgets::LOOKBACK_480_MINUTES, - ], - ], - ], - ]; - } - - public static function getOutputPrefix() - { - return ''; - } - - public static function getPathToTestDirectory() - { - return __DIR__; - } -} - -ApiTest::$fixture = new BotTraffic(); diff --git a/plugins/BotTracking/tests/System/PurgeLogDataTest.php b/plugins/BotTracking/tests/System/PurgeLogDataTest.php deleted file mode 100644 index 0deeeb228457d009fbe34a6ee25a2f97befbfed4..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/PurgeLogDataTest.php +++ /dev/null @@ -1,117 +0,0 @@ -setUserAgent('Mozilla/5.0 (compatible; ChatGPT-User/1.0)'); - $t->setUrl('https://matomo.org/faq/123'); - $t->setCustomTrackingParameter('recMode', '1'); - Fixture::checkResponse($t->doTrackPageView('')); - - $t = Fixture::getTracker(1, '2025-02-02 17:00:00'); - $t->setUserAgent('Perplexity-User/1.0'); - $t->setUrl('https://matomo.org/faq/987'); - $t->setCustomTrackingParameter('recMode', '1'); - Fixture::checkResponse($t->doTrackPageView('')); - - $t = Fixture::getTracker(1, '2025-02-03 01:00:00'); - $t->setUserAgent('MistralAI-User/2.0'); - $t->setUrl('https://matomo.org/faq/576'); - $t->setCustomTrackingParameter('recMode', '1'); - Fixture::checkResponse($t->doTrackPageView('')); - } - - public function testLogDataPurgingRemovesBotRequests(): void - { - // check that all requests were tracked - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT COUNT(*) FROM `{$tableName}`"; - self::assertEquals(3, Db::fetchOne($sql)); - - // run purging for dates before 2025-02-03 - $rawLogDao = new RawLogDao(new DimensionMetadataProvider()); - $purger = new LogDataPurger(new LogDeleter($rawLogDao, new LogTablesProvider()), $rawLogDao); - $days = floor((Date::now()->getTimestamp() - Date::factory('2025-02-03 00:00:00')->getTimestamp()) / (3600 * 24)); - $purger->purgeData($days, true); - - // ensure that two bot requests were removed - $sql = "SELECT * FROM `{$tableName}`"; - $bots = Db::fetchAll($sql); - self::assertCount(1, $bots); - self::assertEquals('MistralAI-User', $bots[0]['bot_name']); - } - - public function testDeleteDataSubjectsForDeletedSitesRemovesBotRequests(): void - { - // track request for another site - Fixture::createWebsite('2014-02-04'); - - // track some bot requests - $t = Fixture::getTracker(2, '2025-02-02 12:00:00'); - $t->setUserAgent('Mozilla/5.0 (compatible; ChatGPT-User/1.0)'); - $t->setUrl('https://matomo.org/faq/123'); - $t->setCustomTrackingParameter('recMode', '1'); - Fixture::checkResponse($t->doTrackPageView('')); - - // remove site 1 - SitesManagerAPI::getInstance()->deleteSite(1); - - // check that all requests still exist - $tableName = BotRequestsDao::getPrefixedTableName(); - $sql = "SELECT COUNT(*) FROM `{$tableName}`"; - self::assertEquals(4, Db::fetchOne($sql)); - - $logTablesProvider = StaticContainer::get('Piwik\Plugin\LogTablesProvider'); - $dataSubjects = new DataSubjects($logTablesProvider); - $result = $dataSubjects->deleteDataSubjectsForDeletedSites([2]); // idsite 2 still exists - $this->assertEquals([ - 'log_bot_request' => 3, - ], $result); - - // check that requests were correctly removed - $sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE `idsite` = 1"; - self::assertEquals(0, Db::fetchOne($sql)); - - $sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE `idsite` = 2"; - self::assertEquals(1, Db::fetchOne($sql)); - } -} diff --git a/plugins/BotTracking/tests/System/RankingQueryApiTest.php b/plugins/BotTracking/tests/System/RankingQueryApiTest.php deleted file mode 100644 index 035d00863b44bf75444f3e227417b0877e45b8e9..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/RankingQueryApiTest.php +++ /dev/null @@ -1,172 +0,0 @@ -General; - $generalConfig['archiving_ranking_query_row_limit'] = 3; - $generalConfig['datatable_archiving_maximum_rows_bots'] = 0; // no limit here, so we see that the ranking query creates the others row - $generalConfig['datatable_archiving_maximum_rows_subtable_bots'] = 2; - - Cache::flushAll(); - self::deleteArchiveTables(); - - $this->runApiTests(['BotTracking.getAIChatbotRequests'], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'otherRequestParameters' => [ - 'expanded' => 1, - 'secondaryDimension' => 'pages', - ], - 'testSuffix' => 'ranking_limit_pages', - ]); - } - - public function testRankingQueryUsesOthersRowDocuments(): void - { - $generalConfig = &Config::getInstance()->General; - $generalConfig['archiving_ranking_query_row_limit'] = 3; - $generalConfig['datatable_archiving_maximum_rows_bots'] = 4; - $generalConfig['datatable_archiving_maximum_rows_subtable_bots'] = 2; - - Cache::flushAll(); - self::deleteArchiveTables(); - - $this->runApiTests(['BotTracking.getAIChatbotRequests'], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'otherRequestParameters' => [ - 'expanded' => 1, - 'secondaryDimension' => 'documents', - ], - 'testSuffix' => 'ranking_limit_documents', - ]); - } - - public function testRankingQueryUsesOthersRowContentPages(): void - { - $generalConfig = &Config::getInstance()->General; - $generalConfig['datatable_archiving_maximum_rows_ai_chatbot_content'] = 2; - - Cache::flushAll(); - self::deleteArchiveTables(); - - $this->runApiTests(['BotTracking.getAIChatbotContentPages'], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => 'ranking_limit_content_pages', - ]); - } - - public function testRankingQueryUsesOthersRowContentDocuments(): void - { - $generalConfig = &Config::getInstance()->General; - $generalConfig['datatable_archiving_maximum_rows_ai_chatbot_content'] = 2; - - Cache::flushAll(); - self::deleteArchiveTables(); - - $this->runApiTests(['BotTracking.getAIChatbotContentDocuments'], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => 'ranking_limit_content_documents', - ]); - } - - public function testRankingQueryUsesOthersRowBrokenContent(): void - { - $generalConfig = &Config::getInstance()->General; - $generalConfig['datatable_archiving_maximum_rows_ai_chatbot_content'] = 2; - - Cache::flushAll(); - self::deleteArchiveTables(); - - $this->runApiTests(['BotTracking.getAIChatbotBrokenContent'], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'testSuffix' => 'ranking_limit_broken_content', - ]); - } - - public function testRankingQueryUsesOthersRowHumanFavouredPages(): void - { - $generalConfig = &Config::getInstance()->General; - $generalConfig['datatable_archiving_maximum_rows_ai_chatbot_favoured_pages'] = 2; - - Cache::flushAll(); - self::deleteArchiveTables(); - - // enable_filter_excludelowpop=0 shows every row (the default filter would drop the unscored - // Others row), so the truncation tail is visible for both the day blob and the week re-aggregation. - $this->runApiTests(['BotTracking.getAIChatbotHumanFavouredPages'], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'otherRequestParameters' => [ - 'enable_filter_excludelowpop' => 0, - ], - 'testSuffix' => 'ranking_limit_human_favoured_pages', - ]); - } - - public function testRankingQueryUsesOthersRowAiFavouredPages(): void - { - $generalConfig = &Config::getInstance()->General; - $generalConfig['datatable_archiving_maximum_rows_ai_chatbot_favoured_pages'] = 2; - - Cache::flushAll(); - self::deleteArchiveTables(); - - $this->runApiTests(['BotTracking.getAIChatbotAIFavouredPages'], [ - 'idSite' => 1, - 'date' => '2025-02-03', - 'periods' => ['day', 'week'], - 'otherRequestParameters' => [ - 'enable_filter_excludelowpop' => 0, - ], - 'testSuffix' => 'ranking_limit_ai_favoured_pages', - ]); - } - - public static function getOutputPrefix() - { - return ''; - } - - public static function getPathToTestDirectory() - { - return __DIR__; - } -} - -RankingQueryApiTest::$fixture = new BotTraffic(); diff --git a/plugins/BotTracking/tests/System/expected/test___BotTracking.get_day.xml b/plugins/BotTracking/tests/System/expected/test___BotTracking.get_day.xml deleted file mode 100644 index 2b648c13d3ce88c87e9f713b3f3f68dc1f028f1e..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test___BotTracking.get_day.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - 10 - 1 - 3 - 1 - 5 - 3 - 2 - 0.1 - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test___BotTracking.get_week.xml b/plugins/BotTracking/tests/System/expected/test___BotTracking.get_week.xml deleted file mode 100644 index 7587b27eaa1e8bb82b6632f5b0f7d0c883ff6515..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test___BotTracking.get_week.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 31 - 10 - 2 - 6 - 3 - 0.3226 - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__ai_favoured__BotTracking.getAIChatbotAIFavouredPages_day.xml b/plugins/BotTracking/tests/System/expected/test__ai_favoured__BotTracking.getAIChatbotAIFavouredPages_day.xml deleted file mode 100644 index 5a64c40e55c84c5e06afe71170ab7635382e92a6..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__ai_favoured__BotTracking.getAIChatbotAIFavouredPages_day.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - 0 - 2 - 79.2 - - - - 2 - 3 - 20 - - - - 1 - 1 - 0 - - - - 1 - 0 - 0 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__ai_favoured__BotTracking.getAIChatbotAIFavouredPages_week.xml b/plugins/BotTracking/tests/System/expected/test__ai_favoured__BotTracking.getAIChatbotAIFavouredPages_week.xml deleted file mode 100644 index f45ef5378a2db0c705f2347a74139977a4ca7a17..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__ai_favoured__BotTracking.getAIChatbotAIFavouredPages_week.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - 0 - 3 - 86.1 - - - - 0 - 2 - 68.3 - - - - 0 - 2 - 68.3 - - - - 0 - 2 - 68.3 - - - - 1 - 4 - 60 - - - - 0 - 1 - 43.1 - - - - 5 - 4 - 0 - - - - 1 - 0 - 0 - - - - 2 - 0 - 0 - - - - 3 - 0 - 0 - - - - 4 - 0 - 0 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__ai_favoured_filtered__BotTracking.getAIChatbotAIFavouredPages_day.xml b/plugins/BotTracking/tests/System/expected/test__ai_favoured_filtered__BotTracking.getAIChatbotAIFavouredPages_day.xml deleted file mode 100644 index 2b5a88fc2c3d2f16f5a3ffe04cf95f34b802aa6c..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__ai_favoured_filtered__BotTracking.getAIChatbotAIFavouredPages_day.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 0 - 2 - 79.2 - - - - 2 - 3 - 20 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__ai_favoured_filtered__BotTracking.getAIChatbotAIFavouredPages_week.xml b/plugins/BotTracking/tests/System/expected/test__ai_favoured_filtered__BotTracking.getAIChatbotAIFavouredPages_week.xml deleted file mode 100644 index 9c1149805b6e5bd961e0e94dc7188c0640cb6dc1..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__ai_favoured_filtered__BotTracking.getAIChatbotAIFavouredPages_week.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - 0 - 3 - 86.1 - - - - 0 - 2 - 68.3 - - - - 0 - 2 - 68.3 - - - - 0 - 2 - 68.3 - - - - 1 - 4 - 60 - - - - 0 - 1 - 43.1 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__broken_content__BotTracking.getAIChatbotBrokenContent_day.xml b/plugins/BotTracking/tests/System/expected/test__broken_content__BotTracking.getAIChatbotBrokenContent_day.xml deleted file mode 100644 index dc9e5529aaf800cf716f62a4a4a0f333f3e3c560..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__broken_content__BotTracking.getAIChatbotBrokenContent_day.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - 1 - 0 - 1 - - - - 1 - 1 - 0 - - - - 1 - 0 - 1 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__broken_content__BotTracking.getAIChatbotBrokenContent_week.xml b/plugins/BotTracking/tests/System/expected/test__broken_content__BotTracking.getAIChatbotBrokenContent_week.xml deleted file mode 100644 index 2a0cc17e3b027e0f2e6065c037fd2a435790b9ee..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__broken_content__BotTracking.getAIChatbotBrokenContent_week.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 1 - 0 - 1 - - - - 1 - 0 - 1 - - - - 1 - 1 - 0 - - - - 1 - 1 - 0 - - - - 1 - 0 - 1 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__content_documents__BotTracking.getAIChatbotContentDocuments_day.xml b/plugins/BotTracking/tests/System/expected/test__content_documents__BotTracking.getAIChatbotContentDocuments_day.xml deleted file mode 100644 index a087581896fc7ed1282c72a0bdb97513d2eba2a7..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__content_documents__BotTracking.getAIChatbotContentDocuments_day.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - 2 - 900 - 2 - 33658 - 1 - 0 - 1 - 0.45 - 33658 - - - - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - - 1 - 4500 - 1 - 123456 - 1 - 0 - 0 - 4.5 - 123456 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__content_documents__BotTracking.getAIChatbotContentDocuments_week.xml b/plugins/BotTracking/tests/System/expected/test__content_documents__BotTracking.getAIChatbotContentDocuments_week.xml deleted file mode 100644 index 47dc041e9860b24c14f4d09e85345ee5469b8a40..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__content_documents__BotTracking.getAIChatbotContentDocuments_week.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - 4 - 4280 - 4 - 329384 - 3 - 0 - 1 - 1.07 - 109794.66666667 - - - - 3 - 2900 - 2 - 207021 - 3 - 1 - 0 - 1.45 - 69007 - - - - 2 - 1500 - 2 - 96725 - 2 - 0 - 0 - 0.75 - 48362.5 - - - - 2 - 5000 - 1 - 225445 - 1 - 1 - 0 - 5 - 225445 - - - - 2 - 6700 - 2 - 193312 - 2 - 0 - 0 - 3.35 - 96656 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__content_pages__BotTracking.getAIChatbotContentPages_day.xml b/plugins/BotTracking/tests/System/expected/test__content_pages__BotTracking.getAIChatbotContentPages_day.xml deleted file mode 100644 index f7573c945cbc4080dd91ebc4b8ad7c4efc880abb..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__content_pages__BotTracking.getAIChatbotContentPages_day.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - 3 - 7700 - 3 - 106455 - 3 - 0 - 0 - 2.5666666666667 - 35485 - - - - 2 - 1520 - 2 - 29658 - 1 - 0 - 1 - 0.76 - 29658 - - - - 1 - 0 - 0 - 85236 - 1 - 0 - 0 - 85236 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__content_pages__BotTracking.getAIChatbotContentPages_week.xml b/plugins/BotTracking/tests/System/expected/test__content_pages__BotTracking.getAIChatbotContentPages_week.xml deleted file mode 100644 index a98a31777c87757086588d10a2aeae50299f56fb..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__content_pages__BotTracking.getAIChatbotContentPages_week.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - 4 - 9350 - 4 - 118911 - 4 - 0 - 0 - 2.3375 - 29727.75 - - - - 4 - 400 - 1 - 130940 - 4 - 0 - 0 - 0.4 - 32735 - - - - 3 - 5870 - 3 - 88372 - 3 - 0 - 0 - 1.9566666666667 - 29457.333333333 - - - - 2 - 1520 - 2 - 29658 - 1 - 0 - 1 - 0.76 - 29658 - - - - 2 - 3500 - 2 - 95147 - 1 - 0 - 1 - 1.75 - 95147 - - - - 2 - 1950 - 2 - 58852 - 2 - 0 - 0 - 0.975 - 29426 - - - - 1 - 210 - 1 - 25412 - 1 - 0 - 0 - 0.21 - 25412 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__documents__BotTracking.getAIChatbotRequests_day.xml b/plugins/BotTracking/tests/System/expected/test__documents__BotTracking.getAIChatbotRequests_day.xml deleted file mode 100644 index ca40f7777aeedaa233f40c7d39a2750bc4d7754e..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__documents__BotTracking.getAIChatbotRequests_day.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - 3 - 1 - 2 - 1 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 1 - - - - - - 2 - 1 - 1 - 0 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - - - 1 - 1 - 0 - 0 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - - - 1 - - - - - - 1 - 0 - 1 - 0 - gemini.google.com - plugins/Morpheus/icons/dist/aiAssistants/gemini.google.com.png - - - - 3 - 1 - 2 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 1 - - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__documents__BotTracking.getAIChatbotRequests_week.xml b/plugins/BotTracking/tests/System/expected/test__documents__BotTracking.getAIChatbotRequests_week.xml deleted file mode 100644 index fc7f689ce6f58b1af06caec9318471392765f71e..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__documents__BotTracking.getAIChatbotRequests_week.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - 5 - 1 - 4 - 2 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - - - 5 - 3 - 2 - 2 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - - - 1 - - - - 1 - - - - 1 - - - - - - 8 - 6 - 2 - 2 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 1 - - - - 1 - - - - 1 - - - - 2 - - - - 1 - - - - - - 4 - 0 - 4 - 0 - gemini.google.com - plugins/Morpheus/icons/dist/aiAssistants/gemini.google.com.png - - - - 5 - 1 - 4 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 1 - - - - - - 4 - 2 - 2 - 0 - notebooklm.google.com - plugins/Morpheus/icons/dist/aiAssistants/notebooklm.google.com.png - - - - 1 - - - - 1 - - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__flat__BotTracking.getAIChatbotRequests_day.xml b/plugins/BotTracking/tests/System/expected/test__flat__BotTracking.getAIChatbotRequests_day.xml deleted file mode 100644 index 21066241601645707c618d8739641e0521f27a00..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__flat__BotTracking.getAIChatbotRequests_day.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - 1 - ChatGPT - example.com/article/1/page/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Gemini - example.com/article/1/page/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Le Chat - example.com/article/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Le Chat - example.com/article/3 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 2 - Perplexity - example.com/article/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__flat__BotTracking.getAIChatbotRequests_week.xml b/plugins/BotTracking/tests/System/expected/test__flat__BotTracking.getAIChatbotRequests_week.xml deleted file mode 100644 index f1795d91f47237ba25ed1ff22ed4141183151cf8..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__flat__BotTracking.getAIChatbotRequests_week.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - 1 - ChatGPT - example.com/article/1/page/1 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - ChatGPT - example.com/article/1/page/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - ChatGPT - example.com/article/3 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - ChatGPT - example.com/article/4/page/1 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Claude - example.com/article/3 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Claude - example.com/article/4/page/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Gemini - example.com/article/1/page/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Gemini - example.com/article/3 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Gemini - example.com/article/4/page/1 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Gemini - example.com/article/4/page/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 2 - Le Chat - example.com/article/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Le Chat - example.com/article/3 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 1 - Le Chat - example.com/article/4/page/1 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 2 - NotebookLM - example.com/overview - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - - - 2 - Perplexity - example.com/article/2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__human_favoured__BotTracking.getAIChatbotHumanFavouredPages_day.xml b/plugins/BotTracking/tests/System/expected/test__human_favoured__BotTracking.getAIChatbotHumanFavouredPages_day.xml deleted file mode 100644 index f21e450ebd0162c09a825d5a46f66b3cdaa918fa..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__human_favoured__BotTracking.getAIChatbotHumanFavouredPages_day.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - 1 - 0 - 63.1 - - - - 2 - 3 - 0 - - - - 1 - 1 - 0 - - - - 0 - 2 - 0 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__human_favoured__BotTracking.getAIChatbotHumanFavouredPages_week.xml b/plugins/BotTracking/tests/System/expected/test__human_favoured__BotTracking.getAIChatbotHumanFavouredPages_week.xml deleted file mode 100644 index 765b192918395ddab97fde65edf8ef8687b9027f..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__human_favoured__BotTracking.getAIChatbotHumanFavouredPages_week.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - 4 - 0 - 89.8 - - - - 3 - 0 - 77.4 - - - - 2 - 0 - 61.3 - - - - 1 - 0 - 38.7 - - - - 5 - 4 - 11.1 - - - - 1 - 4 - 0 - - - - 0 - 1 - 0 - - - - 0 - 2 - 0 - - - - 0 - 3 - 0 - - - - 0 - 2 - 0 - - - - 0 - 2 - 0 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__human_favoured_filtered__BotTracking.getAIChatbotHumanFavouredPages_day.xml b/plugins/BotTracking/tests/System/expected/test__human_favoured_filtered__BotTracking.getAIChatbotHumanFavouredPages_day.xml deleted file mode 100644 index 8da802b27ea7cffa6b32d520baaa312f095c309d..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__human_favoured_filtered__BotTracking.getAIChatbotHumanFavouredPages_day.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 1 - 0 - 63.1 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__human_favoured_filtered__BotTracking.getAIChatbotHumanFavouredPages_week.xml b/plugins/BotTracking/tests/System/expected/test__human_favoured_filtered__BotTracking.getAIChatbotHumanFavouredPages_week.xml deleted file mode 100644 index 0a4c6283afbced875b52bc93d6fbf9975bd3fb9d..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__human_favoured_filtered__BotTracking.getAIChatbotHumanFavouredPages_week.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 4 - 0 - 89.8 - - - - 3 - 0 - 77.4 - - - - 2 - 0 - 61.3 - - - - 1 - 0 - 38.7 - - - - 5 - 4 - 11.1 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__pages__BotTracking.getAIChatbotRequests_day.xml b/plugins/BotTracking/tests/System/expected/test__pages__BotTracking.getAIChatbotRequests_day.xml deleted file mode 100644 index 5f64d7b0408e61672fd9f4d8ebeae513ced99bc7..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__pages__BotTracking.getAIChatbotRequests_day.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - 3 - 1 - 2 - 1 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 2 - - - - - - 2 - 1 - 1 - 0 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - - - 1 - 1 - 0 - 0 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - - - 1 - 0 - 1 - 0 - gemini.google.com - plugins/Morpheus/icons/dist/aiAssistants/gemini.google.com.png - - - - 1 - - - - - - 3 - 1 - 2 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 1 - - - - 1 - - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__pages__BotTracking.getAIChatbotRequests_week.xml b/plugins/BotTracking/tests/System/expected/test__pages__BotTracking.getAIChatbotRequests_week.xml deleted file mode 100644 index 6f539aa4a5b4f34bd830734b38668e564815518f..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__pages__BotTracking.getAIChatbotRequests_week.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - 5 - 1 - 4 - 2 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - 1 - - - - 1 - - - - 1 - - - - - - 5 - 3 - 2 - 2 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - - - 1 - - - - 1 - - - - - - 8 - 6 - 2 - 2 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 2 - - - - - - 4 - 0 - 4 - 0 - gemini.google.com - plugins/Morpheus/icons/dist/aiAssistants/gemini.google.com.png - - - - 1 - - - - 1 - - - - 1 - - - - 1 - - - - - - 5 - 1 - 4 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 2 - - - - 1 - - - - 1 - - - - - - 4 - 2 - 2 - 0 - notebooklm.google.com - plugins/Morpheus/icons/dist/aiAssistants/notebooklm.google.com.png - - - - 2 - - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test__realtime_chatbots_30__BotTracking.getAIChatbotsRealTime.xml b/plugins/BotTracking/tests/System/expected/test__realtime_chatbots_30__BotTracking.getAIChatbotsRealTime.xml deleted file mode 100644 index db73f2856312f5911b9b442d9df146b711d43529..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__realtime_chatbots_30__BotTracking.getAIChatbotsRealTime.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - 2 - 2 - 1 - 0 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - 0 - 0 - 1 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - diff --git a/plugins/BotTracking/tests/System/expected/test__realtime_chatbots_8h__BotTracking.getAIChatbotsRealTime.xml b/plugins/BotTracking/tests/System/expected/test__realtime_chatbots_8h__BotTracking.getAIChatbotsRealTime.xml deleted file mode 100644 index 79becdc24fdbb38a0710dd628ddb633ca724c553..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__realtime_chatbots_8h__BotTracking.getAIChatbotsRealTime.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - 2 - 2 - 1 - 0 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 2 - 1 - 0 - 1 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - - - 1 - 1 - 0 - 1 - gemini.google.com - plugins/Morpheus/icons/dist/aiAssistants/gemini.google.com.png - - - - 1 - 0 - 1 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 1 - 1 - 0 - 0 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - diff --git a/plugins/BotTracking/tests/System/expected/test__realtime_top_pages_30__BotTracking.getTopPageUrlsRealTime.xml b/plugins/BotTracking/tests/System/expected/test__realtime_top_pages_30__BotTracking.getTopPageUrlsRealTime.xml deleted file mode 100644 index 4f218f4085480258261bc0a82b7621a0096f33be..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__realtime_top_pages_30__BotTracking.getTopPageUrlsRealTime.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - 1 - https://example.com/realtime/a - - - - 1 - https://example.com/realtime/b - - diff --git a/plugins/BotTracking/tests/System/expected/test__realtime_top_pages_8h__BotTracking.getTopPageUrlsRealTime.xml b/plugins/BotTracking/tests/System/expected/test__realtime_top_pages_8h__BotTracking.getTopPageUrlsRealTime.xml deleted file mode 100644 index fcd8ff46ab19fefdd6aee33aeb8a692ba83bdb71..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test__realtime_top_pages_8h__BotTracking.getTopPageUrlsRealTime.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - 3 - https://example.com/realtime/a - - - - 1 - https://example.com/realtime/b - - - - 1 - https://example.com/realtime/c - - diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_ai_favoured_pages__BotTracking.getAIChatbotAIFavouredPages_day.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_ai_favoured_pages__BotTracking.getAIChatbotAIFavouredPages_day.xml deleted file mode 100644 index b14f34c31767629165d5a6959f38819129124842..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_ai_favoured_pages__BotTracking.getAIChatbotAIFavouredPages_day.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 0 - 2 - 79.2 - - - - 4 - 4 - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_ai_favoured_pages__BotTracking.getAIChatbotAIFavouredPages_week.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_ai_favoured_pages__BotTracking.getAIChatbotAIFavouredPages_week.xml deleted file mode 100644 index 117bd748712d12ed36f95698dff3e81e0467cdaa..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_ai_favoured_pages__BotTracking.getAIChatbotAIFavouredPages_week.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 0 - 2 - 100 - - - - 16 - 16 - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_broken_content__BotTracking.getAIChatbotBrokenContent_day.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_broken_content__BotTracking.getAIChatbotBrokenContent_day.xml deleted file mode 100644 index 89bb91f246a31530e6a2683292c112d203d5dd47..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_broken_content__BotTracking.getAIChatbotBrokenContent_day.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 1 - 0 - 1 - - - - 2 - 1 - 1 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_broken_content__BotTracking.getAIChatbotBrokenContent_week.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_broken_content__BotTracking.getAIChatbotBrokenContent_week.xml deleted file mode 100644 index c173720066ec186eb88c88440c9a68549f1760e3..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_broken_content__BotTracking.getAIChatbotBrokenContent_week.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 1 - 0 - 1 - - - - 4 - 2 - 2 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_documents__BotTracking.getAIChatbotContentDocuments_day.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_documents__BotTracking.getAIChatbotContentDocuments_day.xml deleted file mode 100644 index 1d4ccae0a7c2247842eb4308f393a7f1a40a80be..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_documents__BotTracking.getAIChatbotContentDocuments_day.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - 2 - 900 - 2 - 33658 - 1 - 0 - 1 - 0.45 - 33658 - - - - 2 - 4500 - 1 - 123456 - 1 - 1 - 0 - 4.5 - 123456 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_documents__BotTracking.getAIChatbotContentDocuments_week.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_documents__BotTracking.getAIChatbotContentDocuments_week.xml deleted file mode 100644 index d7961e34e3382cb24888fcbb7d85ab491ec01818..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_documents__BotTracking.getAIChatbotContentDocuments_week.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - 3 - 1380 - 3 - 70643 - 2 - 0 - 1 - 0.46 - 35321.5 - - - - 10 - 19000 - 8 - 981244 - 9 - 2 - 0 - 2.375 - 109027.11111111 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_pages__BotTracking.getAIChatbotContentPages_day.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_pages__BotTracking.getAIChatbotContentPages_day.xml deleted file mode 100644 index cef224ebc433b9a106c5b0ec66efcffae19f8f99..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_pages__BotTracking.getAIChatbotContentPages_day.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - 3 - 7700 - 3 - 106455 - 3 - 0 - 0 - 2.5666666666667 - 35485 - - - - 3 - 1520 - 2 - 114894 - 2 - 0 - 1 - 0.76 - 57447 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_pages__BotTracking.getAIChatbotContentPages_week.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_pages__BotTracking.getAIChatbotContentPages_week.xml deleted file mode 100644 index c84225d8fdb67bb8536ccbbf6db2af4d54cbba58..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_content_pages__BotTracking.getAIChatbotContentPages_week.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - 3 - 7700 - 3 - 106455 - 3 - 0 - 0 - 2.5666666666667 - 35485 - - - - 15 - 15100 - 12 - 440837 - 13 - 0 - 2 - 1.2583333333333 - 33910.538461538 - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_documents__BotTracking.getAIChatbotRequests_day.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_documents__BotTracking.getAIChatbotRequests_day.xml deleted file mode 100644 index 8f1122403a75e00e965b9edefcd57c0baddf1af6..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_documents__BotTracking.getAIChatbotRequests_day.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - 3 - 1 - 2 - 1 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 1 - - - - - - 2 - 1 - 1 - 0 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - - - 3 - 1 - 2 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 1 - - - - - - 2 - 1 - 1 - 0 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_documents__BotTracking.getAIChatbotRequests_week.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_documents__BotTracking.getAIChatbotRequests_week.xml deleted file mode 100644 index 374f86b4ac73fb957dafb48d3e8f8d67c771b313..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_documents__BotTracking.getAIChatbotRequests_week.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - 4 - 1 - 3 - 2 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - - - 5 - 3 - 2 - 2 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 1 - - - - 2 - - - - - - 5 - 1 - 4 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 1 - - - - - - 17 - 8 - 9 - 2 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_human_favoured_pages__BotTracking.getAIChatbotHumanFavouredPages_day.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_human_favoured_pages__BotTracking.getAIChatbotHumanFavouredPages_day.xml deleted file mode 100644 index 800d22f0aff15f15cd0d6063609f86c745eae4cb..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_human_favoured_pages__BotTracking.getAIChatbotHumanFavouredPages_day.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 1 - 0 - 63.1 - - - - 3 - 6 - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_human_favoured_pages__BotTracking.getAIChatbotHumanFavouredPages_week.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_human_favoured_pages__BotTracking.getAIChatbotHumanFavouredPages_week.xml deleted file mode 100644 index 2cdef9e77af7427bd8af90a6facb0e37ba2cca57..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_human_favoured_pages__BotTracking.getAIChatbotHumanFavouredPages_week.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 4 - 0 - 100 - - - - 12 - 18 - - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_pages__BotTracking.getAIChatbotRequests_day.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_pages__BotTracking.getAIChatbotRequests_day.xml deleted file mode 100644 index 51ddc6270caf253cce75f2faaa45d71b218d0aa1..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_pages__BotTracking.getAIChatbotRequests_day.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - 2 - 0 - 2 - 1 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 2 - - - - - - 2 - 1 - 1 - 0 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - - - 1 - 1 - 0 - 0 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - - - 3 - 1 - 2 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 2 - 1 - 1 - 0 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/System/expected/test_ranking_limit_pages__BotTracking.getAIChatbotRequests_week.xml b/plugins/BotTracking/tests/System/expected/test_ranking_limit_pages__BotTracking.getAIChatbotRequests_week.xml deleted file mode 100644 index 5b68b9bbd9c4dbf02781094600533095de90e181..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/System/expected/test_ranking_limit_pages__BotTracking.getAIChatbotRequests_week.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - 5 - 1 - 4 - 2 - chatgpt.com - plugins/Morpheus/icons/dist/aiAssistants/chatgpt.com.png - - - - 1 - - - - 3 - - - - - - 5 - 3 - 2 - 2 - claude.ai - plugins/Morpheus/icons/dist/aiAssistants/claude.ai.png - - - - 1 - - - - 1 - - - - - - 7 - 5 - 2 - 2 - perplexity.ai - plugins/Morpheus/icons/dist/aiAssistants/perplexity.ai.png - - - - 2 - - - - - - 3 - 0 - 3 - 0 - gemini.google.com - plugins/Morpheus/icons/dist/aiAssistants/gemini.google.com.png - - - - 1 - - - - 2 - - - - - - 5 - 1 - 4 - 0 - chat.mistral.ai - plugins/Morpheus/icons/dist/aiAssistants/chat.mistral.ai.png - - - - 1 - - - - 1 - - - - - - 4 - 2 - 2 - 0 - notebooklm.google.com - plugins/Morpheus/icons/dist/aiAssistants/notebooklm.google.com.png - - - - 2 - - - - - - 2 - 1 - 1 - 0 - - plugins/Morpheus/icons/dist/aiAssistants/xx.png - - \ No newline at end of file diff --git a/plugins/BotTracking/tests/UI/BotTrackingSiteWithoutData_spec.js b/plugins/BotTracking/tests/UI/BotTrackingSiteWithoutData_spec.js deleted file mode 100644 index 752ae24a66339a6be5f2352b6f649e8f13e1ff52..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/UI/BotTrackingSiteWithoutData_spec.js +++ /dev/null @@ -1,126 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * SitesManager screenshot tests. - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -describe('BotTrackingSiteWithoutData', function () { - this.fixture = 'Piwik\\Tests\\Fixtures\\OneVisit'; - - const generalParams = 'idSite=1&period=day&date=today'; - const urlBase = `module=CoreHome&action=index&${generalParams}`; - const urlOverview = `?${urlBase}#?${generalParams}&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsOverview`; - const urlRealtime = `?${urlBase}#?${generalParams}&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsRealtime`; - const urlContentRequests = `?${urlBase}#?${generalParams}&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsContentRequests`; - - before(function () { - testEnvironment.detectedContentDetections = ['WordPress', 'AmazonCloudFront']; - testEnvironment.connectedConsentManagers = []; - testEnvironment.save(); - }); - - after(function () { - // unset all detections so fake class is no longer used - delete testEnvironment.detectedContentDetections; - delete testEnvironment.connectedConsentManagers; - testEnvironment.save(); - }); - - it('should show a message if no bot data has been recently tracked', async function () { - await page.goto(urlOverview); - await page.waitForSelector('.bot-tracking-no-recent-requests-message'); - - const notification = await page.$('.bot-tracking-no-recent-requests-message'); - - expect(await notification.getProperty('textContent')).to.match(/No data collected/i); - }); - - it('should show the same message on the Content Requests page', async function () { - await page.goto(urlContentRequests); - await page.waitForSelector('.bot-tracking-no-recent-requests-message'); - - const notification = await page.$('.bot-tracking-no-recent-requests-message'); - - expect(await notification.getProperty('textContent')).to.match(/No data collected/i); - - // Back to the overview so the click-through flow below starts from the same place. - await page.goto(urlOverview); - await page.waitForSelector('.bot-tracking-no-recent-requests-message'); - }); - - it('should show the same message on the Real-time page', async function () { - await page.goto(urlRealtime); - await page.waitForSelector('.bot-tracking-no-recent-requests-message'); - - const notification = await page.$('.bot-tracking-no-recent-requests-message'); - - expect(await notification.getProperty('textContent')).to.match(/No data collected/i); - - // Back to the overview so the click-through flow below starts from the same place. - await page.goto(urlOverview); - await page.waitForSelector('.bot-tracking-no-recent-requests-message'); - }); - - it('should show the no data page', async function () { - await page.click('.bot-tracking-no-recent-requests-message a'); - await page.waitForSelector('.tracking-method-list'); - - const pageElement = await page.$('.page'); - expect(await pageElement.screenshot()).to.matchImage('siteWithoutData'); - }); - - it('should show details for the recommended tracking method', async function () { - await page.click('.tracking-method-detection .btn'); - await page.waitForSelector('.tracking-method-details'); - - expect(await page.$('.tracking-method-details p')).to.be.ok; - }); - - it('should show details for all other available tracking methods', async function () { - await page.click('.tracking-method-back'); - await page.waitForSelector('.tracking-method-list'); - - const methodCount = (await page.$$('.tracking-method-list .list-entry a')).length; - - // only support link should be skipped - const methodChecksExpected = methodCount - 1; - let methodsChecked = 0; - - for (let methodNum = 1; methodNum <= methodCount; methodNum++) { - const method = await page.$(`.tracking-method-list .list-entry:nth-of-type(${methodNum}) a`); - const hrefProp = await method.getProperty('href'); - const href = await hrefProp.jsonValue(); - - if (!href.includes('#')) { - // skip click on external links (detections without details) - continue; - } - - await method.click(); - await page.waitForSelector('.tracking-method-details'); - - expect(await page.$('.tracking-method-details p')).to.be.ok; - methodsChecked++; - - await page.click('.tracking-method-back'); - await page.waitForSelector('.tracking-method-list'); - } - - expect(methodsChecked).to.equal( - methodChecksExpected, - `Expected ${methodChecksExpected} tracking methods with details, found ${methodsChecked}` - ) - }); - - it('should link back to the overview', async function () { - await page.click('.tracking-method-skip a'); - await page.waitForSelector('.matomo-widget'); - await page.waitForNetworkIdle(); - - const widgets = await page.$$('.matomo-widget'); - expect(widgets.length).to.be.greaterThan(0); - }); -}); diff --git a/plugins/BotTracking/tests/UI/BotTracking_spec.js b/plugins/BotTracking/tests/UI/BotTracking_spec.js deleted file mode 100644 index 84ff811c9369e17f6d44162f946db4efce7011eb..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/UI/BotTracking_spec.js +++ /dev/null @@ -1,400 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * Screenshot integration tests. - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -describe("BotTracking", function () { - this.timeout(0); - - this.fixture = "Piwik\\Plugins\\BotTracking\\tests\\Fixtures\\BotTraffic"; - - var generalParams = 'idSite=1&period=day&date=2025-02-02', - urlBase = 'module=CoreHome&action=index&' + generalParams; - - async function waitForRowEvolutionPopover() { - await page.waitForFunction('$(".ui-dialog:visible .rowevolution").length > 0'); - await page.waitForFunction( - '$(".ui-dialog:visible .rowevolution table.metrics tr").length > 0' - + ' && $(".ui-dialog:visible .rowevolution .jqplot-target").length > 0' - ); - await page.waitForTimeout(250); - } - - async function assertHeaders(widgetId, expectedHeaders) { - const headers = await page.$$eval(widgetId + ' thead th .thDIV', function (divs) { - return divs.map(function (d) { return (d.textContent || '').trim(); }); - }); - - expect(headers).to.deep.equal(expectedHeaders); - } - - async function assertMetricDocumentation(widgetId, expectedCount) { - const docs = await page.$$eval(widgetId + ' thead th .columnDocumentation', function (nodes) { - return nodes.map(function (node) { return (node.textContent || '').trim(); }); - }); - - expect(docs.length).to.equal(expectedCount); - docs.forEach(function (text) { - expect(text.length).to.be.above(0); - }); - } - - it('should render AI Assistants > AI Chatbots Overview page with evolution and sparkline', async function () { - await page.goto("?" + urlBase + "#?" + generalParams + "&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsOverview"); - await page.waitForNetworkIdle(); - - // the metrics picker options are always present in the DOM (the dropdown is - // only hidden until the toggle is clicked), so we can count them directly - const availableMetrics = await page.$$('.metrics-picker__options input'); - expect(availableMetrics.length).to.equal(8); - - await page.mouse.move(0, 0); - - const sparklines = await page.$$('.sparkline-metrics'); - expect(sparklines.length).to.equal(8); - - var elem = await page.$('.pageWrap'); - expect(await elem.screenshot()).to.matchImage('bot_overview'); - }); - - it('should not have shown a "no recent tracking requests" message', async function () { - const notifications = await page.$$('.bot-tracking-no-recent-requests-message'); - expect(notifications.length).to.equal(0); - }) - - it('should not show unique pages and documents metric for higher periods', async function () { - await page.goto("?" + urlBase + "#?idSite=1&period=week&date=2025-02-02&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsOverview"); - await page.waitForNetworkIdle(); - - const availableMetrics = await page.$$('.metrics-picker__options input'); - expect(availableMetrics.length).to.equal(6); - - const sparklines = await page.$$('.sparkline-metrics'); - expect(sparklines.length).to.equal(6); - }); - - it('should render AI Assistants > AI Chatbots Overview bot detail report', async function () { - await page.goto("?" + urlBase + "#?" + generalParams + "&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsOverview"); - await page.waitForNetworkIdle(); - - const row = await page.jQuery('tr.subDataTable:first'); - await row.click(); - await page.mouse.move(-10, -10); - - await page.waitForNetworkIdle(); - await page.waitForTimeout(250); // rendering - - var elem = await page.$('#widgetBotTrackinggetAIChatbotRequests'); - expect(await elem.screenshot()).to.matchImage('bot_requests'); - }); - - it('should switch to secondary dimension when clicked', async function () { - await page.evaluate(() => $('.datatableRelatedReports li span:contains("Document Requests")').click()); - await page.waitForNetworkIdle(); - - const row = await page.jQuery('tr.subDataTable:first'); - await row.click(); - await page.mouse.move(-10, -10); - - await page.waitForNetworkIdle(); - await page.waitForTimeout(250); // rendering - - var elem = await page.$('#widgetBotTrackinggetAIChatbotRequests'); - expect(await elem.screenshot()).to.matchImage('bot_requests_documents'); - }); - - it('should render AI Assistants > AI Chatbots Content Requests page', async function () { - await page.goto("?" + urlBase + "#?" + generalParams + "&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsContentRequests"); - await page.waitForNetworkIdle(); - - // Assert the help icon for this subcategory exists in the reporting menu (proves getHelp() - // returns non-empty content — the icon only renders when subcategory.help is truthy). - // The active subcategory li in the menu contains the help icon as a sibling of .item. - const helpIconCount = await page.evaluate(function () { - return jQuery( - '.reportingMenu ul.navbar > li.menuTab.active > ul > li.active .item-help-icon' - ).length; - }); - expect(helpIconCount).to.equal(1); - - // Click the help icon via jQuery to trigger the help notification for this subcategory. - // (Direct puppeteer click fails because the icon is CSS-hidden until hover.) - await page.evaluate(function () { - jQuery( - '.reportingMenu ul.navbar > li.menuTab.active > ul > li.active .item-help-icon' - ).trigger('click'); - }); - // Wait until the help notification is visible in the notification container. - await page.waitForSelector('#notificationContainer .help-notification', { visible: true }); - - // Assert the help notification body contains non-empty text (proving getHelp() returned content). - const helpNotificationText = await page.evaluate(function () { - var notif = document.querySelector('#notificationContainer .help-notification .notification-body'); - return notif ? notif.textContent.trim() : ''; - }); - expect(helpNotificationText.length).to.be.above(0); - - // Assert exactly 5 report widgets are present on the page (the wide Pages report on top, - // then the Documents / Broken pair side-by-side, then the Human-Favoured / AI-Favoured - // pair side-by-side). - const widgets = await page.$$('.matomo-widget'); - expect(widgets.length).to.equal(5); - - // Dismiss the help notification so it does not obscure table headers, - // then wait for the tables to be fully rendered. - await page.evaluate(function () { - jQuery('#notificationContainer .notification .close').trigger('click'); - }); - await page.waitForNetworkIdle(); - - // Wait explicitly for the Pages widget's table header to appear before querying. - await page.waitForSelector('#widgetBotTrackinggetAIChatbotContentPages thead th .thDIV', { visible: true }); - - // Assert per-widget column counts and header text for Pages widget. - // The DataTable renders column labels inside
within each . - // Each widget should display exactly 4 default columns: label + 3 metrics. - const pagesWidgetId = '#widgetBotTrackinggetAIChatbotContentPages'; - const pagesHeaders = await page.$$eval(pagesWidgetId + ' thead th .thDIV', function (divs) { - return divs.map(function (d) { return (d.textContent || '').trim(); }); - }); - expect(pagesHeaders.length).to.equal(4); - expect(pagesHeaders[0]).to.equal('Page URL'); - expect(pagesHeaders[1]).to.equal('Requests'); - expect(pagesHeaders[2]).to.equal('Avg. Server Time'); - expect(pagesHeaders[3]).to.equal('Avg. Response Size'); - - // Assert default sort indicator on the Requests column in the Pages widget. - // The sorted th gets class "columnSorted"; sort direction is a child span with class "sortIcon desc". - const pagesSortedThCount = await page.$$eval(pagesWidgetId + ' thead th.columnSorted', function (ths) { return ths.length; }); - expect(pagesSortedThCount).to.equal(1); - const pagesSortedThText = await page.$eval(pagesWidgetId + ' thead th.columnSorted .thDIV', function (div) { - return (div.textContent || '').trim(); - }); - expect(pagesSortedThText).to.equal('Requests'); - - // Assert per-widget column counts and header text for Documents widget. - const docsWidgetId = '#widgetBotTrackinggetAIChatbotContentDocuments'; - const docsHeaders = await page.$$eval(docsWidgetId + ' thead th .thDIV', function (divs) { - return divs.map(function (d) { return (d.textContent || '').trim(); }); - }); - expect(docsHeaders.length).to.equal(4); - expect(docsHeaders[0]).to.equal('Document URL'); - expect(docsHeaders[1]).to.equal('Requests'); - expect(docsHeaders[2]).to.equal('Avg. Server Time'); - expect(docsHeaders[3]).to.equal('Avg. Response Size'); - - // Assert default sort indicator on the Requests column in the Documents widget. - const docsSortedThCount = await page.$$eval(docsWidgetId + ' thead th.columnSorted', function (ths) { return ths.length; }); - expect(docsSortedThCount).to.equal(1); - const docsSortedThText = await page.$eval(docsWidgetId + ' thead th.columnSorted .thDIV', function (div) { - return (div.textContent || '').trim(); - }); - expect(docsSortedThText).to.equal('Requests'); - - // Assert per-widget column counts and header text for Broken Content widget. - const brokenWidgetId = '#widgetBotTrackinggetAIChatbotBrokenContent'; - const brokenHeaders = await page.$$eval(brokenWidgetId + ' thead th .thDIV', function (divs) { - return divs.map(function (d) { return (d.textContent || '').trim(); }); - }); - expect(brokenHeaders.length).to.equal(4); - expect(brokenHeaders[0]).to.equal('URL'); - expect(brokenHeaders[1]).to.equal('Total Broken Requests'); - expect(brokenHeaders[2]).to.equal('Page Not Found (404) Requests'); - expect(brokenHeaders[3]).to.equal('5XX Requests'); - - // Assert default sort indicator on total_broken_requests in the Broken widget. - const brokenSortedThCount = await page.$$eval(brokenWidgetId + ' thead th.columnSorted', function (ths) { return ths.length; }); - expect(brokenSortedThCount).to.equal(1); - const brokenSortedThText = await page.$eval(brokenWidgetId + ' thead th.columnSorted .thDIV', function (div) { - return (div.textContent || '').trim(); - }); - expect(brokenSortedThText).to.equal('Total Broken Requests'); - - // Assert per-widget column counts and header text for Human-Favoured widget. - const humanWidgetId = '#widgetBotTrackinggetAIChatbotHumanFavouredPages'; - await page.waitForSelector(humanWidgetId + ' thead th .thDIV', { visible: true }); - const humanHeaders = await page.$$eval(humanWidgetId + ' thead th .thDIV', function (divs) { - return divs.map(function (d) { return (d.textContent || '').trim(); }); - }); - expect(humanHeaders.length).to.equal(4); - expect(humanHeaders[0]).to.equal('Page URL'); - expect(humanHeaders[1]).to.equal('Unique Human Pageviews'); - expect(humanHeaders[2]).to.equal('AI Chatbot Requests'); - expect(humanHeaders[3]).to.equal('Discrepancy Score'); - - // Default sort on Discrepancy Score for the Human-Favoured widget. - const humanSortedThText = await page.$eval(humanWidgetId + ' thead th.columnSorted .thDIV', function (div) { - return (div.textContent || '').trim(); - }); - expect(humanSortedThText).to.equal('Discrepancy Score'); - - // Assert per-widget column counts and header text for AI-Favoured widget. - const aiWidgetId = '#widgetBotTrackinggetAIChatbotAIFavouredPages'; - const aiHeaders = await page.$$eval(aiWidgetId + ' thead th .thDIV', function (divs) { - return divs.map(function (d) { return (d.textContent || '').trim(); }); - }); - // The AI-Favoured report leads with its strong-side metric (AI Chatbot Requests), then human. - expect(aiHeaders.length).to.equal(4); - expect(aiHeaders[0]).to.equal('Page URL'); - expect(aiHeaders[1]).to.equal('AI Chatbot Requests'); - expect(aiHeaders[2]).to.equal('Unique Human Pageviews'); - expect(aiHeaders[3]).to.equal('Discrepancy Score'); - - // Default sort on Discrepancy Score for the AI-Favoured widget. - const aiSortedThText = await page.$eval(aiWidgetId + ' thead th.columnSorted .thDIV', function (div) { - return (div.textContent || '').trim(); - }); - expect(aiSortedThText).to.equal('Discrepancy Score'); - - // The reporting page auto-pairs consecutive non-wide widgets into a 2-column row (see - // CoreHome ReportingPage.store). The Documents + Broken reports must share one row, and the - // Human-Favoured + AI-Favoured reports must share one row. - const sameRow = function (firstSel, secondSel) { - return page.evaluate(function (a, b) { - const first = document.querySelector(a); - const second = document.querySelector(b); - if (!first || !second) { - return 0; - } - const firstRow = first.closest('.row'); - const secondRow = second.closest('.row'); - return firstRow && firstRow === secondRow ? 1 : 0; - }, firstSel, secondSel); - }; - expect(await sameRow(docsWidgetId, brokenWidgetId)).to.equal(1); - expect(await sameRow(humanWidgetId, aiWidgetId)).to.equal(1); - - var elem = await page.$('.pageWrap'); - expect(await elem.screenshot()).to.matchImage('bot_content_requests'); - }); - - it('should render AI Assistants > AI Chatbots Real-time page', async function () { - await page.goto("?" + urlBase + "#?" + generalParams + "&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsRealtime"); - await page.waitForNetworkIdle(); - - const helpIconCount = await page.evaluate(function () { - return jQuery( - '.reportingMenu ul.navbar > li.menuTab.active > ul > li.active .item-help-icon' - ).length; - }); - expect(helpIconCount).to.equal(1); - - await page.evaluate(function () { - jQuery( - '.reportingMenu ul.navbar > li.menuTab.active > ul > li.active .item-help-icon' - ).trigger('click'); - }); - await page.waitForSelector('#notificationContainer .help-notification', { visible: true }); - - const helpNotificationText = await page.evaluate(function () { - var notif = document.querySelector('#notificationContainer .help-notification .notification-body'); - return notif ? notif.textContent.trim() : ''; - }); - expect(helpNotificationText).to.contain('recent AI chatbot activity'); - - await page.evaluate(function () { - jQuery('#notificationContainer .notification .close').trigger('click'); - }); - await page.waitForNetworkIdle(); - - const widgets = await page.$$('.matomo-widget'); - expect(widgets.length).to.equal(4); - - const chatbots30WidgetId = '#widgetBotTrackinggetAIChatbotsRealTimelastMinutes30'; - const chatbots8hWidgetId = '#widgetBotTrackinggetAIChatbotsRealTimelastMinutes480'; - const pages30WidgetId = '#widgetBotTrackinggetTopPageUrlsRealTimelastMinutes30'; - const pages8hWidgetId = '#widgetBotTrackinggetTopPageUrlsRealTimelastMinutes480'; - - await page.waitForSelector(chatbots30WidgetId + ' thead th .thDIV', { visible: true }); - - await assertHeaders(chatbots30WidgetId, [ - 'AI Chatbot Name', - 'Requests', - 'Unique page URLs', - 'Not found requests', - 'Server error (5xx) requests', - ]); - await assertHeaders(chatbots8hWidgetId, [ - 'AI Chatbot Name', - 'Requests', - 'Unique page URLs', - 'Not found requests', - 'Server error (5xx) requests', - ]); - await assertHeaders(pages30WidgetId, [ - 'Page URL', - 'Requests', - ]); - await assertHeaders(pages8hWidgetId, [ - 'Page URL', - 'Requests', - ]); - - await assertMetricDocumentation(chatbots30WidgetId, 4); - await assertMetricDocumentation(chatbots8hWidgetId, 4); - await assertMetricDocumentation(pages30WidgetId, 1); - await assertMetricDocumentation(pages8hWidgetId, 1); - }); - - it('should offer Row Evolution on the Favoured Pages reports and render its chart', async function () { - // Use a date inside the human/AI overlap window (Feb 3-5) so the evolution chart has a real - // multi-day series. Row Evolution is only available now the reports are archived. - await page.goto("?" + urlBase + "#?idSite=1&period=day&date=2025-02-03&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsContentRequests"); - await page.waitForNetworkIdle(); - - const humanWidgetId = '#widgetBotTrackinggetAIChatbotHumanFavouredPages'; - const row = await page.waitForSelector(humanWidgetId + ' table.dataTable tbody tr:first-child'); - await row.hover(); - await page.waitForTimeout(100); - - // The Row Evolution row action must now be offered (disable_row_evolution was removed once the - // data is archived, so the icon is no longer suppressed). - const icon = await row.$('a.actionRowEvolution'); - expect(icon).to.not.equal(null); - - await icon.hover(); - await icon.click(); - await page.mouse.move(-10, -10); - - await waitForRowEvolutionPopover(); - - expect(await page.screenshotSelector('.ui-dialog:visible')).to.matchImage('row_evolution_favoured_pages'); - }); - - it('should show segment not supported footer message on AI Chatbots Content Requests page when segmented', async function () { - const segment = encodeURIComponent('visitConverted==1'); - await page.goto("?" + urlBase + "#?" + generalParams + "&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsContentRequests&segment=" + segment); - await page.waitForNetworkIdle(); - - const expectedMessage = 'Report does not support segmentation. The data displayed is your standard, unsegmented report data.'; - const matchingFooterMessages = await page.$$eval('.datatableFooterMessage', (nodes, expected) => { - return nodes - .map((node) => (node.textContent || '').trim()) - .filter((text) => text.includes(expected)) - .length; - }, expectedMessage); - - // All 5 content-request widgets must show the segment-not-supported footer message. - expect(matchingFooterMessages).to.be.at.least(5); - }); - - it('should show segment not supported footer message in AI bot reports when segmented', async function () { - const segment = encodeURIComponent('visitConverted==1'); - await page.goto("?" + urlBase + "#?" + generalParams + "&category=General_AIAssistants&subcategory=BotTracking_AIChatbotsOverview&segment=" + segment); - await page.waitForNetworkIdle(); - - const expectedMessage = 'Report does not support segmentation. The data displayed is your standard, unsegmented report data.'; - const matchingFooterMessages = await page.$$eval('.datatableFooterMessage', (nodes, expected) => { - return nodes - .map((node) => (node.textContent || '').trim()) - .filter((text) => text.includes(expected)) - .length; - }, expectedMessage); - - expect(matchingFooterMessages).to.be.at.least(3); - }); -}); diff --git a/plugins/BotTracking/tests/UI/expected-screenshots/BotTrackingSiteWithoutData_siteWithoutData.png b/plugins/BotTracking/tests/UI/expected-screenshots/BotTrackingSiteWithoutData_siteWithoutData.png deleted file mode 100644 index b992eb99db620e282e490d33b6959d4b6350ee14..0000000000000000000000000000000000000000 Binary files a/plugins/BotTracking/tests/UI/expected-screenshots/BotTrackingSiteWithoutData_siteWithoutData.png and /dev/null differ diff --git a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_content_requests.png b/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_content_requests.png deleted file mode 100644 index 4e9a298a631ee6345e33744344b4fa74ea553f2a..0000000000000000000000000000000000000000 Binary files a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_content_requests.png and /dev/null differ diff --git a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_overview.png b/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_overview.png deleted file mode 100644 index c93e8322435fce85be57a2162a26add68339165e..0000000000000000000000000000000000000000 Binary files a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_overview.png and /dev/null differ diff --git a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_requests.png b/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_requests.png deleted file mode 100644 index 0e5c0e503e805d258e78925028fc50b55c7a6ad3..0000000000000000000000000000000000000000 Binary files a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_requests.png and /dev/null differ diff --git a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_requests_documents.png b/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_requests_documents.png deleted file mode 100644 index c13602b1f1b001499938578da52388ee0a8124e0..0000000000000000000000000000000000000000 Binary files a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_bot_requests_documents.png and /dev/null differ diff --git a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_row_evolution_favoured_pages.png b/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_row_evolution_favoured_pages.png deleted file mode 100644 index 1ac89fc8cc6101105bc28e237d79b073a0efd728..0000000000000000000000000000000000000000 Binary files a/plugins/BotTracking/tests/UI/expected-screenshots/BotTracking_row_evolution_favoured_pages.png and /dev/null differ diff --git a/plugins/BotTracking/tests/Unit/AIChatbotFavouredPagesTest.php b/plugins/BotTracking/tests/Unit/AIChatbotFavouredPagesTest.php deleted file mode 100644 index 56052aedcdc501358b34bc8383d436232942e6b6..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Unit/AIChatbotFavouredPagesTest.php +++ /dev/null @@ -1,141 +0,0 @@ - $rows list of [label, value] - */ - private static function table(string $valueColumn, array $rows): DataTable - { - $table = new DataTable(); - foreach ($rows as [$label, $value]) { - $table->addRow(new Row([Row::COLUMNS => ['label' => $label, $valueColumn => $value]])); - } - return $table; - } - - /** - * The normal (non-summary) rows as label => [human, ai]. - * - * @return array - */ - private static function asMap(DataTable $table): array - { - $out = []; - foreach ($table->getRows() as $row) { - if ($row->isSummaryRow()) { - continue; - } - $out[(string) $row->getColumn('label')] = [ - (int) $row->getColumn(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS), - (int) $row->getColumn(Metrics::COLUMN_AI_CHATBOT_REQUESTS), - ]; - } - return $out; - } - - public function testMergesOverlappingHumanOnlyAndAiOnlyUrls(): void - { - $human = self::table(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS, [ - ['example.com/both', 100], - ['example.com/human-only', 40], - ]); - $ai = self::table(Metrics::COLUMN_REQUESTS, [ - ['example.com/both', 7], - ['example.com/ai-only', 12], - ]); - - $merged = AIChatbotFavouredPages::mergeHumanAndAiTables($human, $ai); - - self::assertSame([ - 'example.com/both' => [100, 7], - 'example.com/ai-only' => [0, 12], - 'example.com/human-only' => [40, 0], - ], self::asMap($merged)); - } - - public function testMissingSidesDefaultToZero(): void - { - $merged = AIChatbotFavouredPages::mergeHumanAndAiTables( - self::table(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS, [['example.com/h', 5]]), - self::table(Metrics::COLUMN_REQUESTS, [['example.com/a', 9]]) - ); - - self::assertSame(['example.com/a' => [0, 9], 'example.com/h' => [5, 0]], self::asMap($merged)); - } - - public function testEmptyLabelsAreSkipped(): void - { - $merged = AIChatbotFavouredPages::mergeHumanAndAiTables( - self::table(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS, [['', 5], ['example.com/h', 3]]), - self::table(Metrics::COLUMN_REQUESTS, [['', 9]]) - ); - - self::assertSame(['example.com/h' => [3, 0]], self::asMap($merged)); - } - - public function testCombinesTruncationTailIntoUnscoredOthersRow(): void - { - $human = self::table(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS, [['example.com/h', 3]]); - $humanSummary = new Row([Row::COLUMNS => ['label' => 'Others', Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS => 999]]); - $humanSummary->setIsSummaryRow(); - $human->addSummaryRow($humanSummary); - - $ai = self::table(Metrics::COLUMN_REQUESTS, [['example.com/a', 4]]); - $aiSummary = new Row([Row::COLUMNS => ['label' => 'Others', Metrics::COLUMN_REQUESTS => 888]]); - $aiSummary->setIsSummaryRow(); - $ai->addSummaryRow($aiSummary); - - $merged = AIChatbotFavouredPages::mergeHumanAndAiTables($human, $ai); - - // The normal per-URL union is unaffected by the truncation tails. - self::assertSame(['example.com/a' => [0, 4], 'example.com/h' => [3, 0]], self::asMap($merged)); - - // Both per-side "Others" tails combine into one summary row carrying both sums... - $others = $merged->getSummaryRow(); - self::assertInstanceOf(Row::class, $others); - self::assertSame(999, (int) $others->getColumn(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS)); - self::assertSame(888, (int) $others->getColumn(Metrics::COLUMN_AI_CHATBOT_REQUESTS)); - // ...and it is left unscored (no discrepancy score is computed for an aggregate of many URLs). - self::assertFalse($others->getColumn(Metrics::COLUMN_DISCREPANCY_SCORE)); - } - - public function testProducesCanonicalColumnSet(): void - { - $merged = AIChatbotFavouredPages::mergeHumanAndAiTables( - self::table(Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS, [['example.com/h', 5]]), - self::table(Metrics::COLUMN_REQUESTS, [['example.com/h', 2]]) - ); - - $row = $merged->getFirstRow(); - self::assertSame( - ['label', Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS, Metrics::COLUMN_AI_CHATBOT_REQUESTS], - array_keys($row->getColumns()) - ); - } -} diff --git a/plugins/BotTracking/tests/Unit/BotDetectorTest.php b/plugins/BotTracking/tests/Unit/BotDetectorTest.php deleted file mode 100644 index 433eb731b08ae65da78262488343a992aff76680..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Unit/BotDetectorTest.php +++ /dev/null @@ -1,86 +0,0 @@ -isBot()); - - $result = $botDetector->getDetectionResult(); - - self::assertIsArray($result); - self::assertArrayHasKey('bot_name', $result); - self::assertArrayHasKey('bot_type', $result); - self::assertEquals($expectedBotName, $result['bot_name']); - self::assertEquals($expectedBotType, $result['bot_type']); - } - - /** - * @dataProvider getNonBotUserAgents - */ - public function testDetectReturnsNullForNonBots(string $userAgent): void - { - $botDetector = new BotDetector($userAgent); - - self::assertFalse($botDetector->isBot()); - self::assertNull($botDetector->getDetectionResult()); - } - - /** - * @return array - */ - public function getBotUserAgents(): array - { - return [ - ['ChatGPT-User/1.0', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['chatgpt-user/1.0', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['CHATGPT-USER/1.0', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Mozilla/5.0 (compatible; ChatGPT-User/1.0; +https://openai.com)', 'ChatGPT-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; MistralAI-User/1.0; +https://docs.mistral.ai/robots)', 'MistralAI-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Gemini-Deep-Research; +https://gemini.google/overview/deep-research/) Chrome/135.0.0.0 Safari/537.36', 'Gemini-Deep-Research', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)', 'Claude-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)', 'Perplexity-User', BotDetector::BOT_TYPE_AI_CHATBOT], - ['Google-NotebookLM', 'Google-NotebookLM', BotDetector::BOT_TYPE_AI_CHATBOT], - - ]; - } - - /** - * @return array - */ - public function getNonBotUserAgents(): array - { - return [ - ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'], - ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'], - ['curl/7.68.0'], - ['Googlebot/2.1'], - [''], - ]; - } -} diff --git a/plugins/BotTracking/tests/Unit/BotTrackingMethodTest.php b/plugins/BotTracking/tests/Unit/BotTrackingMethodTest.php deleted file mode 100644 index b73a540154e46b66fa803c3f68c185fc33cd62d6..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Unit/BotTrackingMethodTest.php +++ /dev/null @@ -1,52 +0,0 @@ - $method - */ - public function testSiteContentDetectionSourceExists(string $method): void - { - // sanity check to prevent a site content detection - // class going away without being noticed - $detectionId = $method::getSiteContentDetectionId(); - self::assertTrue($detectionId === null || is_string($detectionId)); - } - - public function getBotTrackingMethods(): array - { - return [ - [AmazonCloudFront::class], - [Cloudflare::class], - [HttpTrackingApi::class], - [MissingOneContactUs::class], - [WordPress::class], - ]; - } -} diff --git a/plugins/BotTracking/tests/Unit/FavouredPagesScorerTest.php b/plugins/BotTracking/tests/Unit/FavouredPagesScorerTest.php deleted file mode 100644 index 64721fb4088c271fb174bbc23ce70216122ab507..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/tests/Unit/FavouredPagesScorerTest.php +++ /dev/null @@ -1,199 +0,0 @@ -expectException(InvalidArgumentException::class); - new FavouredPagesScorer('unknown'); - } - - /** - * Reference implementation of the bounded formula, kept inline so expected values are not - * sourced from the class under test. - */ - private static function expected(int $strong, int $weak, int $maxStrong): float - { - $total = $strong + $weak; - if ($total <= 0) { - return 0.0; - } - $lean = max(0, ($strong - $weak) / $total); - $anchor = log10($maxStrong + 1); - $volume = $anchor > 0 ? log10($strong + 1) / $anchor : 0.0; - - return round(100 * $lean * $volume, 1); - } - - public function testScoreAtBoundaryInputs(): void - { - // Exact values at edge inputs (pins the formula, not just the [0,100] bound): a fully - // one-sided page that is itself the anchor (→100), partial leans, balanced (→0), and a - // near-zero-volume page (strong=1 against a far larger anchor). - $cases = [[5000, 0, 5000], [2000, 100, 2000], [50, 1, 2000], [500, 500, 5000], [1, 0, 10000]]; - foreach ($cases as [$strong, $weak, $max]) { - self::assertSame( - self::expected($strong, $weak, $max), - FavouredPagesScorer::score($strong, $weak, $max), - "score($strong, $weak, $max)" - ); - } - - // Spot-check the two most informative edges against hand-computed literals so the test is not - // purely self-referential: the anchor page scores exactly 100, and strong=1/anchor=10000 is tiny. - self::assertSame(100.0, FavouredPagesScorer::score(5000, 0, 5000)); - self::assertSame(7.5, FavouredPagesScorer::score(1, 0, 10000)); - } - - public function testBalancedAndOppositeLeaningScoreZero(): void - { - self::assertSame(0.0, FavouredPagesScorer::score(500, 500, 5000)); // balanced - self::assertSame(0.0, FavouredPagesScorer::score(100, 2000, 5000)); // opposite-leaning - self::assertSame(0.0, FavouredPagesScorer::score(0, 0, 5000)); // empty - } - - public function testHighTrafficLeaningPageOutranksTinyExtremeRatio(): void - { - // The whole point of the volume term: 2000/100 must score above 50/1 (same maxStrong). - $big = FavouredPagesScorer::score(2000, 100, 2000); - $tiny = FavouredPagesScorer::score(50, 1, 2000); - - self::assertGreaterThan($tiny, $big); - } - - public function testVolumeAnchorScalesWithTopPage(): void - { - // The same fully-one-sided page scores 100 when it is the busiest page... - self::assertSame(100.0, FavouredPagesScorer::score(100, 0, 100)); - // ...and far less when a much bigger page sets the anchor. - self::assertSame(self::expected(100, 0, 10000), FavouredPagesScorer::score(100, 0, 10000)); - self::assertLessThan(60, FavouredPagesScorer::score(100, 0, 10000)); - } - - /** - * @param array $rows list of [human, ai] - */ - private static function table(array $rows): DataTable - { - $table = new DataTable(); - foreach ($rows as [$human, $ai]) { - $table->addRow(new Row([Row::COLUMNS => [ - 'label' => 'example.com/' . $human . '-' . $ai, - Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS => $human, - Metrics::COLUMN_AI_CHATBOT_REQUESTS => $ai, - ]])); - } - return $table; - } - - private static function scores(DataTable $table): array - { - $out = []; - foreach ($table->getRows() as $row) { - $out[] = (float) $row->getColumn(Metrics::COLUMN_DISCREPANCY_SCORE); - } - return $out; - } - - public function testAddScoresHumanFavouredUsesHumanAsStrongSide(): void - { - // maxStrong (human) = 2000. - $table = self::table([[2000, 100], [50, 1], [500, 500], [100, 2000]]); - (new FavouredPagesScorer(DiscrepancyScore::VARIANT_HUMAN_FAVOURED))->addScores($table); - - self::assertSame([ - self::expected(2000, 100, 2000), - self::expected(50, 1, 2000), - 0.0, // balanced - 0.0, // leans AI → clamped - ], self::scores($table)); - } - - public function testAddScoresAiFavouredUsesAiAsStrongSide(): void - { - // maxStrong (ai) = 2000. - $table = self::table([[100, 2000], [1, 50], [500, 500], [2000, 100]]); - (new FavouredPagesScorer(DiscrepancyScore::VARIANT_AI_FAVOURED))->addScores($table); - - self::assertSame([ - self::expected(2000, 100, 2000), - self::expected(50, 1, 2000), - 0.0, // balanced - 0.0, // leans human → clamped - ], self::scores($table)); - } - - public function testAddScoresMarksScoreToSkipInSummaryRows(): void - { - $table = self::table([[2000, 100], [50, 1]]); - (new FavouredPagesScorer(DiscrepancyScore::VARIANT_HUMAN_FAVOURED))->addScores($table); - - // The per-page 0-100 index must not be summed into any summary row (the Truncate "Others" - // row during archiving, or the report totals row): the score column is marked 'skip'. - $ops = $table->getMetadata(DataTable::COLUMN_AGGREGATION_OPS_METADATA_NAME); - self::assertSame('skip', $ops[Metrics::COLUMN_DISCREPANCY_SCORE] ?? null); - } - - public function testAddScoresRecursesIntoMap(): void - { - $map = new DataTable\Map(); - $map->addTable(self::table([[100, 0]]), '2025-02-02'); // alone → maxStrong 100 → 100 - $map->addTable(self::table([[100, 0], [10000, 0]]), '2025-02-03'); // bigger page → lower score - - (new FavouredPagesScorer(DiscrepancyScore::VARIANT_HUMAN_FAVOURED))->addScores($map); - - $children = $map->getDataTables(); - self::assertSame([100.0], self::scores($children['2025-02-02'])); - self::assertSame( - [self::expected(100, 0, 10000), self::expected(10000, 0, 10000)], - self::scores($children['2025-02-03']) - ); - } - - public function testSummaryRowExcludedFromAnchorAndLeftUnscored(): void - { - // One real fully-human page (100, 0): on its own it anchors maxStrong at 100 → score 100. - $table = self::table([[100, 0]]); - - // An "Others" summary row aggregating a far larger human tail must NOT become the anchor. - $others = new Row([Row::COLUMNS => [ - 'label' => 'Others', - Metrics::COLUMN_UNIQUE_HUMAN_PAGEVIEWS => 100000, - Metrics::COLUMN_AI_CHATBOT_REQUESTS => 0, - ]]); - $others->setIsSummaryRow(); - $table->addSummaryRow($others); - - (new FavouredPagesScorer(DiscrepancyScore::VARIANT_HUMAN_FAVOURED))->addScores($table); - - // The real page still scores 100 (maxStrong = 100, not 100000): the summary aggregate did not - // hijack the volume anchor. - self::assertSame(100.0, (float) $table->getRowFromLabel('example.com/100-0')->getColumn(Metrics::COLUMN_DISCREPANCY_SCORE)); - // The summary row itself is left unscored. - self::assertFalse($table->getSummaryRow()->getColumn(Metrics::COLUMN_DISCREPANCY_SCORE)); - } -} diff --git a/plugins/BotTracking/vue/dist/BotTracking.umd.js b/plugins/BotTracking/vue/dist/BotTracking.umd.js deleted file mode 100644 index 89f70b950687126c916588ce13e96ff3d79ee3f4..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/vue/dist/BotTracking.umd.js +++ /dev/null @@ -1,424 +0,0 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("CoreHome"), require("vue")); - else if(typeof define === 'function' && define.amd) - define(["CoreHome", ], factory); - else if(typeof exports === 'object') - exports["BotTracking"] = factory(require("CoreHome"), require("vue")); - else - root["BotTracking"] = factory(root["CoreHome"], root["Vue"]); -})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__19dc__, __WEBPACK_EXTERNAL_MODULE__8bbf__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "plugins/BotTracking/vue/dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "fae3"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "19dc": -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE__19dc__; - -/***/ }), - -/***/ "8bbf": -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE__8bbf__; - -/***/ }), - -/***/ "fae3": -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -// ESM COMPAT FLAG -__webpack_require__.r(__webpack_exports__); - -// EXPORTS -__webpack_require__.d(__webpack_exports__, "SiteWithoutData", function() { return /* reexport */ SiteWithoutData; }); -__webpack_require__.d(__webpack_exports__, "NoRecentRequestsWidget", function() { return /* reexport */ NoRecentRequestsWidget; }); - -// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js -// This file is imported into lib/wc client bundles. - -if (typeof window !== 'undefined') { - var currentScript = window.document.currentScript - if (false) { var getCurrentScript; } - - var src = currentScript && currentScript.src.match(/(.+\/)[^/]+\.js(\?.*)?$/) - if (src) { - __webpack_require__.p = src[1] // eslint-disable-line - } -} - -// Indicate to webpack that this file can be concatenated -/* harmony default export */ var setPublicPath = (null); - -// EXTERNAL MODULE: external {"commonjs":"vue","commonjs2":"vue","root":"Vue"} -var external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__("8bbf"); - -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue?vue&type=template&id=8fac1ad0 - -const _hoisted_1 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { - class: "icon-chevron-left" -}, null, -1); -const _hoisted_2 = { - key: 1 -}; -const _hoisted_3 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); -const _hoisted_4 = { - key: 0, - class: "row" -}; -const _hoisted_5 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { - class: "icon-warning" -}, null, -1); -const _hoisted_6 = { - key: 1, - class: "row tracking-method-detection" -}; -const _hoisted_7 = ["src", "alt"]; -const _hoisted_8 = ["href"]; -const _hoisted_9 = { - class: "row tracking-method-list" -}; -const _hoisted_10 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { - class: "icon-search" -}, null, -1); -const _hoisted_11 = ["href", "onClick"]; -const _hoisted_12 = ["src"]; -const _hoisted_13 = { - key: 1, - class: "list-entry-icon", - "aria-hidden": "true" -}; -const _hoisted_14 = { - class: "list-entry-text" -}; -const _hoisted_15 = ["href"]; -const _hoisted_16 = ["src"]; -const _hoisted_17 = { - key: 1, - class: "list-entry-icon", - "aria-hidden": "true" -}; -const _hoisted_18 = { - class: "list-entry-text" -}; -const _hoisted_19 = { - class: "tracking-method-skip" -}; -const _hoisted_20 = ["href"]; -const _hoisted_21 = ["data-method"]; -const _hoisted_22 = ["src", "alt"]; -function render(_ctx, _cache, $props, $setup, $data, $options) { - const _component_ActivityIndicator = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("ActivityIndicator"); - const _component_VueEntryContainer = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("VueEntryContainer"); - return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", null, [_ctx.showMethodDetails ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("a", { - key: 0, - class: "tracking-method-back", - onClick: _cache[0] || (_cache[0] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])($event => { - _ctx.showOverview(); - }, ["prevent"])) - }, [_hoisted_1, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Mobile_NavigationBack')), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h1", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.headline), 1), !_ctx.loading && !_ctx.showMethodDetails ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("p", _hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataChooseTrackingMethodPreamble1')) + " ", 1), _hoisted_3, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataChooseTrackingMethodPreamble2')), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_ActivityIndicator, { - "loading-message": _ctx.translate('BotTracking_DetectingYourSite'), - loading: _ctx.loading - }, null, 8, ["loading-message", "loading"]), !_ctx.loading && !_ctx.showMethodDetails ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], { - key: 2 - }, [_ctx.errorMessage ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_4, [_hoisted_5, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.errorMessage), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { - class: "btn", - href: "#", - onClick: _cache[1] || (_cache[1] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])($event => _ctx.fetchTrackingMethods(), ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Refresh')), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.recommendedMethod ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_6, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", { - src: _ctx.recommendedMethod.icon, - alt: `${_ctx.recommendedMethod.name} logo` - }, null, 8, _hoisted_7), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataInstallWithXRecommendation', _ctx.recommendedMethod.name)), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataRecommendationText', _ctx.recommendedMethod.name)), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { - href: `#${_ctx.recommendedMethod.id.toLowerCase()}`, - class: "btn", - onClick: _cache[2] || (_cache[2] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])($event => _ctx.showMethod(_ctx.recommendedMethod.id), ["prevent"])) - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataInstallWithX', _ctx.recommendedMethod.name)), 9, _hoisted_8)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_9, [_hoisted_10, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataOtherInstallMethods')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataOtherInstallMethodsIntro')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("ul", null, [(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderList"])(_ctx.trackingMethods, method => { - return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("li", { - class: "list-entry", - key: method.id - }, [method.content ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("a", { - key: 0, - href: `#${method.id.toLowerCase()}`, - onClick: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withModifiers"])($event => _ctx.showMethod(method.id), ["prevent"]) - }, [method.icon ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("img", { - key: 0, - src: method.icon, - class: "list-entry-icon" - }, null, 8, _hoisted_12)) : (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", _hoisted_13)), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_14, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(method.name), 1)], 8, _hoisted_11)) : method.link ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("a", { - key: 1, - href: method.link, - target: "_blank", - rel: "noreferrer noopener" - }, [method.icon ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("img", { - key: 0, - src: method.icon, - class: "list-entry-icon" - }, null, 8, _hoisted_16)) : (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", _hoisted_17)), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_18, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(method.name), 1)], 8, _hoisted_15)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]); - }), 128))])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_19, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataNotYetReady')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { - href: _ctx.backToMatomoLink - }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('BotTracking_SiteWithoutDataBackToMatomo')), 9, _hoisted_20)])], 64)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.showMethodDetails ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", { - key: 3, - class: "tracking-method-details", - "data-method": _ctx.showMethodDetails.id - }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", { - src: _ctx.showMethodDetails.icon, - alt: `${_ctx.showMethodDetails.name} logo` - }, null, 8, _hoisted_22), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_VueEntryContainer, { - html: _ctx.showMethodDetails.content - }, null, 8, ["html"])], 8, _hoisted_21)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]); -} -// CONCATENATED MODULE: ./plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue?vue&type=template&id=8fac1ad0 - -// EXTERNAL MODULE: external "CoreHome" -var external_CoreHome_ = __webpack_require__("19dc"); - -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--15-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--15-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue?vue&type=script&lang=ts - - -/* harmony default export */ var SiteWithoutDatavue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({ - components: { - ActivityIndicator: external_CoreHome_["ActivityIndicator"], - VueEntryContainer: external_CoreHome_["VueEntryContainer"] - }, - props: { - backToMatomoLink: String - }, - data() { - return { - loading: true, - errorMessage: null, - showMethodDetails: null, - recommendedMethod: null, - trackingMethods: [] - }; - }, - created() { - Object(external_commonjs_vue_commonjs2_vue_root_Vue_["watch"])(() => external_CoreHome_["MatomoUrl"].hashParsed.value.activeTab, activeTab => { - this.showMethodDetails = this.findTrackingMethod(activeTab); - }); - this.fetchTrackingMethods(); - }, - methods: { - fetchTrackingMethods() { - const params = { - module: 'BotTracking', - action: 'getTrackingMethodsForSite', - idSite: external_CoreHome_["Matomo"].idSite - }; - this.loading = true; - this.errorMessage = null; - external_CoreHome_["AjaxHelper"].fetch(params).then(response => { - const trackingMethods = Array.isArray(response === null || response === void 0 ? void 0 : response.trackingMethods) ? [...response.trackingMethods] : []; - const recommendedIndex = trackingMethods.findIndex(method => method.wasDetected); - if (recommendedIndex !== -1) { - this.recommendedMethod = trackingMethods[recommendedIndex]; - trackingMethods.splice(recommendedIndex, 1); - } else { - this.recommendedMethod = null; - } - this.trackingMethods = trackingMethods; - }).catch(() => { - this.errorMessage = Object(external_CoreHome_["translate"])('General_ErrorRequest', '', ''); - this.recommendedMethod = null; - this.trackingMethods = []; - }).finally(() => { - this.loading = false; - this.showMethodDetails = this.findTrackingMethod(external_CoreHome_["MatomoUrl"].hashParsed.value.activeTab); - }); - }, - findTrackingMethod(methodId) { - if (this.recommendedMethod && methodId && this.recommendedMethod.id.toLowerCase() === methodId.toLowerCase()) { - return this.recommendedMethod; - } - let trackingMethod = null; - Object.entries(this.trackingMethods).forEach(([, method]) => { - if (methodId && method.id.toLowerCase() === methodId.toLowerCase() && method.content) { - trackingMethod = method; - } - }); - return trackingMethod; - }, - showMethod(methodId) { - external_CoreHome_["MatomoUrl"].updateHash(Object.assign(Object.assign({}, external_CoreHome_["MatomoUrl"].hashParsed.value), {}, { - activeTab: methodId.toLowerCase() - })); - }, - showOverview() { - external_CoreHome_["MatomoUrl"].updateHash(Object.assign(Object.assign({}, external_CoreHome_["MatomoUrl"].hashParsed.value), {}, { - activeTab: null - })); - } - }, - computed: { - headline() { - if (this.showMethodDetails && this.showMethodDetails.name) { - if (this.showMethodDetails.isOthers) { - return this.showMethodDetails.name; - } - return Object(external_CoreHome_["translate"])('BotTracking_SiteWithoutDataInstallWithX', this.showMethodDetails.name); - } - return Object(external_CoreHome_["translate"])('BotTracking_SiteWithoutDataChooseTrackingMethod'); - } - } -})); -// CONCATENATED MODULE: ./plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue?vue&type=script&lang=ts - -// CONCATENATED MODULE: ./plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue - - - -SiteWithoutDatavue_type_script_lang_ts.render = render - -/* harmony default export */ var SiteWithoutData = (SiteWithoutDatavue_type_script_lang_ts); -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue?vue&type=template&id=d9a3d5fe - -const NoRecentRequestsWidgetvue_type_template_id_d9a3d5fe_hoisted_1 = ["innerHTML"]; -function NoRecentRequestsWidgetvue_type_template_id_d9a3d5fe_render(_ctx, _cache, $props, $setup, $data, $options) { - return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", { - class: "alert alert-warning bot-tracking-no-recent-requests-message", - innerHTML: _ctx.$sanitize(_ctx.messageHtml) - }, null, 8, NoRecentRequestsWidgetvue_type_template_id_d9a3d5fe_hoisted_1); -} -// CONCATENATED MODULE: ./plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue?vue&type=template&id=d9a3d5fe - -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--15-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--15-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue?vue&type=script&lang=ts - - -/* harmony default export */ var NoRecentRequestsWidgetvue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({ - computed: { - noDataUrl() { - var _Matomo$idSite; - const { - period, - date - } = external_CoreHome_["MatomoUrl"].parsed.value; - const query = external_CoreHome_["MatomoUrl"].stringify({ - module: 'BotTracking', - action: 'siteWithoutData', - idSite: (_Matomo$idSite = external_CoreHome_["Matomo"].idSite) !== null && _Matomo$idSite !== void 0 ? _Matomo$idSite : external_CoreHome_["MatomoUrl"].parsed.value.idSite, - period, - date - }); - return `index.php?${query}`; - }, - messageHtml() { - const linkOpen = ``; - return Object(external_CoreHome_["translate"])('BotTracking_NoRecentAIBotRequests', '', '', linkOpen, ''); - } - } -})); -// CONCATENATED MODULE: ./plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue?vue&type=script&lang=ts - -// CONCATENATED MODULE: ./plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue - - - -NoRecentRequestsWidgetvue_type_script_lang_ts.render = NoRecentRequestsWidgetvue_type_template_id_d9a3d5fe_render - -/* harmony default export */ var NoRecentRequestsWidget = (NoRecentRequestsWidgetvue_type_script_lang_ts); -// CONCATENATED MODULE: ./plugins/BotTracking/vue/src/index.ts -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - - -// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib-no-default.js - - - - -/***/ }) - -/******/ }); -}); -//# sourceMappingURL=BotTracking.umd.js.map \ No newline at end of file diff --git a/plugins/BotTracking/vue/dist/BotTracking.umd.min.js b/plugins/BotTracking/vue/dist/BotTracking.umd.min.js deleted file mode 100644 index 50aa564a70d698e6917d0e88be85994cad14edf3..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/vue/dist/BotTracking.umd.min.js +++ /dev/null @@ -1,8 +0,0 @@ -(function(e,t){"object"===typeof exports&&"object"===typeof module?module.exports=t(require("CoreHome"),require("vue")):"function"===typeof define&&define.amd?define(["CoreHome"],t):"object"===typeof exports?exports["BotTracking"]=t(require("CoreHome"),require("vue")):e["BotTracking"]=t(e["CoreHome"],e["Vue"])})("undefined"!==typeof self?self:this,(function(e,t){return function(e){var t={};function o(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)o.d(n,a,function(t){return e[t]}.bind(null,a));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="plugins/BotTracking/vue/dist/",o(o.s="fae3")}({"19dc":function(t,o){t.exports=e},"8bbf":function(e,o){e.exports=t},fae3:function(e,t,o){"use strict";if(o.r(t),o.d(t,"SiteWithoutData",(function(){return V})),o.d(t,"NoRecentRequestsWidget",(function(){return W})),"undefined"!==typeof window){var n=window.document.currentScript,a=n&&n.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);a&&(o.p=a[1])}var r=o("8bbf");const c=Object(r["createElementVNode"])("span",{class:"icon-chevron-left"},null,-1),i={key:1},l=Object(r["createElementVNode"])("br",null,null,-1),s={key:0,class:"row"},d=Object(r["createElementVNode"])("span",{class:"icon-warning"},null,-1),h={key:1,class:"row tracking-method-detection"},m=["src","alt"],u=["href"],b={class:"row tracking-method-list"},j=Object(r["createElementVNode"])("span",{class:"icon-search"},null,-1),O=["href","onClick"],g=["src"],k={key:1,class:"list-entry-icon","aria-hidden":"true"},p={class:"list-entry-text"},f=["href"],M=["src"],y={key:1,class:"list-entry-icon","aria-hidden":"true"},v={class:"list-entry-text"},B={class:"tracking-method-skip"},D=["href"],w=["data-method"],T=["src","alt"];function E(e,t,o,n,a,E){const S=Object(r["resolveComponent"])("ActivityIndicator"),N=Object(r["resolveComponent"])("VueEntryContainer");return Object(r["openBlock"])(),Object(r["createElementBlock"])("div",null,[e.showMethodDetails?(Object(r["openBlock"])(),Object(r["createElementBlock"])("a",{key:0,class:"tracking-method-back",onClick:t[0]||(t[0]=Object(r["withModifiers"])(t=>{e.showOverview()},["prevent"]))},[c,Object(r["createTextVNode"])(" "+Object(r["toDisplayString"])(e.translate("Mobile_NavigationBack")),1)])):Object(r["createCommentVNode"])("",!0),Object(r["createElementVNode"])("h1",null,Object(r["toDisplayString"])(e.headline),1),e.loading||e.showMethodDetails?Object(r["createCommentVNode"])("",!0):(Object(r["openBlock"])(),Object(r["createElementBlock"])("p",i,[Object(r["createTextVNode"])(Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataChooseTrackingMethodPreamble1"))+" ",1),l,Object(r["createTextVNode"])(" "+Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataChooseTrackingMethodPreamble2")),1)])),Object(r["createVNode"])(S,{"loading-message":e.translate("BotTracking_DetectingYourSite"),loading:e.loading},null,8,["loading-message","loading"]),e.loading||e.showMethodDetails?Object(r["createCommentVNode"])("",!0):(Object(r["openBlock"])(),Object(r["createElementBlock"])(r["Fragment"],{key:2},[e.errorMessage?(Object(r["openBlock"])(),Object(r["createElementBlock"])("div",s,[d,Object(r["createElementVNode"])("h2",null,Object(r["toDisplayString"])(e.errorMessage),1),Object(r["createElementVNode"])("a",{class:"btn",href:"#",onClick:t[1]||(t[1]=Object(r["withModifiers"])(t=>e.fetchTrackingMethods(),["prevent"]))},Object(r["toDisplayString"])(e.translate("General_Refresh")),1)])):Object(r["createCommentVNode"])("",!0),e.recommendedMethod?(Object(r["openBlock"])(),Object(r["createElementBlock"])("div",h,[Object(r["createElementVNode"])("img",{src:e.recommendedMethod.icon,alt:e.recommendedMethod.name+" logo"},null,8,m),Object(r["createElementVNode"])("h2",null,Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataInstallWithXRecommendation",e.recommendedMethod.name)),1),Object(r["createElementVNode"])("p",null,Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataRecommendationText",e.recommendedMethod.name)),1),Object(r["createElementVNode"])("a",{href:"#"+e.recommendedMethod.id.toLowerCase(),class:"btn",onClick:t[2]||(t[2]=Object(r["withModifiers"])(t=>e.showMethod(e.recommendedMethod.id),["prevent"]))},Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataInstallWithX",e.recommendedMethod.name)),9,u)])):Object(r["createCommentVNode"])("",!0),Object(r["createElementVNode"])("div",b,[j,Object(r["createElementVNode"])("h2",null,Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataOtherInstallMethods")),1),Object(r["createElementVNode"])("p",null,Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataOtherInstallMethodsIntro")),1),Object(r["createElementVNode"])("ul",null,[(Object(r["openBlock"])(!0),Object(r["createElementBlock"])(r["Fragment"],null,Object(r["renderList"])(e.trackingMethods,t=>(Object(r["openBlock"])(),Object(r["createElementBlock"])("li",{class:"list-entry",key:t.id},[t.content?(Object(r["openBlock"])(),Object(r["createElementBlock"])("a",{key:0,href:"#"+t.id.toLowerCase(),onClick:Object(r["withModifiers"])(o=>e.showMethod(t.id),["prevent"])},[t.icon?(Object(r["openBlock"])(),Object(r["createElementBlock"])("img",{key:0,src:t.icon,class:"list-entry-icon"},null,8,g)):(Object(r["openBlock"])(),Object(r["createElementBlock"])("span",k)),Object(r["createElementVNode"])("span",p,Object(r["toDisplayString"])(t.name),1)],8,O)):t.link?(Object(r["openBlock"])(),Object(r["createElementBlock"])("a",{key:1,href:t.link,target:"_blank",rel:"noreferrer noopener"},[t.icon?(Object(r["openBlock"])(),Object(r["createElementBlock"])("img",{key:0,src:t.icon,class:"list-entry-icon"},null,8,M)):(Object(r["openBlock"])(),Object(r["createElementBlock"])("span",y)),Object(r["createElementVNode"])("span",v,Object(r["toDisplayString"])(t.name),1)],8,f)):Object(r["createCommentVNode"])("",!0)]))),128))])]),Object(r["createElementVNode"])("div",B,[Object(r["createElementVNode"])("h2",null,Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataNotYetReady")),1),Object(r["createElementVNode"])("a",{href:e.backToMatomoLink},Object(r["toDisplayString"])(e.translate("BotTracking_SiteWithoutDataBackToMatomo")),9,D)])],64)),e.showMethodDetails?(Object(r["openBlock"])(),Object(r["createElementBlock"])("div",{key:3,class:"tracking-method-details","data-method":e.showMethodDetails.id},[Object(r["createElementVNode"])("img",{src:e.showMethodDetails.icon,alt:e.showMethodDetails.name+" logo"},null,8,T),Object(r["createVNode"])(N,{html:e.showMethodDetails.content},null,8,["html"])],8,w)):Object(r["createCommentVNode"])("",!0)])}var S=o("19dc"),N=Object(r["defineComponent"])({components:{ActivityIndicator:S["ActivityIndicator"],VueEntryContainer:S["VueEntryContainer"]},props:{backToMatomoLink:String},data(){return{loading:!0,errorMessage:null,showMethodDetails:null,recommendedMethod:null,trackingMethods:[]}},created(){Object(r["watch"])(()=>S["MatomoUrl"].hashParsed.value.activeTab,e=>{this.showMethodDetails=this.findTrackingMethod(e)}),this.fetchTrackingMethods()},methods:{fetchTrackingMethods(){const e={module:"BotTracking",action:"getTrackingMethodsForSite",idSite:S["Matomo"].idSite};this.loading=!0,this.errorMessage=null,S["AjaxHelper"].fetch(e).then(e=>{const t=Array.isArray(null===e||void 0===e?void 0:e.trackingMethods)?[...e.trackingMethods]:[],o=t.findIndex(e=>e.wasDetected);-1!==o?(this.recommendedMethod=t[o],t.splice(o,1)):this.recommendedMethod=null,this.trackingMethods=t}).catch(()=>{this.errorMessage=Object(S["translate"])("General_ErrorRequest","",""),this.recommendedMethod=null,this.trackingMethods=[]}).finally(()=>{this.loading=!1,this.showMethodDetails=this.findTrackingMethod(S["MatomoUrl"].hashParsed.value.activeTab)})},findTrackingMethod(e){if(this.recommendedMethod&&e&&this.recommendedMethod.id.toLowerCase()===e.toLowerCase())return this.recommendedMethod;let t=null;return Object.entries(this.trackingMethods).forEach(([,o])=>{e&&o.id.toLowerCase()===e.toLowerCase()&&o.content&&(t=o)}),t},showMethod(e){S["MatomoUrl"].updateHash(Object.assign(Object.assign({},S["MatomoUrl"].hashParsed.value),{},{activeTab:e.toLowerCase()}))},showOverview(){S["MatomoUrl"].updateHash(Object.assign(Object.assign({},S["MatomoUrl"].hashParsed.value),{},{activeTab:null}))}},computed:{headline(){return this.showMethodDetails&&this.showMethodDetails.name?this.showMethodDetails.isOthers?this.showMethodDetails.name:Object(S["translate"])("BotTracking_SiteWithoutDataInstallWithX",this.showMethodDetails.name):Object(S["translate"])("BotTracking_SiteWithoutDataChooseTrackingMethod")}}});N.render=E;var V=N;const C=["innerHTML"];function _(e,t,o,n,a,c){return Object(r["openBlock"])(),Object(r["createElementBlock"])("div",{class:"alert alert-warning bot-tracking-no-recent-requests-message",innerHTML:e.$sanitize(e.messageHtml)},null,8,C)}var x=Object(r["defineComponent"])({computed:{noDataUrl(){var e;const{period:t,date:o}=S["MatomoUrl"].parsed.value,n=S["MatomoUrl"].stringify({module:"BotTracking",action:"siteWithoutData",idSite:null!==(e=S["Matomo"].idSite)&&void 0!==e?e:S["MatomoUrl"].parsed.value.idSite,period:t,date:o});return"index.php?"+n},messageHtml(){const e=``;return Object(S["translate"])("BotTracking_NoRecentAIBotRequests","","",e,"")}}});x.render=_;var W=x; -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */}})})); -//# sourceMappingURL=BotTracking.umd.min.js.map \ No newline at end of file diff --git a/plugins/BotTracking/vue/dist/umd.metadata.json b/plugins/BotTracking/vue/dist/umd.metadata.json deleted file mode 100644 index 9ecfcc0456204cf8e8e80416ebc95ef42d4fbd28..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/vue/dist/umd.metadata.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependsOn": [ - "CoreHome" - ] -} \ No newline at end of file diff --git a/plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue b/plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue deleted file mode 100644 index 8e8a3c8658bdffe79f5ce2b773dd36aa2575fe6a..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/vue/src/NoRecentRequests/NoRecentRequestsWidget.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue b/plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue deleted file mode 100644 index 1150fc4e720be2725273aa1b829af46eba41b284..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/vue/src/SiteWithoutData/SiteWithoutData.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - - - diff --git a/plugins/BotTracking/vue/src/index.ts b/plugins/BotTracking/vue/src/index.ts deleted file mode 100644 index e84d698ce9050686e86969b7403def9d40cf6e99..0000000000000000000000000000000000000000 --- a/plugins/BotTracking/vue/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -export { default as SiteWithoutData } from './SiteWithoutData/SiteWithoutData.vue'; -export { default as NoRecentRequestsWidget } from './NoRecentRequests/NoRecentRequestsWidget.vue'; diff --git a/plugins/BulkTracking/.gitignore b/plugins/BulkTracking/.gitignore deleted file mode 100644 index c8c9480010db494b8cf54ca8f9561e7a14ff51ea..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tests/System/processed/*xml \ No newline at end of file diff --git a/plugins/BulkTracking/BulkTracking.php b/plugins/BulkTracking/BulkTracking.php deleted file mode 100644 index 69d8f6154284f5e63005e336f5135f2b5c81cf43..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/BulkTracking.php +++ /dev/null @@ -1,94 +0,0 @@ - 'setHandlerIfBulkRequest', - 'Tracker.initRequestSet' => 'initRequestSet', - ); - } - - public function setRequests(Requests $requests) - { - $this->requests = $requests; - } - - public function initRequestSet(RequestSet $requestSet) - { - if ($this->isUsingBulkRequest()) { - $bulk = $this->buildBulkRequests(); - - list($requests, $token) = $bulk->initRequestsAndTokenAuth($bulk->getRawBulkRequest()); - - if ($bulk->requiresAuthentication()) { - $bulk->authenticateRequests($requests); - } - - if (!$requestSet->getTokenAuth()) { - $requestSet->setTokenAuth($token); - } - - $requestSet->setRequests($requests); - } - } - - public function setHandlerIfBulkRequest(&$handler) - { - if (!is_null($handler)) { - return; - } - - if ($this->isUsingBulkRequest()) { - $handler = new Handler(); - $handler->getResponse()->setShouldSendResponse($this->shouldSendResponse()); - } - } - - private function isUsingBulkRequest() - { - $requests = $this->buildBulkRequests(); - $rawData = $requests->getRawBulkRequest(); - - return $requests->isUsingBulkRequest($rawData); - } - - private function shouldSendResponse(): bool - { - $requests = $this->buildBulkRequests(); - $rawData = $requests->getRawBulkRequest(); - - return $requests->shouldSendResponse($rawData); - } - - private function buildBulkRequests() - { - if (!is_null($this->requests)) { - return $this->requests; - } - - return new Requests(); - } -} diff --git a/plugins/BulkTracking/Tracker/Handler.php b/plugins/BulkTracking/Tracker/Handler.php deleted file mode 100644 index c50ffd695bc38b4f4d0808e0e248b52892382617..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/Tracker/Handler.php +++ /dev/null @@ -1,139 +0,0 @@ -setResponse(new Response()); - } - - public function onStartTrackRequests(Tracker $tracker, RequestSet $requestSet) - { - if ($this->isTransactionSupported()) { - $this->beginTransaction(); - } - } - - public function onAllRequestsTracked(Tracker $tracker, RequestSet $requestSet) - { - $this->commitTransaction(); - - // Do not run schedule task if we are importing logs or doing custom tracking (as it could slow down) - } - - public function process(Tracker $tracker, RequestSet $requestSet) - { - $isAuthenticated = $this->isBulkTrackingRequestAuthenticated($requestSet); - - /** @var Response $response */ - $response = $this->getResponse(); - $response->setIsAuthenticated($isAuthenticated); - - $invalidRequests = array(); - foreach ($requestSet->getRequests() as $index => $request) { - try { - $tracker->trackRequest($request); - } catch (UnexpectedWebsiteFoundException $ex) { - $invalidRequests[] = $index; - } catch (InvalidRequestParameterException $ex) { - $invalidRequests[] = $index; - } catch (Exception $e) { - if ( - stripos($e->getMessage(), 'Lock wait timeout exceeded') - || Tracker::getDatabase()->isErrNo($e, 1205) - ) { - continue; - } else { - throw $e; - } - } - } - - $response->setInvalidRequests($invalidRequests); - } - - public function onException(Tracker $tracker, RequestSet $requestSet, Exception $e) - { - $this->rollbackTransaction(); - parent::onException($tracker, $requestSet, $e); - } - - private function beginTransaction() - { - if (empty($this->transactionId)) { - $this->transactionId = $this->getDb()->beginTransaction(); - } - } - - private function commitTransaction() - { - if (!empty($this->transactionId)) { - $this->getDb()->commit($this->transactionId); - $this->transactionId = null; - } - } - - private function rollbackTransaction() - { - if (!empty($this->transactionId)) { - $this->getDb()->rollback($this->transactionId); - $this->transactionId = null; - } - } - - private function getDb() - { - return Tracker::getDatabase(); - } - - /** - * @return bool - */ - private function isTransactionSupported() - { - return TrackerConfig::getBoolConfigValue('bulk_requests_use_transaction', false); - } - - private function isBulkTrackingRequestAuthenticated(RequestSet $requestSet) - { - $tokenAuth = $requestSet->getTokenAuth(); - if (empty($tokenAuth)) { - return false; - } - - Piwik::postEvent('Request.initAuthenticationObject'); - - /** @var \Piwik\Auth $auth */ - $auth = StaticContainer::get('Piwik\Auth'); - $auth->setTokenAuth($tokenAuth); - $auth->setLogin(null); - $auth->setPassword(null); - $auth->setPasswordHash(null); - $access = $auth->authenticate(); - - return $access->getCode() == AuthResult::SUCCESS_SUPERUSER_AUTH_CODE; - } -} diff --git a/plugins/BulkTracking/Tracker/Requests.php b/plugins/BulkTracking/Tracker/Requests.php deleted file mode 100644 index 531a693a166c05fec4c8c24d307543559f47156d..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/Tracker/Requests.php +++ /dev/null @@ -1,121 +0,0 @@ -checkTokenAuthNotEmpty($request->getTokenAuth()); - - if (!$request->isAuthenticated()) { - $msg = sprintf("token_auth specified does not have Admin permission for idsite=%s", $request->getIdSite()); - throw new Exception($msg); - } - } - } - - private function checkTokenAuthNotEmpty($token) - { - if (empty($token)) { - throw new Exception("token_auth must be specified when using Bulk Tracking Import. " - . " See Tracking Doc"); - } - } - - /** - * @return string|false - */ - public function getRawBulkRequest() - { - return file_get_contents("php://input"); - } - - public function isUsingBulkRequest($rawData) - { - if (!empty($rawData)) { - return strpos($rawData, '"requests"') || strpos($rawData, "'requests'"); - } - - return false; - } - - public function getRequestsArrayFromBulkRequest($rawData) - { - $rawData = trim($rawData); - $rawData = Common::sanitizeLineBreaks($rawData); - - // POST data can be array of string URLs or array of arrays w/ visit info - $jsonData = json_decode($rawData, $assoc = true); - - $tokenAuth = Common::getRequestVar('token_auth', false, 'string', $jsonData); - - $requests = array(); - if (isset($jsonData['requests'])) { - $requests = $jsonData['requests']; - } - - return array($requests, $tokenAuth); - } - - public function shouldSendResponse($rawData): bool - { - $rawData = trim($rawData); - $rawData = Common::sanitizeLineBreaks($rawData); - - // POST data can be array of string URLs or array of arrays w/ visit info - $jsonData = json_decode($rawData, $assoc = true); - - return !!Common::getRequestVar('send_image', true, 'string', $jsonData); - } - - public function initRequestsAndTokenAuth($rawData) - { - list($requests, $tokenAuth) = $this->getRequestsArrayFromBulkRequest($rawData); - - $validRequests = array(); - - if (!empty($requests)) { - foreach ($requests as $index => $request) { - // if a string is sent, we assume its a URL and try to parse it - if (is_string($request)) { - $params = array(); - - $url = @parse_url($request); - if (!empty($url['query'])) { - @parse_str($url['query'], $params); - $validRequests[] = new Request($params, $tokenAuth); - } - } else { - $validRequests[] = new Request($request, $tokenAuth); - } - } - } - - return array($validRequests, $tokenAuth); - } -} diff --git a/plugins/BulkTracking/Tracker/Response.php b/plugins/BulkTracking/Tracker/Response.php deleted file mode 100644 index 860afd34248b4fb91803f7249807f3c0af77744e..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/Tracker/Response.php +++ /dev/null @@ -1,130 +0,0 @@ -logExceptionToErrorLog($e); - - $result = $this->formatException($tracker, $e); - - echo json_encode($result); - } - - public function outputResponse(Tracker $tracker) - { - if ($this->hasAlreadyPrintedOutput()) { - return; - } - - if (!$this->shouldSendResponse()) { - Common::sendResponseCode(204); - return; - } - - $result = $this->formatResponse($tracker); - - echo json_encode($result); - } - - public function getOutput() - { - Common::sendHeader('Content-Type: application/json'); - - return parent::getOutput(); - } - - private function formatException(Tracker $tracker, Exception $e) - { - // when doing bulk tracking we return JSON so the caller will know how many succeeded - $result = array( - 'status' => 'error', - 'tracked' => $tracker->getCountOfLoggedRequests(), - 'invalid' => count($this->invalidRequests), - ); - - $this->addInvalidIndicesIfAuthenticated($result); - - // send error when in debug mode - if ($tracker->isDebugModeEnabled()) { - $result['message'] = $this->getMessageFromException($e); - } - - return $result; - } - - private function formatResponse(Tracker $tracker) - { - $result = array( - 'status' => 'success', - 'tracked' => $tracker->getCountOfLoggedRequests(), - 'invalid' => count($this->invalidRequests), - ); - - $this->addInvalidIndicesIfAuthenticated($result); - - return $result; - } - - public function setShouldSendResponse(bool $shouldSendResponse) - { - $this->shouldSendResponse = $shouldSendResponse; - } - - public function shouldSendResponse(): bool - { - return $this->shouldSendResponse; - } - - public function setInvalidRequests($invalidRequests) - { - $this->invalidRequests = $invalidRequests; - } - - public function setIsAuthenticated($isAuthenticated) - { - $this->isAuthenticated = $isAuthenticated; - } - - private function addInvalidIndicesIfAuthenticated(&$result) - { - if ($this->isAuthenticated) { - $result['invalid_indices'] = $this->invalidRequests; - } - } -} diff --git a/plugins/BulkTracking/config/config.php b/plugins/BulkTracking/config/config.php deleted file mode 100644 index d5be5de26f92a935f318ed4c0a04fe01434bfe66..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/config/config.php +++ /dev/null @@ -1,3 +0,0 @@ -setUpWebsite(); - $this->trackFirstVisit(); - $this->trackSecondVisit(); - } - - public function tearDown(): void - { - // empty - } - - private function setUpWebsite() - { - if (!self::siteCreated($this->idSite)) { - $idSite = self::createWebsite($this->dateTime, $ecommerce = 1); - $this->assertSame($this->idSite, $idSite); - } - } - - protected function trackFirstVisit() - { - $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.1)->getDatetime()); - $t->setUrl('http://example.com/'); - self::checkResponse($t->doTrackPageView('Viewing homepage')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.2)->getDatetime()); - $t->setUrl('http://example.com/sub/page'); - self::checkResponse($t->doTrackPageView('Second page view')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.25)->getDatetime()); - $t->addEcommerceItem($sku = 'SKU_ID', $name = 'Test item!', $category = 'Test & Category', $price = 777, $quantity = 33); - self::checkResponse($t->doTrackEcommerceOrder('TestingOrder', $grandTotal = 33 * 77)); - } - - protected function trackSecondVisit() - { - $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true); - $t->setIp('56.11.55.73'); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.1)->getDatetime()); - $t->setUrl('http://example.com/sub/page'); - self::checkResponse($t->doTrackPageView('Viewing homepage')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.2)->getDatetime()); - $t->setUrl('http://example.com/?search=this is a site search query'); - self::checkResponse($t->doTrackPageView('Site search query')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.3)->getDatetime()); - $t->addEcommerceItem($sku = 'SKU_ID2', $name = 'A durable item', $category = 'Best seller', $price = 321); - self::checkResponse($t->doTrackEcommerceCartUpdate($grandTotal = 33 * 77)); - } -} diff --git a/plugins/BulkTracking/tests/Framework/Mock/Tracker/Requests.php b/plugins/BulkTracking/tests/Framework/Mock/Tracker/Requests.php deleted file mode 100644 index 33081e72aad1a6b4774e7bb9bc654d7349bfa8e5..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Framework/Mock/Tracker/Requests.php +++ /dev/null @@ -1,40 +0,0 @@ -rawData = $rawData; - } - - public function getRawBulkRequest() - { - if (!is_null($this->rawData)) { - return $this->rawData; - } - - return parent::getRawBulkRequest(); - } - - public function enableRequiresAuth() - { - $this->requiresAuth = true; - } - - public function requiresAuthentication() - { - return $this->requiresAuth; - } -} diff --git a/plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php b/plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php deleted file mode 100644 index 30671b4ade0b6ee4af158c78a7f9502d95a0378a..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php +++ /dev/null @@ -1,18 +0,0 @@ -bulk = new BulkTracking(); - - $this->pluginBackup = Plugin\Manager::getInstance()->getLoadedPlugin('BulkTracking'); - Plugin\Manager::getInstance()->addLoadedPlugin('BulkTracking', $this->bulk); - } - - public function tearDown(): void - { - Plugin\Manager::getInstance()->addLoadedPlugin('BulkTracking', $this->pluginBackup); - parent::tearDown(); - } - - protected function getSuperUserToken() - { - Fixture::createSuperUser(false); - return Fixture::getTokenAuth(); - } - - protected function injectRawDataToBulk($rawData, $requiresAuth = false) - { - $requests = new Requests(); - $requests->setRawData($rawData); - - if ($requiresAuth) { - $requests->enableRequiresAuth(); - } - - $this->bulk->setRequests($requests); - } - - protected function initRequestSet($rawData, $requiresAuth = false, $initToken = null) - { - $requestSet = new RequestSet(); - - if (!is_null($initToken)) { - $requestSet->setTokenAuth($initToken); - } - - $this->injectRawDataToBulk($rawData, $requiresAuth); - - $this->bulk->initRequestSet($requestSet); - - return $requestSet; - } - - protected function getDummyRequest($token = null, $idSites = array(1, 2)) - { - $params = array(array('idsite' => $idSites[0], 'rec' => '1'), array('idsite' => $idSites[1], 'rec' => '1')); - $params = array('requests' => $params); - - if (!is_null($token)) { - $params['token_auth'] = $token; - } - - $request = json_encode($params); - - return $request; - } -} diff --git a/plugins/BulkTracking/tests/Integration/BulkTrackingTest.php b/plugins/BulkTracking/tests/Integration/BulkTrackingTest.php deleted file mode 100644 index 6a49770908229c1a0fbf373344f483e41ce65dd1..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Integration/BulkTrackingTest.php +++ /dev/null @@ -1,145 +0,0 @@ -bulk->initRequestSet($requestSet); - - $this->assertEquals(array(), $requestSet->getRequests()); - $this->assertEquals(false, $requestSet->getTokenAuth()); - } - - public function testInitRequestSetShouldNotSetAnythingIfNotBulkRequestRawDataIsGiven() - { - $requestSet = $this->initRequestSet('invalid:requests'); - - $this->assertEquals(array(), $requestSet->getRequests()); - $this->assertEquals(false, $requestSet->getTokenAuth()); - } - - public function testInitRequestSetShouldInitializeAsItIsABulkRequest() - { - $token = $this->getSuperUserToken(); - $request = $this->getDummyRequest($token); - - $requestSet = $this->initRequestSet($request); - - $requests = $requestSet->getRequests(); - $this->assertCount(2, $requests); - $this->assertEquals(array('idsite' => '1', 'rec' => '1'), $requests[0]->getParams()); - $this->assertEquals(array('idsite' => '2', 'rec' => '1'), $requests[1]->getParams()); - $this->assertEquals($token, $requestSet->getTokenAuth()); - } - - public function testInitRequestSetShouldNotOverwriteATokenIfOneIsAlreadySet() - { - $token = $this->getSuperUserToken(); - $request = $this->getDummyRequest($token); - - $requestSet = $this->initRequestSet($request, false, 'initialtoken'); - - $this->assertEquals('initialtoken', $requestSet->getTokenAuth()); - $this->assertCount(2, $requestSet->getRequests()); - } - - public function testInitRequestSetShouldNotFailIfNoTokenProvidedAsAuthenticationIsDisabledByDefault() - { - $request = $this->getDummyRequest(); - - $requestSet = $this->initRequestSet($request); - - $requests = $requestSet->getRequests(); - $this->assertCount(2, $requests); - } - - public function testInitRequestSetShouldTriggerExceptionInCaseNoValidTokenProvidedAndAuthenticationIsRequired() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('token_auth must be specified when using Bulk Tracking Import'); - - $request = $this->getDummyRequest(false); - - $this->initRequestSet($request, true); - } - - public function testSetHandlerIfBulkRequestShouldSetBulkHandlerInCaseNoHandlerIsSetAndItIsABulkRequest() - { - $this->injectRawDataToBulk($this->getDummyRequest()); - - $handler = null; - $this->bulk->setHandlerIfBulkRequest($handler); - - $this->assertTrue($handler instanceof Handler); - } - - public function testSetHandlerIfBulkRequestShouldNotSetAHandlerIfOneIsAlreadySetEvenIfItIsABulkRequest() - { - $this->injectRawDataToBulk($this->getDummyRequest()); - - $default = new DefaultHandler(); - $handler = $default; - - $this->bulk->setHandlerIfBulkRequest($default); - - $this->assertSame($default, $handler); - } - - public function testSetHandlerIfBulkRequestShouldNotSetAHandlerIfItIsNotABulkRequest() - { - $this->injectRawDataToBulk('{"test":"not a bulk request"}'); - - $handler = null; - - $this->bulk->setHandlerIfBulkRequest($handler); - - $this->assertNull($handler); - } - - public function testRegisterEventsShouldListenToNewTrackerEventAndCreateBulkHandlerIfBulkRequest() - { - $this->injectRawDataToBulk($this->getDummyRequest()); - - $handler = DefaultHandler\Factory::make(); - - $this->assertTrue($handler instanceof Handler); - } - - public function testRegisterEventsShouldListenToNewTrackerEventAndNotCreateBulkHandlerIfNotBulkRequest() - { - $handler = DefaultHandler\Factory::make(); - - $this->assertTrue($handler instanceof DefaultHandler); - } - - public function testRegisterEventsShouldListenToInitRequestSetEventAndInitIfBulkRequest() - { - $this->injectRawDataToBulk($this->getDummyRequest()); - - $requestSet = new RequestSet(); - $requestSet->initRequestsAndTokenAuth(); - - $this->assertCount(2, $requestSet->getRequests()); - } -} diff --git a/plugins/BulkTracking/tests/Integration/HandlerTest.php b/plugins/BulkTracking/tests/Integration/HandlerTest.php deleted file mode 100644 index a27f331d83815af4e7adaff1e48dc2afe183b738..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Integration/HandlerTest.php +++ /dev/null @@ -1,163 +0,0 @@ -response = new TrackerResponse(); - $this->handler = new Handler(); - $this->handler->setResponse($this->response); - $this->tracker = new Tracker(); - $this->requestSet = new RequestSet(); - } - - public function testInitShouldInitiateResponseInstance() - { - $this->handler->init($this->tracker, $this->requestSet); - - $this->assertTrue($this->response->isInit); - $this->assertFalse($this->response->isResponseOutput); - $this->assertFalse($this->response->isSend); - } - - public function testFinishShouldOutputAndSendResponse() - { - $response = $this->handler->finish($this->tracker, $this->requestSet); - - $this->assertEquals('My Dummy Content', $response); - - $this->assertFalse($this->response->isInit); - $this->assertFalse($this->response->isExceptionOutput); - $this->assertTrue($this->response->isResponseOutput); - $this->assertTrue($this->response->isSend); - } - - public function testOnExceptionShouldOutputAndSendResponse() - { - $this->executeOnException($this->buildException()); - - $this->assertFalse($this->response->isInit); - $this->assertFalse($this->response->isResponseOutput); - $this->assertTrue($this->response->isExceptionOutput); - $this->assertFalse($this->response->isSend); - } - - public function testOnExceptionShouldPassExceptionToResponse() - { - $exception = $this->buildException(); - - $this->executeOnException($exception); - - $this->assertSame($exception, $this->response->exception); - $this->assertSame(500, $this->response->statusCode); - } - - public function testOnExceptionShouldSendStatusCode400IfUnexpectedWebsite() - { - $this->executeOnException(new UnexpectedWebsiteFoundException('test')); - $this->assertSame(400, $this->response->statusCode); - } - - public function testOnExceptionShouldSendStatusCode400IfInvalidRequestParameterException() - { - $this->executeOnException(new InvalidRequestParameterException('test')); - $this->assertSame(400, $this->response->statusCode); - } - - public function testOnExceptionShouldNotRethrowAnException() - { - self::expectNotToPerformAssertions(); - - $exception = $this->buildException(); - - $this->handler->onException($this->tracker, $this->requestSet, $exception); - } - - public function testOnAllRequestsTrackedShouldNeverTriggerScheduledTasksEvenIfEnabled() - { - $runner = new ScheduledTasksRunner(); - $runner->shouldRun = true; - - $this->handler->setScheduledTasksRunner($runner); - $this->handler->onAllRequestsTracked($this->tracker, $this->requestSet); - - $this->assertFalse($runner->ranScheduledTasks); - } - - public function testProcessShouldTrackAllSetRequests() - { - $this->assertSame(0, $this->tracker->getCountOfLoggedRequests()); - - $this->requestSet->setRequests(array( - array('idsite' => 1, 'url' => 'http://localhost/foo?bar'), - array('idsite' => 1, 'url' => 'http://localhost'), - )); - - $this->handler->process($this->tracker, $this->requestSet); - - $this->assertSame(2, $this->tracker->getCountOfLoggedRequests()); - } - - private function buildException() - { - return new \Exception('MyMessage', 292); - } - - private function executeOnException(Exception $exception) - { - try { - $this->handler->onException($this->tracker, $this->requestSet, $exception); - } catch (Exception $e) { - } - } -} diff --git a/plugins/BulkTracking/tests/Integration/RequestsTest.php b/plugins/BulkTracking/tests/Integration/RequestsTest.php deleted file mode 100644 index c9ee090e58c05f18238b272f8dedecec822eb03b..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Integration/RequestsTest.php +++ /dev/null @@ -1,126 +0,0 @@ -requests = new Requests(); - } - - public function tearDown(): void - { - // clean up your test here if needed - - parent::tearDown(); - } - - public function testRequiresAuthenticationShouldReturnTrueIfEnabled() - { - $oldConfig = TrackerConfig::getConfigValue('bulk_requests_require_authentication'); - TrackerConfig::setConfigValue('bulk_requests_require_authentication', 1); - - $this->assertTrue($this->requests->requiresAuthentication()); - - TrackerConfig::setConfigValue('bulk_requests_require_authentication', $oldConfig); - } - - public function testRequiresAuthenticationShouldReturnFalseIfDisabled() - { - $oldConfig = TrackerConfig::getConfigValue('bulk_requests_require_authentication'); - TrackerConfig::setConfigValue('bulk_requests_require_authentication', 0); - - $this->assertFalse($this->requests->requiresAuthentication()); - - TrackerConfig::setConfigValue('bulk_requests_require_authentication', $oldConfig); - } - - public function testAuthenticateRequestsShouldThrowAnExceptionIfTokenAuthIsEmpty() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('token_auth must be specified when using Bulk Tracking Import'); - - $requests = array($this->buildDummyRequest()); - $this->requests->authenticateRequests($requests); - } - - public function testAuthenticateRequestsShouldThrowAnExceptionIfAnyTokenAuthIsEmpty() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('token_auth must be specified when using Bulk Tracking Import'); - - $requests = array($this->buildDummyRequest($this->getSuperUserToken()), $this->buildDummyRequest()); - $this->requests->authenticateRequests($requests); - } - - public function testAuthenticateRequestsShouldThrowAnExceptionIfTokenIsNotValid() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('token_auth specified does not have Admin permission for idsite=1'); - - $dummyToken = StaticContainer::get(Model::class)->generateRandomTokenAuth(); - $superUserToken = $this->getSuperUserToken(); - - $requests = array($this->buildDummyRequest($superUserToken), $this->buildDummyRequest($dummyToken)); - $this->requests->authenticateRequests($requests); - } - - public function testAuthenticateRequestsShouldNotFailIfAllTokensAreValid() - { - self::expectNotToPerformAssertions(); - - $superUserToken = $this->getSuperUserToken(); - - $requests = array($this->buildDummyRequest($superUserToken), $this->buildDummyRequest($superUserToken)); - $this->requests->authenticateRequests($requests); - } - - public function testAuthenticateRequestsShouldNotFailIfEmptyRequestSetGiven() - { - self::expectNotToPerformAssertions(); - - $this->requests->authenticateRequests(array()); - } - - private function getSuperUserToken() - { - Fixture::createSuperUser(false); - return Fixture::getTokenAuth(); - } - - private function buildDummyRequest($token = false) - { - return new Request(array('idsite' => '1'), $token); - } -} diff --git a/plugins/BulkTracking/tests/Integration/TrackerTest.php b/plugins/BulkTracking/tests/Integration/TrackerTest.php deleted file mode 100644 index 8d6641e2a2b150542f92714d9029df94725f5b4a..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Integration/TrackerTest.php +++ /dev/null @@ -1,154 +0,0 @@ -tracker = new Tracker(); - - Fixture::createWebsite('2014-01-01 00:00:00'); - Fixture::createWebsite('2014-01-01 00:00:00'); - - $this->injectRawDataToBulk($this->getDummyRequest()); - } - - public function testMainShouldIncreaseLoggedRequestsCounter() - { - $this->tracker->main($this->getHandler(), $this->getEmptyRequestSet()); - - $this->assertSame(2, $this->tracker->getCountOfLoggedRequests()); - } - - public function testMainShouldUseBulkHandler() - { - $handler = $this->getHandler(); - $this->assertTrue($handler instanceof Handler); - } - - public function testMainShouldReturnBulkTrackingResponse() - { - $response = $this->tracker->main($this->getHandler(), $this->getEmptyRequestSet()); - - $this->assertSame('{"status":"success","tracked":2,"invalid":0}', $response); - } - - public function testMainShouldReturnErrorResponseInCaseOfAnyError() - { - $requestSet = new RequestSet(); - $requestSet->enableThrowExceptionOnInit(); - - $handler = $this->getHandler(); - $handler->setResponse(new Response()); - - $response = $this->tracker->main($handler, $requestSet); - - $this->assertSame('{"status":"error","tracked":0,"invalid":0}', $response); - } - - public function testMainShouldReturnErrorResponseIfNotAuthorized() - { - $this->injectRawDataToBulk($this->getDummyRequest(), true); - - $handler = $this->getHandler(); - $handler->setResponse(new Response()); - - $response = $this->tracker->main($handler, $this->getEmptyRequestSet()); - - $this->assertSame('{"status":"error","tracked":0,"invalid":0}', $response); - } - - public function testMainShouldActuallyTrack() - { - $this->assertEmpty($this->getIdVisit(1)); - $this->assertEmpty($this->getIdVisit(2)); - - $requestSet = $this->getEmptyRequestSet(); - $this->tracker->main($this->getHandler(), $requestSet); - - $this->assertCount(2, $requestSet->getRequests(), 'Nothing tracked because it could not find 2 requests'); - - $visit1 = $this->getIdVisit(1); - $visit2 = $this->getIdVisit(2); - - $this->assertNotEmpty($visit1); - $this->assertEquals(1, $visit1['idsite']); - $this->assertNotEmpty($visit2); - $this->assertEquals(2, $visit2['idsite']); - - $this->assertEmpty($this->getIdVisit(3)); - } - - public function testMainShouldReportInvalidIndicesIfInvalidRequestsIncludedAndRequestAuthenticated() - { - $this->injectRawDataToBulk($this->getDummyRequest($token = Fixture::getTokenAuth(), $idSite = array(1, -100))); - - $handler = $this->getHandler(); - $handler->setResponse(new Response()); - - $response = $this->tracker->main($handler, $this->getEmptyRequestSet()); - - $this->assertEquals('{"status":"success","tracked":1,"invalid":1,"invalid_indices":[1]}', $response); - } - - public function testMainShouldReportInvalidCountIfInvalidRequestsIncludedAndRequestNotAuthenticated() - { - $this->injectRawDataToBulk($this->getDummyRequest($token = null, $idSite = array(1, -100))); - - $handler = $this->getHandler(); - $handler->setResponse(new Response()); - - $response = $this->tracker->main($handler, $this->getEmptyRequestSet()); - - $this->assertEquals('{"status":"success","tracked":1,"invalid":1}', $response); - } - - private function getHandler() - { - return Tracker\Handler\Factory::make(); - } - - private function getEmptyRequestSet() - { - return new Tracker\RequestSet(); - } - - private function getIdVisit($idVisit) - { - return Tracker::getDatabase()->fetchRow("SELECT * FROM " . Common::prefixTable('log_visit') . " WHERE idvisit = ?", array($idVisit)); - } - - protected static function configureFixture($fixture) - { - parent::configureFixture($fixture); - - $fixture->createSuperUser = true; - } -} diff --git a/plugins/BulkTracking/tests/Mock/TrackerResponse.php b/plugins/BulkTracking/tests/Mock/TrackerResponse.php deleted file mode 100644 index 902b9049c15022cfc360d29bfaf2869844a8e8c1..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Mock/TrackerResponse.php +++ /dev/null @@ -1,32 +0,0 @@ -invalidRequests = $invalidRequests; - } - - public function setIsAuthenticated($isAuthenticated) - { - $this->isAuthenticated = $isAuthenticated; - } -} diff --git a/plugins/BulkTracking/tests/System/TrackerTest.php b/plugins/BulkTracking/tests/System/TrackerTest.php deleted file mode 100644 index 296c6e0b4a689bf783526412ccc1974794a1045b..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/System/TrackerTest.php +++ /dev/null @@ -1,71 +0,0 @@ -tracker = Fixture::getTracker($idSite, $dateTime, $defaultInit = true); - $this->tracker->enableBulkTracking(); - } - - public function testResponseShouldContainBulkTrackingApiResponse() - { - $this->tracker->doTrackPageView('Test'); - $this->tracker->doTrackPageView('Test'); - - // test skipping invalid site errors - $this->tracker->setIdSite(5); - $this->tracker->doTrackPageView('Test'); - - $this->tracker->setIdSite(1); - $this->tracker->doTrackPageView('Test'); - - // test skipping invalid request parameter errors - $this->tracker->setDebugStringAppend('cid=abc'); - $this->tracker->doTrackPageView('Test'); - - $this->tracker->DEBUG_APPEND_URL = ''; - - // another invalid one to further test the invalid request indices in the result - $this->tracker->setIdSite(7); - $this->tracker->doTrackPageView('Test'); - - $response = $this->tracker->doBulkTrack(); - - $this->assertEquals('{"status":"success","tracked":3,"invalid":3,"invalid_indices":[2,4,5]}', $response); - } -} diff --git a/plugins/BulkTracking/tests/Unit/RequestsTest.php b/plugins/BulkTracking/tests/Unit/RequestsTest.php deleted file mode 100644 index 8c2b4c33f2fa37bf075783eaf21d579b23b7f203..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Unit/RequestsTest.php +++ /dev/null @@ -1,171 +0,0 @@ -requests = new Requests(); - } - - public function testIsUsingBulkRequestShouldReturnFalseIfRequestIsEmpty() - { - $this->assertFalse($this->requests->isUsingBulkRequest(false)); - $this->assertFalse($this->requests->isUsingBulkRequest(null)); - $this->assertFalse($this->requests->isUsingBulkRequest('')); - $this->assertFalse($this->requests->isUsingBulkRequest(0)); - } - - public function testIsUsingBulkRequestShouldReturnFalseIfRequestIsNotABulkRequest() - { - $this->assertFalse($this->requests->isUsingBulkRequest(5)); - $this->assertFalse($this->requests->isUsingBulkRequest('test')); - $this->assertFalse($this->requests->isUsingBulkRequest('requests')); - $this->assertFalse($this->requests->isUsingBulkRequest('{"test": "val", "request:" []}')); - $this->assertFalse($this->requests->isUsingBulkRequest('[5, 10, "request"]')); - } - - public function testIsUsingBulkRequestShouldReturnTrueIfRequestIsABulkRequest() - { - $request = $this->buildRequestRawData(array(array('idsite' => '1'))); - $this->assertTrue($this->requests->isUsingBulkRequest($request)); - - // don't know why this one is supposed to count as bulk request! - $this->assertTrue($this->requests->isUsingBulkRequest("{'requests'")); - } - - public function testGetRequestsArrayFromBulkRequestShouldFindRequestsAndEmptyTokenAndItShouldTrimWhitespaceFromRawData() - { - $requests = array(array('idsite' => '1'), array('idsite' => '2')); - $request = $this->buildRequestRawData($requests); - - $result = $this->requests->getRequestsArrayFromBulkRequest(' ' . $request . ' '); - - $expected = array(array(array('idsite' => '1'), array('idsite' => '2')), ''); - $this->assertEquals($expected, $result); - } - - public function testGetRequestsArrayFromBulkRequestShouldRecognize() - { - $token = md5('2'); - - $request = $this->buildRequestRawData(array(), $token); - $result = $this->requests->getRequestsArrayFromBulkRequest($request); - - $expected = array(array(), $token); - $this->assertEquals($expected, $result); - } - - public function testInitRequestsAndTokenAuthNoRequestsSetShouldStillFindToken() - { - $token = md5('2'); - - $request = json_encode(array('requests' => array(), 'token_auth' => $token)); - $result = $this->requests->initRequestsAndTokenAuth($request); - - $expected = array(array(), $token); - $this->assertEquals($expected, $result); - } - - public function testInitRequestsAndTokenAuthShouldFindRequestsAndEmptyToken() - { - $params = array(array('idsite' => '1'), array('idsite' => '2')); - $request = $this->buildRequestRawData($params); - - $result = $this->requests->initRequestsAndTokenAuth($request); - - /** @var Request[] $requests */ - $requests = $result[0]; - $tokenAuth = $result[1]; - - $this->assertEquals('', $tokenAuth); // none was set - - $this->assertEquals(array('idsite' => '1'), $requests[0]->getParams()); - $this->assertEquals('', $requests[0]->getTokenAuth()); - $this->assertEquals(array('idsite' => '2'), $requests[1]->getParams()); - $this->assertEquals('', $requests[1]->getTokenAuth()); - $this->assertCount(2, $requests); - } - - public function testInitRequestsAndTokenAuthShouldFindRequestsAndASetTokenAndPassItToRequestInstances() - { - $token = md5(2); - $params = array(array('idsite' => '1'), array('idsite' => '2')); - $request = $this->buildRequestRawData($params, $token); - - $result = $this->requests->initRequestsAndTokenAuth($request); - - /** @var Request[] $requests */ - $requests = $result[0]; - - $this->assertEquals($token, $result[1]); - $this->assertEquals($token, $requests[0]->getTokenAuth()); - $this->assertEquals($token, $requests[1]->getTokenAuth()); - } - - public function testInitRequestsAndTokenAuthShouldIgnoreEmptyUrls() - { - $token = md5(2); - $params = array(array('idsite' => '1'), '', array('idsite' => '2')); - $request = $this->buildRequestRawData($params, $token); - - $result = $this->requests->initRequestsAndTokenAuth($request); - - /** @var Request[] $requests */ - $requests = $result[0]; - - $this->assertEquals(array('idsite' => '1'), $requests[0]->getParams()); - $this->assertEquals(array('idsite' => '2'), $requests[1]->getParams()); - $this->assertCount(2, $requests); - } - - public function testInitRequestsAndTokenAuthShouldResolveUrls() - { - $token = md5(2); - $params = array('piwik.php?idsite=1', '', 'piwik.php?idsite=3&rec=0', array('idsite' => '2')); - $request = $this->buildRequestRawData($params, $token); - - $result = $this->requests->initRequestsAndTokenAuth($request); - - /** @var Request[] $requests */ - $requests = $result[0]; - - $this->assertEquals(array('idsite' => '1'), $requests[0]->getParams()); - $this->assertEquals(array('idsite' => '3', 'rec' => '0'), $requests[1]->getParams()); - $this->assertEquals(array('idsite' => '2'), $requests[2]->getParams()); - $this->assertCount(3, $requests); - } - - private function buildRequestRawData($requests, $token = null) - { - $params = array('requests' => $requests); - - if (!empty($token)) { - $params['token_auth'] = $token; - } - - return json_encode($params); - } -} diff --git a/plugins/BulkTracking/tests/Unit/ResponseTest.php b/plugins/BulkTracking/tests/Unit/ResponseTest.php deleted file mode 100644 index a306c1f2e2b91dca7baccd1b3029b8f7599ed9d6..0000000000000000000000000000000000000000 --- a/plugins/BulkTracking/tests/Unit/ResponseTest.php +++ /dev/null @@ -1,121 +0,0 @@ -onlyMethods(['logExceptionToErrorLog']); - $this->response = $mock->getMock(); - $this->response->init(new Tracker()); - } - - public function testOutputExceptionShouldOutputBulkResponse() - { - $tracker = $this->getTrackerWithCountedRequests(); - - $this->response->outputException($tracker, new Exception('My Custom Message'), 400); - $content = $this->response->getOutput(); - - $this->assertEquals('{"status":"error","tracked":5,"invalid":0}', $content); - } - - public function testOutputExceptionShouldOutputDebugMessageIfEnabled() - { - $tracker = $this->getTrackerWithCountedRequests(); - $tracker->enableDebugMode(); - - $this->response->outputException($tracker, new Exception('My Custom Message'), 400); - $content = $this->response->getOutput(); - - $this->assertStringStartsWith('{"status":"error","tracked":5,"invalid":0,"message":"My Custom Message\n', $content); - } - - public function testOutputResponseShouldOutputBulkResponse() - { - $tracker = $this->getTrackerWithCountedRequests(); - - $this->response->outputResponse($tracker); - $content = $this->response->getOutput(); - - $this->assertEquals('{"status":"success","tracked":5,"invalid":0}', $content); - } - - public function testOutputResponseShouldNotOutputAnythingIfExceptionResponseAlreadySent() - { - $tracker = $this->getTrackerWithCountedRequests(); - - $this->response->outputException($tracker, new Exception('My Custom Message'), 400); - $this->response->outputResponse($tracker); - $content = $this->response->getOutput(); - - $this->assertEquals('{"status":"error","tracked":5,"invalid":0}', $content); - } - - public function testOutputResponseShouldIncludeInvalidIndicesIfExceptionSetAndRequestAuthenticated() - { - $tracker = $this->getTrackerWithCountedRequests(); - - $this->response->setInvalidRequests(array(10, 20)); - $this->response->setIsAuthenticated(true); - $this->response->outputException($tracker, new Exception('My Custom Message'), 400); - $content = $this->response->getOutput(); - - $this->assertEquals('{"status":"error","tracked":5,"invalid":2,"invalid_indices":[10,20]}', $content); - } - - public function testOutputResponseShouldOutputInvalidRequestsIfInvalidIndicesSetAndRequestNotAuthenticated() - { - $tracker = $this->getTrackerWithCountedRequests(); - - $this->response->setInvalidRequests(array(5, 63, 72)); - $this->response->outputResponse($tracker); - $content = $this->response->getOutput(); - - $this->assertEquals('{"status":"success","tracked":5,"invalid":3}', $content); - } - - public function testOutputResponseShouldOutputInvalidRequestsIfInvalidIndicesSetAndRequestAuthenticated() - { - $tracker = $this->getTrackerWithCountedRequests(); - - $this->response->setInvalidRequests(array(5, 63, 72)); - $this->response->setIsAuthenticated(true); - $this->response->outputResponse($tracker); - $content = $this->response->getOutput(); - - $this->assertEquals('{"status":"success","tracked":5,"invalid":3,"invalid_indices":[5,63,72]}', $content); - } - - private function getTrackerWithCountedRequests() - { - $tracker = new Tracker(); - $tracker->setCountOfLoggedRequests(5); - return $tracker; - } -} diff --git a/plugins/Contents/.gitignore b/plugins/Contents/.gitignore deleted file mode 100644 index c8c9480010db494b8cf54ca8f9561e7a14ff51ea..0000000000000000000000000000000000000000 --- a/plugins/Contents/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tests/System/processed/*xml \ No newline at end of file diff --git a/plugins/Contents/API.php b/plugins/Contents/API.php deleted file mode 100644 index 8bf7f9864bea67839b446e1b3ceadbcfdc9bacc6..0000000000000000000000000000000000000000 --- a/plugins/Contents/API.php +++ /dev/null @@ -1,114 +0,0 @@ -getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $idSubtable); - } - - /** - * Returns content tracking metrics grouped by content piece. - * - * @param int|string|int[] $idSite Website ID(s) to query. - * - Single site ID (e.g. 1) - * - Multiple site IDs (e.g. [1, 4, 5]) - * - Comma-separated list ("1,4,5") or "all" - * @param 'day'|'week'|'month'|'year'|'range' $period The period to process, processes data for the period - * containing the specified date. - * @param string $date The date or date range to process. - * 'YYYY-MM-DD', magic keywords (today, yesterday, lastWeek, lastMonth, lastYear), - * or date range (ie, 'YYYY-MM-DD,YYYY-MM-DD', lastX, previousX). - * @param string|null|false $segment Custom segment to filter the report. - * Example: "referrerName==example.com" - * Supports AND (;) and OR (,) operators. - * @param int|null|false $idSubtable Subtable ID to fetch instead of the top-level report. - * When provided, returns the content names for the selected content piece row. - * @return DataTable|DataTable\Map Content piece rows with impressions, interactions, and interaction rate for the - * requested site and period. - */ - public function getContentPieces($idSite, string $period, string $date, $segment = false, $idSubtable = false) - { - return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $idSubtable); - } - - /** - * @param int|string|int[] $idSite - * @param string|null|false $segment - * @param int|null|false $idSubtable - * @return DataTable|DataTable\Map - */ - private function getDataTable(string $name, $idSite, string $period, string $date, $segment, $idSubtable) - { - Piwik::checkUserHasViewAccess($idSite); - $recordName = Dimensions::getRecordNameForAction($name); - $dataTable = Archive::createDataTableFromArchive($recordName, $idSite, $period, $date, $segment, false, false, $idSubtable); - - if (empty($idSubtable)) { - $dataTable->filter('AddSegmentValue', array(function ($label) { - if ($label === Archiver::CONTENT_PIECE_NOT_SET) { - return false; - } - - return $label; - })); - } - - $this->filterDataTable($dataTable); - return $dataTable; - } - - /** - * @param DataTable|DataTable\Map $dataTable - */ - private function filterDataTable($dataTable): void - { - $dataTable->queueFilter('ReplaceColumnNames'); - $dataTable->queueFilter('ReplaceSummaryRowLabel'); - $dataTable->filter(function (DataTable $table) { - $row = $table->getRowFromLabel(Archiver::CONTENT_PIECE_NOT_SET); - if ($row) { - $row->setColumn('label', Piwik::translate('General_NotDefined', Piwik::translate('Contents_ContentPiece'))); - } - }); - } -} diff --git a/plugins/Contents/Actions/ActionContent.php b/plugins/Contents/Actions/ActionContent.php deleted file mode 100644 index a483fc00372b93dd7faa336c4772862a0bbbfb58..0000000000000000000000000000000000000000 --- a/plugins/Contents/Actions/ActionContent.php +++ /dev/null @@ -1,41 +0,0 @@ -getParam('url'); - $this->setActionUrl($url); - } - - public static function shouldHandle(Request $request) - { - $name = $request->getParam('c_n'); - - return !empty($name); - } - - protected function getActionsToLookup() - { - return array( - 'idaction_url' => array($this->getActionUrl(), $this->getActionType()), - ); - } -} diff --git a/plugins/Contents/Archiver.php b/plugins/Contents/Archiver.php deleted file mode 100644 index 8746c71e9c59b9e9262caac6e50e75474132e156..0000000000000000000000000000000000000000 --- a/plugins/Contents/Archiver.php +++ /dev/null @@ -1,21 +0,0 @@ -' . Piwik::translate('Contents_ContentsSubcategoryHelp1') . '

' - . '

' . Url::getExternalLinkTag('https://matomo.org/docs/content-tracking', null, null, 'App.Contents.getContentNames') - . Piwik::translate('Contents_ContentsSubcategoryHelp2') . '

'; - } -} diff --git a/plugins/Contents/Columns/ContentInteraction.php b/plugins/Contents/Columns/ContentInteraction.php deleted file mode 100644 index a39c8f74396fc6cf3f4a46faa84777ceb35963ed..0000000000000000000000000000000000000000 --- a/plugins/Contents/Columns/ContentInteraction.php +++ /dev/null @@ -1,62 +0,0 @@ -getActionId()); - } - - public function getActionId() - { - return Action::TYPE_CONTENT_INTERACTION; - } - - public function onLookupAction(Request $request, Action $action) - { - if (!($action instanceof ActionContent)) { - return false; - } - - $interaction = $request->getParam('c_i'); - $interaction = trim($interaction); - - if (strlen($interaction) > 0) { - return $interaction; - } - - return false; - } -} diff --git a/plugins/Contents/Columns/ContentName.php b/plugins/Contents/Columns/ContentName.php deleted file mode 100644 index a7ec570624361fc117c8945d4b2bc0aba35ac0d5..0000000000000000000000000000000000000000 --- a/plugins/Contents/Columns/ContentName.php +++ /dev/null @@ -1,64 +0,0 @@ -getActionId()); - } - - public function getActionId() - { - return Action::TYPE_CONTENT_NAME; - } - - public function onLookupAction(Request $request, Action $action) - { - if (!($action instanceof ActionContent)) { - return false; - } - - $contentName = $request->getParam('c_n'); - $contentName = trim($contentName); - - if (strlen($contentName) > 0) { - return $contentName; - } - - throw new InvalidRequestParameterException('Param `c_n` must not be empty or filled with whitespaces'); - } -} diff --git a/plugins/Contents/Columns/ContentPiece.php b/plugins/Contents/Columns/ContentPiece.php deleted file mode 100644 index 02e63b9b6c01b86d3e39d52653c9cdd80fadf288..0000000000000000000000000000000000000000 --- a/plugins/Contents/Columns/ContentPiece.php +++ /dev/null @@ -1,63 +0,0 @@ -getActionId()); - } - - public function getActionId() - { - return Action::TYPE_CONTENT_PIECE; - } - - public function onLookupAction(Request $request, Action $action) - { - if (!($action instanceof ActionContent)) { - return false; - } - - $contentPiece = $request->getParam('c_p'); - $contentPiece = trim($contentPiece); - - if (strlen($contentPiece) > 0) { - return $contentPiece; - } - - return false; - } -} diff --git a/plugins/Contents/Columns/ContentTarget.php b/plugins/Contents/Columns/ContentTarget.php deleted file mode 100644 index 7b1ec82291f80b7aa9b1a332c46dc94ffb0c0c47..0000000000000000000000000000000000000000 --- a/plugins/Contents/Columns/ContentTarget.php +++ /dev/null @@ -1,62 +0,0 @@ -getActionId()); - } - - public function getActionId() - { - return Action::TYPE_CONTENT_TARGET; - } - - public function onLookupAction(Request $request, Action $action) - { - if (!($action instanceof ActionContent)) { - return false; - } - - $contentTarget = $request->getParam('c_t'); - $contentTarget = trim($contentTarget); - - if (strlen($contentTarget) > 0) { - return $contentTarget; - } - - return false; - } -} diff --git a/plugins/Contents/Columns/Metrics/InteractionRate.php b/plugins/Contents/Columns/Metrics/InteractionRate.php deleted file mode 100644 index 23afc36c9db41f1afb47644aeddf38f585bcbdcb..0000000000000000000000000000000000000000 --- a/plugins/Contents/Columns/Metrics/InteractionRate.php +++ /dev/null @@ -1,64 +0,0 @@ -getMetric($row, 'nb_interactions'); - $impressions = $this->getMetric($row, 'nb_impressions'); - - return Piwik::getQuotientSafe($interactions, $impressions, $precision = 4); - } - - public function format($value, Formatter $formatter) - { - return $formatter->getPrettyPercentFromQuotient($value); - } - - public function getDependentMetrics() - { - return array('nb_interactions', 'nb_impressions'); - } - - public function getSemanticType(): ?string - { - return Dimension::TYPE_PERCENT; - } -} diff --git a/plugins/Contents/Contents.php b/plugins/Contents/Contents.php deleted file mode 100644 index 53f6135ea4ab292b36f9b601ac7bc398fdc9cdcb..0000000000000000000000000000000000000000 --- a/plugins/Contents/Contents.php +++ /dev/null @@ -1,71 +0,0 @@ - 'addMetricTranslations', - 'Metrics.getDefaultMetricDocumentationTranslations' => 'addMetricDocumentationTranslations', - 'Metrics.getDefaultMetricSemanticTypes' => 'addMetricSemanticTypes', - 'AssetManager.getJavaScriptFiles' => 'getJsFiles', - 'Actions.getCustomActionDimensionFieldsAndJoins' => 'provideActionDimensionFields', - ); - } - - public function addMetricTranslations(&$translations) - { - $translations['nb_impressions'] = 'Contents_Impressions'; - $translations['nb_interactions'] = 'Contents_ContentInteractions'; - $translations['interaction_rate'] = 'Contents_InteractionRate'; - } - - public function addMetricSemanticTypes(array &$types): void - { - $types['nb_impressions'] = Dimension::TYPE_NUMBER; - $types['nb_interactions'] = Dimension::TYPE_NUMBER; - } - - public function getJsFiles(&$jsFiles) - { - $jsFiles[] = "plugins/Contents/javascripts/contentsDataTable.js"; - } - - public function addMetricDocumentationTranslations(&$translations) - { - $translations['nb_impressions'] = Piwik::translate('Contents_ImpressionsMetricDocumentation'); - $translations['nb_interactions'] = Piwik::translate('Contents_InteractionsMetricDocumentation'); - } - - public function provideActionDimensionFields(&$fields, &$joins) - { - $fields[] = 'log_action_content_name.name as contentName'; - $fields[] = 'log_action_content_piece.name as contentPiece'; - $fields[] = 'log_action_content_target.name as contentTarget'; - $fields[] = 'log_action_content_interaction.name as contentInteraction'; - $joins[] = 'LEFT JOIN ' . Common::prefixTable('log_action') . ' AS log_action_content_name - ON log_link_visit_action.idaction_content_name = log_action_content_name.idaction'; - $joins[] = 'LEFT JOIN ' . Common::prefixTable('log_action') . ' AS log_action_content_piece - ON log_link_visit_action.idaction_content_piece = log_action_content_piece.idaction'; - $joins[] = 'LEFT JOIN ' . Common::prefixTable('log_action') . ' AS log_action_content_target - ON log_link_visit_action.idaction_content_target = log_action_content_target.idaction'; - $joins[] = 'LEFT JOIN ' . Common::prefixTable('log_action') . ' AS log_action_content_interaction - ON log_link_visit_action.idaction_content_interaction = log_action_content_interaction.idaction'; - } -} diff --git a/plugins/Contents/Dimensions.php b/plugins/Contents/Dimensions.php deleted file mode 100644 index 28bff423bcfe1f617d32a57c9ad2c68d5325cb9b..0000000000000000000000000000000000000000 --- a/plugins/Contents/Dimensions.php +++ /dev/null @@ -1,33 +0,0 @@ - Archiver::CONTENTS_NAME_PIECE_RECORD_NAME, - 'getContentPieces' => Archiver::CONTENTS_PIECE_NAME_RECORD_NAME, - ); - - return $apiToRecord[$apiMethod]; - } - - public static function getSubtableLabelForApiMethod($apiMethod) - { - $labelToMethod = array( - 'getContentNames' => 'Contents_ContentPiece', - 'getContentPieces' => 'Contents_ContentName', - ); - - return $labelToMethod[$apiMethod]; - } -} diff --git a/plugins/Contents/RecordBuilders/ContentRecords.php b/plugins/Contents/RecordBuilders/ContentRecords.php deleted file mode 100644 index 530b2bf81b797fb0c97e0521133dd7ef1e262126..0000000000000000000000000000000000000000 --- a/plugins/Contents/RecordBuilders/ContentRecords.php +++ /dev/null @@ -1,273 +0,0 @@ -columnToSortByBeforeTruncation = Metrics::INDEX_NB_VISITS; - $this->maxRowsInTable = ArchivingHelper::$maximumRowsInDataTableLevelZero; - $this->maxRowsInSubtable = ArchivingHelper::$maximumRowsInSubDataTable; - } - - public function getRecordMetadata(ArchiveProcessor $archiveProcessor): array - { - return [ - Record::make(Record::TYPE_BLOB, Archiver::CONTENTS_NAME_PIECE_RECORD_NAME), - Record::make(Record::TYPE_BLOB, Archiver::CONTENTS_PIECE_NAME_RECORD_NAME), - ]; - } - - protected function aggregate(ArchiveProcessor $archiveProcessor): array - { - $reports = [ - Archiver::CONTENTS_PIECE_NAME_RECORD_NAME => new DataTable(), - Archiver::CONTENTS_NAME_PIECE_RECORD_NAME => new DataTable(), - ]; - - $logAggregator = $archiveProcessor->getLogAggregator(); - - $this->aggregateDayImpressions($reports, $logAggregator); - $this->aggregateDayInteractions($reports, $logAggregator); - - return $reports; - } - - - private function aggregateDayImpressions(array $reports, LogAggregator $logAggregator): void - { - $select = " - log_action_content_piece.name as contentPiece, - log_action_content_name.name as contentName, - - count(distinct log_link_visit_action.idvisit) as `" . Metrics::INDEX_NB_VISITS . "`, - count(distinct log_link_visit_action.idvisitor) as `" . Metrics::INDEX_NB_UNIQ_VISITORS . "`, - count(*) as `" . Metrics::INDEX_CONTENT_NB_IMPRESSIONS . "` - "; - - $from = array( - "log_link_visit_action", - array( - "table" => "log_action", - "tableAlias" => "log_action_content_piece", - "joinOn" => "log_link_visit_action.idaction_content_piece = log_action_content_piece.idaction", - ), - array( - "table" => "log_action", - "tableAlias" => "log_action_content_target", - "joinOn" => "log_link_visit_action.idaction_content_target = log_action_content_target.idaction", - ), - array( - "table" => "log_action", - "tableAlias" => "log_action_content_name", - "joinOn" => "log_link_visit_action.idaction_content_name = log_action_content_name.idaction", - ), - ); - - $where = $logAggregator->getWhereStatement('log_link_visit_action', 'server_time'); - $where .= " AND log_link_visit_action.idaction_content_name IS NOT NULL - AND log_link_visit_action.idaction_content_interaction IS NULL"; - - $groupBy = "log_link_visit_action.idaction_content_piece, - log_link_visit_action.idaction_content_target, - log_link_visit_action.idaction_content_name"; - - $orderBy = "`" . Metrics::INDEX_NB_VISITS . "` DESC, `contentName`"; - - $rankingQueryLimit = ArchivingHelper::getRankingQueryLimit(); - $rankingQuery = null; - if ($rankingQueryLimit > 0) { - $rankingQuery = new RankingQuery($rankingQueryLimit); - $rankingQuery->addLabelColumn(array('contentPiece', 'contentName')); - $rankingQuery->addColumn(array(Metrics::INDEX_NB_UNIQ_VISITORS)); - $rankingQuery->addColumn(array(Metrics::INDEX_CONTENT_NB_IMPRESSIONS, Metrics::INDEX_NB_VISITS), 'sum'); - } - - $resultSet = $this->archiveDayQueryProcess($logAggregator, $select, $from, $where, $groupBy, $orderBy, $rankingQuery); - - while ($row = $resultSet->fetch()) { - $this->aggregateImpressionRow($reports, $row); - } - } - - private function aggregateDayInteractions(array $reports, LogAggregator $logAggregator): void - { - $select = " - log_action_content_name.name as contentName, - log_action_content_interaction.name as contentInteraction, - log_action_content_piece.name as contentPiece, - - count(*) as `" . Metrics::INDEX_CONTENT_NB_INTERACTIONS . "` - "; - - $from = array( - "log_link_visit_action", - array( - "table" => "log_action", - "tableAlias" => "log_action_content_piece", - "joinOn" => "log_link_visit_action.idaction_content_piece = log_action_content_piece.idaction", - ), - array( - "table" => "log_action", - "tableAlias" => "log_action_content_interaction", - "joinOn" => "log_link_visit_action.idaction_content_interaction = log_action_content_interaction.idaction", - ), - array( - "table" => "log_action", - "tableAlias" => "log_action_content_name", - "joinOn" => "log_link_visit_action.idaction_content_name = log_action_content_name.idaction", - ), - ); - - $where = $logAggregator->getWhereStatement('log_link_visit_action', 'server_time'); - $where .= " AND log_link_visit_action.idaction_content_name IS NOT NULL - AND log_link_visit_action.idaction_content_interaction IS NOT NULL"; - - $groupBy = "log_action_content_piece.idaction, - log_action_content_interaction.idaction, - log_action_content_name.idaction"; - - $orderBy = "`" . Metrics::INDEX_CONTENT_NB_INTERACTIONS . "` DESC"; - - $rankingQueryLimit = ArchivingHelper::getRankingQueryLimit(); - $rankingQuery = null; - if ($rankingQueryLimit > 0) { - $rankingQuery = new RankingQuery($rankingQueryLimit); - $rankingQuery->addLabelColumn(array('contentPiece', 'contentInteraction', 'contentName')); - $rankingQuery->addColumn(array(Metrics::INDEX_CONTENT_NB_INTERACTIONS), 'sum'); - } - - $resultSet = $this->archiveDayQueryProcess($logAggregator, $select, $from, $where, $groupBy, $orderBy, $rankingQuery); - - while ($row = $resultSet->fetch()) { - $this->aggregateInteractionRow($reports, $row); - } - } - - private function archiveDayQueryProcess( - LogAggregator $logAggregator, - string $select, - array $from, - string $where, - string $groupBy, - string $orderBy, - ?RankingQuery $rankingQuery = null - ) { - // get query with segmentation - $query = $logAggregator->generateQuery($select, $from, $where, $groupBy, $orderBy); - - // apply ranking query - if ($rankingQuery) { - $query['sql'] = $rankingQuery->generateRankingQuery($query['sql']); - } - - // get result - $resultSet = $logAggregator->getDb()->query($query['sql'], $query['bind']); - return $resultSet; - } - - - private function aggregateImpressionRow(array $reports, $row): void - { - foreach ($this->getRecordToDimensions() as $record => $dimensions) { - /** @var DataTable $table */ - $table = $reports[$record]; - - $mainDimension = $dimensions[0]; - $mainLabel = $row[$mainDimension]; - - $subDimension = $dimensions[1]; - $subLabel = $row[$subDimension]; - - $columns = [ - Metrics::INDEX_NB_UNIQ_VISITORS => $row[Metrics::INDEX_NB_UNIQ_VISITORS], - Metrics::INDEX_NB_VISITS => $row[Metrics::INDEX_NB_VISITS], - Metrics::INDEX_CONTENT_NB_IMPRESSIONS => $row[Metrics::INDEX_CONTENT_NB_IMPRESSIONS], - Metrics::INDEX_CONTENT_NB_INTERACTIONS => 0, - ]; - - // content piece is optional - if ( - $mainDimension == 'contentPiece' - && empty($mainLabel) - ) { - $mainLabel = Archiver::CONTENT_PIECE_NOT_SET; - } - - $topLevelRow = $table->sumRowWithLabel($mainLabel, $columns); - - if (empty($subLabel)) { - continue; - } - - // content piece is optional - if ( - $subDimension == 'contentPiece' - && empty($subLabel) - ) { - $subLabel = Archiver::CONTENT_PIECE_NOT_SET; - } - - $topLevelRow->sumRowWithLabelToSubtable($subLabel, $columns); - } - } - - private function aggregateInteractionRow(array $reports, array $row): void - { - foreach ($this->getRecordToDimensions() as $record => $dimensions) { - /** @var DataTable $table */ - $table = $reports[$record]; - - $mainDimension = $dimensions[0]; - $mainLabel = $row[$mainDimension]; - - $subDimension = $dimensions[1]; - $subLabel = $row[$subDimension]; - - $columns = [ - Metrics::INDEX_CONTENT_NB_INTERACTIONS => $row[Metrics::INDEX_CONTENT_NB_INTERACTIONS], - ]; - - // ignore interactions that do not have an impression - if (!$table->getRowFromLabel($mainLabel)) { - continue; - } - - $topLevelRow = $table->sumRowWithLabel($mainLabel, $columns); - - if (empty($subLabel)) { - continue; - } - - $topLevelRow->sumRowWithLabelToSubtable($subLabel, $columns); - } - } - - private function getRecordToDimensions(): array - { - return array( - Archiver::CONTENTS_PIECE_NAME_RECORD_NAME => array('contentPiece', 'contentName'), - Archiver::CONTENTS_NAME_PIECE_RECORD_NAME => array('contentName', 'contentPiece'), - ); - } -} diff --git a/plugins/Contents/Reports/Base.php b/plugins/Contents/Reports/Base.php deleted file mode 100644 index 586ea041a60cc1abc194a850f8abc47a18200fd3..0000000000000000000000000000000000000000 --- a/plugins/Contents/Reports/Base.php +++ /dev/null @@ -1,72 +0,0 @@ -categoryId = 'General_Actions'; - $this->subcategoryId = 'Contents_Contents'; - $this->onlineGuideUrl = Url::addCampaignParametersToMatomoLink('https://matomo.org/docs/content-tracking/'); - } - - public function configureWidgets(WidgetsList $widgetsList, ReportWidgetFactory $factory) - { - $widget = $factory->createWidget(); - - $widgetsList->addToContainerWidget('Contents', $widget); - } - - /** - * Here you can configure how your report should be displayed. For instance whether your report supports a search - * etc. You can also change the default request config. For instance change how many rows are displayed by default. - */ - public function configureView(ViewDataTable $view) - { - $view->config->datatable_js_type = 'ContentsDataTable'; - $view->config->datatable_css_class = 'ContentsDataTable'; - $view->config->show_table_all_columns = false; - - $view->config->columns_to_display = array_merge( - array('label'), - array_keys($this->getMetrics()), - array_keys($this->getProcessedMetrics()) - ); - - if (property_exists($view->config, 'selectable_columns')) { - $view->config->selectable_columns = $this->metrics; - } - - $view->requestConfig->filter_sort_column = 'nb_impressions'; - - if ($this->hasSubtableId()) { - $apiMethod = $view->requestConfig->getApiMethodToRequest(); - $label = Dimensions::getSubtableLabelForApiMethod($apiMethod); - $view->config->addTranslation('label', Piwik::translate($label)); - } - } - - private function hasSubtableId() - { - $subtable = Common::getRequestVar('idSubtable', false, 'integer'); - - return !empty($subtable); - } -} diff --git a/plugins/Contents/Reports/GetContentNames.php b/plugins/Contents/Reports/GetContentNames.php deleted file mode 100644 index b0559b7c8c3300970bd52465d84da89d24436bf2..0000000000000000000000000000000000000000 --- a/plugins/Contents/Reports/GetContentNames.php +++ /dev/null @@ -1,36 +0,0 @@ -name = Piwik::translate('Contents_ContentName'); - $this->documentation = Piwik::translate('Contents_ContentNameReportDocumentation'); - $this->dimension = new ContentName(); - $this->order = 35; - $this->actionToLoadSubTables = 'getContentNames'; - - $this->metrics = array('nb_impressions', 'nb_interactions'); - $this->processedMetrics = array(new InteractionRate()); - } -} diff --git a/plugins/Contents/Reports/GetContentPieces.php b/plugins/Contents/Reports/GetContentPieces.php deleted file mode 100644 index 42d28a85b07bdc77ef0d4bf68fe9c371cbdc51af..0000000000000000000000000000000000000000 --- a/plugins/Contents/Reports/GetContentPieces.php +++ /dev/null @@ -1,36 +0,0 @@ -name = Piwik::translate('Contents_ContentPiece'); - $this->documentation = Piwik::translate('Contents_ContentPieceReportDocumentation'); - $this->dimension = new ContentPiece(); - $this->order = 36; - $this->actionToLoadSubTables = 'getContentPieces'; - - $this->metrics = array('nb_impressions', 'nb_interactions'); - $this->processedMetrics = array(new InteractionRate()); - } -} diff --git a/plugins/Contents/VisitorDetails.php b/plugins/Contents/VisitorDetails.php deleted file mode 100644 index 882ec6006838f918f5f481eeb8e10c70db730e8e..0000000000000000000000000000000000000000 --- a/plugins/Contents/VisitorDetails.php +++ /dev/null @@ -1,53 +0,0 @@ -sendHeadersWhenRendering = false; - $view->action = $action; - $view->previousAction = $previousAction; - $view->visitInfo = $visitorDetails; - return $view->render(); - } - - public function renderActionTooltip($action, $visitInfo) - { - if (empty($action['type']) || $action['type'] != Action::TYPE_CONTENT) { - return []; - } - - $view = new View('@Contents/_actionTooltip'); - $view->sendHeadersWhenRendering = false; - $view->action = $action; - return [[ 10, $view->render() ]]; - } -} diff --git a/plugins/Contents/Widgets/ContentsByDimension.php b/plugins/Contents/Widgets/ContentsByDimension.php deleted file mode 100644 index 3d2858cd789c3bf6cb99c2fb69383bf425284746..0000000000000000000000000000000000000000 --- a/plugins/Contents/Widgets/ContentsByDimension.php +++ /dev/null @@ -1,21 +0,0 @@ - tbody > tr').each(function (index, tr) { - var $tr = $(tr); - var $td = $tr.find('.label .value'); - var text = $td.text().trim(); - - if (text.search('^https?:\/\/[^\/]+') !== -1) { - if (text.match(/(.jpg|.gif|.png|.svg)$/)) { - if (window.encodeURI) { - text = window.encodeURI(text); - } - $td.tooltip({ - track: true, - items: 'span', - content: '


' + text + '

', - tooltipClass: 'rowActionTooltip', - show: false, - hide: false - }); - } - } - }); - - } - }); - -})(jQuery, require); diff --git a/plugins/Contents/lang/am.json b/plugins/Contents/lang/am.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/am.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/ar.json b/plugins/Contents/lang/ar.json deleted file mode 100644 index 81753821e5237e58ee8c5f4a2e6e50fa469a7107..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ar.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Contents": { - "ContentPiece": "جزء من المحتوى", - "Contents": "عنوان المحتوى", - "Impressions": "طباعة", - "InteractionRate": "نسبة المشاركة" - } -} diff --git a/plugins/Contents/lang/az.json b/plugins/Contents/lang/az.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/az.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/be.json b/plugins/Contents/lang/be.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/be.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/bg.json b/plugins/Contents/lang/bg.json deleted file mode 100644 index 74b5a8e8fe0711edc7fd6591d9d8a9477bed7230..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/bg.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Импресия на съдържание", - "ContentInteraction": "Взаимодействие със съдържание", - "ContentInteractions": "Взаимодействия със съдържание", - "ContentName": "Име на съдържанието", - "ContentNameReportDocumentation": "Този отчет показва имената на съдържанието, което Вашите посетители са гледали и с което са взаимодействали.", - "ContentNames": "Имена на съдържанието", - "ContentPiece": "Част от съдържанието", - "ContentPieceReportDocumentation": "Този отчет показва частите от съдържанието, които Вашите посетители са разглеждали и с които са взаимодействали.", - "ContentPieces": "Части от съдържанието", - "ContentTarget": "Целево съдържание", - "ContentTargets": "Цели на съдържанието", - "Contents": "Съдържание", - "ContentsSubcategoryHelp1": "Проследяването на съдържанието Ви помага да определите популярността на конкретни части от съдържание на всяка страница от Вашия уебсайт или приложение. Този раздел отчита броя на импресиите и взаимодействията, които получават различните части от съдържанието на Вашия сайт.", - "ContentsSubcategoryHelp2": "Научете повече в ръководството за проследяване на съдържанието.", - "Impressions": "Импресии", - "ImpressionsMetricDocumentation": "Броят пъти, когато блок със съдържание, като банер или реклама, е бил показан на страница.", - "InteractionRate": "Честота на взаимодействие", - "InteractionRateMetricDocumentation": "Съотношението на импресиите в съдържанието към взаимодействията.", - "InteractionsMetricDocumentation": "Броят пъти, когато е имало взаимодействие с блок съдържание (напр. „кликване“ върху банер или реклама).", - "PluginDescription": "Проследяването на съдържание позволява измерването на преглеждания, кликове, CTR на който и да е елемент от Вашите страници (банери, реклами, картинки и т.н.)." - } -} diff --git a/plugins/Contents/lang/bn.json b/plugins/Contents/lang/bn.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/bn.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/bs.json b/plugins/Contents/lang/bs.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/bs.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/ca.json b/plugins/Contents/lang/ca.json deleted file mode 100644 index 6d72f8d970a54b1c76e0afd1d1db9f16bced7c05..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ca.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Impressions de contingut", - "ContentInteraction": "Interacció amb el contingut", - "ContentInteractionSegmentHelp": "El tipus d'interacció amb el contingut. Per exemple, \"clica\" o \"envia\".", - "ContentInteractions": "Interacció amb els continguts", - "ContentName": "Nom del contingut", - "ContentNameReportDocumentation": "Aquest informe mostra els noms del contingut que els vostres visitants han vist i amb el qual han interactuat.", - "ContentNameSegmentHelp": "El nom d'un bloc de contingut, per exemple \"Venda d'anuncis\"", - "ContentNames": "Noms del contingut", - "ContentPiece": "Element de contingut", - "ContentPieceReportDocumentation": "Aquest informe mostra els elements de contingut que els vostres visitants han vist i amb el qual han interactuat.", - "ContentPieceSegmentHelp": "El contingut real. Per exemple, \"ad.jpg\" o \"El meu anunci de text\"", - "ContentPieces": "Parts de contingut", - "ContentTarget": "Objectiu de contingut", - "ContentTargetSegmentHelp": "Per exemple, l'URL d'una pàgina d'arribada: \"http://landingpage.example.com\"", - "ContentTargets": "Objectius de contingut", - "Contents": "Continguts", - "ContentsSubcategoryHelp1": "El seguiment del contingut us ajuda a determinar la popularitat de contingut específic a qualsevol pàgina del vostre lloc web o aplicació. Aquesta secció informa del nombre d'impressions i interaccions que reben els diferents continguts del vostre lloc.", - "ContentsSubcategoryHelp2": "Més informació a la guia de seguiment de contingut.", - "Impressions": "Impressions", - "ImpressionsMetricDocumentation": "El nombre de vegades que s'ha mostrat un bloc de contingut, com ara un bàner o un anunci, en una pàgina.", - "InteractionRate": "Taxa d'interacció", - "InteractionRateMetricDocumentation": "La proporció entre impressions de contingut i interaccions.", - "InteractionsMetricDocumentation": "El nombre de vegades que s'ha interactuat amb un bloc de contingut (p. ex., un \"clic\" en un bàner o anunci).", - "PluginDescription": "El seguiment del contingut i dels bàners us permet mesurar el rendiment (visualitzacions, clics, CTR) de qualsevol contingut de les vostres pàgines (anunci de bàner, imatge, qualsevol element)." - } -} diff --git a/plugins/Contents/lang/cs.json b/plugins/Contents/lang/cs.json deleted file mode 100644 index efafe642f3e55c03cbff26eb21aa8ac08cdf3156..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/cs.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Zobrazení obsahu", - "ContentInteraction": "Interakce s obsahem", - "ContentInteractions": "Interakce s obsahem", - "ContentName": "Jméno obsahu", - "ContentNameReportDocumentation": "Tento přehled zobrazuje názvy obsahu, který si návštěvníci prohlíželi a se kterým pracovali.", - "ContentNames": "Názvy obsahu", - "ContentPiece": "Část obsahu", - "ContentPieceReportDocumentation": "Tento přehled zobrazuje části obsahu, které si návštěvníci prohlíželi a se kterými pracovali.", - "ContentPieces": "Části obsahu", - "ContentTarget": "Cíl obsahu", - "ContentTargets": "Cíle obsahu", - "Contents": "Obsah", - "ContentsSubcategoryHelp1": "Sledování obsahu vám pomůže určit popularitu konkrétních částí obsahu na kterékoli stránce vašeho webu nebo aplikace. V této části se zobrazuje počet zobrazení a interakcí, které jednotlivé části obsahu na vašem webu zaznamenávají.", - "ContentsSubcategoryHelp2": "Další informace najdete v příručce Sledování obsahu.", - "Impressions": "Zobrazení", - "ImpressionsMetricDocumentation": "Počet zobrazení banneru nebo reklamy na stránkách.", - "InteractionRate": "Rychlost interakcí", - "InteractionRateMetricDocumentation": "Poměr impresí obsahu k interakcím.", - "InteractionsMetricDocumentation": "Kolikrát bylo s blokem obsahu interagováno (t. j. kliknuto na banner nebo reklamu).", - "PluginDescription": "Sledování obsahu a bannerů vám umožňuje měřit výkon (zobrazení, kliknutí, CTR) libovolného obsahu na vašich stránkách (bannerová reklama, obrázek, libovolná položka)." - } -} diff --git a/plugins/Contents/lang/cy.json b/plugins/Contents/lang/cy.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/cy.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/da.json b/plugins/Contents/lang/da.json deleted file mode 100644 index 1ee7c7cb125f946431a44dc648404aa6e798b275..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/da.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Indholdsvisning", - "ContentInteraction": "Interaktion med indhold", - "ContentInteractions": "Interaktion med indhold", - "ContentName": "Indholdsnavn", - "ContentNames": "Indholdsnavne", - "ContentPiece": "Indholdsstykke", - "ContentPieces": "Indholdsstykker", - "ContentTarget": "Indholdsmål", - "ContentTargets": "Indholdsmål", - "Contents": "Indhold", - "Impressions": "Visninger", - "ImpressionsMetricDocumentation": "Antal gange et indhold, som f.eks. et banner eller en reklame er vist på en side.", - "InteractionRate": "Interaktionsfrekvens", - "InteractionRateMetricDocumentation": "Forholdet mellem indholdsvisninger til interaktioner.", - "InteractionsMetricDocumentation": "Antal gange der er blevet interageret på et indhold (f.eks. et klik på et banner eller en reklame).", - "PluginDescription": "Indhold og banner sporing gør dig i stand til at måle effektiviteten (besøg, klik, CTR) af ethvert indhold på dine sider (bannerreklamer, billeder, hvad som helst)." - } -} diff --git a/plugins/Contents/lang/de.json b/plugins/Contents/lang/de.json deleted file mode 100644 index 911e7609646c3de44d2e2afc2e386bedf6f62be8..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/de.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Inhaltsimpression", - "ContentInteraction": "Inhaltsinteraktion", - "ContentInteractionSegmentHelp": "Der Typ der Interaktion mit dem Inhalt. Zum Beispiel \"Klick\" oder \"Absenden\".", - "ContentInteractions": "Inhaltsinteraktionen", - "ContentName": "Inhaltsname", - "ContentNameReportDocumentation": "Dieser Bericht zeigt die Namen der Inhalte, welche Ihren Besuchern gezeigt wurden und mit denen sie interagiert haben.", - "ContentNameSegmentHelp": "Der Name eines inhaltlichen Blocks, zum Beispiel \"Verkaufsanzeige\"", - "ContentNames": "Inhaltnamen", - "ContentPiece": "Inhaltsteil", - "ContentPieceReportDocumentation": "Dieser Bericht zeigt die Inhaltsteile, welche Ihren Besuchern gezeigt wurden und mit denen sie interagiert haben.", - "ContentPieceSegmentHelp": "Der tatsächliche Inhalt. Zum Beispiel \"ad.jpg\" oder \"Meine Text Anzeige\"", - "ContentPieces": "Inhaltteile", - "ContentTarget": "Inhaltsziel", - "ContentTargetSegmentHelp": "Beispielsweise die URL einer Landingpage: \"http://landingpage.beispiel.de\"", - "ContentTargets": "Inhaltziele", - "Contents": "Inhalte", - "ContentsSubcategoryHelp1": "Content Tracking hilft Ihnen die Popularität spezifischer Inhalte ihrer einzelnen Seiten Ihrer Webseite oder App aufzuzeigen. Dieser Bereich zeigt die Anzahl der Impressionen und Interaktionen der verschiedenen Teile von Inhalten, die Ihre Seite enthält.", - "ContentsSubcategoryHelp2": "Weitere Informationen finden Sie in der Anleitung zur Erfassung von Inhalten.", - "Impressions": "Impressionen", - "ImpressionsMetricDocumentation": "Die Anzahl, wie häufig ein Inhalt, z.b. ein Banner oder eine Anzeige, auf der Seite angezeigt wurden.", - "InteractionRate": "Interaktionsrate", - "InteractionRateMetricDocumentation": "Verhältnis zwischen Impressionen des Inhalts und Interaktionen.", - "InteractionsMetricDocumentation": "Die Anzahl, wie häufig mit einem Inhalt interagiert wurde (z.B. durch einen Klick auf ein Banner oder eine Anzeige).", - "PluginDescription": "Content- und Banner-Tracking gibt Ihnen die Möglichkeit, die Performance (Ansichten, Klicks, CTR) von einem beliebigen Stück Content (Banner-Werbung, Bild, beliebiges Element) auf Ihrer Seite zu messen." - } -} diff --git a/plugins/Contents/lang/dv.json b/plugins/Contents/lang/dv.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/dv.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/el.json b/plugins/Contents/lang/el.json deleted file mode 100644 index f8a0ad5c5ae7c6cf1251e45cb322749da71058e6..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/el.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Αποτύπωμα Περιεχομένου", - "ContentInteraction": "Αλληλεπίδραση σε Περιεχόμενο", - "ContentInteractionSegmentHelp": "Ο τύπος αλληλεπίδρασης με το περιεχόμενο. Για παράδειγμα \"κλικ\" ή \"υποβολή\".", - "ContentInteractions": "Αλληλεπιδράσεις σε Περιεχόμενο", - "ContentName": "Όνομα Περιεχομένου", - "ContentNameReportDocumentation": "Αυτή η αναφορά δείχνει τα ονόματα του περιεχομένου που είδαν οι επισκέπτες σας και αλληλεπίδρασαν με αυτά.", - "ContentNameSegmentHelp": "Το όνομα του μπλοκ περιεχομένου, για παράδειγμα \"Ad Sale\"", - "ContentNames": "Ονόματα περιεχομένου", - "ContentPiece": "Κομμάτι Περιεχομένου", - "ContentPieceReportDocumentation": "Αυτή η αναφορά δείχνει τα τμήματα του περιεχομένου που είδαν οι επισκέπτες σας και αλληλεπίδρασαν με αυτά.", - "ContentPieceSegmentHelp": "Το πραγματικό περιεχόμενο. Για παράδειγμα, \"ad.jpg\" ή \"Η διαφήμισή μου σε κείμενο\"", - "ContentPieces": "Τεμάχια περιεχομένου", - "ContentTarget": "Στόχος Περιεχομένου", - "ContentTargetSegmentHelp": "Για παράδειγμα η διεύθυνση URL της σελίδας εισόδου: \"http://landingpage.example.com\"", - "ContentTargets": "Στόχοι περιεχομένου", - "Contents": "Περιεχόμενα", - "ContentsSubcategoryHelp1": "Η ιχνηλάτηση περιεχομένου σας βοηθά να βρίσκετε την δημοφιλία ορισμένων τμημάτων περιεχομένου σε οποιαδήποτε σελίδα του ιστοτόπου ή της εφαρμογής σας. Το τμήμα αυτό αναφέρει τον αριθμό των εμφανίσεων και αλληλεπιδράσεων που δέχονται τα διάφορα τμήματα περιεχομένου του ιστοτόπου σας.", - "ContentsSubcategoryHelp2": "Μάθετε περισσότερα σχετικά με τον οδηγό Ιχνηλάτησης Περιεχομένου.", - "Impressions": "Αποτυπώσεις", - "ImpressionsMetricDocumentation": "Ο αριθμός εμφανίσεων σε μια σελίδα ενός μπλοκ περιεχομένου, όπως μια εικόνα ή διαφήμιση.", - "InteractionRate": "Ρυθμός Αλληλεπίδρασης", - "InteractionRateMetricDocumentation": "Ο λόγος Εμφανίσεων περιεχομένου προς Αλληλεπιδράσεις.", - "InteractionsMetricDocumentation": "Ο αριθμός αλληλεπιδράσεων σε ένα μπλοκ περιεχομένου (πχ. ένα 'κλικ' σε μια εικόνα ή διαφήμιση).", - "PluginDescription": "Η παρακολούθηση περιεχομένου και εικόνων επιτρέπει να μετράτε την απόδοση (επισκέψεις, κλικ, CTR) οποιουδήποτε είδους περιεχομένου των σελίδων σας (εικόνες διαφημίσεων, εικόνες, οποιαδήποτε αντικείμενα)." - } -} diff --git a/plugins/Contents/lang/en.json b/plugins/Contents/lang/en.json deleted file mode 100644 index 6e387097361da4a3a29b0ec9b27780190b2e7298..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/en.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "PluginDescription": "Content and banner tracking lets you measure the performance (views, clicks, CTR) of any piece of content on your pages (Banner ad, image, any item).", - "Impressions": "Impressions", - "ContentImpression": "Content Impression", - "ContentInteraction": "Content Interaction", - "ContentInteractionSegmentHelp": "The type of interaction with the content. For instance \"click\" or \"submit\".", - "ContentInteractions": "Content Interactions", - "InteractionRate": "Interaction Rate", - "ContentName": "Content Name", - "ContentNameReportDocumentation": "This report shows the names of the content your visitors viewed and interacted with.", - "ContentNames": "Content Names", - "ContentNameSegmentHelp": "The name of a content block, for instance \"Ad Sale\"", - "ContentPiece": "Content Piece", - "ContentPieceSegmentHelp": "The actual content. For instance \"ad.jpg\" or \"My text ad\"", - "ContentPieceReportDocumentation": "This report shows the pieces of content your visitors viewed and interacted with.", - "ContentPieces": "Content Pieces", - "ContentTarget": "Content Target", - "ContentTargetSegmentHelp": "For instance the URL of a landing page: \"http://landingpage.example.com\"", - "ContentTargets": "Content Targets", - "Contents": "Contents", - "InteractionsMetricDocumentation": "The number of times a content block was interacted with (eg, a 'click' on a banner or ad).", - "ImpressionsMetricDocumentation": "The number of times a content block, such as a banner or an ad, was displayed on a page.", - "InteractionRateMetricDocumentation": "The ratio of content impressions to interactions.", - "ContentsSubcategoryHelp1": "Content tracking helps you determine the popularity of specific pieces of content on any page of your website or app. This section reports the number of impressions and interactions the various pieces of content on your site receive.", - "ContentsSubcategoryHelp2": "Learn more in the Content Tracking guide." - } -} \ No newline at end of file diff --git a/plugins/Contents/lang/eo.json b/plugins/Contents/lang/eo.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/eo.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/es-ar.json b/plugins/Contents/lang/es-ar.json deleted file mode 100644 index 4044134333e576b19b7cfd14a4b036e8cb72342e..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/es-ar.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Impresión de contenido", - "ContentInteraction": "Interacción de contenido", - "ContentInteractions": "Interacciones de contenido", - "ContentName": "Nombre del contenido", - "ContentNameReportDocumentation": "Este informe muestra los nombres del contenido que tus visitantes vieron e interactuaron.", - "ContentNames": "Nombres del contenido", - "ContentPiece": "Pieza del contenido", - "ContentPieceReportDocumentation": "Este informe muestra las piezas de contenido que tus visitantes vieron e interactuaron.", - "ContentPieces": "Piezas del contenido", - "ContentTarget": "Objetivo del contenido", - "ContentTargets": "Objetivos del contenido", - "Contents": "Contenidos", - "ContentsSubcategoryHelp1": "El rastreo de contenido te ayuda a determinar la popularidad de piezas específicas de contenido en cualquier página de tu sitio web o aplicación. Esta sección informa el número de impresiones e interacciones que las piezas de contenido de tu sitio web reciben.", - "ContentsSubcategoryHelp2": "Aprendé más en la guía de Rastreo de contenido.", - "Impressions": "Impresiones", - "ImpressionsMetricDocumentation": "El número de veces que un bloque de contenido, como un báner o una publicidad, fue mostrado en una página.", - "InteractionRate": "Tasa de interacción", - "InteractionRateMetricDocumentation": "La tasa entre las impresiones del contenido y las interacciones.", - "InteractionsMetricDocumentation": "El número de veces con que un bloque de contenido interactuó (por ejemplo, un clic en un báner o publicidad).", - "PluginDescription": "El seguimiento de báner y contenido te permite medir tu rendimiento (vistas, clics, etc) de cualquier pieza de contenido en tus páginas (publicidad en báner, imagen, cualquier elemento)." - } -} diff --git a/plugins/Contents/lang/es.json b/plugins/Contents/lang/es.json deleted file mode 100644 index 5cd8fbb07ba773a8aacd95a70dbf5a3e605b6bc6..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/es.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Impresiones de contenido", - "ContentInteraction": "Interacción con el contenido", - "ContentInteractions": "Interacciones con el contenido", - "ContentName": "Nombre del contenido", - "ContentNameReportDocumentation": "Este informe muestra los nombres del contenido que los visitantes vieron e interactuaron.", - "ContentNames": "Nombres de contenidos", - "ContentPiece": "Pieza de contenido", - "ContentPieceReportDocumentation": "Este informa muestra las piezas de contenido que los visitantes vieron e interactuaron.", - "ContentPieces": "Piezas de contenido", - "ContentTarget": "Objetivo del contenido", - "ContentTargets": "Objetivos de contenido", - "Contents": "Contenidos", - "ContentsSubcategoryHelp1": "El seguimiento del contenido ayuda a determinar la popularidad cada porción de contenido de cada web o aplicación. Esta sección informa de la cantidad de impresiones e interacciones que reciben a título individual.", - "ContentsSubcategoryHelp2": "Obtén más información en la guía del contenido.", - "Impressions": "Impresiones", - "ImpressionsMetricDocumentation": "El número de veces que un bloque de contenido, como un banner o un anuncio, fue mostrado en una página.", - "InteractionRate": "Nivel de interacción", - "InteractionRateMetricDocumentation": "La proporción de impresiones de contenido a interacciones.", - "InteractionsMetricDocumentation": "El número de veces que se interactuo con un bloque de contenido (ej, un 'clic' en un banner o anuncio).", - "PluginDescription": "El contenido y el monitoreo de anuncios le permite medir el rendimiento (visitas, clics, CTR) de cualquier pieza de contenido en sus páginas (anuncios publicitarios, imágenes, cualquier elemento)." - } -} diff --git a/plugins/Contents/lang/et.json b/plugins/Contents/lang/et.json deleted file mode 100644 index 2a9a8d1dc48e689c67d522b31c3de6a465e5e662..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/et.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Contents": { - "ContentName": "Sisu nimi", - "ContentPiece": "Sisu tükk", - "Contents": "Sisud", - "InteractionRate": "Koostoime mõju" - } -} diff --git a/plugins/Contents/lang/eu.json b/plugins/Contents/lang/eu.json deleted file mode 100644 index efcef316c154c21064c2da4771cb5d7dfc030cb2..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/eu.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Edukiaren inpresioa", - "ContentInteraction": "Edukiaren interakzioa", - "ContentInteractions": "Edukiaren interakzioak", - "ContentName": "Edukiaren izena", - "ContentNameReportDocumentation": "Txosten honek zure bisitariek ikusitako eta interakzioak izandako edukiaren izenak erakusten ditu.", - "ContentNames": "Edukien izenak", - "ContentPiece": "Eduki zatia", - "ContentPieceReportDocumentation": "Txosten honek zure bisitariek ikusitako eta interakzioak izandako eduki zatiak erakusten ditu.", - "ContentPieces": "Eduki zatiak", - "ContentTarget": "Edukiaren helburua", - "ContentTargets": "Edukien helburuak", - "Contents": "Edukiak", - "ContentsSubcategoryHelp1": "Edukien jarraipenak zure webgune edo aplikazioko edozein orritako eduki zati zehatzen arrakasta neurtzen laguntzen dizu. Txosten honek erakusten dizu zure guneko eduki zatiek zenbat inpresio eta interakzio izan dituzten.", - "ContentsSubcategoryHelp2": "Ikasi gehiago Edukiaren jarraipenari buruzko gidan.", - "Impressions": "Inpresioak", - "ImpressionsMetricDocumentation": "Eduki bloke bat, adibidez banner edo iragarki bat, zenbat aldiz bistaratu den orri batean.", - "InteractionRate": "Interakzio tasa", - "InteractionRateMetricDocumentation": "Inpresio eta interakzioen arteko proportzioa.", - "InteractionsMetricDocumentation": "Eduki bloke batek zenbat interakzio izan dituen. Adibidez, banner edo iragarki batean klik egitea.", - "PluginDescription": "Eduki eta bannerren jarraipenak aukera ematen dizu zure orrietako edozein zatiren (banner iragarkiak, irudiak, edozein elementu) errendimendua neurtzeko (ikustaldiak, klikak, CTR)." - } -} diff --git a/plugins/Contents/lang/fa.json b/plugins/Contents/lang/fa.json deleted file mode 100644 index 08ea6bead34faf2876004c4e6b90cef661bc0a44..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/fa.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Contents": { - "Contents": "محتوا" - } -} diff --git a/plugins/Contents/lang/fi.json b/plugins/Contents/lang/fi.json deleted file mode 100644 index dae280fe6d0365972e88258e52b606b861b5ca63..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/fi.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "Contents": { - "ContentInteraction": "Sisällön interaktio", - "ContentInteractions": "Sisällön interaktiot", - "ContentName": "Sisällön nimi", - "ContentNames": "Sisällön nimet", - "ContentPiece": "Sisällön osa", - "ContentPieces": "Sisällön osat", - "ContentTarget": "Sisällön kohde", - "ContentTargets": "Sisällön kohteet", - "Contents": "Sisällöt", - "Impressions": "Näkymät", - "InteractionRate": "Interaktioiden määrä" - } -} diff --git a/plugins/Contents/lang/fr.json b/plugins/Contents/lang/fr.json deleted file mode 100644 index 402b6de222a18702503686fe69dfb847269d7a99..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/fr.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Affichage du contenu", - "ContentInteraction": "Action du contenu", - "ContentInteractionSegmentHelp": "Le type d’interaction avec le contenu. Par exemple : “clic” ou “soumission”.", - "ContentInteractions": "Actions du contenu", - "ContentName": "Nom du contenu", - "ContentNameReportDocumentation": "Ce rapport indique les titres des contenus que vos visiteurs ont consultés et avec lesquels ils ont interagi.", - "ContentNameSegmentHelp": "Le nom d’un bloc de contenu, par exemple “Promotion publicitaire”", - "ContentNames": "Noms du contenu", - "ContentPiece": "Partie du contenu", - "ContentPieceReportDocumentation": "Ce rapport indique les éléments de contenu que vos visiteurs ont consultés et avec lesquels ils ont interagi.", - "ContentPieceSegmentHelp": "Le contenu réel. Par exemple : “ad.jpg” ou “Mon annonce texte”", - "ContentPieces": "Portions de contenu", - "ContentTarget": "Cible du contenu", - "ContentTargetSegmentHelp": "Par exemple, sur la page de destination : \"http://landingpage.example.com\"", - "ContentTargets": "Cibles de contenu", - "Contents": "Contenus", - "ContentsSubcategoryHelp1": "Le suivi du contenu vous aide à déterminer la popularité de certains éléments de contenu sur n'importe quelle page de votre site web ou application. Cette section rapporte le nombre d'impressions et d'interactions que les différents éléments de contenu de votre site reçoivent.", - "ContentsSubcategoryHelp2": "Pour en savoir plus, consultez le guide de suivi du contenu.", - "Impressions": "Impressions", - "ImpressionsMetricDocumentation": "Le nombre de fois qu'un bloc de contenu tel qu'une bannière ou une publicité a été affiché sur la page.", - "InteractionRate": "Taux d'interaction", - "InteractionRateMetricDocumentation": "Le ratio entre les impressions de contenu et les interactions.", - "InteractionsMetricDocumentation": "Nombre de fois où un bloc de contenu a subi une interaction (ex un click sur une bannière ou sur une publicité).", - "PluginDescription": "Le suivi de contenu et de bannière vous permet de mesurer la performance (vues, clics, CTR) de chaque partie du contenu de vos pages (bannière de pub, image, tout élément)." - } -} diff --git a/plugins/Contents/lang/ga.json b/plugins/Contents/lang/ga.json deleted file mode 100644 index 477378ef598f76c83b95593715141e17830fcd45..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ga.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Léiriú Ábhar", - "ContentInteraction": "Idirghníomhaíocht Ábhar", - "ContentInteractionSegmentHelp": "An cineál idirghníomhaíochta leis an ábhar. Mar shampla \"cliceáil\" nó \"cuir isteach\".", - "ContentInteractions": "Idirghníomhaíochtaí Ábhar", - "ContentName": "Ainm an Ábhair", - "ContentNameReportDocumentation": "Taispeánann an tuarascáil seo ainmneacha an ábhair ar fhéach do chuairteoirí air agus ar idirghníomhú leo.", - "ContentNameSegmentHelp": "Ainm bloc ábhair, mar shampla \"Díol Fógraí\"", - "ContentNames": "Ainmneacha Ábhar", - "ContentPiece": "Píosa Ábhar", - "ContentPieceReportDocumentation": "Léiríonn an tuarascáil seo na píosaí ábhair ar fhéach do chuairteoirí orthu agus ar idirghníomhú leo.", - "ContentPieceSegmentHelp": "An t-ábhar iarbhír. Mar shampla \"ad.jpg\" nó \"Mo fhógra téacs\"", - "ContentPieces": "Píosaí Ábhar", - "ContentTarget": "Sprioc Ábhar", - "ContentTargetSegmentHelp": "Mar shampla URL leathanaigh tuirlingthe: \"http://landingpage.example.com\"", - "ContentTargets": "Spriocanna Ábhar", - "Contents": "Clár ábhair", - "ContentsSubcategoryHelp1": "Cuidíonn rianú inneachair leat an tóir atá ar phíosaí sonracha ábhair ar aon leathanach de do shuíomh Gréasáin nó d’aip a chinneadh. Tuairiscíonn an chuid seo líon na n-imprisean agus na n-idirghníomhaíochtaí a fhaigheann na píosaí éagsúla ábhair ar do shuíomh.", - "ContentsSubcategoryHelp2": "Foghlaim tuilleadh sa treoir Rianú Ábhar.", - "Impressions": "Imprisean", - "ImpressionsMetricDocumentation": "An líon uaireanta a taispeánadh bloc ábhair, mar bhratach nó fógra, ar leathanach.", - "InteractionRate": "Ráta Idirghníomhaíochta", - "InteractionRateMetricDocumentation": "Cóimheas na n-imprisean ábhair agus na hidirghníomhaíochtaí.", - "InteractionsMetricDocumentation": "An líon uaireanta a rinneadh idirghníomhú le bloc ábhair (m.sh., ‘cliceáil’ ar bhratach nó ar fhógra).", - "PluginDescription": "Ligeann rianú ábhar agus meirgí duit feidhmíocht (amhairc, cad a tharlaíonn, CTR) aon phíosa inneachair ar do leathanaigh a thomhas (fógra Meirge, íomhá, aon mhír)." - } -} diff --git a/plugins/Contents/lang/gl.json b/plugins/Contents/lang/gl.json deleted file mode 100644 index 06e528be4e6c4c641511502c7318087c6b746b29..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/gl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Contents": { - "ContentName": "Nome do contido", - "Contents": "Contido", - "Impressions": "Impresións" - } -} diff --git a/plugins/Contents/lang/gu.json b/plugins/Contents/lang/gu.json deleted file mode 100644 index e1d9ec6a0d92e17a67c54b25061f0d317eb3c7a1..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/gu.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "સામગ્રી છાપ", - "ContentInteraction": "સામગ્રી ક્રિયાપ્રતિક્રિયા", - "ContentInteractions": "સામગ્રી ક્રિયાપ્રતિક્રિયાઓ", - "ContentName": "સામગ્રી નામ", - "ContentNameReportDocumentation": "આ રિપોર્ટ તમારા મુલાકાતીઓએ જોયેલી અને જેની સાથે ક્રિયાપ્રતિક્રિયા કરી હતી તે સામગ્રીના નામ બતાવે છે.", - "ContentNames": "સામગ્રી નામો", - "ContentPiece": "સામગ્રી ભાગ", - "ContentPieceReportDocumentation": "આ રિપોર્ટ તમારા મુલાકાતીઓએ જોયેલી અને તેની સાથે વાર્તાલાપ કરેલ સામગ્રીના ટુકડાઓ દર્શાવે છે.", - "ContentPieces": "સામગ્રી ટુકડાઓ", - "ContentTarget": "સામગ્રી લક્ષ્ય", - "ContentTargets": "સામગ્રી લક્ષ્યો", - "Contents": "સામગ્રી", - "ContentsSubcategoryHelp1": "સામગ્રી ટ્રેકિંગ તમને તમારી વેબસાઇટ અથવા એપ્લિકેશનના કોઈપણ પૃષ્ઠ પર સામગ્રીના ચોક્કસ ટુકડાઓની લોકપ્રિયતા નક્કી કરવામાં મદદ કરે છે. આ વિભાગ તમારી સાઇટ પર સામગ્રીના વિવિધ ભાગોને પ્રાપ્ત થતી છાપ અને ક્રિયાપ્રતિક્રિયાઓની સંખ્યાની જાણ કરે છે.", - "ContentsSubcategoryHelp2": "સામગ્રી ટ્રેકિંગ માર્ગદર્શિકામાં વધુ જાણો.", - "Impressions": "છાપ", - "ImpressionsMetricDocumentation": "પૃષ્ઠ પર બેનર અથવા જાહેરાત જેવી સામગ્રી બ્લોક કેટલી વખત પ્રદર્શિત કરવામાં આવી હતી.", - "InteractionRate": "ક્રિયાપ્રતિક્રિયા દર", - "InteractionRateMetricDocumentation": "ક્રિયાપ્રતિક્રિયાઓ અને સામગ્રીની છાપનો ગુણોત્તર.", - "InteractionsMetricDocumentation": "સામગ્રી બ્લોકની સાથે કેટલી વાર ક્રિયાપ્રતિક્રિયા કરવામાં આવી હતી (દા.ત., બેનર અથવા જાહેરાત પર 'ક્લિક').", - "PluginDescription": "સામગ્રી અને બેનર ટ્રેકિંગ તમને તમારા પૃષ્ઠો (બેનર જાહેરાત, છબી, કોઈપણ આઇટમ) પરની સામગ્રીના કોઈપણ ભાગનું પ્રદર્શન (વ્યુઝ, ક્લિક્સ, CTR) માપવા દે છે." - } -} diff --git a/plugins/Contents/lang/he.json b/plugins/Contents/lang/he.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/he.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/hi.json b/plugins/Contents/lang/hi.json deleted file mode 100644 index 95a93b6beeb0a42ea483ef1512cda23664e8deb3..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/hi.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "Contents": { - "ContentName": "सामग्री का नाम", - "ContentPiece": "सामग्री टुकड़ा", - "ContentTarget": "सामग्री को लक्षित", - "Contents": "अंतर्वस्तु", - "Impressions": "छापे", - "InteractionRate": "सहभागिता दर", - "PluginDescription": "सामग्री और बैनर पर नज़र रखने से आप किसी भी अपने पृष्ठों पर सामग्री का टुकड़ा (बैनर विज्ञापन, छवि, किसी भी आइटम) का प्रदर्शन (विचारों, क्लिक, CTR) को मापने की सुविधा देता है।" - } -} diff --git a/plugins/Contents/lang/hr.json b/plugins/Contents/lang/hr.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/hr.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/hu.json b/plugins/Contents/lang/hu.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/hu.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/hy.json b/plugins/Contents/lang/hy.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/hy.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/id.json b/plugins/Contents/lang/id.json deleted file mode 100644 index 00cfa20eae3eafcdf81aa54d47b16bfe3b1761c9..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/id.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Impresi Konten", - "ContentInteraction": "Interaksi Konten", - "ContentInteractions": "Interaksi Konten", - "ContentName": "Nama Konten", - "ContentNameReportDocumentation": "Laporan ini menunjukkan nama konten yang berinteraksi dengan pengunjung Anda dan yang dilihat oleh pengunjung Anda.", - "ContentNames": "Nama Konten", - "ContentPiece": "Potongan Konten", - "ContentPieceReportDocumentation": "Laporan ini menunjukkan bagian konten yang dilihat oleh pengunjung Anda dan yang berinteraksi dengan pengunjung Anda.", - "ContentPieces": "Potongan Konten", - "ContentTarget": "Target Konten", - "ContentTargets": "Target Konten", - "Contents": "Konten", - "ContentsSubcategoryHelp1": "Pelacakan konten membantu Anda dalam menentukan popularitas konten tertentu di halaman mana pun di situs web atau aplikasi Anda. Bagian ini melaporkan jumlah tayangan dan interaksi yang diterima berbagai konten di situs Anda.", - "ContentsSubcategoryHelp2": "Pelajari lebih lanjut di panduan Pelacakan Konten.", - "Impressions": "Impresi", - "ImpressionsMetricDocumentation": "Frekuensi blok konten, seperti spanduk atau iklan, ditampilkan di halaman.", - "InteractionRate": "Nilai Interaksi", - "InteractionRateMetricDocumentation": "Rasio impresi konten terhadap interaksi.", - "InteractionsMetricDocumentation": "Frekuensi interaksi blok konten (misalnya, 'klik' pada spanduk atau iklan).", - "PluginDescription": "Pelacakan konten dan spanduk memungkinkan Anda untuk mengukur kinerja (tampilan, klik, CTR) dari setiap konten di halaman Anda (Iklan spanduk, gambar, bentuk apa pun)." - } -} diff --git a/plugins/Contents/lang/is.json b/plugins/Contents/lang/is.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/is.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/it.json b/plugins/Contents/lang/it.json deleted file mode 100644 index 72e9c33daa33d394397241b101066002e0f2110c..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/it.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Impressioni Contenuto", - "ContentInteraction": "Interazione Contenuto", - "ContentInteractions": "Interazioni Contenuto", - "ContentName": "Nome Contenuto", - "ContentNameReportDocumentation": "Questo report mostra i nomi dei contenuti che i tuoi visitatori hanno visualizzato e con cui hanno interagito.", - "ContentNames": "Nomi Contenuto", - "ContentPiece": "Pezzo del Contenuto", - "ContentPieceReportDocumentation": "Questo report mostra i contenuti che i tuoi visitatori hanno visualizzato e con cui hanno interagito.", - "ContentPieces": "Pezzi Contenuto", - "ContentTarget": "Obiettivo del Contenuto", - "ContentTargets": "Target Contenuto", - "Contents": "Contenuti", - "ContentsSubcategoryHelp1": "Il monitoraggio dei contenuti ti aiuta a determinare la popolarità di parti specifiche di contenuto su qualsiasi pagina del tuo sito web o della tua app. Questa sezione riporta il numero di impressioni e interazioni ricevute dai vari contenuti del tuo sito.", - "ContentsSubcategoryHelp2": "Ulteriori informazioni nella guida al Monitoraggio dei Contenuti.", - "Impressions": "Impressioni", - "ImpressionsMetricDocumentation": "Numero di volte in cui un blocco di contenuto, come un banner o una inserzione, è stato mostrato in una pagina.", - "InteractionRate": "Rapporto di Interazioni", - "InteractionRateMetricDocumentation": "Rapporto tra impressioni contenuto e interazioni.", - "InteractionsMetricDocumentation": "Numero di volte in cui si è interagito con un blocco di contenuto (es. un 'click' su un banner o una inserzione).", - "PluginDescription": "Il tracciamento di contenuto e banner ti consente di misurare le prestazioni (visite, clicks, CTR) di ciascuna porzione di contenuto delle tue pagine (Banner ad, immagini, ogni elemento)." - } -} diff --git a/plugins/Contents/lang/ja.json b/plugins/Contents/lang/ja.json deleted file mode 100644 index ee4148cca6216e8e2a3387b1309693fee8c2883d..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ja.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "コンテンツインプレッション", - "ContentInteraction": "コンテンツインタラクション", - "ContentInteractions": "コンテンツインタラクション", - "ContentName": "コンテンツ名", - "ContentNameReportDocumentation": "このレポートでは、来客が閲覧し、相互作用したコンテンツの名前が表示されます。", - "ContentNames": "コンテンツ名", - "ContentPiece": "コンテンツ要素", - "ContentPieceReportDocumentation": "このレポートでは、来客が閲覧し、相互作用したコンテンツの断片が表示されます。", - "ContentPieces": "コンテンツ要素", - "ContentTarget": "コンテンツターゲット", - "ContentTargets": "コンテンツターゲット", - "Contents": "コンテンツ", - "ContentsSubcategoryHelp1": "コンテンツトラッキングは、ウェブサイトとアプリのあらゆるページで、特定の断片の人気を判断するのに役立ちます。このセクションでは、サイト上のさまざまなコンテンツが受け取ったインプレッション数とインタラクション数を報告します。", - "ContentsSubcategoryHelp2": "詳しくは、内容のトラッキングガイドをご覧ください。", - "Impressions": "インプレッション", - "ImpressionsMetricDocumentation": "広告やバナーなどのコンテンツブロックがページに表示された回数。", - "InteractionRate": "インタラクション率", - "InteractionRateMetricDocumentation": "インタラクションに対するコンテンツインプレッションの比率。", - "InteractionsMetricDocumentation": "コンテンツブロックが操作された回数(バナーや広告の ' クリック ' など)。", - "PluginDescription": "コンテンツとバナートラッキングでは、ページ上のコンテンツ ( バナー広告、画像、アイテム ) のパフォーマンス ( 表示、クリック、クリック率 ) を測定できます。" - } -} diff --git a/plugins/Contents/lang/ka.json b/plugins/Contents/lang/ka.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ka.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/ko.json b/plugins/Contents/lang/ko.json deleted file mode 100644 index 3d95e6ce6ac0cf41eed6f0d0af11abbabda892b3..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ko.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "Contents": { - "ContentInteraction": "컨텐츠 상호교환", - "ContentInteractions": "컨텐츠 상호교환들", - "ContentName": "콘텐츠 이름", - "ContentPiece": "콘텐츠 조각", - "ContentTarget": "콘텐츠 목표", - "Contents": "콘텐츠", - "Impressions": "뷰들", - "ImpressionsMetricDocumentation": "배너나 광고와 같은 콘텐츠 블록이 보여진 횟수입니다.", - "InteractionRate": "상호 작용 비율", - "InteractionRateMetricDocumentation": "상호작용으로 인해 보여진 페이지들의 비율", - "InteractionsMetricDocumentation": "(배너나 광고의 '클릭')과 상호작용한 콘텐츠 블록의 횟수입니다.", - "PluginDescription": "컨텐츠와 배너 트래킹으로 당신의 페이지들(배너광고, 이미지, 각종 아이템)상에서의 각각의 컨텐츠의 퍼포먼스(뷰들, 클릭수들, CTR) 를 측정할 수 있습니다" - } -} diff --git a/plugins/Contents/lang/ku.json b/plugins/Contents/lang/ku.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ku.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/lb.json b/plugins/Contents/lang/lb.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/lb.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/lt.json b/plugins/Contents/lang/lt.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/lt.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/lv.json b/plugins/Contents/lang/lv.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/lv.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/ms.json b/plugins/Contents/lang/ms.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ms.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/nb.json b/plugins/Contents/lang/nb.json deleted file mode 100644 index 22ec6800c65174e873493463797c7e5c603f32c8..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/nb.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Innholdsinntrykk", - "ContentInteraction": "Innholdsinteraksjon", - "ContentInteractions": "Innholdsinteraksjoner", - "ContentName": "Innholdsnavn", - "ContentNameReportDocumentation": "Denne rapporten viser navnene for innholdene dine besøkende tittet på og interagerte med.", - "ContentNames": "Innholdsnavn", - "ContentPiece": "Innholdsdel", - "ContentPieceReportDocumentation": "Denne rapporten viser deg innholdet dine besøkende så på eller interagerte med.", - "ContentPieces": "Innholdsdeler", - "ContentTarget": "Innholdsmål", - "ContentTargets": "Innholdsmål", - "Contents": "Innhold", - "ContentsSubcategoryHelp1": "Innholdssporing hjelper deg å bestemme populariteten for gitte deler av innhold på enhver side i nettsiden eller programmet ditt. Denne delen rapporterer antall inntrykk og interaksjoner de forskjellige delene av innhold på siden din mottar.", - "ContentsSubcategoryHelp2": "Lær mer om det i innholdssporingsveiledningen.", - "Impressions": "Visninger", - "ImpressionsMetricDocumentation": "Antall ganger en innholdsdel, som en banner eller annonse, ble vist på en side.", - "InteractionRate": "Interaksjonsrate", - "InteractionRateMetricDocumentation": "Ratioen mellom visninger og interaksjoner.", - "InteractionsMetricDocumentation": "Antall ganger en innholdsdel ble interagert med (f.eks. et klikk på en banner eller annonse).", - "PluginDescription": "Innholds- og bannersporing lar deg måle ytelsen (visninger, klikk, CTR) til deler av innholdet på dine sider (banner-annonser, bilder, eller hva som helst)." - } -} diff --git a/plugins/Contents/lang/nl.json b/plugins/Contents/lang/nl.json deleted file mode 100644 index 385056a1d24b8fc627ffd65180ecba8916c7e1a7..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/nl.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Inhoud Impressies", - "ContentInteraction": "Content interacties", - "ContentInteractions": "Content interacties", - "ContentName": "Content naam", - "ContentNameReportDocumentation": "Dit rapport toont de titels van de inhoud die uw bezoekers bekeken en mee communiceerden.", - "ContentNames": "Inhoud Namen", - "ContentPiece": "Contentonderdeel", - "ContentPieceReportDocumentation": "Dit rapport toont de stukjes inhoud die uw bezoekers bekeken en mee communiceerden.", - "ContentPieces": "Inhoud Gedeeltes", - "ContentTarget": "Contentdoel", - "ContentTargets": "Inhoud Doelen", - "Contents": "Contentbronnen", - "ContentsSubcategoryHelp1": "Inhoud volgen helpt u om de populariteit te bepalen van specifieke stukjes inhoud op een pagina van uw website of app. Deze sectie rapporteert het ontvangen aantal indrukken en interacties van diversie stukjes inhoud op uw site.", - "ContentsSubcategoryHelp2": "Meer informatie in de Content Tracking handleiding.", - "Impressions": "Vertoningen", - "ImpressionsMetricDocumentation": "Het aantal keer dat een contentbron, zoals een banner of een advertentie, was getoond op een pagina.", - "InteractionRate": "Aantal interacties", - "InteractionRateMetricDocumentation": "De verhouding tussen vertoningen en kliks.", - "InteractionsMetricDocumentation": "Het aantal keer dat er interactie was met een contentbron (bijvoorbeeld een klik op een banner of advertentie).", - "PluginDescription": "Met content- en bannertracking meet je de prestaties (bezoeken, kliks, ctr) van elk stukje content op je webpagina (banner, tekstadvertentie, plaatje)." - } -} diff --git a/plugins/Contents/lang/nn.json b/plugins/Contents/lang/nn.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/nn.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/pl.json b/plugins/Contents/lang/pl.json deleted file mode 100644 index 60be9ecf65d8af41549596a302025cd582c01fa1..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/pl.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Wyświetlenia treści", - "ContentInteraction": "Interakcja", - "ContentInteractions": "Interakcje", - "ContentName": "Nazwa treści", - "ContentNameReportDocumentation": "Ten raport pokazuje nazwy treści, które oglądali i z którymi wchodzili w interakcję Twoi goście.", - "ContentNames": "Nazwy treści", - "ContentPiece": "Fragment treści", - "ContentPieceReportDocumentation": "Ten raport pokazuje fragmenty treści, które odwiedzający oglądali i z którymi wchodzili w interakcję.", - "ContentPieces": "Fragmenty treści", - "ContentTarget": "Cel treści", - "ContentTargets": "Cele treści", - "Contents": "Treść", - "ContentsSubcategoryHelp1": "Śledzenie treści pomaga określić popularność konkretnych fragmentów treści na dowolnej stronie Twojej witryny lub aplikacji. Ta sekcja raportuje liczbę wyświetleń i interakcji, jakie otrzymują różne fragmenty treści w Twojej witrynie.", - "ContentsSubcategoryHelp2": "Dowiedz się więcej w przewodniku Śledzenie zawartości.", - "Impressions": "Wyświetlenia treści", - "ImpressionsMetricDocumentation": "Liczba wyświetleń bloku treści, takiego jak baner czy reklama, na stronie.", - "InteractionRate": "Częstość interakcji", - "InteractionRateMetricDocumentation": "Stosunek wyświetleń treści do interakcji.", - "InteractionsMetricDocumentation": "Liczba interakcji wykonanych na zawartości (np. 'kliknięcie' w baner lub reklamę).", - "PluginDescription": "Śledzenie treści i banerów pozwala Ci zmierzyć wydajność (wyświetleń, kliknięć, CTR) dowolnego fragmentu treści na Twojej stronie (baner reklamowy, obrazek, dowolny element)." - } -} diff --git a/plugins/Contents/lang/pt-br.json b/plugins/Contents/lang/pt-br.json deleted file mode 100644 index 6aff558d12cd273c50624db982cc118cffaa029a..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/pt-br.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Impressão de Conteúdo", - "ContentInteraction": "Interação de Conteúdo", - "ContentInteractionSegmentHelp": "O tipo de interação com o conteúdo. Por exemplo, \"clicar\" ou \"enviar\".", - "ContentInteractions": "Interação de Conteúdos", - "ContentName": "Nome do conteúdo", - "ContentNameReportDocumentation": "Este relatório mostra os nomes do conteúdo que seus visitantes visualizaram e interagiram.", - "ContentNameSegmentHelp": "O nome de um bloco de conteúdo, por exemplo \"Promoção de Anúncios\"", - "ContentNames": "Nomes de Conteúdo", - "ContentPiece": "Parte do conteúdo", - "ContentPieceReportDocumentation": "Este relatório mostra as partes do conteúdo que seus visitantes visualizaram e interagiram.", - "ContentPieceSegmentHelp": "O conteúdo em si. Por exemplo, \"ad.jpg\" ou \"Meu anúncio de texto\"", - "ContentPieces": "Peças de Conteúdo", - "ContentTarget": "Destino do conteúdo", - "ContentTargetSegmentHelp": "Por exemplo, o URL de uma página de destino: \"http://landingpage.example.com\"", - "ContentTargets": "Metas de Conteúdo", - "Contents": "Conteúdos", - "ContentsSubcategoryHelp1": "O rastreamento de conteúdo ajuda a determinar a popularidade de partes específicas de conteúdo em qualquer página de seu site ou aplicativo. Esta seção relata o número de impressões e interações que as várias partes do conteúdo em seu site recebem.", - "ContentsSubcategoryHelp2": "Saiba mais no guia de rastreamento de conteúdo.", - "Impressions": "Impressões", - "ImpressionsMetricDocumentation": "O número de vezes que um bloco de conteúdo, como um banner ou um anúncio, foi exibido em uma página.", - "InteractionRate": "Taxa de interação", - "InteractionRateMetricDocumentation": "A proporção de impressões de conteúdo para interações.", - "InteractionsMetricDocumentation": "O número de vezes que interagiram com um bloco de conteúdo (e.g., um 'clique' em um banner ou anúncio).", - "PluginDescription": "O rastreamento de conteúdo e banner permite que meça o desempenho (visualizações, cliques, CTR) de qualquer parte do conteúdo em suas páginas (Banner de anúncio, imagem, qualquer item)." - } -} diff --git a/plugins/Contents/lang/pt.json b/plugins/Contents/lang/pt.json deleted file mode 100644 index 64d9ef9d618b9a259c11e4cd90eedc88625a7c3d..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/pt.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Impressão de conteúdo", - "ContentInteraction": "Interação de conteúdo", - "ContentInteractions": "Interações de conteúdo", - "ContentName": "Nome do Conteúdo", - "ContentNameReportDocumentation": "Este relatório mostra os nomes do conteúdo que os seus visitantes visualizaram e interagiram.", - "ContentNames": "Nomes do conteúdo", - "ContentPiece": "Parte de Conteúdo", - "ContentPieceReportDocumentation": "Este relatório mostra as partes do conteúdo que os seus visitantes visualizaram e interagiram.", - "ContentPieces": "Pedaços de conteúdo", - "ContentTarget": "Conteúdo de Destino", - "ContentTargets": "Conteúdos-alvo", - "Contents": "Conteúdos", - "ContentsSubcategoryHelp1": "O rastreamento de conteúdo ajuda a determinar a popularidade de partes específicas de conteúdo em qualquer página do seu site ou aplicação. Esta secção relata o número de impressões e interações que as várias partes do conteúdo no seu site recebem.", - "ContentsSubcategoryHelp2": "Saiba mais no guia de rastreamento de conteúdo.", - "Impressions": "Impressões", - "ImpressionsMetricDocumentation": "O número de vezes que um bloco de conteúdo, como um banner ou publicidade, foi apresentado numa página.", - "InteractionRate": "Taxa de Interação", - "InteractionRateMetricDocumentation": "O rácio de impressões a interações de conteúdo.", - "InteractionsMetricDocumentation": "O número de interações num bloco de conteúdo (por exemplo, um 'clique' num banner ou publicidade).", - "PluginDescription": "O acompanhamento de conteúdo e banner permite-lhe medir a performance (visualizações, cliques, CTR) de qualquer pedaço de conteúdo nas suas páginas (banner de publicidade, imagem, qualquer item)." - } -} diff --git a/plugins/Contents/lang/ro.json b/plugins/Contents/lang/ro.json deleted file mode 100644 index b096d5924ebc5f95a6cf9e529699da61c88de965..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ro.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Contents": { - "ContentName": "Nume Continut", - "ContentTarget": "Conţinut ţintă", - "Contents": "Conţinut", - "Impressions": "Impresii", - "InteractionRate": "Rata de interacţiune" - } -} diff --git a/plugins/Contents/lang/ru.json b/plugins/Contents/lang/ru.json deleted file mode 100644 index 6153c9e5e5914073c4d284a22664c3618c17f21d..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ru.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Показы контента", - "ContentInteraction": "Взаимодействие с контентом", - "ContentInteractions": "Взаимодействия с контентом", - "ContentName": "Название публикации", - "ContentNames": "Названия публикаций", - "ContentPiece": "Часть публикации", - "ContentPieces": "Часть публикаций", - "ContentTarget": "Цель публикации", - "ContentTargets": "Цели публикаций", - "Contents": "Публикации", - "Impressions": "Показы", - "ImpressionsMetricDocumentation": "Сколько раз блок контента, такой как баннер или реклама, был показан на странице.", - "InteractionRate": "Коэффициент взаимодествия", - "InteractionRateMetricDocumentation": "Соотношение представления контента и взаимодействий.", - "InteractionsMetricDocumentation": "Сколько раз с блоком контента происходило взаимодействие (например, 'клик' по баннеру или рекламе).", - "PluginDescription": "Отслеживание контента и баннеров позволяет вам измерять эффективность (просмотры, клики, CTR) любой части контента на ваших страницах (баннер-реклама, изображение, любой элемент)." - } -} diff --git a/plugins/Contents/lang/si.json b/plugins/Contents/lang/si.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/si.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/sk.json b/plugins/Contents/lang/sk.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/sk.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/sl.json b/plugins/Contents/lang/sl.json deleted file mode 100644 index 52bc5c65dea159d5115ab4d87936da8f60d1c8f8..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/sl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Contents": { - "ContentName": "Ime vsebine", - "ContentPiece": "Del vsebine", - "ContentTarget": "Cilj vsebine", - "Contents": "Vsebine", - "Impressions": "Ogledi", - "InteractionRate": "Stopnja interakcij" - } -} diff --git a/plugins/Contents/lang/sq.json b/plugins/Contents/lang/sq.json deleted file mode 100644 index a96071d50f38e2cd58e80765ffb8dac2a1c7b329..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/sq.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Përshtypje Lënde", - "ContentInteraction": "Ndërveprim Me Lëndën", - "ContentInteractionSegmentHelp": "Lloji i ndërveprimit me lëndën. Për shembull, “klikoni”, ose “parashtrojeni”.", - "ContentInteractions": "Ndërveprime me Lëndën", - "ContentName": "Emër Lënde", - "ContentNameReportDocumentation": "Ky raport shfaq emrat e lëndës të cilën panë dhe me të cilën ndërvepruan vizitorët tuaj.", - "ContentNameSegmentHelp": "Emri i bllokut të lëndës, për shembull “Shitje Reklamash”", - "ContentNames": "Emra Lënde", - "ContentPiece": "Pjesë Lënde", - "ContentPieceReportDocumentation": "Ky raport shfaq pjesë lënde të cilat panë dhe me të cilat ndërvepruan vizitorët tuaj.", - "ContentPieceSegmentHelp": "Lënda faktike. Për shembull, “ad.jpg”, ose “Reklama ime tekst”", - "ContentPieces": "Pjesë Lënde", - "ContentTarget": "Synim Lënde", - "ContentTargetSegmentHelp": "Për shembull, URL-ja e një faqe hyrëse: “http://landingpage.example.com”", - "ContentTargets": "Synime Lënde", - "Contents": "Lëndë", - "ContentsSubcategoryHelp1": "Ndjekja e lëndës ju ndihmon të përcaktoni popullaritetin e pjesëve specifike të lëndës në çfarëdo faqe të sajtit apo aplikacionit tuaj. Kjo ndarje raporton numrin e përshtypjeve dhe ndërveprimeve që marrin pjesë të ndryshme të lëndës në sajtin tuaj.", - "ContentsSubcategoryHelp2": "Mësoni më tepër, te udhërrëfyesi i Ndjekjes së Lëndës.", - "Impressions": "Përshtypje", - "ImpressionsMetricDocumentation": "Numri i herëve që një bllok lënde, bie fjala, banderolë apo reklamë, është shfaqur në një faqe.", - "InteractionRate": "Shkallë Ndërveprimi", - "InteractionRateMetricDocumentation": "Përpjesëtimi i përshtypjeve nga lënda kundrejt ndërveprimeve me të.", - "InteractionsMetricDocumentation": "Numri i herëve kur për një bllok lënde ka pasur ndërveprime (p.sh., një “klikim” mbi një banderolë apo reklamë).", - "PluginDescription": "Ndjekja e lëndës dhe e banderolave ju lejon të matni punimin (parje, klikime, CTR) të çfarëdo pjese të lëndës në faqet tuaja (banderolë reklame, figurë, çfarëdo objekti)." - } -} diff --git a/plugins/Contents/lang/sr.json b/plugins/Contents/lang/sr.json deleted file mode 100644 index efec43fa9dbcd1b3550dc46c282b446b56a7861a..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/sr.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "Contents": { - "ContentInteraction": "Interakcija sa sadržajem", - "ContentInteractions": "Interakcije sa sadržajem", - "ContentName": "Naziv sadržaja", - "ContentPiece": "Sadržaj", - "ContentTarget": "Cilj sadržaja", - "Contents": "Sadržaji", - "Impressions": "Prikazi", - "ImpressionsMetricDocumentation": "Broj prikaza bloka sadržaja poput banera i reklama na stranici.", - "InteractionRate": "Odnos interakcija", - "InteractionRateMetricDocumentation": "Odnos prikaza i interakcija sadržaja.", - "InteractionsMetricDocumentation": "Broj interakcija sa blokom sadržaja (npr., klik na baner ili reklamu).", - "PluginDescription": "Praćenje sadržaja i banera vam omogućuje merenje performansi (prikaza, klikova, CTR) bilo kog dela sadržaja vaših stranica (reklama, slika itd.)." - } -} diff --git a/plugins/Contents/lang/sv.json b/plugins/Contents/lang/sv.json deleted file mode 100644 index c6c4daaf88a39dbcc5099fd7f54a8bba90dbc037..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/sv.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Innehållsintryck", - "ContentInteraction": "Innehållsinteraktion", - "ContentInteractions": "Innehållsinteraktioner", - "ContentName": "Namn på innehåll", - "ContentNameReportDocumentation": "Denna rapport visar namnen på det innehåll som dina besökare tittade på och interagerade med.", - "ContentNameSegmentHelp": "Namnet på ett innehållsblock, till exempel \"Annons\"", - "ContentNames": "Innehållsnamn", - "ContentPiece": "Innehållsdel", - "ContentPieceReportDocumentation": "Den här rapporten visar det innehåll som dina besökare tittade på och interagerade med.", - "ContentPieceSegmentHelp": "Det faktiska innehållet. Till exempel \"annons.jpg\" eller \"Min textannons\"", - "ContentPieces": "Innehållsdelar", - "ContentTarget": "Innehållsmål", - "ContentTargetSegmentHelp": "Till exempel URL:en till en landningssida: \"http://landningssida.exempel.se\"", - "ContentTargets": "Innehållsmål", - "Contents": "Innehåll", - "ContentsSubcategoryHelp1": "Innehållsspårning hjälper dig att bestämma populariteten för specifika innehållsdelar på vilken sida som helst på din webbplats eller applikation. Detta avsnitt rapporterar antalet intryck och interaktioner som de olika innehållsdelarna på din webbplats får.", - "ContentsSubcategoryHelp2": "Läs mer i innehållsspårningsguiden.", - "Impressions": "Visningar", - "ImpressionsMetricDocumentation": "Antalet gånger ett innehållsblock såsom en banner eller en annons har visats på en sida.", - "InteractionRate": "Andel interaktioner", - "InteractionRateMetricDocumentation": "Förhållandet mellan innehållsvisningar och interaktioner.", - "InteractionsMetricDocumentation": "Antalet gånger ett innehållsblock har interagerats med (t.ex. ett \"klick\" på en banner eller annons).", - "PluginDescription": "Innehålls- och bannertracking ger dig möjlighet att mäta prestanda (visningar, klick, CTR) för alla typer av innehåll på dina sidor (bannerannonser, bilder mm)." - } -} diff --git a/plugins/Contents/lang/ta.json b/plugins/Contents/lang/ta.json deleted file mode 100644 index 2319612718c1e5996398bd893b52cc81d9780d5c..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ta.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "உள்ளடக்க எண்ணம்", - "ContentInteraction": "உள்ளடக்க தொடர்பு", - "ContentInteractions": "உள்ளடக்க இடைவினைகள்", - "ContentName": "உள்ளடக்கத்தின் பெயர்", - "ContentNameReportDocumentation": "இந்த அறிக்கை உங்கள் பார்வையாளர்கள் பார்த்த மற்றும் தொடர்பு கொண்ட உள்ளடக்கத்தின் பெயர்களைக் காட்டுகிறது.", - "ContentNames": "உள்ளடக்க பெயர்கள்", - "ContentPiece": "உள்ளடக்கக் கூறு", - "ContentPieceReportDocumentation": "இந்த அறிக்கை உங்கள் பார்வையாளர்கள் பார்த்த மற்றும் தொடர்பு கொண்ட உள்ளடக்கத்தின் பகுதிகளைக் காட்டுகிறது.", - "ContentPieces": "உள்ளடக்க துண்டுகள்", - "ContentTarget": "உள்ளடக்க இலக்கு", - "ContentTargets": "உள்ளடக்க இலக்குகள்", - "Contents": "உள்ளடக்கம்", - "ContentsSubcategoryHelp1": "உள்ளடக்க கண்காணிப்பு உங்கள் வலைத்தளம் அல்லது பயன்பாட்டின் எந்த பக்கத்திலும் குறிப்பிட்ட உள்ளடக்கங்களின் பிரபலத்தை தீர்மானிக்க உதவுகிறது. இந்த பிரிவு உங்கள் தளத்தின் பல்வேறு உள்ளடக்கங்களின் பதிவுகள் மற்றும் தொடர்புகளின் எண்ணிக்கையைப் புகாரளிக்கிறது.", - "ContentsSubcategoryHelp2": "உள்ளடக்க கண்காணிப்பு வழிகாட்டியில் மேலும் அறிக.", - "Impressions": "எண்ண ஓட்டம்", - "ImpressionsMetricDocumentation": "ஒரு பேனர் அல்லது விளம்பரம் போன்ற உள்ளடக்கத் தொகுதி எத்தனை முறை ஒரு பக்கத்தில் காட்டப்பட்டது.", - "InteractionRate": "உரையாடல் வீதம்", - "InteractionRateMetricDocumentation": "உள்ளடக்க பதிவுகள் இடைவினைகளுக்கான விகிதம்.", - "InteractionsMetricDocumentation": "உள்ளடக்கத் தொகுதி எத்தனை முறை தொடர்பு கொள்ளப்பட்டது (எ.கா., ஒரு பேனர் அல்லது விளம்பரத்தில் ஒரு 'கிளிக்').", - "PluginDescription": "உள்ளடக்கம் மற்றும் பேனர் கண்காணிப்பு உங்கள் பக்கங்களில் உள்ள எந்தவொரு உள்ளடக்கத்தின் செயல்திறனை (காட்சிகள், கிளிக்குகள், சி.டி.ஆர்) அளவிட உங்களை அனுமதிக்கிறது (பேனர் விளம்பரம், படம், எந்த உருப்படியும்)." - } -} diff --git a/plugins/Contents/lang/te.json b/plugins/Contents/lang/te.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/te.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/th.json b/plugins/Contents/lang/th.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/th.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/tl.json b/plugins/Contents/lang/tl.json deleted file mode 100644 index 76f5d508d31a19f67d8f674894236e66e632406c..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/tl.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "Contents": { - "ContentName": "Pangalan ng Nilalaman", - "ContentPiece": "Piraso ng Nilalaman", - "ContentTarget": "Target ng Nilalaman", - "Contents": "Mga Nilalaman", - "Impressions": "Mga Impresyon", - "InteractionRate": "Rate ng Pakikipag-ugnayan", - "PluginDescription": "Maaring sukatin ang pagganap (mga view, pag-click, CTR) ng anumang piraso ng nilalaman sa iyong mga pahina (Banner ad, imahe, anumang item) sa pagsubaybay sa contento at banner." - } -} diff --git a/plugins/Contents/lang/tr.json b/plugins/Contents/lang/tr.json deleted file mode 100644 index 567bd730873d2029bc3d7115e44c5aac497fadc8..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/tr.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Contents": { - "ContentImpression": "İçerik gösterimi", - "ContentInteraction": "İçerik etkileşimi", - "ContentInteractionSegmentHelp": "İçerikle etkileşim türü. Örneğin \"tıklama\" veya \"gönderme\".", - "ContentInteractions": "İçerik etkileşimleri", - "ContentName": "İçerik adı", - "ContentNameReportDocumentation": "Bu rapor, ziyaretçilerin baktığı ve etkileşime geçtiği içerik adlarını içerir.", - "ContentNameSegmentHelp": "Bir içerik bloğunun adı. Örneğin \"Reklam Satışı\"", - "ContentNames": "İçerik adı", - "ContentPiece": "İçerik parçası", - "ContentPieceReportDocumentation": "Bu rapor, ziyaretçilerin baktığı ve etkileşime geçtiği içerik parçalarını içerir.", - "ContentPieceSegmentHelp": "Gerçek içerik. Örneğin \"ad.jpg\" veya \"Yazılı reklamım\"", - "ContentPieces": "İçerik parçası", - "ContentTarget": "İçerik hedefi", - "ContentTargetSegmentHelp": "Örneğin bir iniş sayfasının adresi: \"http://inissayfasi.ornek.com\"", - "ContentTargets": "İçerik hedefi", - "Contents": "İçerikler", - "ContentsSubcategoryHelp1": "İçerik izleme, sitenin ya da uygulama içeriğinin belirli parçalarının sık kullanılma oranını belirlemeye yardımcı olur. Bu bölüm, sitedeki çeşitli içerik parçalarının gösterim ve etkileşim sayılarını içerir.", - "ContentsSubcategoryHelp2": "Ayrıntılı bilgi almak için içerik izleme rehberine bakabilirsiniz.", - "Impressions": "Görülme", - "ImpressionsMetricDocumentation": "Afiş ya da reklam gibi bir içerik bloğunun bir sayfada kaç kere görüntülendiği .", - "InteractionRate": "Etkileşim oranı", - "InteractionRateMetricDocumentation": "İçeriğin görüntülenmesi ile etkileşime geçilme oranı.", - "InteractionsMetricDocumentation": "İçerik bloğu ile kaç kere etkileşime geçildiği (afiş ya da reklama 'tıklanma' gibi).", - "PluginDescription": "İçerik ve reklam izleme, sayfalarınızdaki herhangi bir içeriğin (reklam, görsel, herhangi bir öge) başarımının (görülme, tıklanma, CTR) izlenmesini sağlar." - } -} diff --git a/plugins/Contents/lang/tzm.json b/plugins/Contents/lang/tzm.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/tzm.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/uk.json b/plugins/Contents/lang/uk.json deleted file mode 100644 index 85f24309c182ba3e42e1ea3d54f2082a459a4eb7..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/uk.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "Зміст показу", - "ContentInteraction": "Зміст взаємодії", - "ContentInteractions": "Зміст взаємодій", - "ContentName": "Назва публікації", - "ContentNameReportDocumentation": "Цей звіт показує назви вмісту, який переглядали ваші відвідувачі та з яким взаємодіяли.", - "ContentNames": "Назви публікацій", - "ContentPiece": "Частина публікації", - "ContentPieceReportDocumentation": "Цей звіт показує фрагменти вмісту, які переглядали ваші відвідувачі та з якими взаємодіяли.", - "ContentPieces": "Частини публікацій", - "ContentTarget": "Ціль публікації", - "ContentTargets": "Цілі публікацій", - "Contents": "Публікації", - "ContentsSubcategoryHelp1": "Відстеження вмісту допомагає визначити відвідуваність певного вмісту на будь-якій сторінці вашого вебсайту чи застосунку. У цьому розділі повідомляється про кількість показів і взаємодій з різними частинами вмісту на вашому сайті.", - "ContentsSubcategoryHelp2": "Докладніше в посібнику з відстеження вмісту.", - "Impressions": "Покази", - "ImpressionsMetricDocumentation": "Скільки разів блок контенту, такий як банер або реклама, був показаний на сторінці.", - "InteractionRate": "Коефіцієнт взаємодії", - "InteractionRateMetricDocumentation": "Співвідношення подання контенту і взаємодій.", - "InteractionsMetricDocumentation": "Скільки разів з блоком контенту відбувалося взаємодія (наприклад, 'клік' по банеру або рекламі).", - "PluginDescription": "Відстеження контенту і банерів дозволяє вам вимірювати ефективність (перегляди, кліки, CTR) в будь-якій частині контенту на ваших сторінках (рекламний банер, зображення, будь-який елемент)." - } -} diff --git a/plugins/Contents/lang/ur.json b/plugins/Contents/lang/ur.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/ur.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/Contents/lang/vi.json b/plugins/Contents/lang/vi.json deleted file mode 100644 index 5ff0136bd9763261986769e51d9b6d3bbc12db8a..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/vi.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "Contents": { - "ContentName": "Tên nội dung", - "ContentPiece": "Thành phần nội dung", - "ContentTarget": "Đối tượng nội dung", - "Contents": "Nội dung", - "Impressions": "Lượt hiển thị cho người dùng", - "InteractionRate": "Tỷ lệ tương tác", - "PluginDescription": "Chức năng theo dõi nội dung và banner cho phép bạn đánh giá được hiệu quả (lượt xem, click, CTR) của bất kỳ trang web nào." - } -} diff --git a/plugins/Contents/lang/zh-cn.json b/plugins/Contents/lang/zh-cn.json deleted file mode 100644 index 09bac86a8018149d17bcc698dfcc3b77673fa6eb..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/zh-cn.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "Contents": { - "ContentImpression": "内容展示量", - "ContentInteraction": "内容互动", - "ContentInteractions": "内容互动", - "ContentName": "内容名称", - "ContentNames": "内容名称", - "ContentPiece": "内容区块", - "ContentPieces": "内容片段", - "ContentTarget": "内容目标", - "ContentTargets": "内容目标", - "Contents": "内容", - "ContentsSubcategoryHelp2": "前往內容追蹤說明內了解更多", - "Impressions": "展示次数", - "ImpressionsMetricDocumentation": "内容区块(例如横幅或广告)在页面上的展示次数。", - "InteractionRate": "互动率", - "InteractionRateMetricDocumentation": "内容展示和互动的比率。", - "InteractionsMetricDocumentation": "内容区块的互动次数(例如点击横幅或广告)", - "PluginDescription": "追踪内容和横幅可以让您衡量您网页上任何一部分内容(横幅广告,图像,任何项目)的表现(浏览次数,点击次数,点击率)。" - } -} diff --git a/plugins/Contents/lang/zh-tw.json b/plugins/Contents/lang/zh-tw.json deleted file mode 100644 index feaae1c4cf86135c57e003eb0a66caf92c4fd311..0000000000000000000000000000000000000000 --- a/plugins/Contents/lang/zh-tw.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Contents": { - "ContentImpression": "內容曝光", - "ContentInteraction": "內容互動", - "ContentInteractions": "內容互動", - "ContentName": "內容名稱", - "ContentNameReportDocumentation": "此報表顯示訪客查閲和交互的內容的名稱。", - "ContentNames": "內容名稱", - "ContentPiece": "內容區塊", - "ContentPieceReportDocumentation": "此報表顯示訪客查閲和交互的內容的片段。", - "ContentPieces": "內容區塊", - "ContentTarget": "內容目標", - "ContentTargets": "內容目標", - "Contents": "內容", - "ContentsSubcategoryHelp1": "內容追蹤可幫助您確定您網站或應用程式的任何頁面上特定內容的受歡迎程度。此部分提供您網站上各個內容的展示次數和交互次數。", - "ContentsSubcategoryHelp2": "前往內容追蹤說明內了解更多。", - "Impressions": "曝光", - "ImpressionsMetricDocumentation": "內容區塊(例如橫幅或廣告)的展示次數。", - "InteractionRate": "互動率", - "InteractionRateMetricDocumentation": "內容曝光及互動的比率。", - "InteractionsMetricDocumentation": "內容區塊的互動次數(例如「點擊」橫幅或廣告)。", - "PluginDescription": "追蹤內容和橫幅讓你衡量網頁中任何區塊內容(橫幅廣告、圖片、任何項目)的表現(瀏覽數、點擊數、CTR)。" - } -} diff --git a/plugins/Contents/screenshots/.gitkeep b/plugins/Contents/screenshots/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/plugins/Contents/templates/_actionContent.twig b/plugins/Contents/templates/_actionContent.twig deleted file mode 100644 index 0eb5f86d812333d75c53f3ee90ed04f7f62d5f46..0000000000000000000000000000000000000000 --- a/plugins/Contents/templates/_actionContent.twig +++ /dev/null @@ -1,17 +0,0 @@ -
  • -
    - {% if action.contentInteraction %} - - {% else %} - - {% endif %} - {% if action.contentInteraction %} - [{{ action.contentInteraction }}] - {% endif %} - {{ action.contentName }} - - {{ action.contentPiece }} -
    -
  • diff --git a/plugins/Contents/templates/_actionTooltip.twig b/plugins/Contents/templates/_actionTooltip.twig deleted file mode 100644 index c81c6883b496a966906220928879d8271c0d30fe..0000000000000000000000000000000000000000 --- a/plugins/Contents/templates/_actionTooltip.twig +++ /dev/null @@ -1,9 +0,0 @@ -{% if action.contentName %} - -{{ 'Contents_ContentName'|translate }}: {{ action.contentName }}{% endif %}{% if action.contentPiece %} - -{{ 'Contents_ContentPiece'|translate }}: {{ action.contentPiece }}{% endif %}{% if action.contentTarget %} - -{{ 'Contents_ContentTarget'|translate }}: {{ action.contentTarget }}{% endif %}{% if action.contentInteraction %} - -{{ 'Contents_ContentInteraction'|translate }}: {{ action.contentInteraction }}{% endif %} \ No newline at end of file diff --git a/plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php b/plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php deleted file mode 100644 index da233e68259ce8acc86f394fe54b6d7b26f2c88e..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php +++ /dev/null @@ -1,98 +0,0 @@ -setUpWebsitesAndGoals(); - $this->trackVisits(); - } - - private function setUpWebsitesAndGoals() - { - // tests run in UTC, the Tracker in UTC - if (!self::siteCreated($idSite = 1)) { - self::createWebsite($this->dateTime); - } - - if (!self::goalExists($idSite = 1, $idGoal = 1)) { - // These two goals are to check contents don't trigger for URL or Title matching - APIGoals::getInstance()->addGoal($this->idSite, 'triggered js', 'url', 'webradio', 'contains'); - APIGoals::getInstance()->addGoal($this->idSite, 'triggered js', 'title', 'Music', 'contains'); - } - } - - public function trackVisits() - { - $uselocal = false; - $vis = self::getTracker($this->idSite, $this->dateTime, $useDefault = true, $uselocal); - - $this->trackContentImpressionsAndInteractions($vis); - - $this->dateTime = Date::factory($this->dateTime)->addHour(0.5)->getDatetime(); - $vis2 = self::getTracker($this->idSite, $this->dateTime, $useDefault = true, $uselocal); - $vis2->setIp('111.1.1.1'); - $vis2->setPlugins($flash = false, $java = false); - - $this->trackContentImpressionsAndInteractions($vis2); - } - - private function moveTimeForward(MatomoTracker $vis, $minutes) - { - $hour = $minutes / 60; - $vis->setForceVisitDateTime(Date::factory($this->dateTime)->addHour($hour)->getDatetime()); - } - - protected function trackContentImpressionsAndInteractions(MatomoTracker $vis) - { - $vis->setUrl('http://www.example.org/page'); - $vis->setPerformanceTimings(33, 325, 124, 356, 215, 99); - self::checkResponse($vis->doTrackPageView('Ads')); - - self::checkResponse($vis->doTrackContentImpression('ImageAd')); - self::checkResponse($vis->doTrackContentImpression('ImageAd', '')); - - $this->moveTimeForward($vis, 2); - self::checkResponse($vis->doTrackContentImpression('ImageAd', '/path/ad.jpg', 'http://www.example.com')); - self::checkResponse($vis->doTrackContentImpression('ImageAd', '/path/ad2.jpg', 'http://www.example.com')); - self::checkResponse($vis->doTrackContentInteraction('submit', 'ImageAd', '/path/ad.jpg', 'http://www.example.com')); - $this->moveTimeForward($vis, 3); - self::checkResponse($vis->doTrackContentImpression('Text Ad', 'Click to download Piwik now', 'http://piwik.org/download')); - self::checkResponse($vis->doTrackContentImpression('Text Ad', 'Click NOW', 'http://piwik.org/')); - self::checkResponse($vis->doTrackContentInteraction('click', 'Text Ad', 'Click to download Piwik now', 'http://piwik.org/download')); - self::checkResponse($vis->doTrackContentInteraction('click', 'Text Ad', 'Click NOW', 'http://piwik.org/download')); - $this->moveTimeForward($vis, 4); - self::checkResponse($vis->doTrackContentImpression('Text Ad', 'Click to download Piwik now', '')); - - $this->moveTimeForward($vis, 4.5); - self::checkResponse($vis->doTrackContentImpression('Video Ad', 'movie.mov')); - - $vis->setUrl('http://www.example.com/de/suche?q=foo'); - $this->moveTimeForward($vis, 4.5); - self::checkResponse($vis->doTrackContentImpression('Video Ad', 'movie.mov')); - } - - public function tearDown(): void - { - } -} diff --git a/plugins/Contents/tests/System/ContentsTest.php b/plugins/Contents/tests/System/ContentsTest.php deleted file mode 100644 index 7dec337a07a356a47a856e8c0d3c0df78a75950f..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/ContentsTest.php +++ /dev/null @@ -1,139 +0,0 @@ -runApiTests($api, $params); - } - - protected function getApiToCall() - { - return array( - 'Contents.getContentNames', - 'Contents.getContentPieces', - 'Actions.get', - 'Actions.getPageUrls', - 'Live.getLastVisitsDetails', - ); - } - - public function setUp(): void - { - parent::setUp(); - Fixture::loadAllTranslations(); - } - - public function tearDown(): void - { - parent::tearDown(); - Fixture::resetTranslations(); - } - - public function getApiForTesting() - { - $dateTime = self::$fixture->dateTime; - $idSite1 = self::$fixture->idSite; - - $apiToCallProcessedReportMetadata = $this->getApiToCall(); - - $dayPeriod = 'day'; - $periods = array($dayPeriod, 'month'); - - $apisToTest = array('Contents', 'Actions.getPageUrls', 'Live.getLastVisitsDetails'); - $result = array( - array($apiToCallProcessedReportMetadata, array( - 'idSite' => $idSite1, - 'date' => $dateTime, - 'periods' => $periods, - 'setDateLastN' => false, - 'testSuffix' => '')), - - array($apisToTest, array( - 'idSite' => $idSite1, - 'date' => $dateTime, - 'periods' => $dayPeriod, - 'segment' => "contentName==ImageAd,contentPiece==" . urlencode('Click to download Piwik now'), - 'setDateLastN' => false, - 'testSuffix' => 'contentNameOrPieceMatch'), - ), - - array($apisToTest, array( - 'idSite' => $idSite1, - 'date' => $dateTime, - 'periods' => $dayPeriod, - 'segment' => "contentTarget==" . urlencode('http://www.example.com'), - 'setDateLastN' => false, - 'testSuffix' => '_contentTargetMatch'), - ), - - array($apisToTest, array( - 'idSite' => $idSite1, - 'date' => $dateTime, - 'periods' => $dayPeriod, - 'segment' => "contentInteraction==click", - 'setDateLastN' => false, - 'testSuffix' => '_contentInteractionMatch'), - ), - ); - - $apiToCallProcessedReportMetadata = array( - 'Contents.getContentNames', - 'Contents.getContentPieces', - ); - // testing metadata API for Contents reports - foreach ($apiToCallProcessedReportMetadata as $api) { - list($apiModule, $apiAction) = explode(".", $api); - - $result[] = array( - 'API.getProcessedReport', array('idSite' => $idSite1, - 'date' => $dateTime, - 'periods' => $dayPeriod, - 'setDateLastN' => true, - 'apiModule' => $apiModule, - 'apiAction' => $apiAction, - 'testSuffix' => '_' . $api . '_lastN'), - ); - } - - return $result; - } - - public static function getOutputPrefix() - { - return 'Contents'; - } - - public static function getPathToTestDirectory() - { - return dirname(__FILE__); - } -} - -ContentsTest::$fixture = new TwoVisitsWithContents(); diff --git a/plugins/Contents/tests/System/expected/.gitkeep b/plugins/Contents/tests/System/expected/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml deleted file mode 100644 index 5a7e89f574172ae6872cfe09167d3cdc89757eed..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - Piwik test - January 3 – 9, 2010 - - Behaviour - Contents - Content Name - Contents - getContentNames - Content Name - This report shows the names of the content your visitors viewed and interacted with. - https://matomo.org/docs/content-tracking/ - - Impressions - Content Interactions - - - The number of times a content block, such as a banner or an ad, was displayed on a page. - The number of times a content block was interacted with (eg, a 'click' on a banner or ad). - The ratio of content impressions to interactions. - - - Interaction Rate - - - number - number - percent - - getContentNames - index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentNames&period=range&date=2010-01-03,2010-01-09 - index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentNames&period=day&date=2010-01-03,2010-01-09 - Contents_getContentNames - - - - Impressions - Content Interactions - Interaction Rate - - - - - - 8 - 2 - 25% - - - - 6 - 4 - 66.67% - - - - 4 - 0 - 0% - - - - - - - - - - - - - contentName==ImageAd - - - - contentName==Text+Ad - - - - contentName==Video+Ad - - - - - - - - - - - - 16 - 16 - 18 - 6 - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml deleted file mode 100644 index ad639602d126bdc8c6bd949355566cae7fb5b239..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - Piwik test - January 3 – 9, 2010 - - Behaviour - Contents - Content Piece - Contents - getContentPieces - Content Piece - This report shows the pieces of content your visitors viewed and interacted with. - https://matomo.org/docs/content-tracking/ - - Impressions - Content Interactions - - - The number of times a content block, such as a banner or an ad, was displayed on a page. - The number of times a content block was interacted with (eg, a 'click' on a banner or ad). - The ratio of content impressions to interactions. - - - Interaction Rate - - - number - number - percent - - getContentPieces - index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentPieces&period=range&date=2010-01-03,2010-01-09 - index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentPieces&period=day&date=2010-01-03,2010-01-09 - Contents_getContentPieces - - - - Impressions - Content Interactions - Interaction Rate - - - - - - 4 - 2 - 50% - - - - 2 - 2 - 100% - - - - 2 - 0 - 0% - - - - 2 - 2 - 100% - - - - 2 - 0 - 0% - - - - 4 - 0 - 0% - - - - 2 - 0 - 0% - - - - - - - - - - - - - contentPiece==Click+to+download+Piwik+now - - - - contentPiece==%2Fpath%2Fad.jpg - - - - contentPiece==%2Fpath%2Fad2.jpg - - - - contentPiece==Click+NOW - - - - - - - contentPiece==movie.mov - - - - contentPiece==Unknown - - - - - - - - - - - - 16 - 16 - 18 - 6 - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Actions.getPageUrls_day.xml b/plugins/Contents/tests/System/expected/test_Contents__Actions.getPageUrls_day.xml deleted file mode 100644 index bc4d78ee71ee6897e37c48935d45cb6b5ebc58fe..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Actions.getPageUrls_day.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - 2 - 2 - 2 - 540 - 2 - 0.0330 - 0.0330 - 2 - 0.3250 - 0.3250 - 2 - 0.1240 - 0.1240 - 2 - 0.3560 - 0.3560 - 2 - 0.2150 - 0.2150 - 2 - 0.0990 - 0.0990 - 0 - 0 - - - 2 - 2 - 2 - 542 - 2 - 2 - 2 - 0 - 0.033 - 0.325 - 0.124 - 0.356 - 0.215 - 0.099 - 1.152 - 270 - 100% - 100% - http://www.example.org/page - pageUrl==http%253A%252F%252Fwww.example.org%252Fpage - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Actions.getPageUrls_month.xml b/plugins/Contents/tests/System/expected/test_Contents__Actions.getPageUrls_month.xml deleted file mode 100644 index d6a5388c253ec74be60c09fc728b2b163d04223c..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Actions.getPageUrls_month.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - 2 - 2 - 540 - 2 - 0.0330 - 0.0330 - 2 - 0.3250 - 0.3250 - 2 - 0.1240 - 0.1240 - 2 - 0.3560 - 0.3560 - 2 - 0.2150 - 0.2150 - 2 - 0.0990 - 0.0990 - 0 - 0 - - - 2 - 2 - 542 - 2 - 2 - 2 - 2 - 2 - 0 - 0.033 - 0.325 - 0.124 - 0.356 - 0.215 - 0.099 - 1.152 - 270 - 100% - 100% - http://www.example.org/page - pageUrl==http%253A%252F%252Fwww.example.org%252Fpage - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Actions.get_day.xml b/plugins/Contents/tests/System/expected/test_Contents__Actions.get_day.xml deleted file mode 100644 index 7122d463752e4a8ff452830cdb54075dd09aacf7..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Actions.get_day.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 26 - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Actions.get_month.xml b/plugins/Contents/tests/System/expected/test_Contents__Actions.get_month.xml deleted file mode 100644 index 7122d463752e4a8ff452830cdb54075dd09aacf7..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Actions.get_month.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 26 - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentNames_day.xml b/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentNames_day.xml deleted file mode 100644 index fb6ce6eb1c8d66ce4c6db9dc9a1754ed7ef0c2c4..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentNames_day.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 8 - 8 - 8 - 2 - 25% - contentName==ImageAd - - - - 6 - 6 - 6 - 4 - 66.67% - contentName==Text+Ad - - - - 2 - 2 - 4 - 0 - 0% - contentName==Video+Ad - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentNames_month.xml b/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentNames_month.xml deleted file mode 100644 index a50c3d0d2c5d800bdb031144dd03131d5f094342..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentNames_month.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 8 - 8 - 2 - 8 - 25% - contentName==ImageAd - - - - 6 - 6 - 4 - 6 - 66.67% - contentName==Text+Ad - - - - 2 - 4 - 0 - 2 - 0% - contentName==Video+Ad - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentPieces_day.xml b/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentPieces_day.xml deleted file mode 100644 index fca86f9cea7ba058c8faecec6e3be054c66e09a7..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentPieces_day.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - 4 - 4 - 4 - 2 - 50% - contentPiece==Click+to+download+Piwik+now - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==%2Fpath%2Fad.jpg - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==%2Fpath%2Fad2.jpg - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==Click+NOW - - - - 2 - 2 - 2 - 0 - 0% - - - - 2 - 2 - 4 - 0 - 0% - contentPiece==movie.mov - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==Unknown - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentPieces_month.xml b/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentPieces_month.xml deleted file mode 100644 index d169477e3847dc13b27c68de3fa01867028cb608..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Contents.getContentPieces_month.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - 4 - 4 - 2 - 4 - 50% - contentPiece==Click+to+download+Piwik+now - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==%2Fpath%2Fad.jpg - - - - 2 - 2 - 0 - 2 - 0% - contentPiece==%2Fpath%2Fad2.jpg - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==Click+NOW - - - - 2 - 2 - 0 - 2 - 0% - - - - 2 - 4 - 0 - 2 - 0% - contentPiece==movie.mov - - - - 2 - 2 - 0 - 2 - 0% - contentPiece==Unknown - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml deleted file mode 100644 index 859ddd0fab353595cb886da790fe33a0001b6d10..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml +++ /dev/null @@ -1,749 +0,0 @@ - - - - 1 - 2 - 111.1.1.1 - - 14db763aafccd039 - - - action - http://www.example.org/page - Ads - 2 - - - 14 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 15 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 16 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 17 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 18 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 19 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 20 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 21 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 22 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 23 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 24 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 25 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 26 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - - - - - 1 - 1 - 156.5.3.2 - - e16cf2bbaeea2c88 - - - action - http://www.example.org/page - Ads - 2 - - - 1 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 2 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 3 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 4 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 5 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 6 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 7 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 8 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 9 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 10 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 11 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 12 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 13 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie, flash, java - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - plugins/Morpheus/icons/dist/plugins/flash.png - flash - - - plugins/Morpheus/icons/dist/plugins/java.png - java - - - - - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml deleted file mode 100644 index 859ddd0fab353595cb886da790fe33a0001b6d10..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml +++ /dev/null @@ -1,749 +0,0 @@ - - - - 1 - 2 - 111.1.1.1 - - 14db763aafccd039 - - - action - http://www.example.org/page - Ads - 2 - - - 14 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 15 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 16 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 17 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 18 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 19 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 20 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 21 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 22 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 23 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 24 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 25 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 26 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - - - - - 1 - 1 - 156.5.3.2 - - e16cf2bbaeea2c88 - - - action - http://www.example.org/page - Ads - 2 - - - 1 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 2 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 3 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 4 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 5 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 6 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 7 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 8 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 9 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 10 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 11 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 12 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 13 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie, flash, java - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - plugins/Morpheus/icons/dist/plugins/flash.png - flash - - - plugins/Morpheus/icons/dist/plugins/java.png - java - - - - - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Actions.getPageUrls_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Actions.getPageUrls_day.xml deleted file mode 100644 index bc4d78ee71ee6897e37c48935d45cb6b5ebc58fe..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Actions.getPageUrls_day.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - 2 - 2 - 2 - 540 - 2 - 0.0330 - 0.0330 - 2 - 0.3250 - 0.3250 - 2 - 0.1240 - 0.1240 - 2 - 0.3560 - 0.3560 - 2 - 0.2150 - 0.2150 - 2 - 0.0990 - 0.0990 - 0 - 0 - - - 2 - 2 - 2 - 542 - 2 - 2 - 2 - 0 - 0.033 - 0.325 - 0.124 - 0.356 - 0.215 - 0.099 - 1.152 - 270 - 100% - 100% - http://www.example.org/page - pageUrl==http%253A%252F%252Fwww.example.org%252Fpage - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Contents.getContentNames_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Contents.getContentNames_day.xml deleted file mode 100644 index fb6ce6eb1c8d66ce4c6db9dc9a1754ed7ef0c2c4..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Contents.getContentNames_day.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 8 - 8 - 8 - 2 - 25% - contentName==ImageAd - - - - 6 - 6 - 6 - 4 - 66.67% - contentName==Text+Ad - - - - 2 - 2 - 4 - 0 - 0% - contentName==Video+Ad - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Contents.getContentPieces_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Contents.getContentPieces_day.xml deleted file mode 100644 index fca86f9cea7ba058c8faecec6e3be054c66e09a7..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Contents.getContentPieces_day.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - 4 - 4 - 4 - 2 - 50% - contentPiece==Click+to+download+Piwik+now - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==%2Fpath%2Fad.jpg - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==%2Fpath%2Fad2.jpg - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==Click+NOW - - - - 2 - 2 - 2 - 0 - 0% - - - - 2 - 2 - 4 - 0 - 0% - contentPiece==movie.mov - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==Unknown - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml deleted file mode 100644 index 859ddd0fab353595cb886da790fe33a0001b6d10..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml +++ /dev/null @@ -1,749 +0,0 @@ - - - - 1 - 2 - 111.1.1.1 - - 14db763aafccd039 - - - action - http://www.example.org/page - Ads - 2 - - - 14 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 15 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 16 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 17 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 18 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 19 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 20 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 21 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 22 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 23 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 24 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 25 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 26 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - - - - - 1 - 1 - 156.5.3.2 - - e16cf2bbaeea2c88 - - - action - http://www.example.org/page - Ads - 2 - - - 1 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 2 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 3 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 4 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 5 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 6 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 7 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 8 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 9 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 10 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 11 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 12 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 13 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie, flash, java - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - plugins/Morpheus/icons/dist/plugins/flash.png - flash - - - plugins/Morpheus/icons/dist/plugins/java.png - java - - - - - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Actions.getPageUrls_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Actions.getPageUrls_day.xml deleted file mode 100644 index bc4d78ee71ee6897e37c48935d45cb6b5ebc58fe..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Actions.getPageUrls_day.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - 2 - 2 - 2 - 540 - 2 - 0.0330 - 0.0330 - 2 - 0.3250 - 0.3250 - 2 - 0.1240 - 0.1240 - 2 - 0.3560 - 0.3560 - 2 - 0.2150 - 0.2150 - 2 - 0.0990 - 0.0990 - 0 - 0 - - - 2 - 2 - 2 - 542 - 2 - 2 - 2 - 0 - 0.033 - 0.325 - 0.124 - 0.356 - 0.215 - 0.099 - 1.152 - 270 - 100% - 100% - http://www.example.org/page - pageUrl==http%253A%252F%252Fwww.example.org%252Fpage - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Contents.getContentNames_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Contents.getContentNames_day.xml deleted file mode 100644 index fb6ce6eb1c8d66ce4c6db9dc9a1754ed7ef0c2c4..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Contents.getContentNames_day.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 8 - 8 - 8 - 2 - 25% - contentName==ImageAd - - - - 6 - 6 - 6 - 4 - 66.67% - contentName==Text+Ad - - - - 2 - 2 - 4 - 0 - 0% - contentName==Video+Ad - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Contents.getContentPieces_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Contents.getContentPieces_day.xml deleted file mode 100644 index fca86f9cea7ba058c8faecec6e3be054c66e09a7..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Contents.getContentPieces_day.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - 4 - 4 - 4 - 2 - 50% - contentPiece==Click+to+download+Piwik+now - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==%2Fpath%2Fad.jpg - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==%2Fpath%2Fad2.jpg - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==Click+NOW - - - - 2 - 2 - 2 - 0 - 0% - - - - 2 - 2 - 4 - 0 - 0% - contentPiece==movie.mov - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==Unknown - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml deleted file mode 100644 index 859ddd0fab353595cb886da790fe33a0001b6d10..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml +++ /dev/null @@ -1,749 +0,0 @@ - - - - 1 - 2 - 111.1.1.1 - - 14db763aafccd039 - - - action - http://www.example.org/page - Ads - 2 - - - 14 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 15 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 16 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 17 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 18 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 19 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 20 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 21 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 22 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 23 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 24 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 25 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 26 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - - - - - 1 - 1 - 156.5.3.2 - - e16cf2bbaeea2c88 - - - action - http://www.example.org/page - Ads - 2 - - - 1 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 2 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 3 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 4 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 5 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 6 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 7 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 8 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 9 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 10 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 11 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 12 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 13 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie, flash, java - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - plugins/Morpheus/icons/dist/plugins/flash.png - flash - - - plugins/Morpheus/icons/dist/plugins/java.png - java - - - - - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Actions.getPageUrls_day.xml b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Actions.getPageUrls_day.xml deleted file mode 100644 index bc4d78ee71ee6897e37c48935d45cb6b5ebc58fe..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Actions.getPageUrls_day.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - 2 - 2 - 2 - 540 - 2 - 0.0330 - 0.0330 - 2 - 0.3250 - 0.3250 - 2 - 0.1240 - 0.1240 - 2 - 0.3560 - 0.3560 - 2 - 0.2150 - 0.2150 - 2 - 0.0990 - 0.0990 - 0 - 0 - - - 2 - 2 - 2 - 542 - 2 - 2 - 2 - 0 - 0.033 - 0.325 - 0.124 - 0.356 - 0.215 - 0.099 - 1.152 - 270 - 100% - 100% - http://www.example.org/page - pageUrl==http%253A%252F%252Fwww.example.org%252Fpage - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Contents.getContentNames_day.xml b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Contents.getContentNames_day.xml deleted file mode 100644 index fb6ce6eb1c8d66ce4c6db9dc9a1754ed7ef0c2c4..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Contents.getContentNames_day.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 8 - 8 - 8 - 2 - 25% - contentName==ImageAd - - - - 6 - 6 - 6 - 4 - 66.67% - contentName==Text+Ad - - - - 2 - 2 - 4 - 0 - 0% - contentName==Video+Ad - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Contents.getContentPieces_day.xml b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Contents.getContentPieces_day.xml deleted file mode 100644 index fca86f9cea7ba058c8faecec6e3be054c66e09a7..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Contents.getContentPieces_day.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - 4 - 4 - 4 - 2 - 50% - contentPiece==Click+to+download+Piwik+now - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==%2Fpath%2Fad.jpg - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==%2Fpath%2Fad2.jpg - - - - 2 - 2 - 2 - 2 - 100% - contentPiece==Click+NOW - - - - 2 - 2 - 2 - 0 - 0% - - - - 2 - 2 - 4 - 0 - 0% - contentPiece==movie.mov - - - - 2 - 2 - 2 - 0 - 0% - contentPiece==Unknown - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml deleted file mode 100644 index 859ddd0fab353595cb886da790fe33a0001b6d10..0000000000000000000000000000000000000000 --- a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml +++ /dev/null @@ -1,749 +0,0 @@ - - - - 1 - 2 - 111.1.1.1 - - 14db763aafccd039 - - - action - http://www.example.org/page - Ads - 2 - - - 14 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 15 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 16 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 17 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 18 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 19 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 20 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 21 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 22 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 23 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 24 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 25 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 26 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - - - - - 1 - 1 - 156.5.3.2 - - e16cf2bbaeea2c88 - - - action - http://www.example.org/page - Ads - 2 - - - 1 - 1.15s - - 271 - 4 min 31s - 1152 - 1 - Ads - http://www.example.org/page - - plugins/Morpheus/images/action.svg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 2 - ImageAd - Unknown - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - Unknown - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 3 - ImageAd - - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 4 - ImageAd - /path/ad.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 5 - ImageAd - /path/ad2.jpg - http://www.example.com - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - ImageAd - /path/ad2.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 6 - ImageAd - /path/ad.jpg - http://www.example.com - submit - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (submit) - ImageAd - /path/ad.jpg - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 7 - Text Ad - Click to download Piwik now - http://piwik.org/download - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 8 - Text Ad - Click NOW - http://piwik.org/ - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 9 - Text Ad - Click to download Piwik now - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 10 - Text Ad - Click NOW - http://piwik.org/download - click - - 1 - plugins/Morpheus/images/contentinteraction.png - plugins/Morpheus/images/contentinteraction.svg - Content Interaction (click) - Text Ad - Click NOW - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 11 - Text Ad - Click to download Piwik now - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Text Ad - Click to download Piwik now - - 0 M - - - 13 - http://www.example.org/page - - 3 - - - 12 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 13 - http://www.example.com/de/suche?q=foo - - 18 - - - 13 - Video Ad - movie.mov - - - - 1 - plugins/Morpheus/images/contentimpression.png - plugins/Morpheus/images/contentimpression.svg - Content Impression - Video Ad - movie.mov - - 0 M - - - 0 - USD - $ - - - - - Piwik test - - - - - - - - new - - 0 - - 1 - none - - 0 - 0 - 0 - - 271 - 4 min 31s - 0 - 1 - 1 - direct - Direct Entry - - - - - - - - - - - fr - French - Desktop - plugins/Morpheus/icons/dist/devices/desktop.png - Unknown - Generic Desktop - Windows XP - Windows - plugins/Morpheus/icons/dist/os/WIN.png - WIN - XP - Gecko - Gecko (Firefox) - Firefox 3.6 - Firefox - plugins/Morpheus/icons/dist/browsers/FF.png - FF - 3.6 - 0 - Europe - eur - France - fr - plugins/Morpheus/icons/dist/flags/fr.png - - - - France - - - 12:34:06 - 12 - 0 - 0 - 1024x768 - cookie, flash, java - - - plugins/Morpheus/icons/dist/plugins/cookie.png - cookie - - - plugins/Morpheus/icons/dist/plugins/flash.png - flash - - - plugins/Morpheus/icons/dist/plugins/java.png - java - - - - - - \ No newline at end of file diff --git a/plugins/Contents/tests/System/processed/.gitkeep b/plugins/Contents/tests/System/processed/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/plugins/CoreAdminHome/.gitignore b/plugins/CoreAdminHome/.gitignore deleted file mode 100644 index c8c9480010db494b8cf54ca8f9561e7a14ff51ea..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tests/System/processed/*xml \ No newline at end of file diff --git a/plugins/CoreAdminHome/API.php b/plugins/CoreAdminHome/API.php deleted file mode 100644 index b461bb27936b903a1a834e680cbe5f15172558fe..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/API.php +++ /dev/null @@ -1,531 +0,0 @@ -scheduler = $scheduler; - $this->invalidator = $invalidator; - $this->trackingFailures = $trackingFailures; - $this->optOutManager = $optOutManager; - } - - /** - * Will run all scheduled tasks due to run at this time. - * - * @return array Results for each executed scheduled task. - * @hideExceptForSuperUser - */ - public function runScheduledTasks(): array - { - Piwik::checkUserHasSuperUserAccess(); - - return $this->scheduler->run(); - } - - /** - * @param bool|string $enableBrowserTriggerArchiving - * @param int|string $todayArchiveTimeToLive - * @return true - * @internal - */ - public function setArchiveSettings($enableBrowserTriggerArchiving, $todayArchiveTimeToLive): bool - { - Piwik::checkUserHasSuperUserAccess(); - - if (!Controller::isGeneralSettingsAdminEnabled()) { - throw new Exception('General settings admin is not enabled'); - } - - Rules::setBrowserTriggerArchiving((bool)$enableBrowserTriggerArchiving); - Rules::setTodayArchiveTimeToLive($todayArchiveTimeToLive); - - return true; - } - - /** - * @param string[] $trustedHosts - * @return true - * @internal - */ - public function setTrustedHosts($trustedHosts): bool - { - Piwik::checkUserHasSuperUserAccess(); - - if (!Controller::isGeneralSettingsAdminEnabled()) { - throw new Exception('General settings admin is not enabled'); - } - - if (!empty($trustedHosts)) { - Url::saveTrustedHostnameInConfig($trustedHosts); - Config::getInstance()->forceSave(); - } - - return true; - } - - /** - * @param bool|string $useCustomLogo - * @param bool|string $hasCustomLogo - * @param bool|string $hasCustomFavicon - * @return array - * @internal - */ - public function setBrandingSettings($useCustomLogo, $hasCustomLogo, $hasCustomFavicon): array - { - Piwik::checkUserHasSuperUserAccess(); - $customLogo = new CustomLogo(); - $response = []; - - if (!$useCustomLogo || (!$hasCustomLogo && !$hasCustomFavicon)) { - $customLogo->removeLogos(); - $customLogo->disable(); - - $response['useCustomLogo'] = false; - - return $response; - } - - $customLogo->enable(); - $response['useCustomLogo'] = true; - if ($hasCustomLogo && $customLogo->hasTempLogo()) { - $customLogo->publishUserLogo(); - $response['customLogoPath'] = $customLogo->getPathUserLogo(); - } - if ($hasCustomFavicon && $customLogo->hasTempFavicon()) { - $customLogo->publishUserFavicon(); - $response['customFaviconPath'] = $customLogo->getPathUserFavicon(); - } - - return $response; - } - - /** - * Invalidates report data, forcing it to be recomputed during the next archiving run. - * - * Note: This is done automatically when tracking or importing visits in the past. - * - * @param string $idSites Comma-separated list of site IDs to invalidate reports for. - * @param string|string[] $dates Comma-separated list of dates or date ranges to invalidate. - * Use an array of strings when `$period` is `range`. - * @param 'day'|'week'|'month'|'year'|'range'|false $period The period type to invalidate. - * Invalidating one period also invalidates its parent periods. - * @param string|false $segment Optional segment to invalidate reports for. - * Example: "referrerName==example.com" - * Supports AND (;) and OR (,) operators. - * @param bool $cascadeDown If true, child periods will be invalidated as well. So if it is requested to invalidate - * a month, then all the weeks and days within that month will also be invalidated. But only - * if this parameter is set. - * @param bool $_forceInvalidateNonexistent Whether to also invalidate archives that do not currently exist. - * @return string[] Log messages describing the invalidation work that was scheduled. - * @hideExceptForSuperUser - */ - public function invalidateArchivedReports( - $idSites, - $dates, - $period = false, - $segment = false, - $cascadeDown = false, - $_forceInvalidateNonexistent = false - ): array { - $idSites = Site::getIdSitesFromIdSitesString($idSites, false, true); - if (empty($idSites)) { - throw new Exception("Specify a value for &idSites= as a comma separated list of website IDs, for which your token_auth has 'admin' permission"); - } - - Piwik::checkUserHasAdminAccess($idSites); - - if (!empty($segment)) { - $segment = new Segment($segment, $idSites); - } else { - $segment = null; - } - - /** Date[]|string[] $dates */ - [$dates, $invalidDates] = $this->getDatesToInvalidateFromString($dates, $period ?: null); - - $invalidationResult = $this->invalidator->markArchivesAsInvalidated($idSites, $dates, $period, $segment, (bool)$cascadeDown, (bool)$_forceInvalidateNonexistent); - - $output = $invalidationResult->makeOutputLogs(); - if ($invalidDates) { - $output[] = 'Warning: some of the Dates to invalidate were invalid: \'' . - implode("', '", $invalidDates) . "'. Matomo simply ignored those and proceeded with the others."; - } - - return $output; - } - - /** - * Initiates cron archiving via web request. - * - * @hideExceptForSuperUser - */ - public function runCronArchiving(): void - { - Piwik::checkUserHasSuperUserAccess(); - - // HTTP request: logs needs to be dumped in the HTTP response (on top of existing log destinations) - /** @var \Piwik\Log\Logger $logger */ - $logger = StaticContainer::get(LoggerInterface::class); - $handler = new StreamHandler('php://output', Logger::INFO); - $handler->setFormatter(StaticContainer::get('Piwik\Plugins\Monolog\Formatter\LineMessageFormatter')); - $logger->pushHandler($handler); - - $archiver = new CronArchive(); - $archiver->main(); - } - - /** - * Deletes all tracking failures this user has at least admin access to. - * A super user will also delete tracking failures for sites that don't exist. - * - */ - public function deleteAllTrackingFailures(): void - { - if (Piwik::hasUserSuperUserAccess()) { - $this->trackingFailures->deleteAllTrackingFailures(); - } else { - Piwik::checkUserHasSomeAdminAccess(); - $idSites = Access::getInstance()->getSitesIdWithAdminAccess(); - Piwik::checkUserHasAdminAccess($idSites); - $this->trackingFailures->deleteTrackingFailures($idSites); - } - } - - /** - * Deletes a specific tracking failure. - * - * @param int $idSite Site ID that owns the tracking failure. - * @param int|string $idFailure Tracking failure ID to delete. - */ - public function deleteTrackingFailure(int $idSite, $idFailure): void - { - Piwik::checkUserHasAdminAccess($idSite); - - $this->trackingFailures->deleteTrackingFailure($idSite, $idFailure); - } - - /** - * Get all tracking failures. A user retrieves only tracking failures for sites with at least admin access. - * A superuser will also retrieve failed requests for sites that don't exist. - * - * @return array> Tracking failures visible to the current user. - */ - public function getTrackingFailures(): array - { - if (Piwik::hasUserSuperUserAccess()) { - $failures = $this->trackingFailures->getAllFailures(); - } else { - Piwik::checkUserHasSomeAdminAccess(); - $idSites = Access::getInstance()->getSitesIdWithAdminAccess(); - Piwik::checkUserHasAdminAccess($idSites); - - $failures = $this->trackingFailures->getFailuresForSites($idSites); - } - - return $failures; - } - - /** - * @param 'day'|'week'|'month'|'year'|'range' $period - * @param string|null|false $segment - * @param string|null|false $plugin - * @param string|string[]|null|false $report - * @return array - * @internal - */ - public function archiveReports(int $idSite, string $period, string $date, $segment = false, $plugin = false, $report = false) - { - if ($this->shouldRequireSuperUserForArchiveReports()) { - Piwik::checkUserHasSuperUserAccess(); - } else { - Piwik::checkUserHasViewAccess($idSite); - } - - // if cron archiving is running, we will invalidate in CronArchive, not here - $isArchivePhpTriggered = SettingsServer::isArchivePhpTriggered(); - $invalidateBeforeArchiving = !$isArchivePhpTriggered; - - $period = Factory::build($period, $date); - $site = new Site($idSite); - $segmentObj = new Segment( - $segment, - [$idSite], - $period->getDateTimeStart()->setTimezone($site->getTimezone()), - $period->getDateTimeEnd()->setTimezone($site->getTimezone()) - ); - $parameters = new ArchiveProcessor\Parameters( - $site, - $period, - $segmentObj - ); - if ($report) { - $parameters->setArchiveOnlyReport($report); - } - - /** - * Triggered before a full archiveReports run starts. - * - * Usage example: - * Piwik::addAction('CoreAdminHome.archiveReports.start', function ($idSite, $period, $segment, $plugin, $report, $isArchivePhpTriggered) { ... }); - * - * @internal - */ - Piwik::postEvent('CoreAdminHome.archiveReports.start', [ - $idSite, - $period, - $segmentObj, - (string) $plugin, - $report, - $isArchivePhpTriggered, - ]); - - // TODO: need to test case when there are multiple plugin archives w/ only some data each. does purging remove some that we need? - $archiveLoader = new ArchiveProcessor\Loader($parameters, $invalidateBeforeArchiving); - - $result = $archiveLoader->prepareArchive($plugin); - if (!empty($result)) { - $result = [ - 'idarchives' => $result[0], - 'nb_visits' => $result[1], - ]; - } - - $idArchives = isset($result['idarchives']) ? (array) $result['idarchives'] : []; - $wasCached = $archiveLoader->didReuseArchive(); - - /** - * Triggered after a full archiveReports run completes. - * - * Usage example: - * Piwik::addAction('CoreAdminHome.archiveReports.complete', function ($idSite, $period, $segment, $plugin, $report, $isArchivePhpTriggered, $idArchives, $wasCached) { ... }); - * - * @internal - */ - Piwik::postEvent('CoreAdminHome.archiveReports.complete', [ - $idSite, - $period, - $segmentObj, - (string) $plugin, - $report, - $isArchivePhpTriggered, - $idArchives, - $wasCached, - ]); - - if (is_array($result) && $isArchivePhpTriggered) { - $result = $this->addPeakMemoryUsageToResult($result); - } - - return $result; - } - - private function addPeakMemoryUsageToResult(array $result): array - { - if (!function_exists('memory_get_peak_usage')) { - return $result; - } - - $peakMemoryBytes = memory_get_peak_usage(true); - $formatter = new Formatter(); - - $result['peak_memory_usage'] = $peakMemoryBytes; - $result['peak_memory_usage_pretty'] = $formatter->getPrettySizeFromBytes($peakMemoryBytes); - - return $result; - } - - private function shouldRequireSuperUserForArchiveReports(): bool - { - $rootApiMethod = $this->normalizeApiMethodName(Request::getRootApiRequestMethod() ?: ''); - $currentApiMethod = $this->normalizeApiMethodName(PiwikRequest::fromRequest()->getStringParameter('method', '')); - - // Require superuser for direct archiveReports calls and archiveReports inside bulk requests. - return $rootApiMethod === 'CoreAdminHome.archiveReports' - || ($rootApiMethod === 'API.getBulkRequest' && $currentApiMethod === 'CoreAdminHome.archiveReports'); - } - - private function normalizeApiMethodName(string $method): string - { - return preg_replace('/[^\w\.]+/', '', Common::sanitizeInputValue($method)); - } - - /** - * @param array|string $dates - * @param 'day'|'week'|'month'|'year'|'range'|null $period - * @return array{0: array, 1: string[]} - */ - private function getDatesToInvalidateFromString($dates, ?string $period): array - { - $toInvalidate = []; - $invalidDates = []; - - if (!is_array($dates)) { - if ($period !== 'range') { - $dates = explode(',', trim($dates)); - } else { - $dates = [trim($dates)]; - } - } - - $dates = array_unique($dates); - - foreach ($dates as $theDate) { - $theDate = trim($theDate); - - if ($period == 'range') { - try { - $periodObj = Factory::build('range', $theDate); - $subPeriods = $periodObj->getSubperiods(); - } catch (\Exception $e) { - $invalidDates[] = $theDate; - continue; - } - if (count($subPeriods)) { - $toInvalidate[] = $periodObj->getRangeString(); - } else { - $invalidDates[] = $theDate; - } - } else { - try { - $date = Date::factory($theDate); - } catch (\Exception $e) { - $invalidDates[] = $theDate; - continue; - } - - if ($date->toString() == $theDate || $theDate == 'today' || $theDate == 'yesterday') { - $toInvalidate[] = $date; - } else { - $invalidDates[] = $theDate; - } - } - } - - return [$toInvalidate, $invalidDates]; - } - - /** - * @internal - */ - public function getOptOutJSEmbedCode( - string $backgroundColor, - string $fontColor, - string $fontSize, - string $fontFamily, - bool $applyStyling, - bool $showIntro, - string $matomoUrl, - string $language - ): string { - - return $this->optOutManager->getOptOutJSEmbedCode( - $matomoUrl, - $language, - $backgroundColor, - $fontColor, - $fontSize, - $fontFamily, - $applyStyling, - $showIntro - ); - } - - /** - * @internal - */ - public function getOptOutSelfContainedEmbedCode( - string $backgroundColor, - string $fontColor, - string $fontSize, - string $fontFamily, - bool $applyStyling = false, - bool $showIntro = true - ): string { - return $this->optOutManager->getOptOutSelfContainedEmbedCode($backgroundColor, $fontColor, $fontSize, $fontFamily, $applyStyling, $showIntro); - } - - - /** - * @internal - */ - public function whatIsNewMarkAllChangesReadForCurrentUser(): bool - { - Piwik::checkUserHasSomeViewAccess(); - Piwik::checkUserIsNotAnonymous(); - - $model = new UsersModel(); - $user = $model->getUser(Piwik::getCurrentUserLogin()); - if (!empty($user)) { - $userChanges = new UserChanges($user); - $userChanges->markChangesAsRead(); - return true; - } - return false; - } -} diff --git a/plugins/CoreAdminHome/Commands/ConfigDelete.php b/plugins/CoreAdminHome/Commands/ConfigDelete.php deleted file mode 100644 index 5056bf4a9f737582e0814d03cac6034fa0a57ab3..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/ConfigDelete.php +++ /dev/null @@ -1,268 +0,0 @@ -setName('config:delete'); - $this->setDescription('Delete a config setting'); - $this->addOptionalArgument( - 'argument', - "A config setting in the format Section.key or Section.array_key[], e.g. 'Database.username' or 'PluginsInstalled.PluginsInstalled.CustomDimensions'" - ); - $this->addRequiredValueOption('section', 's', 'The section the INI config setting belongs to.'); - $this->addRequiredValueOption('key', 'k', 'The name of the INI config setting.'); - $this->addRequiredValueOption('value', 'i', 'For arrays, specify the array value to be deleted.'); - - $this->setHelp("This command can be used to delete a INI config setting. - -You can delete config values per the two sections below, where: -- [Section] is the name of the section, e.g. database or General. -- [config_setting_name] the name of the setting, e.g. username. -- [array_value] For arrays, the specific array value to delete. - -(1) By settings options --section=[Section] and --key=[config_setting_name], and optionally --value=[array_value]. Examples: -#Delete this setting. -$ ./console %command.name% --section=database --key=username -#Delete one value in an array: -$ ./console %command.name% --section=PluginsInstalled --key=PluginsInstalled --value=DevicesDetection - -OR - -(2) By using a command argument in the format [Section].[config_setting_name].[array_value]. Examples: -#Delete this setting. -$ ./console %command.name% 'database.username' -#Delete one value in an array: -$ ./console %command.name% 'PluginsInstalled.PluginsInstalled.DevicesDetection' - -NOTES: -- Settings may still appear to exist if they are set in global.ini.php or elsewhere. -- Section names, key names, and array values are all case-sensitive; so e.g. --section=Database fails but --section=database works. Look in config.ini.php and global.ini.php for the proper case. -- If no matching section/setting is found, the string \"" . self::MSG_NOTHING_FOUND . "\" shows. -- For safety, this tool cannot be used to delete a whole section of settings or an array of values in a single command. -"); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $output = $this->getOutput(); - - // Gather options, then discard ones that are empty so we do not need to check for empty later. - $options = array_filter([ - 'section' => $input->getOption('section'), - 'key' => $input->getOption('key'), - 'value' => $input->getOption('value'), - ]); - - $argument = trim($input->getArgument('argument') ?? ''); - - // Sanity check inputs. - switch (true) { - case empty($argument) && empty($options): - throw new \InvalidArgumentException('You must set either an argument or set options --section, --key and optional --value'); - case (!empty($argument) && !empty($options)): - throw new \InvalidArgumentException('You cannot set both an argument (' . serialize($argument) . ') and options (' . serialize($argument) . ')'); - case empty($argument) && (!isset($options['section']) || empty($options['section']) || !isset($options['key']) || empty($options['key'])): - throw new \InvalidArgumentException('When using options, --section and --key must be set'); - case (!empty($argument)): - $settingStr = $argument; - break; - case (!empty($options)): - $settingStr = implode('.', $options); - break; - default: - // We should not get here, but just in case. - throw new \Exception('Some unexpected error occurred parsing input values'); - } - - // Convenience wrapper used to augment SystemConfigSetting without extending SystemConfigSetting or adding random properties to the instance. - $settingWrapped = (object) [ - 'setting' => null, - 'isArray' => false, - 'arrayVal' => '', - ]; - - // Parse the $settingStr into a $settingWrapped object. - $settingWrapped = self::parseSettingStr($settingStr, $settingWrapped); - - // Check the setting exists and user has permissions, then populates the $settingWrapped properties. - $settingWrapped = $this->checkAndPopulate($settingWrapped); - - if (!isset($settingWrapped->setting) || empty($settingWrapped->setting)) { - $output->writeln(self::wrapInTag('comment', self::MSG_NOTHING_FOUND)); - } else { - // Pass both static and array config items out to the delete logic. - $result = $this->deleteConfigSetting($settingWrapped); - - if ($result) { - $output->writeln($this->wrapInTag('info', self::MSG_SUCCESS)); - } - } - - return self::SUCCESS; - } - - /** - * Check the setting exists and user has permissions, then return a new, populated SystemConfigSetting wrapper. - * - * @param object $settingWrapped A wrapped SystemConfigSetting object e.g. what is returned from parseSettingStr(). - * @return object A new wrapped SystemConfigSetting object. - */ - private function checkAndPopulate(object $settingWrapped): object - { - - // Sanity check inputs. - if (!($settingWrapped->setting instanceof SystemConfigSetting)) { - throw new \InvalidArgumentException('This function expects $settingWrapped->setting to be a SystemConfigSetting instance'); - } - - $config = Config::getInstance(); - - // Check the setting exists and user has permissions. If so, put it in the wrapper. - switch (true) { - case empty($sectionName = $settingWrapped->setting->getConfigSectionName()): - throw new \InvalidArgumentException('A section name must be specified'); - case empty($settingName = $settingWrapped->setting->getName()): - throw new \InvalidArgumentException('A setting name must be specified'); - case empty($section = $config->__get($sectionName)): - return new \stdClass(); - case empty($section = (object) $section) || !isset($section->$settingName): - return new \stdClass(); - default: - // We have a valid scalar or array setting in a valid section, so just fall out of the switch statement. - break; - } - - $settingWrappedNew = clone($settingWrapped); - $settingWrappedNew->isArray = is_array($section->$settingName); - - if (!$settingWrappedNew->isArray && !empty($settingWrappedNew->arrayVal)) { - throw new \InvalidArgumentException('This config setting is not an array'); - } - if ($settingWrappedNew->isArray) { - if (empty($settingWrappedNew->arrayVal)) { - throw new \InvalidArgumentException('This config setting is an array, but no array value was specified for deletion'); - } - if (false === array_search($settingWrappedNew->arrayVal, $section->$settingName)) { - return new \stdClass(); - } - } - - return $settingWrappedNew; - } - - /** - * Delete a single config section.setting or section.setting[array_key]. - * - * @param object $settingWrapped Wrapper around a setting object describing what to get e.g. from self::make(). - * @return bool True on success. If the delete fails, throws an exception. - */ - private function deleteConfigSetting(object $settingWrapped): bool - { - - // Sanity check inputs. - if (!($settingWrapped->setting instanceof SystemConfigSetting)) { - throw new \InvalidArgumentException('This function expects $settingWrapped->setting to be a SystemConfigSetting instance'); - } - - // Make easy shortcuts to some info. - $sectionName = $settingWrapped->setting->getConfigSectionName(); - $settingName = $settingWrapped->setting->getName(); - - // Get the actual config section. - $config = Config::getInstance(); - $section = $config->$sectionName; - $setting = $section[$settingName]; - - // Do the delete. - // This does not do the job with value=null or value='': $config->setSetting($sectionName, $settingName, $value). - switch (true) { - case $settingWrapped->isArray === true && empty($settingWrapped->arrayVal): - throw new \InvalidArgumentException('This function refuses to delete config arrays. See usage for how to delete config array values.'); - case $settingWrapped->isArray === true: - // Array config values. - - $key = array_search($settingWrapped->arrayVal, $setting); - if ($key !== false) { - unset($setting[$key]); - } - - // Save the setting into the section. - $section[$settingName] = $setting; - break; - default: - // Scalar config values. - // Remove the setting from the section. - unset($section[$settingName]); - break; - } - - // Save the section into the config. - $config->$sectionName = $section; - - // Save the config. - $config->forceSave(); - - return true; - } - - /** - * Build a SystemConfigSetting object from a string. - * - * @param string $settingStr Config setting string to parse. - * @return object A new wrapped SystemConfigSetting object. - */ - public static function parseSettingStr(string $settingStr, object $settingWrapped): object - { - - $matches = []; - if (!preg_match('/^([a-zA-Z0-9_]+)(?:\.([a-zA-Z0-9_]+))?(?:\[\])?(?:\.(.+))?/', $settingStr, $matches) || empty($matches[1])) { - throw new \InvalidArgumentException("Invalid input string='{$settingStr}': expected section.name or section.name[]"); - } - - - $settingName = $matches[2] ?? null; - $arrayVal = $matches[3] ?? null; - - $systemConfigSetting = new SystemConfigSetting( - // Setting name. - $settingName, - // Default value. - '', - // Type. - FieldConfig::TYPE_STRING, - // Plugin name. - 'core', - // Section name. - $matches[1] - ); - - $settingWrappedNew = clone($settingWrapped); - $settingWrappedNew->setting = $systemConfigSetting; - if ($settingWrappedNew->isArray = !empty($arrayVal)) { - $settingWrappedNew->arrayVal = $arrayVal; - } - - return $settingWrappedNew; - } -} diff --git a/plugins/CoreAdminHome/Commands/ConfigGet.php b/plugins/CoreAdminHome/Commands/ConfigGet.php deleted file mode 100644 index 0482435e9ce432f23c9fb95e60443b64276f3902..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/ConfigGet.php +++ /dev/null @@ -1,295 +0,0 @@ -setName('config:get'); - $this->setDescription('Get a config value or section'); - $this->addOptionalArgument( - 'argument', - "A config setting in the format Section.key or Section.array_key[], e.g. 'Database.username' or 'PluginsInstalled'" - ); - $this->addRequiredValueOption('section', 's', 'The section the INI config setting belongs to.'); - $this->addRequiredValueOption('key', 'k', 'The name of the INI config setting.'); - $this->addOptionalValueOption('format', 'f', 'Format the output as ' . json_encode(self::OUTPUT_FORMATS) . '; Default is ' . self::OUTPUT_FORMAT_DEFAULT, self::OUTPUT_FORMAT_DEFAULT); - - $this->setHelp("This command can be used to get a INI config setting or a whole section of settings on a Piwik instance. - -You can get config values per the two sections below, where: -- [Section] is the name of the section, e.g. database or General. -- [config_setting_name] the name of the setting, e.g. username. - -(1) By settings options --section=[Section] and --key=[config_setting_name]. The option --section is required. Examples: -#Return all settings in this section. -$ ./console %command.name% --section=database -#Return only this setting. -$ ./console %command.name% --section=database --key=username - -OR - -(2) By using a command argument in the format [Section].[config_setting_name]. Examples: -#Return all settings in this section. -$ ./console %command.name% 'database' -#Return all settings in this array; square brackets are optional. -$ ./console %command.name% 'PluginsInstalled.PluginsInstalled' -$ ./console %command.name% 'PluginsInstalled.PluginsInstalled[]' -#Return only this setting. -$ ./console %command.name% 'database.username' - -NOTES: -- Section and key names are case-sensitive; so e.g. --section=Database fails but --section=database works. Look in global.ini.php for the proper case. -- If no matching section/setting is found, the string \"" . self::MSG_NOTHING_FOUND . "\" shows. -- Else the output will be shown JSON-encoded. You can use something like https://stedolan.github.io/jq to parse it. -- If you ask for 'PluginsInstalled.PluginsInstalled[\"some_array_item\"]', it will ignore the array key (\"some_array_item\") and you will get back the whole array of values (e.g. all PluginsInstalled[] values). -"); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $output = $this->getOutput(); - - // Gather options, then discard ones with an empty value so we do not need to check for empty later. - $options = array_filter([ - 'section' => $input->getOption('section'), - 'key' => $input->getOption('key'), - ]); - - // If none specified, set default format. - $format = $input->getOption('format'); - if (empty($format) || !in_array($format, self::OUTPUT_FORMATS, true)) { - $format = self::OUTPUT_FORMAT_DEFAULT; - } - - $argument = trim($input->getArgument('argument') ?? ''); - - // If there are multiple arguments, just use the last one. - $argument = array_slice(explode(' ', $argument), -1)[0]; - - // Sanity check inputs. - switch (true) { - case empty($argument) && empty($options): - throw new \InvalidArgumentException('You must set either an argument or set options --section and optional --key'); - case (!empty($argument) && !empty($options)): - throw new \InvalidArgumentException('You cannot set both an argument (' . serialize($argument) . ') and options (' . serialize($argument) . ')'); - case empty($argument) && (!isset($options['section']) || empty($options['section'])): - throw new \InvalidArgumentException('When using options, the --section value must be set'); - case (!empty($argument)): - $settingStr = $argument; - break; - case (!empty($options)): - $settingStr = implode('.', $options); - break; - default: - // We should not get here, but just in case. - throw new \Exception('Some unexpected error occurred in ' . __FUNCTION__ . ' at line ' . __LINE__); - } - - // Parse the $settingStr into a SystemConfigSetting object. - $setting = self::parseSettingStr($settingStr); - - $result = $this->getConfigValue(Config::getInstance(), $setting); - - if (empty($result)) { - $output->writeln(self::wrapInTag('comment', self::MSG_NOTHING_FOUND)); - } else { - $output->writeln($this->formatVariableForOutput($setting, $result, $format)); - } - - return self::SUCCESS; - } - - /** - * Get a config section or section.value. - * - * @param Config $config A Matomo Config instance. - * @param SystemConfigSetting $setting A setting object describing what to get e.g. from self::make(). - * @return Mixed The config section or value. - */ - private function getConfigValue(Config $config, SystemConfigSetting $setting) - { - - // This should have been caught in the calling function, so assume a bad implementation and throw an error. - if (empty($sectionName = $setting->getConfigSectionName())) { - throw new \InvalidArgumentException('A section name must be specified'); - } - if (empty($section = $config->__get($sectionName))) { - return null; - } - - // Convert array to object since it is slightly cleaner/easier to work with. - $section = (object) $section; - - // Look for the specific setting. - $settingName = $setting->getName(); - - // Return the whole setting section if requested. - // The name=FAKE_SETTING_NAME is a placeholder for when no setting is specified. - if (empty($settingName) || $settingName === self::NO_SETTING_NAME_FOUND_PLACEHOLDER) { - $sectionContents = $section; - return (array) $sectionContents; - } - - - switch (true) { - case (!isset($section->$settingName)): - $settingValue = null; - break; - case is_array($settingValue = $section->$settingName): - break; - default: - $settingValue = $setting->getValue(); - } - - return $settingValue; - } - - /** - * Build a SystemConfigSetting object from a string. - * - * @param string $settingStr Config setting string to parse. - * @return SystemConfigSetting A SystemConfigSetting object. - */ - public static function parseSettingStr(string $settingStr): SystemConfigSetting - { - - $matches = []; - if (!preg_match('/^([a-zA-Z0-9_]+)(?:\.([a-zA-Z0-9_]+))?(\[\])?/', $settingStr, $matches) || empty($matches[1])) { - throw new \InvalidArgumentException("Invalid input string='{$settingStr}' =expected section.name or section.name[]"); - } - - - return new SystemConfigSetting( - // Setting name. SystemConfigSetting throws an error if the setting name is empty, so use placeholder that flags that no setting was specified. - $matches[2] ?? self::NO_SETTING_NAME_FOUND_PLACEHOLDER, - // Default value. - '', - // Type. - FieldConfig::TYPE_STRING, - // Plugin name. - 'core', - // Section name. - $matches[1] - ); - } - - /** - * Format the config setting to the specified output format. - * - * @param SystemConfigSetting $setting The found SystemConfigSetting. - * @param mixed $var The config setting -- either scalar or an array of settings. - * @param string $format The output format: One of self::OUTPUT_FORMAT_DEFAULT. - * @return string The formatted output. - */ - private function formatVariableForOutput(SystemConfigSetting $setting, $var, string $format = self::OUTPUT_FORMAT_DEFAULT): string - { - - switch ($format) { - case 'json': - return $this->toJson($var); - case 'yaml': - return $this->toYaml($var); - case 'text': - return $this->toText($setting, $var); - default: - throw new \InvalidArgumentException('Unsupported output format'); - } - } - - /** - * Convert $var to a YAML string. - * Throws an error on invalid types (a PHP resource or object). - * - * @param mixed $var The variable to convert. - * @return string The Yaml-formatted string. - */ - private function toYaml($var): string - { - - // Remove leading dash and spaces Spyc adds so we just output the bare value. - return trim(ltrim(Spyc::YAMLDump($var, 2, 0, true), '-')); - } - - /** - * Convert $var to a JSON string. - * Throws an error on json_encode failure. - * - * @param mixed $var The variable to convert. - * @return string The JSON-formatted string. - */ - private function toJson($var): string - { - $result = json_encode($var, JSON_UNESCAPED_SLASHES); - if ($result === false) { - throw new \Exception('Failed to json_encode'); - } - - return $result; - } - - /** - * Convert $var to Symfony-colorized CLI output text. - * - * @param SystemConfigSetting $setting The found SystemConfigSetting. - * @param mixed $var The thing to format: Config scalar values lead to $var being scalar; Config array values lead to $var being an array of scalars; Config sections lead to $var being a mixed array of both scalar and array values. - * @return string The formatted result. - */ - private function toText(SystemConfigSetting $setting, $var): string - { - - // Strip off the NO_SETTING_NAME_FOUND_PLACEHOLDER. - $settingName = $setting->getName() === self::NO_SETTING_NAME_FOUND_PLACEHOLDER ? '' : $setting->getName(); - $sectionAndSettingName = implode('.', array_filter([$setting->getConfigSectionName(), $settingName])); - - $output = ''; - - switch (true) { - case is_array($var): - $output .= $this->wrapInTag('info', ($settingName ? $sectionAndSettingName : "[{$sectionAndSettingName}]") . PHP_EOL); - $output .= $this->wrapInTag('info', '--' . PHP_EOL); - foreach ($var as $thisSettingName => &$val) { - if (is_array($val)) { - foreach ($val as &$arrayVal) { - $output .= $this->wrapInTag('info', "{$thisSettingName}[] = " . $this->wrapInTag('comment', $arrayVal)) . PHP_EOL; - } - } else { - $output .= $this->wrapInTag('info', $thisSettingName . ' = ' . $this->wrapInTag('comment', $val)) . PHP_EOL; - } - } - $output .= $this->wrapInTag('info', '--' . PHP_EOL); - break; - case is_scalar($var): - $output .= $this->wrapInTag('info', $sectionAndSettingName . ' = ' . $this->wrapInTag('comment', $var)); - break; - default: - throw new \InvalidArgumentException('Cannot output unknown type'); - } - - return $output; - } -} diff --git a/plugins/CoreAdminHome/Commands/DeleteLogsData.php b/plugins/CoreAdminHome/Commands/DeleteLogsData.php deleted file mode 100644 index 46b3eb8effbfc8c7bbf45f49f1a65a6d4c5799b3..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/DeleteLogsData.php +++ /dev/null @@ -1,207 +0,0 @@ -logDeleter = $logDeleter ?: StaticContainer::get('Piwik\LogDeleter'); - $this->rawLogDao = $rawLogDao ?: StaticContainer::get('Piwik\DataAccess\RawLogDao'); - } - - protected function configure() - { - $this->setName('core:delete-logs-data'); - $this->setDescription('Delete data from the user log tables: ' . implode(', ', self::$logTables) . '.'); - $this->addRequiredValueOption('dates', null, 'Delete log data with a date within this date range. Eg, 2012-01-01,2013-01-01'); - $this->addOptionalValueOption( - 'idsite', - null, - 'Delete log data belonging to the site with this ID. Comma separated list of website id. Eg, 1, 2, 3, etc. By default log data from all sites is purged.' - ); - $this->addRequiredValueOption('limit', null, "The number of rows to delete at a time. The larger the number, " - . "the more time is spent deleting logs, and the less progress will be printed to the screen.", 1000); - $this->addNoValueOption( - 'optimize-tables', - null, - "If supplied, the command will optimize log tables after deleting logs. Note: this can take a very long time." - ); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $output = $this->getOutput(); - - [$from, $to] = $this->getDateRangeToDeleteFrom(); - $idSite = $this->getSiteToDeleteFrom(); - $step = $this->getRowIterationStep(); - - $output->writeln(sprintf( - "Preparing to delete all visits belonging to %s between $from and $to.", - $idSite ? "website $idSite" : "ALL websites" - )); - - $confirm = $this->askForDeleteConfirmation(); - if (!$confirm) { - return self::FAILURE; - } - - $timer = new Timer(); - - try { - $logsDeleted = $this->logDeleter->deleteVisitsFor($from, $to, $idSite, $step, function () use ($output) { - $output->write('.'); - }); - } catch (\Exception $ex) { - $output->writeln(''); - - throw $ex; - } - - $this->writeSuccessMessage("Successfully deleted {$logsDeleted} visits. {$timer}"); - - if ($input->getOption('optimize-tables')) { - $this->optimizeTables(); - } - - return self::SUCCESS; - } - - /** - * @return string[] - */ - private function getDateRangeToDeleteFrom() - { - $dates = $this->getInput()->getOption('dates'); - if (empty($dates)) { - throw new \InvalidArgumentException("No date range supplied in --dates option. Deleting all logs by default is not allowed, you must specify a date range."); - } - - $parts = explode(',', $dates); - $parts = array_map('trim', $parts); - - if (count($parts) !== 2) { - throw new \InvalidArgumentException("Invalid date range supplied: $dates"); - } - - [$start, $end] = $parts; - - try { - /** @var Date[] $dateObjects */ - $dateObjects = array(Date::factory($start), Date::factory($end)); - } catch (\Exception $ex) { - throw new \InvalidArgumentException("Invalid date range supplied: $dates (" . $ex->getMessage() . ")", $code = 0, $ex); - } - - if ($dateObjects[0]->getTimestamp() > $dateObjects[1]->getTimestamp()) { - throw new \InvalidArgumentException("Invalid date range supplied: $dates (first date is older than the last date)"); - } - - $dateObjects = array($dateObjects[0]->getDatetime(), $dateObjects[1]->getDatetime()); - - return $dateObjects; - } - - private function getSiteToDeleteFrom() - { - $idSite = $this->getInput()->getOption('idsite'); - - if (is_null($idSite)) { - return $idSite; - } - // validate the site ID - try { - new Site($idSite); - } catch (\Exception $ex) { - throw new \InvalidArgumentException("Invalid site ID: $idSite", $code = 0, $ex); - } - - return $idSite; - } - - private function getRowIterationStep() - { - $step = (int) $this->getInput()->getOption('limit'); - - if ($step <= 0) { - throw new \InvalidArgumentException("Invalid row limit supplied: $step. Must be a number greater than 0."); - } - - return $step; - } - - private function askForDeleteConfirmation() - { - if (!$this->getInput()->isInteractive()) { - return true; - } - - return $this->askForConfirmation( - 'You are about to delete log data. This action cannot be undone, are you sure you want to continue? (Y/N) ', - false - ); - } - - private function optimizeTables() - { - foreach (self::$logTables as $table) { - $this->getOutput()->write("Optimizing table $table... "); - - $timer = new Timer(); - - $prefixedTable = Common::prefixTable($table); - - $done = Db\Schema::getInstance()->optimizeTables([$prefixedTable]); - - if ($done) { - $this->getOutput()->writeln("done. " . $timer . ""); - } else { - $this->getOutput()->writeln("skipped! " . $timer . ""); - } - } - - $this->writeSuccessMessage('Table optimization finished.'); - } -} diff --git a/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php b/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php deleted file mode 100644 index 2d3152c61874af48b52b88a51f21382b6d82116e..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php +++ /dev/null @@ -1,199 +0,0 @@ -archiveInvalidator = $invalidator ?: StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); - $this->duplicateActionRemover = $duplicateActionRemover ?: new DuplicateActionRemover(); - $this->actionsAccess = $actionsAccess ?: new Actions(); - $this->logger = $logger ?: StaticContainer::get(LoggerInterface::class); - } - - protected function configure() - { - $this->setName('core:fix-duplicate-log-actions'); - $this->addNoValueOption('invalidate-archives', null, "If supplied, archives for logs that use duplicate actions will be invalidated." - . " On the next cron archive run, the reports for those dates will be re-processed."); - $this->setDescription('Removes duplicates in the log action table and fixes references to the duplicates in ' - . 'related tables. NOTE: This action can take a long time to run!'); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $output = $this->getOutput(); - - $invalidateArchives = $input->getOption('invalidate-archives'); - - $timer = new Timer(); - - $duplicateActions = $this->duplicateActionRemover->getDuplicateIdActions(); - if (empty($duplicateActions)) { - $output->writeln("Found no duplicate actions."); - return self::SUCCESS; - } - - $output->writeln("Found " . count($duplicateActions) . " actions with duplicates."); - - list($numberRemoved, $allArchivesAffected) = $this->fixDuplicateActionReferences($duplicateActions); - - $this->deleteDuplicatesFromLogAction($duplicateActions); - - if ($invalidateArchives) { - $this->invalidateArchivesUsingActionDuplicates($allArchivesAffected); - } else { - $this->printAffectedArchives($allArchivesAffected); - } - - $logActionTable = Common::prefixTable('log_action'); - $this->writeSuccessMessage(array( - "Found and deleted $numberRemoved duplicate action entries in the $logActionTable table.", - "References in log_link_visit_action, log_conversion and log_conversion_item were corrected.", - $timer->__toString(), - )); - - return self::SUCCESS; - } - - private function invalidateArchivesUsingActionDuplicates($archivesAffected) - { - $this->getOutput()->write("Invalidating archives affected by duplicates fixed..."); - foreach ($archivesAffected as $archiveInfo) { - $dates = array(Date::factory($archiveInfo['server_time'])); - $this->archiveInvalidator->markArchivesAsInvalidated(array($archiveInfo['idsite']), $dates, $period = false); - } - $this->getOutput()->writeln("Done."); - } - - private function printAffectedArchives($allArchivesAffected) - { - $this->getOutput()->writeln("The following archives used duplicate actions and should be invalidated if you want correct reports:"); - foreach ($allArchivesAffected as $archiveInfo) { - $this->getOutput()->writeln("\t[ idSite = {$archiveInfo['idsite']}, date = {$archiveInfo['server_time']} ]"); - } - } - - private function fixDuplicateActionReferences($duplicateActions) - { - $dupeCount = count($duplicateActions); - - $numberRemoved = 0; - $allArchivesAffected = array(); - - foreach ($duplicateActions as $index => $dupeInfo) { - $name = $dupeInfo['name']; - $toIdAction = $dupeInfo['idaction']; - $fromIdActions = $dupeInfo['duplicateIdActions']; - - $numberRemoved += count($fromIdActions); - - $this->getOutput()->writeln("[$index / $dupeCount] Fixing duplicates for '$name'"); - - $this->logger->debug(" idaction = {idaction}, duplicate idactions = {duplicateIdActions}", array( - 'idaction' => $toIdAction, - 'duplicateIdActions' => $fromIdActions, - )); - - foreach (DuplicateActionRemover::$tablesWithIdActionColumns as $table) { - $archivesAffected = $this->fixDuplicateActionsInTable($table, $toIdAction, $fromIdActions); - $allArchivesAffected = array_merge($allArchivesAffected, $archivesAffected); - } - } - - $allArchivesAffected = array_values(array_unique($allArchivesAffected, SORT_REGULAR)); - - return array($numberRemoved, $allArchivesAffected); - } - - private function fixDuplicateActionsInTable($table, $toIdAction, $fromIdActions) - { - $timer = new Timer(); - - $archivesAffected = $this->duplicateActionRemover->getSitesAndDatesOfRowsUsingDuplicates($table, $fromIdActions); - - $this->duplicateActionRemover->fixDuplicateActionsInTable($table, $toIdAction, $fromIdActions); - - $this->getOutput()->writeln("\tFixed duplicates in " . Common::prefixTable($table) . ". " . $timer->__toString() . "."); - - return $archivesAffected; - } - - private function deleteDuplicatesFromLogAction($duplicateActions) - { - $logActionTable = Common::prefixTable('log_action'); - $this->getOutput()->writeln("Deleting duplicate actions from $logActionTable..."); - - $idActions = []; - foreach ($duplicateActions as $dupeInfo) { - $idActions = array_merge($idActions, $dupeInfo['duplicateIdActions']); - } - - $this->actionsAccess->delete($idActions); - } -} diff --git a/plugins/CoreAdminHome/Commands/InvalidateReportData.php b/plugins/CoreAdminHome/Commands/InvalidateReportData.php deleted file mode 100644 index 9e469470a0fd0354a012621fbe01ace2f919d0a6..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/InvalidateReportData.php +++ /dev/null @@ -1,487 +0,0 @@ ->|null - * @phpstan-var list|null - */ - private $allSegments = null; - - /** - * @var LoggerInterface - */ - private $logger; - - /** - * @var ArchiveInvalidator - */ - private $invalidator; - - public function __construct() - { - parent::__construct(); - - $this->logger = StaticContainer::get(LoggerInterface::class); - $this->invalidator = StaticContainer::get(ArchiveInvalidator::class); - } - - protected function configure() - { - $this->setName('core:invalidate-report-data'); - $this->setDescription('Invalidate archived report data by date range, site and period.'); - $this->addRequiredValueOption( - 'dates', - null, - 'List of dates or date ranges to invalidate report data for, eg, 2015-01-03 or 2015-01-05,2015-02-12.', - null, - true - ); - $this->addRequiredValueOption( - 'sites', - null, - 'List of site IDs to invalidate report data for, eg, "1,2,3,4" or "all" for all sites.', - self::ALL_OPTION_VALUE - ); - $this->addRequiredValueOption( - 'periods', - null, - 'List of period types to invalidate report data for. Can be one or more of the following values: day, ' - . 'week, month, year, range or "all" for all of them.', - self::ALL_OPTION_VALUE - ); - $this->addRequiredValueOption( - 'segment', - null, - 'List of segments to invalidate report data for. This can be the segment string itself, the segment name from the UI or the ID of the segment.' - . ' If specifying the segment definition, make sure it is encoded properly (it should be the same as the segment parameter in the URL).' - . ' If no segment is provided, all segments (including all visits) will be invalidated. To specifically invalidate all visits --segment="" can be provided.', - null, - true - ); - $this->addNoValueOption( - 'cascade', - null, - 'If supplied, invalidation will cascade, invalidating child period types even if they aren\'t specified in' - . ' --periods. For example, if --periods=week, --cascade will cause the days within those weeks to be ' - . 'invalidated as well. If --periods=month, then weeks and days will be invalidated. Note: if a period ' - . 'falls partly outside of a date range, then --cascade will also invalidate data for child periods ' - . 'outside the date range. For example, if --dates=2015-09-14,2015-09-15 & --periods=week, --cascade will' - . ' also invalidate all days within 2015-09-13,2015-09-19, even those outside the date range.' - ); - $this->addNoValueOption('dry-run', null, 'For tests. Runs the command w/o actually ' - . 'invalidating anything.'); - $this->addRequiredValueOption('plugin', null, 'To invalidate data for a specific plugin only.'); - $this->addNoValueOption( - 'ignore-log-deletion-limit', - null, - 'Ignore the log purging limit when invalidating archives. If a date is older than the log purging threshold (which means ' - . 'there should be no log data for it), we normally skip invalidating it in order to prevent losing any report data. In some cases, ' - . 'however it is useful, if, for example, your site was imported from Google, and there is never any log data.' - ); - $this->setHelp('Invalidate archived report data by date range, site and period. Invalidated archive data will ' - . 'be re-archived during the next core:archive run. If your log data has changed for some reason, this ' - . 'command can be used to make sure reports are generated using the new, changed log data.'); - } - - protected function doExecute(): int - { - $sites = $this->getSitesToInvalidateFor(); - $periodTypes = $this->getPeriodTypesToInvalidateFor(); - $dateRanges = $this->getDateRangesToInvalidateFor(); - $segments = $this->getSegmentsToInvalidateFor($sites); - - foreach ($periodTypes as $periodType) { - if ($periodType === 'range') { - $this->invalidateRangePeriods($dateRanges, $segments, $sites); - } else { - $this->invalidateNonRangePeriods($periodType, $dateRanges, $segments, $sites); - } - } - - return self::SUCCESS; - } - - private function getSegmentsWithSitesToProcess( - array $segments, - array $sites, - bool $ignoreInvalidSegments = false - ): array { - $segmentDetails = []; - - // check availability of provided segments for all sites - foreach ($segments as $segmentStr) { - // determine sites where current segment is available for - $sitesToProcess = $this->getSitesForSegment($segmentStr, $sites); - $segment = null; - - try { - $segment = new Segment($segmentStr, $sitesToProcess); - } catch (Exception $e) { - if (!$ignoreInvalidSegments) { - throw $e; - } - } - - if (empty($sitesToProcess)) { - // segment not available for any site - $this->logger->info("Segment [$segmentStr] not available for any site, skipping it..."); - continue; - } - - $sitesDiff = array_diff($sites, $sitesToProcess); - - if (count($sitesDiff)) { - $this->logger->info( - "Segment [$segmentStr] not available for all sites, skipping this segment for sites [ " - . implode(', ', $sitesDiff) . " ]." - ); - } - - $segmentDetails[$segmentStr] = [ - 'segment' => $segment, - 'sites' => $sitesToProcess, - ]; - } - - return $segmentDetails; - } - - private function invalidateNonRangePeriods( - string $periodType, - array $dateRangesToInvalidate, - array $segments, - array $sites - ): void { - $ignoreLogDeletionLimit = $this->getInput()->getOption('ignore-log-deletion-limit'); - $cascade = $this->getInput()->getOption('cascade'); - $dryRun = $this->getInput()->getOption('dry-run'); - $plugin = $this->getInput()->getOption('plugin'); - - foreach ($dateRangesToInvalidate as $dateRange) { - foreach ($segments as $segmentStr => $segmentData) { - $sitesToProcess = $segmentData['sites']; - $segment = $segmentData['segment']; - - $this->logger->info("Invalidating $periodType periods in $dateRange for site = [ " - . implode(', ', $sitesToProcess) . " ], segment = [ $segmentStr ]..."); - - $dates = $this->getPeriodDates($periodType, $dateRange); - - if ($dryRun) { - $message = "[Dry-run] invalidating archives for site = [ " . implode(', ', $sitesToProcess) - . " ], dates = [ " . implode(', ', $dates) . " ], period = [ $periodType ], segment = [ " - . "$segmentStr ], cascade = [ " . (int)$cascade . " ]"; - if (!empty($plugin)) { - $message .= ", plugin = [ $plugin ]"; - } - $this->logger->info($message); - } else { - $invalidationResult = $this->invalidator->markArchivesAsInvalidated( - $sitesToProcess, - $dates, - $periodType, - $segment, - $cascade, - false, - $plugin, - $ignoreLogDeletionLimit - ); - - if ($this->getOutput()->getVerbosity() > $this->getOutput()::VERBOSITY_NORMAL) { - foreach ($invalidationResult->makeOutputLogs() as $outputLog) { - $this->logger->info($outputLog); - } - } - } - } - } - } - - private function invalidateRangePeriods(array $dateRangesToInvalidate, array $segments, array $sites): void - { - $dryRun = $this->getInput()->getOption('dry-run'); - $plugin = $this->getInput()->getOption('plugin'); - $periods = trim($this->getInput()->getOption('periods')); - $isUsingAllOption = $periods === self::ALL_OPTION_VALUE; - $rangeDates = []; - - foreach ($dateRangesToInvalidate as $dateRange) { - if ( - $isUsingAllOption - && !Period::isMultiplePeriod($dateRange, 'day') - ) { - continue; // not a range, nothing to do... only when "all" option is used - } - - $rangeDates[] = $this->getPeriodDates('range', $dateRange); - } - - if (!empty($rangeDates)) { - foreach ($segments as $segmentStr => $segmentData) { - $sitesToProcess = $segmentData['sites']; - $segment = $segmentData['segment']; - - if ($dryRun) { - $dateRangeStr = implode(';', $dateRangesToInvalidate); - $this->logger->info("Invalidating range periods overlapping $dateRangeStr for " - . "site = [ " . implode(', ', $sitesToProcess) . " ], segment = [ $segmentStr ]..."); - } else { - $this->invalidator->markArchivesOverlappingRangeAsInvalidated($sitesToProcess, $rangeDates, $segment, $plugin); - } - } - } - } - - /** - * Returns all sites where the given segment is available for - */ - private function getSitesForSegment(string $segmentStr, array $idSites): array - { - $sitesToProcess = []; - - foreach ($idSites as $idSite) { - try { - $segment = new Segment($segmentStr, $idSite); - $sitesToProcess[] = $idSite; - } catch (Exception $e) { - continue; - } - } - - return $sitesToProcess; - } - - /** - * Parses, validates and returns the provided list of site ids - */ - private function getSitesToInvalidateFor(): array - { - $sites = $this->getInput()->getOption('sites'); - - $siteIds = Site::getIdSitesFromIdSitesString($sites); - if (empty($siteIds)) { - throw new \InvalidArgumentException("Invalid --sites value: '$sites'."); - } - - $allSiteIds = SitesManagerAPI::getInstance()->getAllSitesId(); - foreach ($siteIds as $idSite) { - if (!in_array($idSite, $allSiteIds)) { - throw new \InvalidArgumentException("Invalid --sites value: '$sites', there are no sites with IDs = $idSite"); - } - } - - return $siteIds; - } - - /** - * Parses, validates and returns the provided list of period types - * If 'all' is provided, this will be converted to a list of all period types - */ - private function getPeriodTypesToInvalidateFor(): array - { - $periods = $this->getInput()->getOption('periods'); - if (empty($periods)) { - throw new \InvalidArgumentException("The --periods argument is required."); - } - - if ($periods == self::ALL_OPTION_VALUE) { - $result = array_keys(Piwik::$idPeriods); - return $result; - } - - $periods = explode(',', $periods); - $periods = array_map('trim', $periods); - - foreach ($periods as $periodIdentifier) { - if (!isset(Piwik::$idPeriods[$periodIdentifier])) { - throw new \InvalidArgumentException("Invalid period type '$periodIdentifier' supplied in --periods."); - } - } - - return $periods; - } - - /** - * Returns the list of provided dates / date ranges - */ - private function getDateRangesToInvalidateFor(): array - { - $dateRanges = $this->getInput()->getOption('dates'); - if (empty($dateRanges)) { - throw new \InvalidArgumentException("The --dates option is required."); - } - - return is_array($dateRanges) ? $dateRanges : [$dateRanges]; - } - - private function getPeriodDates($periodType, $dateRange) - { - if (!isset(Piwik::$idPeriods[$periodType])) { - throw new \InvalidArgumentException("Invalid period type '$periodType'."); - } - - try { - $period = PeriodFactory::build($periodType, $dateRange); - } catch (\Exception $ex) { - throw new \InvalidArgumentException("Invalid date or date range specifier '$dateRange'", $code = 0, $ex); - } - - $result = []; - if ($periodType === 'range') { - $result[] = $period->getDateStart(); - $result[] = $period->getDateEnd(); - } elseif ($period instanceof Range) { - foreach ($period->getSubperiods() as $subperiod) { - $result[] = $subperiod->getDateStart(); - } - } else { - $result[] = $period->getDateStart(); - } - return $result; - } - - /** - * Parses, validates and returns the list of segments that can be invalidated for the provided sites - * If no segment is provided, a list of all segments available for the provided sites will be returned (including all visits segment) - * - * @param array $idSites - */ - private function getSegmentsToInvalidateFor(array $idSites): array - { - $input = $this->getInput(); - $segments = $input->getOption('segment'); - $segments = array_map('trim', $segments); - $segments = array_unique($segments); - - if (empty($segments)) { - $this->logger->debug("No segment provided. Invalidating all stored segments."); - $segments = Rules::getSegmentsToProcess($idSites); - array_unshift($segments, ""); - return $this->getSegmentsWithSitesToProcess($segments, $idSites, true); - } - - $result = []; - - foreach ($segments as $segmentOptionValue) { - if ($segmentOptionValue === "") { - $result[] = ""; - continue; - } - - $segmentDefinition = $this->findSegment($segmentOptionValue, $idSites); - - if (empty($segmentDefinition)) { - continue; - } - - $result[] = $segmentDefinition; - } - - return $this->getSegmentsWithSitesToProcess($result, $idSites); - } - - /** - * @param array $idSites - */ - private function findSegment(string $segmentOptionValue, array $idSites) - { - $allSegments = $this->getAllSegments($idSites); - - foreach ($allSegments as $segment) { - if ( - !empty($segment['enable_only_idsite']) - && !in_array($segment['enable_only_idsite'], $idSites) - ) { - continue; - } - - if ($segmentOptionValue == $segment['idsegment']) { - $this->logger->debug("Matching '$segmentOptionValue' by idsegment with segment {segment}.", ['segment' => json_encode($segment)]); - return $segment['definition']; - } - - if (strtolower($segmentOptionValue) == strtolower($segment['name'])) { - $this->logger->debug("Matching '$segmentOptionValue' by name with segment {segment}.", ['segment' => json_encode($segment)]); - return $segment['definition']; - } - - if ( - $segment['definition'] == $segmentOptionValue - || $segment['definition'] == urldecode($segmentOptionValue) - ) { - $this->logger->debug("Matching '{value}' by definition with segment {segment}.", ['value' => $segmentOptionValue, 'segment' => json_encode($segment)]); - return $segment['definition']; - } - } - - $this->logger->warning("'$segmentOptionValue' did not match any stored segment, but invalidating it anyway."); - return $segmentOptionValue; - } - - /** - * @param array $idSites - * - * @return array> - * @phpstan-return list - */ - private function getAllSegments(array $idSites): array - { - if ($this->allSegments === null) { - $segmentsByDefinition = []; - - if ([] === $idSites) { - $idSites = [null]; - } - - foreach ($idSites as $idSite) { - $siteSegments = API::getInstance()->getAll($idSite); - - $siteSegmentsByDefinition = array_combine( - array_column($siteSegments, 'definition'), - $siteSegments - ); - - $segmentsByDefinition = array_merge( - $segmentsByDefinition, - $siteSegmentsByDefinition - ); - } - - $this->allSegments = array_values($segmentsByDefinition); - } - - return $this->allSegments; - } -} diff --git a/plugins/CoreAdminHome/Commands/MigrateAnnotations.php b/plugins/CoreAdminHome/Commands/MigrateAnnotations.php deleted file mode 100644 index d206751df3f16e76d04dfca4c6e2c40bb73a4191..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/MigrateAnnotations.php +++ /dev/null @@ -1,125 +0,0 @@ -setName('core:matomo550-migrate-annotations'); - $this->addOptionalValueOption('chunk-size', null, 'How many annotations to migrate per SQL insert per site', 20); - $this->setDescription( - 'Only needed for Matomo 5.5.0-b2 upgrade. ' . - 'Migrate annotations from option table to a separate annotations table. ' . - 'By default creates inserts of 20 annotations per SQL insert per site. You can lower this if you have annotations with long content.' - ); - } - - protected function doExecute(): int - { - $chunkSize = $this->getInput()->getOption('chunk-size'); - $migrated = self::migrate($chunkSize); - $this->getOutput()->writeln($migrated ? 'Done' : 'All existing annotations already migrated.'); - - return self::SUCCESS; - } - - public static function migrate(int $chunkSize = 20): bool - { - $migration = StaticContainer::get(MigrationFactory::class); - $migrations = []; - - // create new annotations table - $migrations[] = $migration->db->createTable('annotations', [ - 'id' => 'BIGINT UNSIGNED NOT NULL AUTO_INCREMENT', - 'idsite' => 'INTEGER UNSIGNED NOT NULL', - 'date' => 'DATETIME NOT NULL', - 'note' => 'TEXT NOT NULL', - 'starred' => 'TINYINT(1) NOT NULL DEFAULT 0', - 'user' => 'VARCHAR(100) NOT NULL', - ], $primaryKey = 'id'); - $migrations[] = $migration->db->addIndex('annotations', ['idsite', 'date']); - - // insert values from options table - $migrated = false; - foreach (self::getAnnotationInsertsAndBindValues($chunkSize) as $migrationEntry) { - $migrations[] = $migration->db->boundSql($migrationEntry['sql'], $migrationEntry['bind']); - $migrated = true; - } - - $updater = StaticContainer::get(Updater::class); - $updater->executeMigrations(__FILE__, $migrations); - - return $migrated; - } - - private static function getAnnotationsForSite(int $idSite): array - { - $optionName = sprintf('%s_annotations', $idSite); - $serialized = Option::get($optionName); - - if ($serialized !== false) { - $result = Common::safe_unserialize($serialized); - if (!empty($result)) { - return $result; - } - } - - return []; - } - - private static function getAnnotationInsertsAndBindValues(int $chunkSize): array - { - $table = Common::prefixTable('annotations'); - $data = []; - - $model = new Model(); - foreach ($model->getSitesId() as $siteID) { - $annotations = self::getAnnotationsForSite($siteID); - $chunks = array_chunk($annotations, $chunkSize); - - foreach ($chunks as $chunk) { - $bindValues = []; - $placeholders = []; - foreach ($chunk as $annotation) { - $bindValues[] = $values = [ - $siteID, - $annotation['date'], - Common::unsanitizeInputValue($annotation['note']), - $annotation['starred'], - $annotation['user'], - ]; - $placeholders[] = Common::getSqlStringFieldsArray($values); - } - - // chunk always has array items, so it's safe to assume we have some bind values and placeholders - $sql = sprintf( - 'INSERT INTO `%s` (`idsite`, `date`, `note`, `starred`, `user`) VALUES (%s)', - $table, - implode('), (', $placeholders) - ); - $data[] = ['sql' => $sql, 'bind' => Common::flattenArray($bindValues)]; - } - } - - return $data; - } -} diff --git a/plugins/CoreAdminHome/Commands/MigrateTokenAuths.php b/plugins/CoreAdminHome/Commands/MigrateTokenAuths.php deleted file mode 100644 index 1fa94e4da9eb88558f71770632a13ca489e8b050..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/MigrateTokenAuths.php +++ /dev/null @@ -1,77 +0,0 @@ -setName('core:matomo4-migrate-token-auths'); - $this->setDescription('Only needed for the matomo 3 to matomo 4 migration'); - } - - protected function doExecute(): int - { - self::migrate(); - $this->getOutput()->writeln('Done'); - - return self::SUCCESS; - } - - public static function migrate() - { - $migration = StaticContainer::get(MigrationFactory::class); - - /** APP SPECIFIC TOKEN START */ - $migrations[] = $migration->db->createTable('user_token_auth', array( - 'idusertokenauth' => 'BIGINT UNSIGNED NOT NULL AUTO_INCREMENT', - 'login' => 'VARCHAR(100) NOT NULL', - 'description' => 'VARCHAR(' . Model::MAX_LENGTH_TOKEN_DESCRIPTION . ') NOT NULL', - 'password' => 'VARCHAR(191) NOT NULL', - 'system_token' => 'TINYINT(1) NOT NULL DEFAULT 0', - 'hash_algo' => 'VARCHAR(30) NOT NULL', - 'last_used' => 'DATETIME NULL', - 'date_created' => ' DATETIME NOT NULL', - 'date_expired' => ' DATETIME NULL', - ), 'idusertokenauth'); - $migrations[] = $migration->db->addUniqueKey('user_token_auth', 'password', 'uniq_password'); - - $migrations[] = $migration->db->dropIndex('user', 'uniq_keytoken'); - - $userModel = new Model(); - foreach ($userModel->getUsers(array()) as $user) { - /** @var array{login:string, token_auth:string} $user */ - if (!empty($user['token_auth'])) { - $migrations[] = $migration->db->insert('user_token_auth', array( - 'login' => $user['login'], - 'description' => 'Created by Matomo 4 migration', - 'password' => $userModel->hashTokenAuth($user['token_auth']), - 'date_created' => Date::now()->getDatetime(), - 'hash_algo' => 'sha512', - )); - } - } - - $migrations[] = $migration->db->dropColumn('user', 'token_auth'); - - $updater = StaticContainer::get(Updater::class); - $updater->executeMigrations(__FILE__, $migrations); - } -} diff --git a/plugins/CoreAdminHome/Commands/MigrateUserScopedSettings.php b/plugins/CoreAdminHome/Commands/MigrateUserScopedSettings.php deleted file mode 100644 index 2091a61eacfeb5b29b5014365e0c9815da3fc09b..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/MigrateUserScopedSettings.php +++ /dev/null @@ -1,47 +0,0 @@ -setName('core:matomo590-migrate-user-scoped-settings'); - $this->setDescription( - 'Only needed for Matomo 5.9.0-b1 upgrade. ' - . 'Migrates legacy user-scoped settings from option keys to plugin_setting rows and purges legacy option keys.' - ); - } - - protected function doExecute(): int - { - $result = self::migrate(); - - $this->getOutput()->writeln('Done'); - foreach ($result as $key => $value) { - $this->getOutput()->writeln(sprintf('%s: %d', $key, $value)); - } - - return self::SUCCESS; - } - - /** - * @return array - */ - public static function migrate(): array - { - $migration = StaticContainer::get(LegacyUserSettingsMigration::class); - return $migration->migrate(); - } -} diff --git a/plugins/CoreAdminHome/Commands/OptimizeArchiveTables.php b/plugins/CoreAdminHome/Commands/OptimizeArchiveTables.php deleted file mode 100644 index 9e348af18df195cc4fef8e04b43ec22352d1d835..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/OptimizeArchiveTables.php +++ /dev/null @@ -1,130 +0,0 @@ -setName('database:optimize-archive-tables'); - $this->setDescription("Runs an OPTIMIZE TABLE query on the specified archive tables."); - $this->addRequiredArgument( - "dates", - "The months of the archive tables to optimize. Use '" . self::ALL_TABLES_STRING . "' for all dates or '" . - self::CURRENT_MONTH_STRING . "' to optimize the current month only.", - null, - true - ); - $this->addNoValueOption('dry-run', null, 'For testing purposes.'); - $this->setHelp("This command can be used to ease or automate maintenance. Instead of manually running " - . "OPTIMIZE TABLE queries, the command can be used.\n\nYou should run the command if you find your " - . "archive tables grow and do not shrink after purging. Optimizing them will reclaim some space."); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $dryRun = $input->getOption('dry-run'); - - $tableMonths = $this->getTableMonthsToOptimize(); - - foreach ($tableMonths as $month) { - $this->optimizeTable($dryRun, 'archive_numeric_' . $month); - $this->optimizeTable($dryRun, 'archive_blob_' . $month); - } - - return self::SUCCESS; - } - - private function optimizeTable($dryRun, $table) - { - $output = $this->getOutput(); - - $output->write("Optimizing table '$table'..."); - - if ($dryRun) { - $output->write("[dry-run, not optimising table]"); - } else { - Db\Schema::getInstance()->optimizeTables([Common::prefixTable($table)], $force = true); - } - - $output->writeln("Done."); - } - - private function getTableMonthsToOptimize() - { - $dateSpecifiers = $this->getInput()->getArgument('dates'); - if (count($dateSpecifiers) === 1) { - $dateSpecifier = reset($dateSpecifiers); - - if ($dateSpecifier == self::ALL_TABLES_STRING) { - return $this->getAllArchiveTableMonths(); - } elseif ($dateSpecifier == self::CURRENT_MONTH_STRING) { - $now = Date::factory('now'); - return array(ArchiveTableCreator::getTableMonthFromDate($now)); - } elseif (strpos($dateSpecifier, 'last') === 0) { - $lastN = substr($dateSpecifier, 4); - if (!ctype_digit($lastN)) { - throw new \Exception("Invalid lastN specifier '$lastN'. The end must be an integer, eg, last1 or last2."); - } - - if ($lastN <= 0) { - throw new \Exception("Invalid lastN value '$lastN'."); - } - - return $this->getLastNTableMonths((int)$lastN); - } - } - - $tableMonths = array(); - foreach ($dateSpecifiers as $date) { - $date = Date::factory($date); - $tableMonths[] = ArchiveTableCreator::getTableMonthFromDate($date); - } - return $tableMonths; - } - - private function getAllArchiveTableMonths() - { - $tableMonths = array(); - foreach (ArchiveTableCreator::getTablesArchivesInstalled() as $table) { - $tableMonths[] = ArchiveTableCreator::getDateFromTableName($table); - } - return $tableMonths; - } - - /** - * @param int $lastN - * @return string[] - */ - private function getLastNTableMonths($lastN) - { - $now = Date::factory('now'); - - $result = array(); - for ($i = 0; $i < $lastN; ++$i) { - $date = $now->subMonth($i + 1); - $result[] = ArchiveTableCreator::getTableMonthFromDate($date); - } - return $result; - } -} diff --git a/plugins/CoreAdminHome/Commands/PurgeBrokenArchiveData.php b/plugins/CoreAdminHome/Commands/PurgeBrokenArchiveData.php deleted file mode 100644 index ee09b51e45b097676a1201c31c1dd42f12400671..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/PurgeBrokenArchiveData.php +++ /dev/null @@ -1,102 +0,0 @@ -archivePurger = $archivePurger; - } - - protected function configure() - { - $currentMonth = new Month(Date::today()); - $this->setName('core:purge-broken-archive-data'); - $this->setDescription('Purges broken archive data from archive tables.'); - $this->addOptionalArgument( - "startMonth", - "The start month to purge data from in format YYYY-MM. Defaults to current month", - $currentMonth->getDateStart()->toString('Y-m') - ); - $this->addOptionalArgument( - "endMonth", - "The end month to purge data to in format YYYY-MM. Defaults to current month", - $currentMonth->getDateStart()->toString('Y-m') - ); - $this->setHelp("Broken archives are removed from all archive tables between supplied months inclusive.\n\n" - . "Note: archive purging is done during scheduled task execution, so under normal circumstances, you should not need to " - . "run this command manually."); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $output = $this->getOutput(); - - // during normal command execution, we don't want the INFO level logs logged by the ArchivePurger service - // to display in the console, so we use a NullLogger for the service - $logger = null; - if (!$output->isVerbose()) { - $logger = new NullLogger(); - } - - $archivePurger = $this->archivePurger ?: new ArchivePurger($model = null, $purgeDatesOlderThan = null, $logger); - - $startMonthStr = $this->getInput()->getArgument('startMonth'); - $endMonthStr = $this->getInput()->getArgument('endMonth'); - - $yearMonthRegex = '/^(19[7-9][0-9]|2[0-9]{3})-(0[1-9]|1[0-2])$/'; - try { - // check format of string - if (!preg_match($yearMonthRegex, $startMonthStr)) { - throw new \Exception(); - } - $startMonth = new Month(Date::factory($startMonthStr)); - } catch (\Exception $e) { - $output->writeln("Invalid Argument - startMonth - $startMonthStr"); - return self::INVALID; - } - - try { - if (!preg_match($yearMonthRegex, $endMonthStr)) { - throw new \Exception(); - } - $endMonth = new Month(Date::factory($endMonthStr)); - } catch (\Exception $e) { - $output->writeln("Invalid Argument - endMonth - $endMonthStr"); - return self::INVALID; - } - $startMonthStr = $startMonth->getDateStart()->toString('Y-m'); - $endMonthStr = $endMonth->getDateStart()->toString('Y-m'); - $output->writeln("Purging broken archives between $startMonthStr and $endMonthStr"); - $rowsPurged = $archivePurger->purgeBrokenArchives($startMonth, $endMonth); - $output->writeln("Purging complete: Rows purged - $rowsPurged"); - - return self::SUCCESS; - } -} diff --git a/plugins/CoreAdminHome/Commands/PurgeLegacyAnnotations.php b/plugins/CoreAdminHome/Commands/PurgeLegacyAnnotations.php deleted file mode 100644 index 4323c12e845f5c278a0f5b04c81ef48b3db7a9bb..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/PurgeLegacyAnnotations.php +++ /dev/null @@ -1,56 +0,0 @@ -setName('core:matomo550-purge-legacy-annotations'); - $this->setDescription( - 'Only needed for Matomo 5.5.0-b2 upgrade. ' . - 'Purge legacy annotations from option table after migrating them to a separate annotations table.' - ); - } - - protected function doExecute(): int - { - self::purge(); - $this->getOutput()->writeln('Done'); - - return self::SUCCESS; - } - - public static function purge(): void - { - $migration = StaticContainer::get(MigrationFactory::class); - $migrations = []; - - // remove legacy option table values - $migrations[] = $migration->db->sql(self::removeLegacyValuesFromOptionsTableSql()); - - $updater = StaticContainer::get(Updater::class); - $updater->executeMigrations(__FILE__, $migrations); - } - - private static function removeLegacyValuesFromOptionsTableSql(): string - { - return sprintf("DELETE FROM `%s` WHERE `option_name` LIKE '%%_annotations'", Common::prefixTable('option')); - } -} diff --git a/plugins/CoreAdminHome/Commands/PurgeOldArchiveData.php b/plugins/CoreAdminHome/Commands/PurgeOldArchiveData.php deleted file mode 100644 index 5a779622b36c07a879b7f8299cbcb7aa1f42835a..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/PurgeOldArchiveData.php +++ /dev/null @@ -1,219 +0,0 @@ -archivePurger = $archivePurger; - } - - protected function configure() - { - $this->setName('core:purge-old-archive-data'); - $this->setDescription('Purges out of date and invalid archive data from archive tables.'); - $this->addOptionalArgument( - "dates", - sprintf( - "The months of the archive tables to purge data from. By default, only deletes from the current month. Use '%s' for all dates.", - self::ALL_DATES_STRING - ), - [self::getToday()->toString()], - true - ); - $this->addNoValueOption('exclude-outdated', null, "Do not purge outdated archive data."); - $this->addNoValueOption('exclude-invalidated', null, "Do not purge invalidated archive data."); - $this->addNoValueOption('exclude-ranges', null, "Do not purge custom ranges."); - $this->addNoValueOption('skip-optimize-tables', null, "Do not run OPTIMIZE TABLES query on affected archive tables."); - $this->addNoValueOption('include-year-archives', null, "If supplied, the command will purge archive tables that contain year archives for every supplied date."); - $this->setHelp("By default old and invalidated archives are purged. Custom ranges are also purged with outdated archives.\n\n" - . "Note: archive purging is done during scheduled task execution, so under normal circumstances, you should not need to " - . "run this command manually."); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $output = $this->getOutput(); - - // during normal command execution, we don't want the INFO level logs logged by the ArchivePurger service - // to display in the console, so we use a NullLogger for the service - $logger = null; - if (!$output->isVerbose()) { - $logger = new NullLogger(); - } - - $archivePurger = $this->archivePurger ?: new ArchivePurger($model = null, $purgeDatesOlderThan = null, $logger); - - $dates = $this->getDatesToPurgeFor(); - - $excludeOutdated = $input->getOption('exclude-outdated'); - if ($excludeOutdated) { - $output->writeln("Skipping purge outdated archive data."); - } else { - foreach ($dates as $date) { - $message = sprintf("Purging outdated archives for %s...", $date->toString('Y_m')); - $this->performTimedPurging($message, function () use ($date, $archivePurger) { - $archivePurger->purgeOutdatedArchives($date); - }); - } - } - - $excludeInvalidated = $input->getOption('exclude-invalidated'); - if ($excludeInvalidated) { - $output->writeln("Skipping purge invalidated archive data."); - } else { - foreach ($dates as $date) { - $message = sprintf("Purging invalidated archives for %s...", $date->toString('Y_m')); - $this->performTimedPurging($message, function () use ($archivePurger, $date) { - $archivePurger->purgeInvalidatedArchivesFrom($date); - }); - } - } - - $excludeCustomRanges = $input->getOption('exclude-ranges'); - if ($excludeCustomRanges) { - $output->writeln("Skipping purge custom range archives."); - } else { - foreach ($dates as $date) { - $message = sprintf("Purging custom range archives for %s...", $date->toString('Y_m')); - $this->performTimedPurging($message, function () use ($date, $archivePurger) { - $archivePurger->purgeArchivesWithPeriodRange($date); - }); - } - } - - $skipOptimizeTables = $input->getOption('skip-optimize-tables'); - if ($skipOptimizeTables) { - $output->writeln("Skipping OPTIMIZE TABLES."); - } else { - $this->optimizeArchiveTables($dates); - } - - return self::SUCCESS; - } - - /** - * @return Date[] - */ - private function getDatesToPurgeFor() - { - $dates = array(); - - $dateSpecifier = $this->getInput()->getArgument('dates'); - if ( - count($dateSpecifier) === 1 - && reset($dateSpecifier) == self::ALL_DATES_STRING - ) { - foreach (ArchiveTableCreator::getTablesArchivesInstalled(ArchiveTableCreator::NUMERIC_TABLE) as $table) { - $tableDate = ArchiveTableCreator::getDateFromTableName($table); - - list($year, $month) = explode('_', $tableDate); - - try { - $date = Date::factory($year . '-' . $month . '-' . '01'); - $dates[] = $date; - } catch (\Exception $e) { - // this might occur if archive tables like piwik_archive_numeric_1875_09 exist - } - } - } else { - $includeYearArchives = $this->getInput()->getOption('include-year-archives'); - - foreach ($dateSpecifier as $date) { - $dateObj = Date::factory($date); - $yearMonth = $dateObj->toString('Y-m'); - $dates[$yearMonth] = $dateObj; - - // if --include-year-archives is supplied, add a date for the january table for this date's year - // so year archives will be purged - if ($includeYearArchives) { - $janYearMonth = $dateObj->toString('Y') . '-01'; - if (empty($dates[$janYearMonth])) { - $dates[$janYearMonth] = Date::factory($janYearMonth . '-01'); - } - } - } - - $dates = array_values($dates); - } - - return array_unique($dates); - } - - private function performTimedPurging($startMessage, $callback) - { - $timer = new Timer(); - - $this->getOutput()->write($startMessage); - - $callback(); - - $this->getOutput()->writeln("Done. [" . $timer->__toString() . "]"); - } - - /** - * @param Date[] $dates - */ - private function optimizeArchiveTables($dates) - { - $this->getOutput()->writeln("Optimizing archive tables..."); - - foreach ($dates as $date) { - $numericTable = ArchiveTableCreator::getNumericTable($date, false); - if (!empty($numericTable)) { - $this->performTimedPurging("Optimizing table $numericTable...", function () use ($numericTable) { - Db\Schema::getInstance()->optimizeTables([$numericTable], $force = true); - }); - } - - $blobTable = ArchiveTableCreator::getBlobTable($date, false); - if (!empty($blobTable)) { - $this->performTimedPurging("Optimizing table $blobTable...", function () use ($blobTable) { - Db\Schema::getInstance()->optimizeTables([$blobTable], $force = true); - }); - } - } - } - - private static function getToday() - { - return self::$todayOverride ?: Date::today(); - } -} diff --git a/plugins/CoreAdminHome/Commands/ResetInvalidations.php b/plugins/CoreAdminHome/Commands/ResetInvalidations.php deleted file mode 100644 index d97f89fdf478edb78addaf6dd612141d0a2a5dde..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/ResetInvalidations.php +++ /dev/null @@ -1,185 +0,0 @@ -setName('core:reset-invalidations'); - $this->setDescription('Resets invalidations that are stuck in the "in progress" state, allowing them to be reprocessed.'); - - $this->addRequiredValueOption( - 'processing-host', - null, - 'Restrict the reset to invalidations assigned to the specified host. Can be used multiple times to target multiple hosts.', - null, - true - ); - - $this->addRequiredValueOption( - 'idsite', - null, - 'Specify the site ID for which invalidations should be reset. Can be used multiple times to target multiple sites.', - null, - true - ); - - $this->addRequiredValueOption( - 'older-than', - null, - 'Only reset invalidations that were started before the given time. Accepts any date format parsable by `strtotime` (e.g. "1 day ago", "2024-01-01 12:00:00").' - ); - - $this->addRequiredValueOption( - 'newer-than', - null, - 'Only reset invalidations that were started after the given time. Accepts any date format parsable by `strtotime` (e.g. "1 hour ago", "2024-02-01").' - ); - - $this->addNoValueOption( - 'dry-run', - null, - 'Perform a dry run without making changes. Shows which invalidations would be reset without actually modifying them.' - ); - - $this->setHelp( - 'This command allows administrators to reset stuck invalidations that are incorrectly marked as "in progress". ' - . 'This can happen if an archiving process was interrupted, such as during a server crash or a deployment, leaving ' - . 'invalidations in a stuck state. Resetting them ensures they can be reprocessed in the next archiving run. - -⚠ Warning: Only reset invalidations when you are certain they are no longer being processed. ⚠ - -Resetting active invalidations can lead to incomplete archives, data inconsistencies and wasted processing resources. - -Usage examples: - -- Reset all stuck invalidations for site ID 1 that were started more than an hour ago: - `./console core:reset-invalidations --idsite=1 --older-than="1 hour ago"` - -- Reset invalidations assigned to a specific host: - `./console core:reset-invalidations --processing-host=archiver1.example.com` - -- Perform a dry run to check which invalidations would be reset: - `./console core:reset-invalidations --idsite=1 --older-than="1 hour ago" --dry-run` - -- Reset invalidations for multiple sites and hosts: - `./console core:reset-invalidations --idsite=1 --idsite=10 --processing-host=archiver1 --processing-host=archiver2` - -Use this command with caution, especially when resetting invalidations while archiving processes are still in progress.' - ); - } - - protected function doExecute(): int - { - $dryRun = $this->getInput()->getOption('dry-run'); - - try { - $startTime = $this->getStartTime(); - } catch (\Exception $e) { - throw new \Exception('Invalid value for --newer-than provided.', $e->getCode(), $e); - } - - try { - $endTime = $this->getEndTime(); - } catch (\Exception $e) { - throw new \Exception('Invalid value for --older-than provided.', $e->getCode(), $e); - } - - $model = new Model(); - - $invalidations = $model->getInvalidationsInProgress( - $this->getIdSites(), - $this->getProcessingHosts(), - $startTime, - $endTime - ); - - if (count($invalidations) === 0) { - $this->getOutput()->writeln('No invalidations found.'); - } elseif ($dryRun) { - $this->getOutput()->writeln(count($invalidations) . ' invalidations found:'); - if (count($invalidations) > 50) { - $invalidations = array_slice($invalidations, 0, 50); - $this->getOutput()->writeln('Output limited to oldest 50 records'); - } - - $header = [ - 'name', 'idsite', 'report', 'date1', 'date2', 'period', - 'ts_invalidated', 'ts_started', 'processing_host', 'process_id', - ]; - $rows = []; - - foreach ($invalidations as $invalidation) { - $rows[] = [ - 'name' => $invalidation['name'], - 'idsite' => $invalidation['idsite'], - 'report' => $invalidation['report'], - 'date1' => $invalidation['date1'], - 'date2' => $invalidation['date2'], - 'period' => $invalidation['period'], - 'ts_invalidated' => $invalidation['ts_invalidated'], - 'ts_started' => $invalidation['ts_started'], - 'processing_host' => $invalidation['processing_host'], - 'process_id' => $invalidation['process_id'], - ]; - } - - $this->renderTable($header, $rows); - } else { - $rowCount = $model->releaseInProgressInvalidations(array_column($invalidations, 'idinvalidation')); - - $this->getOutput()->writeln('Number of invalidations that were reset: ' . $rowCount); - } - - return self::SUCCESS; - } - - private function getProcessingHosts(): array - { - $processingHosts = $this->getInput()->getOption('processing-host'); - - return !is_array($processingHosts) ? [$processingHosts] : $processingHosts; - } - - private function getIdSites(): array - { - $idSites = $this->getInput()->getOption('idsite'); - - return Site::getIdSitesFromIdSitesString($idSites); - } - - private function getStartTime(): ?Date - { - $startTime = $this->getInput()->getOption('newer-than'); - - if (empty($startTime)) { - return null; - } - - return Date::factory($startTime); - } - - private function getEndTime(): ?Date - { - $endTime = $this->getInput()->getOption('older-than'); - - if (empty($endTime)) { - return null; - } - - return Date::factory($endTime); - } -} diff --git a/plugins/CoreAdminHome/Commands/RunScheduledTasks.php b/plugins/CoreAdminHome/Commands/RunScheduledTasks.php deleted file mode 100644 index cd0340bb1c500a537f66169feee771e3cfbff011..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/RunScheduledTasks.php +++ /dev/null @@ -1,112 +0,0 @@ -logger = $logger ?: StaticContainer::get(LoggerInterface::class); - } - - public function getSystemSignalsToHandle(): array - { - return [\SIGINT, \SIGTERM]; - } - - public function handleSystemSignal(int $signal): void - { - if (null === $this->scheduler) { - // scheduled tasks have not yet started, stop immediately - exit; - } - - $this->logger->info('Received system signal to stop scheduled tasks: ' . $signal); - $this->scheduler->handleSignal($signal); - } - - protected function configure() - { - $this->setName('scheduled-tasks:run'); - $this->setAliases(array('core:run-scheduled-tasks')); - $this->setDescription('Will run all scheduled tasks due to run at this time.'); - $this->addOptionalArgument('task', 'Optionally pass the name of a task to run (will run even if not scheduled to run now)'); - $this->addNoValueOption('force', null, 'If set, it will execute all tasks even the ones not due to run at this time.'); - } - - /** - * Execute command like: ./console core:run-scheduled-tasks - */ - protected function doExecute(): int - { - $input = $this->getInput(); - - $this->forceRunAllTasksIfRequested(); - - FrontController::getInstance()->init(); - - // TODO use dependency injection - $this->scheduler = StaticContainer::get(Scheduler::class); - - $task = $input->getArgument('task'); - - if ($task) { - $this->runSingleTask($this->scheduler, $task); - } else { - $this->scheduler->run(); - } - - $this->writeSuccessMessage('Scheduled Tasks executed'); - - return self::SUCCESS; - } - - private function forceRunAllTasksIfRequested() - { - $force = $this->getInput()->getOption('force'); - - if ($force && !defined('DEBUG_FORCE_SCHEDULED_TASKS')) { - define('DEBUG_FORCE_SCHEDULED_TASKS', true); - } - } - - private function runSingleTask(Scheduler $scheduler, $task) - { - try { - $message = $scheduler->runTaskNow($task); - } catch (\InvalidArgumentException $e) { - $message = $e->getMessage() . PHP_EOL - . 'Available tasks:' . PHP_EOL - . implode(PHP_EOL, $scheduler->getTaskList()); - - throw new \Exception($message); - } - - $this->getOutput()->writeln($message); - } -} diff --git a/plugins/CoreAdminHome/Commands/SetConfig.php b/plugins/CoreAdminHome/Commands/SetConfig.php deleted file mode 100644 index 37b330e35bb0cd66d7d01b80bb2a9ed38b0d294f..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/SetConfig.php +++ /dev/null @@ -1,99 +0,0 @@ -setName('config:set'); - $this->setDescription('Set one or more config settings in the file config/config.ini.php'); - $this->addOptionalArgument('assignment', 'List of config setting assignments, eg, Section.key=1 or Section.array_key[]=value', null, true); - $this->addRequiredValueOption('section', null, 'The section the INI config setting belongs to.'); - $this->addRequiredValueOption('key', null, 'The name of the INI config setting.'); - $this->addRequiredValueOption('value', null, 'The value of the setting. (Not JSON encoded)'); - $this->setHelp("This command can be used to set INI config settings on a Piwik instance. - -You can set config values two ways, via --section, --key, --value or by command arguments. - -To use --section, --key, --value, simply supply those options. You can only set one setting this way, and you cannot -append to arrays. - -To use arguments, supply one or more arguments in the following format: -$ ./console config:set 'Section.config_setting_name=\"value\"' -'Section' is the name of the section, -'config_setting_name' the name of the setting and -'value' is the value. - -NOTE: 'value' must be JSON encoded, so 'Section.config_setting_name=\"value\"' would work but 'Section.config_setting_name=value' would not. - -To append to an array setting, supply an argument like this: -$ ./console config:set 'Section.config_setting_name[]=\"value to append\"' - -To reset an array setting, supply an argument like this: -$ ./console config:set 'Section.config_setting_name=[]' - -Resetting an array will not work if the array has default values in global.ini.php (such as, [log] log_writers). -In this case the values in global.ini.php will be used, since there is no way to explicitly set an -array setting to empty in INI config. -"); - } - - protected function doExecute(): int - { - $input = $this->getInput(); - $output = $this->getOutput(); - $section = $input->getOption('section'); - $key = $input->getOption('key'); - $value = $input->getOption('value'); - - $manipulations = $this->getAssignments(); - - $isSingleAssignment = !empty($section) && !empty($key) && $value !== false; - if ($isSingleAssignment) { - $manipulations[] = new ConfigSettingManipulation($section, $key, $value); - } - - if (empty($manipulations)) { - throw new \InvalidArgumentException("Nothing to assign. Add assignments as arguments or use the " - . "--section, --key and --value options."); - } - - $config = Config::getInstance(); - foreach ($manipulations as $manipulation) { - $manipulation->manipulate($config); - - $output->write("Setting [{$manipulation->getSectionName()}] {$manipulation->getName()} = {$manipulation->getValueString()}..."); - $output->writeln(" done."); - } - - $config->forceSave(); - - return self::SUCCESS; - } - - /** - * @return ConfigSettingManipulation[] - */ - private function getAssignments() - { - $assignments = $this->getInput()->getArgument('assignment'); - - $result = []; - foreach ($assignments as $assignment) { - $result[] = ConfigSettingManipulation::make($assignment); - } - return $result; - } -} diff --git a/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php b/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php deleted file mode 100644 index 66aeeacb443bf9258d7ba43081b4feb08dda6a67..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php +++ /dev/null @@ -1,178 +0,0 @@ -sectionName = $sectionName; - $this->name = $name; - $this->value = $value; - $this->isArrayAppend = $isArrayAppend; - } - - /** - * Performs the INI config manipulation. - * - * @throws \Exception if trying to append to a non-array setting value or if trying to set an - * array value to a non-array setting - */ - public function manipulate(Config $config) - { - if ($this->isArrayAppend) { - $this->appendToArraySetting($config); - } else { - $this->setSingleConfigValue($config); - } - } - - private function setSingleConfigValue(Config $config) - { - $sectionName = $this->sectionName; - $section = $config->$sectionName; - - if ( - isset($section[$this->name]) - && is_array($section[$this->name]) - && !is_array($this->value) - ) { - throw new \Exception("Trying to set non-array value to array setting " . $this->getSettingString() . "."); - } - - $section[$this->name] = $this->value; - $config->$sectionName = $section; - } - - private function appendToArraySetting(Config $config) - { - $sectionName = $this->sectionName; - $section = $config->$sectionName; - - if ( - isset($section[$this->name]) - && !is_array($section[$this->name]) - ) { - throw new \Exception("Trying to append to non-array setting value " . $this->getSettingString() . "."); - } - - $section[$this->name][] = $this->value; - $config->$sectionName = $section; - } - - /** - * Creates a ConfigSettingManipulation instance from a string like: - * - * `SectionName.setting_name=value` - * - * or - * - * `SectionName.setting_name[]=value` - * - * The value must be JSON so `="string"` will work but `=string` will not. - * - * @param string $assignment - * @return self - */ - public static function make($assignment) - { - if (!preg_match('/^([a-zA-Z0-9_]+)\.([a-zA-Z0-9_]+)(\[\])?=(.*)/', $assignment, $matches)) { - throw new \InvalidArgumentException("Invalid assignment string '$assignment': expected section.name=value or section.name[]=value"); - } - - $section = $matches[1]; - $name = $matches[2]; - $isAppend = !empty($matches[3]); - - $value = json_decode($matches[4], $isAssoc = true); - if ($value === null) { - throw new \InvalidArgumentException("Invalid assignment string '$assignment': could not parse value as JSON"); - } - - return new self($section, $name, $value, $isAppend); - } - - private function getSettingString() - { - return "[{$this->sectionName}] {$this->name}"; - } - - /** - * @return string - */ - public function getSectionName() - { - return $this->sectionName; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * @return boolean - */ - public function isArrayAppend() - { - return $this->isArrayAppend; - } - - /** - * @return string - */ - public function getValueString() - { - return json_encode($this->value); - } -} diff --git a/plugins/CoreAdminHome/Commands/VersionInfo.php b/plugins/CoreAdminHome/Commands/VersionInfo.php deleted file mode 100644 index a4a53a9f32ba32af5705419a3591c2fd4f90650d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Commands/VersionInfo.php +++ /dev/null @@ -1,30 +0,0 @@ -setName('core:version'); - $this->setDescription('Returns the current version information of this Matomo instance.'); - $this->setHelp("This command can be used to set get the version information of the current Matomo instance."); - } - - protected function doExecute(): int - { - $this->getOutput()->writeln(Version::VERSION); - - return self::SUCCESS; - } -} diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php deleted file mode 100644 index 1512c3af7e699a5298534b39696b3317e48d21f9..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Controller.php +++ /dev/null @@ -1,492 +0,0 @@ -translator = $translator; - $this->optOutManager = $optOutManager; - $this->passwordVerify = $passwordVerify; - - parent::__construct(); - } - - public function home() - { - $isInternetEnabled = SettingsPiwik::isInternetEnabled(); - - $isMarketplaceEnabled = Marketplace::isMarketplaceEnabled(); - $isFeedbackEnabled = Plugin\Manager::getInstance()->isPluginLoaded('Feedback'); - $widgetsList = WidgetsList::get(); - - if ($isInternetEnabled && $isMarketplaceEnabled) { - $this->securityPolicy->addPolicy('img-src', '*.matomo.org'); - } - - $hasDonateForm = $widgetsList->isDefined('CoreHome', 'getDonateForm'); - $hasPiwikBlog = $widgetsList->isDefined('RssWidget', 'rssPiwik'); - $hasPremiumFeatures = $widgetsList->isDefined('Marketplace', 'getPremiumFeatures'); - $hasNewPlugins = $widgetsList->isDefined('Marketplace', 'getNewPlugins'); - $hasDiagnostics = $widgetsList->isDefined('Installation', 'getSystemCheck'); - $hasTrackingFailures = $widgetsList->isDefined('CoreAdminHome', 'getTrackingFailures'); - $hasQuickLinks = $widgetsList->isDefined('CoreHome', 'quickLinks'); - $hasSystemSummary = $widgetsList->isDefined('CoreHome', 'getSystemSummary'); - - return $this->renderTemplate('home', array( - 'isInternetEnabled' => $isInternetEnabled, - 'isMarketplaceEnabled' => $isMarketplaceEnabled, - 'hasPremiumFeatures' => $hasPremiumFeatures, - 'hasNewPlugins' => $hasNewPlugins, - 'isFeedbackEnabled' => $isFeedbackEnabled, - 'hasDonateForm' => $hasDonateForm, - 'hasPiwikBlog' => $hasPiwikBlog, - 'hasDiagnostics' => $hasDiagnostics, - 'hasTrackingFailures' => $hasTrackingFailures, - 'hasQuickLinks' => $hasQuickLinks, - 'hasSystemSummary' => $hasSystemSummary, - )); - } - - public function index() - { - $this->redirectToIndex('UsersManager', 'userSettings'); - return; - } - - public function trackingFailures() - { - Piwik::checkUserHasSomeAdminAccess(); - - return $this->renderTemplate('trackingFailures'); - } - - public function generalSettings() - { - Piwik::checkUserHasSuperUserAccess(); - - $view = new View('@CoreAdminHome/generalSettings'); - $this->handleGeneralSettingsAdmin($view); - - $view->trustedHosts = array_values(Url::getTrustedHostsFromConfig()); - $logo = new CustomLogo(); - $view->branding = array('use_custom_logo' => $logo->isEnabled()); - $view->fileUploadEnabled = $logo->isFileUploadEnabled(); - $view->logosWriteable = $logo->isCustomLogoWritable(); - $view->customLogoEnabled = $logo->isCustomLogoFeatureEnabled(); - $view->hasUserLogo = CustomLogo::hasUserLogo(); - $view->pathUserLogo = CustomLogo::getPathUserLogo(); - $view->hasUserFavicon = CustomLogo::hasUserFavicon(); - $view->pathUserFavicon = CustomLogo::getPathUserFavicon(); - $view->pathUserLogoSmall = CustomLogo::getPathUserLogoSmall(); - $view->pathUserLogoSVG = CustomLogo::getPathUserSvgLogo(); - $view->pathUserLogoDirectory = realpath(dirname($view->pathUserLogo) . '/'); - $view->mailTypes = array( - '' => '', - 'Plain' => 'Plain', - 'Login' => 'Login', - 'Cram-md5' => 'Cram-md5', - ); - $view->mailEncryptions = array( - '' => 'auto', - 'ssl' => 'SSL', - 'tls' => 'TLS', - 'none' => 'none', - ); - $mail = new Mail(); - $view->mailHost = $mail->getMailHost(); - - $view->language = LanguagesManager::getLanguageCodeForCurrentUser(); - $this->setBasicVariablesView($view); - return $view->render(); - } - - public function setMailSettings() - { - Piwik::checkUserHasSuperUserAccess(); - - if (!self::isGeneralSettingsAdminEnabled()) { - // General settings + Beta channel + SMTP settings is disabled - return ''; - } - - if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') { - throw new Exception('Invalid HTTP method.'); - } - - $response = new ResponseBuilder('json'); - try { - $this->checkTokenInUrl(); - - $request = Request::fromPost(); - - // require password re-authentication before applying any changes - $login = Piwik::getCurrentUserLogin(); - if (Piwik::doesUserRequirePasswordConfirmation($login)) { - $passwordConfirmation = $request->getStringParameter('passwordConfirmation', ''); - if ( - $passwordConfirmation === '' - || !$this->passwordVerify->isPasswordCorrect($login, $passwordConfirmation) - ) { - throw new Exception(Piwik::translate('UsersManager_CurrentPasswordNotCorrect')); - } - } - - // Update email settings - $mail = []; - $mail['transport'] = $request->getBoolParameter('mailUseSmtp') ? 'smtp' : ''; - $mail['port'] = $request->getStringParameter('mailPort', ''); - $mail['host'] = $request->getStringParameter('mailHost', ''); - $mail['type'] = $request->getStringParameter('mailType', ''); - $mail['username'] = $request->getStringParameter('mailUsername', ''); - $mail['password'] = $request->getStringParameter('mailPassword', ''); - - if (!array_key_exists('mailPassword', $request->getParameters()) && Config::getInstance()->mail['host'] === $mail['host']) { - // use old password if it wasn't set in request (and the host wasn't changed) - $mail['password'] = Config::getInstance()->mail['password']; - } - - $mail['encryption'] = $request->getStringParameter('mailEncryption', ''); - - Config::getInstance()->mail = $mail; - - $general = Config::getInstance()->General; - $general['noreply_email_name'] = $request->getStringParameter('mailFromName', ''); - - $mailFrom = $request->getStringParameter('mailFromAddress', ''); - if (empty($mailFrom)) { - $mailFrom = 'noreply@{DOMAIN}'; - } - if (!Piwik::isValidEmailString($mailFrom) && !Common::stringEndsWith($mailFrom, '@{DOMAIN}')) { - throw new Exception(Piwik::translate('CoreAdminHome_ErrorEmailFromAddressNotValid')); - } - $general['noreply_email_address'] = $mailFrom; - Config::getInstance()->General = $general; - - Config::getInstance()->forceSave(); - - $toReturn = $response->getResponse(); - } catch (Exception $e) { - $toReturn = $response->getResponseException($e); - } - - return $toReturn; - } - - /** - * Renders and returns an admin page that lets users generate custom JavaScript - * tracking code and custom image tracker links. - */ - public function trackingCodeGenerator() - { - Piwik::checkUserHasSomeViewAccess(); - - $view = new View('@CoreAdminHome/trackingCodeGenerator'); - $this->setBasicVariablesView($view); - $view->topMenu = MenuTop::getInstance()->getMenu(); - - $viewableIdSites = APISitesManager::getInstance()->getSitesIdWithAtLeastViewAccess(); - - $defaultIdSite = reset($viewableIdSites); - $view->idSite = $this->idSite ?: $defaultIdSite; - - if ($view->idSite) { - try { - $view->siteName = Site::getNameFor($view->idSite); - $view->siteNameDecoded = Common::unsanitizeInputValue($view->siteName); - } catch (Exception $e) { - // ignore if site no longer exists - } - } - - $view->defaultReportSiteName = Site::getNameFor($view->idSite); - $view->defaultSiteRevenue = Site::getCurrencySymbolFor($view->idSite); - $view->maxCustomVariables = 0; - - if (Plugin\Manager::getInstance()->isPluginActivated('CustomVariables')) { - $view->maxCustomVariables = CustomVariables::getNumUsableCustomVariables(); - } - - $view->defaultSite = array('id' => $view->idSite, 'name' => $view->defaultReportSiteName); - $view->defaultSiteDecoded = [ - 'id' => $view->idSite, - 'name' => Common::unsanitizeInputValue($view->defaultReportSiteName), - ]; - - $allUrls = APISitesManager::getInstance()->getSiteUrlsFromId($view->idSite); - if (isset($allUrls[1])) { - $aliasUrl = $allUrls[1]; - } else { - $aliasUrl = 'x.domain.com'; - } - $view->defaultReportSiteAlias = $aliasUrl; - - $mainUrl = Site::getMainUrlFor($view->idSite); - $view->defaultReportSiteDomain = @parse_url($mainUrl, PHP_URL_HOST); - - $dntChecker = new DoNotTrackHeaderChecker(); - $view->serverSideDoNotTrackEnabled = $dntChecker->isActive(); - - return $view->render(); - } - - /** - * Shows the "Track Visits" checkbox - iFrame (deprecated) - */ - public function optOut() - { - return $this->optOutManager->getOptOutViewIframe()->render(); - } - - /** - * Shows the Javascript opt out - * - * @throws Exception - */ - public function optOutJS(): string - { - Common::sendHeader('Content-Type: application/javascript; charset=utf-8'); - Common::sendHeader('Cache-Control: no-store'); - return $this->optOutManager->getOptOutJS(); - } - - public function uploadCustomLogo() - { - Piwik::checkUserHasSuperUserAccess(); - $this->checkTokenInUrl(); - - $logo = new CustomLogo(); - - if (! $logo->isCustomLogoFeatureEnabled()) { - return '0'; - } - - $successLogo = $logo->uploadLogoToTempFolder(); - $successFavicon = $logo->uploadFaviconToTempFolder(); - - $response = []; - - if ($successLogo) { - $response['logo'] = $logo->getTempUserLogoBase64(); - } - - if ($successFavicon) { - $response['favicon'] = $logo->getTempUserFaviconBase64(); - } - - Json::sendHeaderJSON(); - return json_encode($response); - } - - public static function isGeneralSettingsAdminEnabled() - { - return (bool) Config::getInstance()->General['enable_general_settings_admin']; - } - - private function handleGeneralSettingsAdmin($view) - { - // Whether to display or not the general settings (cron, beta, smtp) - $view->isGeneralSettingsAdminEnabled = self::isGeneralSettingsAdminEnabled(); - $view->isMultiServerEnvironment = SettingsPiwik::isMultiServerEnvironment(); - $view->isPluginsAdminEnabled = CorePluginsAdmin::isPluginsAdminEnabled(); - if ($view->isGeneralSettingsAdminEnabled) { - $this->displayWarningIfConfigFileNotWritable(); - } - - $enableBrowserTriggerArchiving = Rules::isBrowserTriggerEnabled(); - $todayArchiveTimeToLive = Rules::getTodayArchiveTimeToLive(); - $showWarningCron = false; - if ( - !$enableBrowserTriggerArchiving - && $todayArchiveTimeToLive < 3600 - ) { - $showWarningCron = true; - } - $view->showWarningCron = $showWarningCron; - $view->todayArchiveTimeToLive = $todayArchiveTimeToLive; - $view->todayArchiveTimeToLiveDefault = Rules::getTodayArchiveTimeToLiveDefault(); - $view->enableBrowserTriggerArchiving = $enableBrowserTriggerArchiving; - $view->showSegmentArchiveTriggerInfo = Rules::isBrowserArchivingAvailableForSegments(); - - $mail = Config::getInstance()->mail; - $mail['noreply_email_address'] = Config::getInstance()->General['noreply_email_address']; - $mail['noreply_email_name'] = Config::getInstance()->General['noreply_email_name']; - $mail['password'] = !empty($mail['password']) ? '*****' : ''; - $view->mail = $mail; - } - - /** - * Show the what is new changes list - */ - public function whatIsNew() - { - Piwik::checkUserHasSomeViewAccess(); - Piwik::checkUserIsNotAnonymous(); - - $model = new UsersModel(); - $user = $model->getUser(Piwik::getCurrentUserLogin()); - if (!empty($user)) { - $userChanges = new UserChanges($user); - $changes = $this->enrichChangesForWhatIsNew($userChanges->getChanges()); - return $this->renderTemplate('whatIsNew', ['changes' => $changes]); - } else { - throw new \Exception('Unable to getUser() when attempting to show whatIsNew'); - } - } - - /** - * Adds metadata used for rendering entries in the What's New popup. - */ - private function enrichChangesForWhatIsNew(array $changes): array - { - $pluginManager = Plugin\Manager::getInstance(); - - foreach ($changes as &$change) { - $pluginName = $change['plugin_name'] ?? ''; - $change['showPluginPrefix'] = !empty($pluginName) - && !$pluginManager->isPluginBundledWithCore($pluginName); - - if (!empty($change['link'])) { - $defaultIdSite = $this->getDefaultIdSiteForWhatIsNewLinks(); - if (!empty($defaultIdSite)) { - $change['link'] = $this->normalizeWhatIsNewLink($change['link'], $defaultIdSite); - } - } - } - unset($change); - - return $changes; - } - - private function getDefaultIdSiteForWhatIsNewLinks(): ?int - { - $userPreferences = new UserPreferences(); - $defaultReport = $userPreferences->getDefaultReport(); - - if (is_numeric($defaultReport)) { - return (int) $defaultReport; - } - - $defaultWebsiteId = $userPreferences->getDefaultWebsiteId(); - if (is_numeric($defaultWebsiteId)) { - return (int) $defaultWebsiteId; - } - - return null; - } - - private function normalizeWhatIsNewLink(string $link, int $defaultIdSite): string - { - if (!$this->isInternalWhatIsNewLink($link)) { - return $link; - } - - // Use a path relative to the current Matomo install so subdirectory installs - // don't resolve internal "What's New" links against the web root. - if (strpos($link, '/index.php') === 0) { - $link = substr($link, 1); - } - - $parsedLink = @parse_url($link); - if (!is_array($parsedLink)) { - return $link; - } - - $query = $parsedLink['query'] ?? ''; - $parsedLink['query'] = $this->replaceIdSiteInQueryString($query, $defaultIdSite); - - $fragment = $parsedLink['fragment'] ?? ''; - $parsedLink['fragment'] = $this->replaceIdSiteInFragment($fragment, $defaultIdSite); - - if ($query === $parsedLink['query'] && $fragment === $parsedLink['fragment']) { - return $link; - } - - return UrlHelper::getParseUrlReverse($parsedLink) ?: $link; - } - - private function replaceIdSiteInFragment(string $fragment, int $idSite): string - { - $fragmentPrefix = ''; - $fragmentQuery = ''; - if (strpos($fragment, '/?') === 0) { - $fragmentPrefix = '/?'; - $fragmentQuery = substr($fragment, 2); - } elseif (strpos($fragment, '?') === 0) { - $fragmentPrefix = '?'; - $fragmentQuery = substr($fragment, 1); - } - - if (empty($fragmentPrefix)) { - return $fragment; - } - - return $fragmentPrefix . $this->replaceIdSiteInQueryString($fragmentQuery, $idSite); - } - - private function replaceIdSiteInQueryString(string $queryStr, int $idSite): string - { - $queryParams = UrlHelper::getArrayFromQueryString($queryStr); - - if (!array_key_exists('idSite', $queryParams)) { - return $queryStr; - } - - $queryParams['idSite'] = $idSite; - return Url::getQueryStringFromParameters($queryParams); - } - - private function isInternalWhatIsNewLink(string $link): bool - { - return strpos($link, 'index.php') === 0 || strpos($link, '/index.php') === 0; - } -} diff --git a/plugins/CoreAdminHome/CoreAdminHome.php b/plugins/CoreAdminHome/CoreAdminHome.php deleted file mode 100644 index d7faa11764d667247799796334b5397b95c269a5..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/CoreAdminHome.php +++ /dev/null @@ -1,304 +0,0 @@ - 'getStylesheetFiles', - 'AssetManager.getJavaScriptFiles' => 'getJsFiles', - 'UsersManager.deleteUser' => 'cleanupUser', - 'API.DocumentationGenerator.@hideExceptForSuperUser' => 'displayOnlyForSuperUser', - 'Template.jsGlobalVariables' => 'addJsGlobalVariables', - 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', - 'System.addSystemSummaryItems' => 'addSystemSummaryItems', - 'FrontController.modifyErrorPage' => 'onModifyErrorPage', - ); - } - - public function onModifyErrorPage(&$output, $exception) - { - if ( - empty($output) - || !$exception instanceof UnexpectedWebsiteFoundException - ) { - return; - } - - $requestedIdSite = $this->getRequestedIdSite(); - if ($requestedIdSite === null) { - return; - } - - if (!$this->isInvalidRequestedIdSite($requestedIdSite)) { - return; - } - - $message = sprintf( - '

    %s

    %s

    ', - Piwik::translate('CoreAdminHome_InvalidSiteUrlError', Common::sanitizeInputValue($requestedIdSite)), - Piwik::translate('CoreAdminHome_InvalidSiteUrlErrorHelp') - ); - - $output = $this->replaceErrorPageMessage($output, $message); - } - - private function getRequestedIdSite(): ?string - { - foreach ([$_GET, $_POST] as $request) { - if (!isset($request['idSite']) || is_array($request['idSite'])) { - continue; - } - - $idSite = trim((string) $request['idSite']); - if ($idSite !== '') { - return $idSite; - } - } - - return null; - } - - private function isInvalidRequestedIdSite(string $requestedIdSite): bool - { - if (!ctype_digit($requestedIdSite)) { - return false; - } - - try { - new Site((int) $requestedIdSite); - return false; - } catch (UnexpectedWebsiteFoundException $exception) { - return true; - } - } - - private function replaceErrorPageMessage(string $output, string $message): string - { - $updatedOutput = preg_replace('/

    .*?<\/h2>/s', '

    ' . $message . '

    ', $output, 1); - if ($updatedOutput !== null && $updatedOutput !== $output) { - return $updatedOutput; - } - - $updatedOutput = preg_replace( - '/
    Error:<\/strong> .*?<\/div>/s', - "
    Error: $message
    ", - $output, - 1 - ); - - if ($updatedOutput !== null) { - return $updatedOutput; - } - - return $output; - } - - public function addSystemSummaryItems(&$systemSummary) - { - if (Piwik::isUserHasSomeAdminAccess()) { - $failures = Request::processRequest('CoreAdminHome.getTrackingFailures', [], []); - $numFailures = count($failures); - $icon = 'icon-error'; - if ($numFailures === 0) { - $icon = 'icon-ok'; - } - $systemSummary[] = new SystemSummary\Item($key = 'trackingfailures', Piwik::translate('CoreAdminHome_NTrackingFailures', $numFailures), $value = null, array('module' => 'CoreAdminHome', 'action' => 'trackingFailures'), $icon, $order = 9); - } - } - - public function cleanupUser($userLogin) - { - PluginSettingsTable::removeAllUserSettingsForUser($userLogin); - } - - public function getStylesheetFiles(&$stylesheets) - { - $stylesheets[] = "node_modules/jquery-ui-dist/jquery-ui.min.css"; - $stylesheets[] = "plugins/Morpheus/stylesheets/base.less"; - $stylesheets[] = "plugins/Morpheus/stylesheets/main.less"; - $stylesheets[] = "plugins/CoreAdminHome/stylesheets/generalSettings.less"; - $stylesheets[] = "plugins/CoreAdminHome/vue/src/TrackingFailures/TrackingFailures.less"; - $stylesheets[] = "plugins/CoreAdminHome/stylesheets/whatIsNew.less"; - $stylesheets[] = "plugins/CoreAdminHome/stylesheets/trackingCodeGenerator.less"; - } - - public function getJsFiles(&$jsFiles) - { - $jsFiles[] = "node_modules/jquery/dist/jquery.min.js"; - $jsFiles[] = "node_modules/jquery-ui-dist/jquery-ui.min.js"; - $jsFiles[] = "node_modules/sprintf-js/dist/sprintf.min.js"; - $jsFiles[] = "plugins/Morpheus/javascripts/piwikHelper.js"; - $jsFiles[] = "plugins/CoreHome/javascripts/broadcast.js"; - $jsFiles[] = "plugins/CoreAdminHome/javascripts/protocolCheck.js"; - } - - public function displayOnlyForSuperUser(&$hide) - { - $hide = !Piwik::hasUserSuperUserAccess(); - } - - public function addJsGlobalVariables(&$out) - { - if (ProxyHttp::isHttps()) { - $isHttps = 'true'; - } else { - $isHttps = 'false'; - } - - $out .= "piwik.hasServerDetectedHttps = $isHttps;\n"; - } - - public function getClientSideTranslationKeys(&$translationKeys) - { - $translationKeys[] = 'CoreAdminHome_ProtocolNotDetectedCorrectly'; - $translationKeys[] = 'CoreAdminHome_ProtocolNotDetectedCorrectlySolution'; - $translationKeys[] = 'CoreAdminHome_SettingsSaveSuccess'; - $translationKeys[] = 'UserCountryMap_None'; - $translationKeys[] = 'Actions_ColumnPageURL'; - $translationKeys[] = 'General_Date'; - $translationKeys[] = 'General_Measurable'; - $translationKeys[] = 'General_Action'; - $translationKeys[] = 'General_Delete'; - $translationKeys[] = 'General_Id'; - $translationKeys[] = 'CoreHome_ClickToSeeFullInformation'; - $translationKeys[] = 'CoreAdminHome_LearnMore'; - $translationKeys[] = 'CoreAdminHome_ConfirmDeleteAllTrackingFailures'; - $translationKeys[] = 'CoreAdminHome_ConfirmDeleteThisTrackingFailure'; - $translationKeys[] = 'CoreAdminHome_DeleteAllFailures'; - $translationKeys[] = 'CoreAdminHome_NTrackingFailures'; - $translationKeys[] = 'CoreAdminHome_Problem'; - $translationKeys[] = 'CoreAdminHome_Solution'; - $translationKeys[] = 'CoreAdminHome_TrackingFailures'; - $translationKeys[] = 'CoreAdminHome_TrackingFailuresIntroduction'; - $translationKeys[] = 'CoreAdminHome_TrackingURL'; - $translationKeys[] = 'CoreAdminHome_NoKnownFailures'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CodeNoteBeforeClosingHead'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CodeNoteBeforeClosingHeadEmail'; - $translationKeys[] = 'SitesManager_InstallationGuides'; - $translationKeys[] = 'CoreAdminHome_ArchivingSettings'; - $translationKeys[] = 'General_AllowPiwikArchivingToTriggerBrowser'; - $translationKeys[] = 'General_ReportsContainingTodayWillBeProcessedAtMostEvery'; - $translationKeys[] = 'General_ArchivingTriggerDescription'; - $translationKeys[] = 'General_ArchivingTriggerSegment'; - $translationKeys[] = 'General_SeeTheOfficialDocumentationForMoreInformation'; - $translationKeys[] = 'General_SmallTrafficYouCanLeaveDefault'; - $translationKeys[] = 'General_MediumToHighTrafficItIsRecommendedTo'; - $translationKeys[] = 'General_RearchiveTimeIntervalOnlyForTodayReports'; - $translationKeys[] = 'General_ArchivingInlineHelp'; - $translationKeys[] = 'General_NewReportsWillBeProcessedByCron'; - $translationKeys[] = 'General_ReportsWillBeProcessedAtMostEveryHour'; - $translationKeys[] = 'General_IfArchivingIsFastYouCanSetupCronRunMoreOften'; - $translationKeys[] = 'CoreAdminHome_BrandingSettings'; - $translationKeys[] = 'CoreAdminHome_CustomLogoHelpText'; - $translationKeys[] = 'CoreAdminHome_UseCustomLogo'; - $translationKeys[] = 'CoreAdminHome_LogoUpload'; - $translationKeys[] = 'CoreAdminHome_FaviconUpload'; - $translationKeys[] = 'CoreAdminHome_LogoUploadHelp'; - $translationKeys[] = 'CoreAdminHome_LogoUploadFailed'; - $translationKeys[] = 'CoreAdminHome_FileUploadDisabled'; - $translationKeys[] = 'CoreAdminHome_LogoNotWriteableInstruction'; - $translationKeys[] = 'General_GiveUsYourFeedback'; - $translationKeys[] = 'CoreAdminHome_CustomLogoFeedbackInfo'; - $translationKeys[] = 'CoreAdminHome_EmailServerSettings'; - $translationKeys[] = 'General_UseSMTPServerForEmail'; - $translationKeys[] = 'General_SelectYesIfYouWantToSendEmailsViaServer'; - $translationKeys[] = 'General_SmtpServerAddress'; - $translationKeys[] = 'General_SmtpPort'; - $translationKeys[] = 'General_OptionalSmtpPort'; - $translationKeys[] = 'General_AuthenticationMethodSmtp'; - $translationKeys[] = 'General_OnlyUsedIfUserPwdIsSet'; - $translationKeys[] = 'General_SmtpUsername'; - $translationKeys[] = 'General_OnlyEnterIfRequired'; - $translationKeys[] = 'General_Plugins'; - $translationKeys[] = 'General_SmtpPassword'; - $translationKeys[] = 'General_SmtpFromAddress'; - $translationKeys[] = 'General_SmtpFromEmailHelp'; - $translationKeys[] = 'General_SmtpFromName'; - $translationKeys[] = 'General_NameShownInTheSenderColumn'; - $translationKeys[] = 'General_SmtpEncryption'; - $translationKeys[] = 'General_EncryptedSmtpTransport'; - $translationKeys[] = 'General_OnlyEnterIfRequiredPassword'; - $translationKeys[] = 'General_WarningPasswordStored'; - $translationKeys[] = 'CoreAdminHome_ImageTracking'; - $translationKeys[] = 'CoreAdminHome_TrackAGoal'; - $translationKeys[] = 'CoreAdminHome_WithOptionalRevenue'; - $translationKeys[] = 'CoreAdminHome_ImageTrackingLink'; - $translationKeys[] = 'CoreAdminHome_ImageTrackingIntro1'; - $translationKeys[] = 'CoreAdminHome_ImageTrackingIntro2'; - $translationKeys[] = 'CoreAdminHome_ImageTrackingIntro3'; - $translationKeys[] = 'CoreAdminHome_JavaScriptTracking'; - $translationKeys[] = 'CoreAdminHome_JSTrackingIntro1'; - $translationKeys[] = 'CoreAdminHome_JSTrackingIntro2'; - $translationKeys[] = 'CoreAdminHome_JSTrackingIntro3b'; - $translationKeys[] = 'General_JsTrackingTag'; - $translationKeys[] = 'SitesManager_EmailInstructionsButton'; - $translationKeys[] = 'CoreAdminHome_JSTracking_MergeSubdomains'; - $translationKeys[] = 'CoreAdminHome_JSTracking_GroupPageTitlesByDomainDesc1'; - $translationKeys[] = 'CoreAdminHome_JSTracking_GroupPageTitlesByDomain'; - $translationKeys[] = 'CoreAdminHome_JSTracking_MergeAliasesDesc'; - $translationKeys[] = 'CoreAdminHome_JSTracking_MergeAliases'; - $translationKeys[] = 'CoreAdminHome_JSTracking_TrackNoScript'; - $translationKeys[] = 'Mobile_Advanced'; - $translationKeys[] = 'CoreAdminHome_JSTracking_VisitorCustomVars'; - $translationKeys[] = 'CoreAdminHome_JSTracking_VisitorCustomVarsDesc'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CrossDomain'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CrossDomain_NeedsMultipleDomains'; - $translationKeys[] = 'CoreAdminHome_JSTracking_EnableCrossDomainLinking'; - $translationKeys[] = 'CoreAdminHome_JSTracking_EnableDoNotTrackDesc'; - $translationKeys[] = 'CoreAdminHome_JSTracking_EnableDoNotTrack_AlreadyEnabled'; - $translationKeys[] = 'CoreAdminHome_JSTracking_EnableDoNotTrack'; - $translationKeys[] = 'CoreAdminHome_JSTracking_DisableCookies'; - $translationKeys[] = 'CoreAdminHome_JSTracking_DisableCookiesDesc'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CustomCampaignQueryParam'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CampaignNameParam'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CampaignKwdParam'; - $translationKeys[] = 'SitesManager_EmailInstructionsSubject'; - $translationKeys[] = 'SitesManager_JsTrackingTagHelp'; - $translationKeys[] = 'CoreAdminHome_JSTrackingIntro3a'; - $translationKeys[] = 'CoreAdminHome_JSTrackingIntro4'; - $translationKeys[] = 'CoreAdminHome_JSTrackingIntro5'; - $translationKeys[] = 'General_Options'; - $translationKeys[] = 'General_Value'; - $translationKeys[] = 'Actions_ColumnPageName'; - $translationKeys[] = 'CoreAdminHome_JSTracking_MergeSubdomainsDesc'; - $translationKeys[] = 'CoreAdminHome_JSTracking_CustomCampaignQueryParamDesc'; - $translationKeys[] = 'CoreAdminHome_SinglePageApplicationDescription'; - $translationKeys[] = 'CoreAdminHome_CloudflareDescription'; - $translationKeys[] = 'CoreAdminHome_SecurityNotificationUserAcceptInviteBody'; - $translationKeys[] = 'CoreAdminHome_SecurityNotificationUserDeclinedInviteBody'; - $translationKeys[] = 'CoreAdminHome_JSTracking_ConsentManagerDetected'; - $translationKeys[] = 'CoreAdminHome_JSTracking_ConsentManagerConnected'; - $translationKeys[] = 'CoreAdminHome_GoogleTagManagerDescription'; - $translationKeys[] = 'CoreAdminHome_WordpressDescription'; - $translationKeys[] = 'CoreAdminHome_VueDescription'; - $translationKeys[] = 'CoreAdminHome_ShowAdvancedOptions'; - $translationKeys[] = 'CoreAdminHome_HideAdvancedOptions'; - $translationKeys[] = 'CoreAdminHome_JSTrackingDocumentationHelp'; - $translationKeys[] = 'CoreAdminHome_ReactDescription'; - $translationKeys[] = 'CoreAdminHome_JsTrackingCodeAdvancedOptionsStep'; - $translationKeys[] = 'CoreAdminHome_JSTracking_DisableCampaignParameters'; - $translationKeys[] = 'CoreAdminHome_JSTracking_DisableCampaignParametersDesc'; - } -} diff --git a/plugins/CoreAdminHome/CustomLogo.php b/plugins/CoreAdminHome/CustomLogo.php deleted file mode 100644 index 19f2a495c34370e911a1f2ce86565e49d5f219ba..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/CustomLogo.php +++ /dev/null @@ -1,473 +0,0 @@ -getPathToLogo($pathOnly, $defaultLogo, $themeLogo, $userLogo); - } - - public function getHeaderLogoUrl($pathOnly = false) - { - $defaultLogo = 'plugins/Morpheus/images/logo.svg'; - $themeLogo = 'plugins/%s/images/logo-header.png'; - $customLogo = static::getPathUserLogoSmall(); - return $this->getPathToLogo($pathOnly, $defaultLogo, $themeLogo, $customLogo); - } - - public function getSVGLogoUrl($pathOnly = false) - { - $defaultLogo = 'plugins/Morpheus/images/logo.svg'; - $themeLogo = 'plugins/%s/images/logo.svg'; - $customLogo = static::getPathUserSvgLogo(); - $svg = $this->getPathToLogo($pathOnly, $defaultLogo, $themeLogo, $customLogo); - return $svg; - } - - public function isEnabled() - { - return $this->isCustomLogoFeatureEnabled() && Option::get('branding_use_custom_logo'); - } - - public function enable() - { - Option::set('branding_use_custom_logo', '1', true); - } - - public function disable() - { - Option::set('branding_use_custom_logo', '0', true); - } - - public function hasSVGLogo() - { - if (!$this->isEnabled()) { - /* We always have our application logo */ - return true; - } - - if ($this->isEnabled() && static::logoExists(static::getPathUserSvgLogo())) { - return true; - } - - return false; - } - - /** - * @return bool - */ - public function isFileUploadEnabled() - { - return ini_get('file_uploads') == 1; - } - - public function isCustomLogoFeatureEnabled() - { - return Config::getInstance()->General['enable_custom_logo'] != 0; - } - - /** - * @return bool - */ - public function isCustomLogoWritable() - { - if (Config::getInstance()->General['enable_custom_logo_check'] == 0) { - return true; - } - $pathUserLogo = $this->getPathUserLogo(); - - $directoryWritingTo = PIWIK_DOCUMENT_ROOT . '/' . dirname($pathUserLogo); - - // Create directory if not already created - Filesystem::mkdir($directoryWritingTo); - - $directoryWritable = is_writable($directoryWritingTo); - $logoFilesWriteable = is_writeable(PIWIK_DOCUMENT_ROOT . '/' . $pathUserLogo) - && is_writeable(PIWIK_DOCUMENT_ROOT . '/' . $this->getPathUserSvgLogo()) - && is_writeable(PIWIK_DOCUMENT_ROOT . '/' . $this->getPathUserLogoSmall()); - - $isCustomLogoWritable = ($logoFilesWriteable || $directoryWritable) && $this->isFileUploadEnabled(); - - return $isCustomLogoWritable; - } - - protected function getPathToLogo($pathOnly, $defaultLogo, $themeLogo, $customLogo) - { - $logo = $defaultLogo; - - $theme = \Piwik\Plugin\Manager::getInstance()->getThemeEnabled(); - if (!$theme) { - $themeName = Manager::DEFAULT_THEME; - } else { - $themeName = $theme->getPluginName(); - } - $themeLogo = sprintf($themeLogo, $themeName); - - if (static::logoExists($themeLogo)) { - $logo = $themeLogo; - } - if ($this->isEnabled() && static::logoExists($customLogo)) { - $logo = $customLogo; - } - - if (!$pathOnly) { - return SettingsPiwik::getPiwikUrl() . $logo; - } - - return Filesystem::getPathToPiwikRoot() . '/' . $logo; - } - - private static function getBasePath() - { - try { - $basePath = StaticContainer::get('path.misc.user'); - return $basePath; - } catch (NotFoundException $e) { - // happens when upgrading from an older version which didn't have that global config entry yet - // to a newer version of Matomo when this value is being requested while the update happens - // basically request starts... the old global.php is loaded, then we update all PHP files, then after the - // update within the same request a newer version of CustomLogo.php is loaded and they are not compatible. - // In this case we return the default value - return 'misc/user/'; - } - } - - public static function getTempPathUserLogoUploads(): string - { - // use sha1 of the username to prevent usage of unsafe characters in the path - $path = StaticContainer::get('path.tmp') . '/logos/' . sha1(Piwik::getCurrentUserLogin()) . '/'; - - if (!is_dir($path)) { - Filesystem::mkdir($path); - } - - return $path; - } - - public static function getPathUserLogo(): string - { - return static::rewritePath(self::getBasePath() . self::FILENAME_LOGO); - } - - public static function getTempPathUserLogo(): string - { - return static::getTempPathUserLogoUploads() . self::FILENAME_LOGO; - } - - public static function getPathUserFavicon(): string - { - return static::rewritePath(self::getBasePath() . self::FILENAME_FAVICON); - } - - public static function getTempPathUserFavicon(): string - { - return static::getTempPathUserLogoUploads() . self::FILENAME_FAVICON; - } - - public static function getPathUserSvgLogo(): string - { - return static::rewritePath(self::getBasePath() . self::FILENAME_LOGO_SVG); - } - - public static function getPathUserLogoSmall(): string - { - return static::rewritePath(self::getBasePath() . self::FILENAME_LOGO_HEADER); - } - - public static function getTempPathUserLogoSmall(): string - { - return static::getTempPathUserLogoUploads() . self::FILENAME_LOGO_HEADER; - } - - protected static function rewritePath(string $path): string - { - return SettingsPiwik::rewriteMiscUserPathWithInstanceId($path); - } - - public static function hasTempLogo(): bool - { - $logoTempPath = static::getTempPathUserLogo(); - $smallLogoTempPath = static::getTempPathUserLogoSmall(); - - return (file_exists($logoTempPath) && file_exists($smallLogoTempPath)); - } - - public static function hasTempFavicon(): bool - { - $faviconTempPath = static::getTempPathUserFavicon(); - - return file_exists($faviconTempPath); - } - - /** - * @return bool - */ - public static function hasUserLogo() - { - return static::logoExists(static::getPathUserLogo()); - } - - /** - * @return bool - */ - public static function hasUserFavicon() - { - return static::logoExists(static::getPathUserFavicon()); - } - - private function postLogoChangeEvent($imagePath): void - { - $rootPath = Filesystem::getPathToPiwikRoot(); - $absolutePath = $rootPath . '/' . $imagePath; - - /** - * Triggered when a user uploads a custom logo. This event is triggered for - * the large logo, for the smaller logo-header.png file, and for the favicon. - * - * @param string $absolutePath The absolute path to the logo file on the Piwik server. - */ - Piwik::postEvent('CoreAdminHome.customLogoChanged', [$absolutePath]); - } - - public function uploadFaviconToTempFolder(): bool - { - $uploadFieldName = 'customFavicon'; - - $faviconTempPath = static::getTempPathUserFavicon(); - - return $this->uploadImage($uploadFieldName, self::FAVICON_HEIGHT, $faviconTempPath); - } - - public function uploadLogoToTempFolder(): bool - { - $uploadFieldName = 'customLogo'; - - $logoTempPath = static::getTempPathUserLogo(); - $smallLogoTempPath = static::getTempPathUserLogoSmall(); - - $success = $this->uploadImage($uploadFieldName, self::LOGO_SMALL_HEIGHT, $smallLogoTempPath); - if (!$success) { - return false; - } - - $success = $this->uploadImage($uploadFieldName, self::LOGO_HEIGHT, $logoTempPath); - if (!$success) { - return false; - } - - return true; - } - - /** - * Publish logo and small logo from tmp folder to user folder - */ - public function publishUserLogo(): bool - { - $logoTempPath = static::getTempPathUserLogo(); - $logoUserPath = static::getPathUserLogo(); - - $smallLogoTempPath = static::getTempPathUserLogoSmall(); - $smallLogoUserPath = static::getPathUserLogoSmall(); - - try { - if (file_exists($logoTempPath) && file_exists($smallLogoTempPath)) { - Filesystem::copy($logoTempPath, $logoUserPath); - Filesystem::copy($smallLogoTempPath, $smallLogoUserPath); - - $this->postLogoChangeEvent($logoUserPath); - $this->postLogoChangeEvent($smallLogoUserPath); - - // remove temp files - Filesystem::remove($logoTempPath); - Filesystem::remove($smallLogoTempPath); - - return true; - } - } catch (Exception $e) { - // nop - } - - return false; - } - - /** - * Publish favicon from tmp folder to user folder - */ - public function publishUserFavicon(): bool - { - $faviconTempPath = static::getTempPathUserFavicon(); - $faviconUserPath = static::getPathUserFavicon(); - - try { - if (file_exists($faviconTempPath)) { - Filesystem::copy($faviconTempPath, $faviconUserPath); - - $this->postLogoChangeEvent($faviconUserPath); - - // remove temp file - Filesystem::remove($faviconTempPath); - - return true; - } - } catch (Exception $e) { - // nop - } - - return false; - } - - /** - * Remove any uploaded logos from tmp and user folders - */ - public function removeLogos(): void - { - static::removePublishedLogos(); - static::removeLogosFromTempFolder(); - } - - /** - * Remove publicly accessible logos and favicons from the misc/user folder - */ - public function removePublishedLogos(): void - { - $logoUserPath = static::getPathUserLogo(); - $smallLogoUserPath = static::getPathUserLogoSmall(); - $faviconUserPath = static::getPathUserFavicon(); - - Filesystem::deleteFileIfExists($logoUserPath); - Filesystem::deleteFileIfExists($smallLogoUserPath); - Filesystem::deleteFileIfExists($faviconUserPath); - } - - /** - * Remove all uploaded logos and favicons from the temp folder - */ - public function removeLogosFromTempFolder(): void - { - $logosUploadTempFolder = static::getTempPathUserLogoUploads(); - Filesystem::unlinkRecursive($logosUploadTempFolder, true); - } - - /** - * Process logo/favicon uploads from the request and store in a given path - * @param $uploadFieldName - * @param $targetHeight - * @param $path - */ - private function uploadImage($uploadFieldName, $targetHeight, $path): bool - { - if ( - empty($_FILES[$uploadFieldName]) - || !empty($_FILES[$uploadFieldName]['error']) - ) { - return false; - } - - $file = $_FILES[$uploadFieldName]['tmp_name']; - if (!file_exists($file)) { - return false; - } - - list($width, $height) = getimagesize($file); - switch ($_FILES[$uploadFieldName]['type']) { - case 'image/jpeg': - $image = @imagecreatefromjpeg($file); - break; - case 'image/png': - $image = @imagecreatefrompng($file); - break; - case 'image/gif': - $image = @imagecreatefromgif($file); - break; - default: - return false; - } - - // @phpstan-ignore class.notFound - if (!is_resource($image) && !($image instanceof \GdImage)) { - return false; - } - - $targetWidth = round($width * $targetHeight / $height); - - $newImage = imagecreatetruecolor($targetWidth, $targetHeight); - - if ($_FILES[$uploadFieldName]['type'] == 'image/png') { - imagealphablending($newImage, false); - imagesavealpha($newImage, true); - } - - $backgroundColor = imagecolorallocate($newImage, 0, 0, 0); - imagecolortransparent($newImage, $backgroundColor); - - imagecopyresampled($newImage, $image, 0, 0, 0, 0, $targetWidth, $targetHeight, $width, $height); - return imagepng($newImage, $path, 3); - } - - /** - * @return bool - */ - private static function logoExists($relativePath) - { - return file_exists(Filesystem::getPathToPiwikRoot() . '/' . $relativePath); - } - - /** - * If tmp logo exists, return it as base64 encoded string for preview in branding settings - */ - public function getTempUserLogoBase64(): ?string - { - $img = static::getTempPathUserLogo(); - - if (file_exists($img)) { - return base64_encode(file_get_contents($img)); - } - - return null; - } - - /** - * If tmp favicon exists, return it as base64 encoded string for preview in branding settings - */ - public function getTempUserFaviconBase64(): ?string - { - $img = static::getTempPathUserFavicon(); - - if (file_exists($img)) { - return base64_encode(file_get_contents($img)); - } - - return null; - } -} diff --git a/plugins/CoreAdminHome/Emails/AnonymousAccessEnabledEmail.php b/plugins/CoreAdminHome/Emails/AnonymousAccessEnabledEmail.php deleted file mode 100644 index 4137963c549fa83823867e6943ec24b950248b13..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/AnonymousAccessEnabledEmail.php +++ /dev/null @@ -1,35 +0,0 @@ -siteName = html_entity_decode($siteName); - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - return Piwik::translate('CoreAdminHome_SecurityNotificationAnonymousAccessEnabledBody', [$this->siteName]); - } -} diff --git a/plugins/CoreAdminHome/Emails/JsTrackingCodeMissingEmail.php b/plugins/CoreAdminHome/Emails/JsTrackingCodeMissingEmail.php deleted file mode 100644 index e01299d45e02dc9b39e9b8459acad9b75f65a82f..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/JsTrackingCodeMissingEmail.php +++ /dev/null @@ -1,101 +0,0 @@ -login = $login; - $this->emailAddress = $emailAddress; - $this->idSite = $idSite; - - $this->setUpEmail(); - } - - /** - * @return string - */ - public function getLogin() - { - return $this->login; - } - - /** - * @return string - */ - public function getEmailAddress() - { - return $this->emailAddress; - } - - /** - * @return int - */ - public function getIdSite() - { - return $this->idSite; - } - - private function setUpEmail() - { - $this->setDefaultFromPiwik(); - $this->addTo($this->emailAddress); - $this->setSubject($this->getDefaultSubject()); - $this->addReplyTo($this->getFrom(), $this->getFromName()); - $this->setWrappedHtmlBody($this->getDefaultBodyView()); - } - - protected function getDefaultSubject() - { - return Piwik::translate('CoreAdminHome_MissingTrackingCodeEmailSubject', ["'" . Site::getNameFor($this->idSite) . "'"]); - } - - protected function getDefaultBodyView() - { - $view = new View('@CoreAdminHome/_jsTrackingCodeMissingEmail.twig'); - $view->login = $this->login; - $view->emailAddress = $this->emailAddress; - $view->idSite = $this->idSite; - $view->siteName = Site::getNameFor($this->idSite); - $view->trackingCodeUrl = SettingsPiwik::getPiwikUrl() . 'index.php?' . Url::getQueryStringFromParameters([ - 'idSite' => $this->idSite, - 'module' => 'CoreAdminHome', - 'action' => 'trackingCodeGenerator', - 'period' => 'day', - 'date' => 'yesterday', - ]); - return $view; - } -} diff --git a/plugins/CoreAdminHome/Emails/RecoveryCodesRegeneratedEmail.php b/plugins/CoreAdminHome/Emails/RecoveryCodesRegeneratedEmail.php deleted file mode 100644 index 64a8aa6771e80a800f756c35c30adb53be1a41b9..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/RecoveryCodesRegeneratedEmail.php +++ /dev/null @@ -1,21 +0,0 @@ - 'CoreAdminHome_Login', - 'TwoFactorAuth' => 'CoreAdminHome_TwoFactorAuth', - 'CoreAdminHome' => 'CoreAdminHome_Cors', - ]; - - /** - * @var string - */ - private $login; - - /** - * @var string - */ - private $emailAddress; - - public function __construct($login, $emailAddress) - { - parent::__construct(); - - $this->login = $login; - $this->emailAddress = $emailAddress; - - $this->setUpEmail(); - } - - /** - * @return string - */ - public function getLogin() - { - return $this->login; - } - - /** - * @return string - */ - public function getEmailAddress() - { - return $this->emailAddress; - } - - - private function setUpEmail() - { - $this->setDefaultFromPiwik(); - $this->addTo($this->emailAddress); - $this->setSubject($this->getDefaultSubject()); - $this->addReplyTo($this->getFrom(), $this->getFromName()); - $this->setWrappedHtmlBody($this->getDefaultBodyView()); - } - - protected function getDefaultSubject() - { - return Piwik::translate('CoreAdminHome_SecurityNotificationEmailSubject'); - } - - protected function getDefaultBodyView() - { - $view = new View('@CoreAdminHome/_securityNotificationEmail.twig'); - $view->login = $this->login; - $view->body = $this->getBody(); - - return $view; - } - - abstract protected function getBody(); -} diff --git a/plugins/CoreAdminHome/Emails/SettingsChangedEmail.php b/plugins/CoreAdminHome/Emails/SettingsChangedEmail.php deleted file mode 100644 index 734670f779fc3bb966855381a081c925108def0b..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/SettingsChangedEmail.php +++ /dev/null @@ -1,43 +0,0 @@ -pluginNames = $pluginNames; - $this->superuser = $superuser; - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - if ($this->superuser) { - return Piwik::translate('CoreAdminHome_SecurityNotificationSettingsChangedByOtherSuperUserBody', [$this->superuser, $this->pluginNames]); - } - - return Piwik::translate('CoreAdminHome_SecurityNotificationSettingsChangedByUserBody', [$this->pluginNames]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange'); - } -} diff --git a/plugins/CoreAdminHome/Emails/TokenAuthCreatedEmail.php b/plugins/CoreAdminHome/Emails/TokenAuthCreatedEmail.php deleted file mode 100644 index 2255690d2b89c69484db64ed2983f202e46f24bd..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/TokenAuthCreatedEmail.php +++ /dev/null @@ -1,33 +0,0 @@ -tokenDescription = $tokenDescription; - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - return Piwik::translate('CoreAdminHome_SecurityNotificationTokenAuthCreatedBody', [$this->tokenDescription]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange'); - } -} diff --git a/plugins/CoreAdminHome/Emails/TokenAuthDeletedEmail.php b/plugins/CoreAdminHome/Emails/TokenAuthDeletedEmail.php deleted file mode 100644 index 4ea89cee64a5a6dc09d6f4c81f0ca5738c7f3479..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/TokenAuthDeletedEmail.php +++ /dev/null @@ -1,43 +0,0 @@ -tokenDescription = $tokenDescription; - $this->all = $all; - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - if ($this->all) { - return Piwik::translate('CoreAdminHome_SecurityNotificationAllTokenAuthDeletedBody') . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange'); - } - - return Piwik::translate('CoreAdminHome_SecurityNotificationTokenAuthDeletedBody', [$this->tokenDescription]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange'); - } -} diff --git a/plugins/CoreAdminHome/Emails/TrackingFailuresEmail.php b/plugins/CoreAdminHome/Emails/TrackingFailuresEmail.php deleted file mode 100644 index 217d9b26ee926457a5eebcfbf0479210ac641a68..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/TrackingFailuresEmail.php +++ /dev/null @@ -1,106 +0,0 @@ -login = $login; - $this->emailAddress = $emailAddress; - $this->numFailures = (int)$numFailures; - - $this->setUpEmail(); - } - - /** - * @return string - */ - public function getLogin() - { - return $this->login; - } - - /** - * @return string - */ - public function getEmailAddress() - { - return $this->emailAddress; - } - - /** - * @return int - */ - public function getNumFailures() - { - return $this->numFailures; - } - - private function setUpEmail() - { - $this->setDefaultFromPiwik(); - $this->addTo($this->emailAddress); - $this->setSubject($this->getDefaultSubject()); - $this->addReplyTo($this->getFrom(), $this->getFromName()); - $this->setWrappedHtmlBody($this->getDefaultBodyView()); - } - - private function getDefaultSubject() - { - return Piwik::translate('CoreAdminHome_TrackingFailuresEmailSubject'); - } - - private function getDefaultBodyView() - { - $view = new View('@CoreAdminHome/_trackingFailuresEmail.twig'); - $view->login = $this->login; - $view->emailAddress = $this->emailAddress; - $view->numFailures = $this->numFailures; - - $sitesId = Access::getInstance()->getSitesIdWithAtLeastViewAccess(); - $idSite = false; - if (!empty($sitesId)) { - $idSite = array_shift($sitesId); - } - $view->trackingFailuresUrl = SettingsPiwik::getPiwikUrl() . 'index.php?' . Url::getQueryStringFromParameters([ - 'module' => 'CoreAdminHome', - 'action' => 'trackingFailures', - 'period' => 'day', - 'date' => 'yesterday', - 'idSite' => $idSite, - ]); - return $view; - } -} diff --git a/plugins/CoreAdminHome/Emails/TwoFactorAuthDisabledEmail.php b/plugins/CoreAdminHome/Emails/TwoFactorAuthDisabledEmail.php deleted file mode 100644 index 3065e8bcb049753b9fab11ddebd107c842ed911d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/TwoFactorAuthDisabledEmail.php +++ /dev/null @@ -1,21 +0,0 @@ -userLogin = $userLogin; - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - return Piwik::translate('CoreAdminHome_SecurityNotificationUserAcceptInviteBody', [$this->userLogin]); - } -} diff --git a/plugins/CoreAdminHome/Emails/UserCreatedEmail.php b/plugins/CoreAdminHome/Emails/UserCreatedEmail.php deleted file mode 100644 index 581de88e184bace037a66e5e42415b898c01017d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/UserCreatedEmail.php +++ /dev/null @@ -1,33 +0,0 @@ -userLogin = $userLogin; - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - return Piwik::translate('CoreAdminHome_SecurityNotificationUserCreatedBody', [$this->userLogin]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange'); - } -} diff --git a/plugins/CoreAdminHome/Emails/UserDeclinedInvitationEmail.php b/plugins/CoreAdminHome/Emails/UserDeclinedInvitationEmail.php deleted file mode 100644 index 0b92df39faae5b3fffa565a40ea3af90aac16d23..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/UserDeclinedInvitationEmail.php +++ /dev/null @@ -1,33 +0,0 @@ -userLogin = $userLogin; - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - return Piwik::translate('CoreAdminHome_SecurityNotificationUserDeclinedInviteBody', [$this->userLogin]) ; - } -} diff --git a/plugins/CoreAdminHome/Emails/UserDeletedEmail.php b/plugins/CoreAdminHome/Emails/UserDeletedEmail.php deleted file mode 100644 index f76da9ac78760726edb9384943ac5c1aeb8e14f0..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Emails/UserDeletedEmail.php +++ /dev/null @@ -1,33 +0,0 @@ -userLogin = $userLogin; - - parent::__construct($login, $emailAddress); - } - - protected function getBody() - { - return Piwik::translate('CoreAdminHome_SecurityNotificationUserDeletedBody', [$this->userLogin]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange'); - } -} diff --git a/plugins/CoreAdminHome/Menu.php b/plugins/CoreAdminHome/Menu.php deleted file mode 100644 index e4bb63c1f904f14610b20f348086fccc1928a201..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Menu.php +++ /dev/null @@ -1,90 +0,0 @@ -addPersonalItem('', [], 1); - $menu->addSystemItem('', [], 2); - $menu->addPluginItem('', [], 3); - $menu->addMeasurableItem('', [], 4); - $menu->addPlatformItem('', [], 5); - $menu->addDiagnosticItem('', [], 6); - $menu->addDevelopmentItem('', [], 40); - - if (Piwik::hasUserSuperUserAccess()) { - $menu->addSystemItem( - 'General_GeneralSettings', - $this->urlForAction('generalSettings'), - $order = 5 - ); - } - - if (!Piwik::isUserIsAnonymous()) { - $menu->addMeasurableItem( - 'CoreAdminHome_TrackingCode', - $this->urlForAction('trackingCodeGenerator'), - $order = 12 - ); - } - - if (Piwik::isUserHasSomeAdminAccess()) { - $menu->addDiagnosticItem( - 'CoreAdminHome_TrackingFailures', - $this->urlForAction('trackingFailures'), - $order = 2 - ); - } - } - - public function configureTopMenu(MenuTop $menu) - { - $url = $this->urlForModuleAction('CoreAdminHome', 'home'); - $menu->registerMenuIcon('CoreAdminHome_Administration', 'icon-settings'); - $menu->addItem('CoreAdminHome_Administration', null, $url, 980, Piwik::translate('CoreAdminHome_Administration')); - - if (!Piwik::isUserIsAnonymous() && Piwik::isUserHasSomeViewAccess()) { - $model = new UsersModel(); - $user = $model->getUser(Piwik::getCurrentUserLogin()); - if ($user) { - $userChanges = new UserChanges($user); - $newChangesStatus = $userChanges->getNewChangesStatus(); - - if ($newChangesStatus !== ChangesModel::NO_CHANGES_EXIST) { - $icon = ($newChangesStatus === ChangesModel::NEW_CHANGES_EXIST ? 'icon-notifications_on' : 'icon-reporting-actions'); - - $menu->registerMenuIcon('CoreAdminHome_WhatIsNew', $icon); - $menu->addItem( - 'CoreAdminHome_WhatIsNew', - null, - 'javascript:', - 990, - Piwik::translate('CoreAdminHome_WhatIsNewTooltip'), - $icon, - "Piwik_Popover.createPopupAndLoadUrl('module=CoreAdminHome&action=whatIsNew', '" . - addslashes(Piwik::translate('CoreAdminHome_WhatIsNewTooltip')) . "','what-is-new-popup')", - null, - null, - $userChanges->getNewChangesCount() - ); - } - } - } - } -} diff --git a/plugins/CoreAdminHome/Model/DuplicateActionRemover.php b/plugins/CoreAdminHome/Model/DuplicateActionRemover.php deleted file mode 100644 index 0b4e2faf9669ffc5e570787ca2221cbbf71aea88..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Model/DuplicateActionRemover.php +++ /dev/null @@ -1,184 +0,0 @@ -tableMetadataAccess = $tableMetadataAccess ?: new TableMetadata(); - $this->logger = $logger ?: StaticContainer::get(LoggerInterface::class); - } - - /** - * Returns list of all duplicate actions in the log_action table by name and the lowest action ID. - * The duplicate actions are returned with each action. - * - * @return array Contains the following elements: - * - * * **name**: The action's name. - * * **idaction**: The action's ID. - * * **duplicateIdActions**: An array of duplicate action IDs. - */ - public function getDuplicateIdActions() - { - $sql = "SELECT name, COUNT(*) AS count, GROUP_CONCAT(idaction ORDER BY idaction ASC SEPARATOR ',') as idactions - FROM " . Common::prefixTable('log_action') . " - GROUP BY name, hash, type HAVING count > 1"; - - $result = array(); - foreach (Db::fetchAll($sql) as $row) { - $dupeInfo = array('name' => $row['name']); - - $idActions = explode(",", $row['idactions']); - $dupeInfo['idaction'] = array_shift($idActions); - $dupeInfo['duplicateIdActions'] = $idActions; - - $result[] = $dupeInfo; - } - return $result; - } - - /** - * Executes one SQL statement that sets all idaction columns in a table to a single value, if the - * values of those columns are in the specified set (`$duplicateIdActions`). - * - * Notes: - * - * The SQL will look like: - * - * UPDATE $table SET - * col1 = IF((col1 IN ($duplicateIdActions)), $realIdAction, col1), - * col2 = IF((col2 IN ($duplicateIdActions)), $realIdAction, col2), - * ... - * WHERE col1 IN ($duplicateIdActions) OR col2 IN ($duplicateIdActions) OR ... - * - * @param string $table - * @param int $realIdAction The idaction to set column values to. - * @param int[] $duplicateIdActions The idaction values that should be changed. - */ - public function fixDuplicateActionsInTable($table, $realIdAction, $duplicateIdActions) - { - $idactionColumns = $this->getIdActionTableColumnsFromMetadata(); - $idactionColumns = array_values($idactionColumns[$table]); - $table = Common::prefixTable($table); - - $inFromIdsExpression = $this->getInFromIdsExpression($duplicateIdActions); - $setExpression = "%1\$s = IF(($inFromIdsExpression), $realIdAction, %1\$s)"; - - $sql = "UPDATE $table SET\n"; - foreach ($idactionColumns as $index => $column) { - if ($index != 0) { - $sql .= ",\n"; - } - $sql .= sprintf($setExpression, $column); - } - $sql .= $this->getWhereToGetRowsUsingDuplicateActions($idactionColumns, $duplicateIdActions); - - Db::query($sql); - } - - /** - * Returns the server time and idsite of rows in a log table that reference at least one action - * in a set. - * - * @param string $table - * @param int[] $duplicateIdActions - * @return array with two elements **idsite** and **server_time**. idsite is the site ID and server_time - * is the date of the log. - */ - public function getSitesAndDatesOfRowsUsingDuplicates($table, $duplicateIdActions) - { - $idactionColumns = $this->getIdActionTableColumnsFromMetadata(); - $idactionColumns = array_values($idactionColumns[$table]); - $table = Common::prefixTable($table); - - $sql = "SELECT idsite, DATE(server_time) as server_time FROM `$table` "; - $sql .= $this->getWhereToGetRowsUsingDuplicateActions($idactionColumns, $duplicateIdActions); - return Db::fetchAll($sql); - } - - private function getIdActionTableColumnsFromMetadata() - { - if ($this->idactionColumns === null) { - $this->idactionColumns = array(); - foreach (self::$tablesWithIdActionColumns as $table) { - $columns = $this->tableMetadataAccess->getIdActionColumnNames(Common::prefixTable($table)); - - $this->logger->debug("Found following idactions in {table}: {columns}", array( - 'table' => $table, - 'columns' => implode(',', $columns), - )); - - $this->idactionColumns[$table] = $columns; - } - } - return $this->idactionColumns; - } - - private function getWhereToGetRowsUsingDuplicateActions($idactionColumns, $fromIdActions) - { - $sql = "WHERE "; - foreach ($idactionColumns as $index => $column) { - if ($index != 0) { - $sql .= "OR "; - } - - $sql .= sprintf($this->getInFromIdsExpression($fromIdActions), $column) . " "; - } - return $sql; - } - - private function getInFromIdsExpression($fromIdActions) - { - return "%1\$s IN (" . implode(',', $fromIdActions) . ")"; - } -} diff --git a/plugins/CoreAdminHome/OptOutManager.php b/plugins/CoreAdminHome/OptOutManager.php deleted file mode 100644 index 2f14c665fe4af1e2fc51545ced85c84440ff9f16..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/OptOutManager.php +++ /dev/null @@ -1,699 +0,0 @@ - tag is added to the webpage with a Matomo URL as the source, this URL serves the opt-out - * content and sets the opt-out cookie for the Matomo URL domain. Translation and styling is done - * server side, a third party cookie is set. Not well supported with modern browser third party cookie - * restrictions, no longer offered as an option in the UI but the content URL is supported for existing - * webpages still using the iFrame code. - * - * JavaScript : an empty
    tag is added to the webpage along with a '; - } - - /** - * Return the HTML code to be added to pages for the self-contained opt-out - */ - public function getOptOutSelfContainedEmbedCode( - string $backgroundColor, - string $fontColor, - string $fontSize, - string $fontFamily, - bool $applyStyling, - bool $showIntro - ): string { - - $cookiePath = Common::getRequestVar('cookiePath', '', 'string'); - $cookieDomain = Common::getRequestVar('cookieDomain', '', 'string'); - - $settings = [ - 'showIntro' => $showIntro, - 'divId' => 'matomo-opt-out', - 'useSecureCookies' => true, - 'cookiePath' => ($cookiePath !== '' ? $cookiePath : null), - 'cookieDomain' => ($cookieDomain !== '' ? $cookieDomain : null), - 'cookieSameSite' => Common::getRequestVar('cookieSameSite', 'Lax', 'string'), - ]; - - // Self contained code translations are static and always use the language of the user who generated the embed code - $settings = array_merge($settings, $this->getTranslations()); - $settingsString = 'var settings = ' . json_encode($settings) . ';'; - - $styleSheet = $this->optOutStyling($fontSize, $fontColor, $fontFamily, $backgroundColor, true); - - $code = <<
    - -HTML; - return str_replace( - 'window.MatomoConsent = { };', - $this->getOptOutCommonJS(), - str_replace( - 'style=""', - ($applyStyling ? 'style="' . $styleSheet . '"' : ''), - str_replace("var settings = {};", $settingsString, $code) - ) - ); - } - - /** - * Generate and return JavaScript to show the opt-out option - * - * All optOutJS URL params: - * backgroundColor - * fontColor - * fontSize - * fontFamily - * language (default "auto") Language code for the translations or "auto" to use the browser language - * showIntro (default 1) Should the opt-out intro text be shown? - * divId (default "matomo-opt-out") The id of the div which will contain the opt-out form - * useCookiesIfNoTracker (default 1) Should consent cookies be read/written directly if the tracker can't be found? - * useCookiesTimeout (default 10) How long to wait for the tracker to be detected? - * useSecureCookies (default 1) Set secure cookies? - * cookiePath (default blank) Use this path for consent cookies - * cookieDomain (default blank) Use this domain for consent cookies - */ - public function getOptOutJS(): string - { - - $language = Common::getRequestVar('language', 'auto', 'string'); - $showIntro = Common::getRequestVar('showIntro', 1, 'int'); - $divId = Common::getRequestVar('divId', 'matomo-opt-out', 'string'); - $useCookiesIfNoTracker = Common::getRequestVar('useCookiesIfNoTracker', 1, 'int'); - $useCookiesTimeout = Common::getRequestVar('useCookiesTimeout', 10, 'int'); - $useSecureCookies = Common::getRequestVar('useSecureCookies', 1, 'int'); - $cookiePath = Common::getRequestVar('cookiePath', '', 'string'); - $cookieDomain = Common::getRequestVar('cookieDomain', '', 'string'); - - // If the language parameter is 'auto' then use the browser language - if ($language === 'auto') { - $language = Common::extractLanguageAndRegionCodeFromBrowserLanguage( - Common::getBrowserLanguage(), - APILanguagesManager::getInstance()->getAvailableLanguages() - ); - } - - $settings = [ - 'showIntro' => $showIntro, - 'divId' => $divId, - 'useSecureCookies' => $useSecureCookies, - 'cookiePath' => ($cookiePath !== '' ? $cookiePath : null), - 'cookieDomain' => ($cookieDomain !== '' ? $cookieDomain : null), - 'useCookiesIfNoTracker' => $useCookiesIfNoTracker, - 'useCookiesTimeout' => $useCookiesTimeout, - ]; - - // Self contained code translations are static and always use the language of the user who generated the embed code - $translations = $this->getTranslations($language); - $translations['OptOutErrorNoTracker'] = Piwik::translate('CoreAdminHome_OptOutErrorNoTracker', [], $language); - $settings = array_merge($settings, $translations); - $settingsString = 'var settings = ' . json_encode($settings) . ';'; - - $styleSheet = $this->optOutStyling(null, null, null, null, true); - - /** @lang JavaScript */ - $code = <<getOptOutCommonJS(), - str_replace( - 'stylecss', - $styleSheet, - str_replace("var settings = {};", $settingsString, $code) - ) - ); - } - - /** - * Return the shared opt-out JavaScript (used by self-contained and tracker versions) - */ - private function getOptOutCommonJS(): string - { - /** @lang JavaScript */ - return <<'; - document.body.insertBefore(warningDiv, document.body.firstChild); - console.log(msg); - return; - } - - if (!navigator || !navigator.cookieEnabled) { - div.innerHTML = errorBlock+settings.OptOutErrorNoCookies+'

    '; - return; - } - - if (errorMessage !== null) { - div.innerHTML = errorBlock+errorMessage+'

    '; - return; - } - - var content = ''; - - if (location.protocol !== 'https:') { - content += errorBlock + settings.OptOutErrorNotHttps + '

    '; - } - - if (consent) { - if (settings.showIntro) { - content += '

    '+settings.YouMayOptOut2+' '+settings.YouMayOptOut3+'

    '; - } - content += ''; - content += ''; - } else { - if (settings.showIntro) { - content += '

    '+settings.OptOutComplete+' '+settings.OptOutCompleteBis+'

    '; - } - content += ''; - content += ''; - } - div.innerHTML = content; - - var tV = document.getElementById('trackVisits'); - if (consent) { - if (useTracker) { - tV.addEventListener("click", function (e) { - _paq.push(['optUserOut']); - showContent(false, null, true); - }); - } else { - tV.addEventListener("click", function (e) { - window.MatomoConsent.consentRevoked(); - showContent(false); - }); - } - } else { - if (useTracker) { - tV.addEventListener("click", function (e) { - _paq.push(['forgetUserOptOut']); - showContent(true, null, true); - }); - } else { - tV.addEventListener("click", function (e) { - window.MatomoConsent.consentGiven(); - showContent(true); - }); - } - } - }; - - window.MatomoConsent = { - cookiesDisabled: (!navigator || !navigator.cookieEnabled), - CONSENT_COOKIE_NAME: 'mtm_consent', CONSENT_REMOVED_COOKIE_NAME: 'mtm_consent_removed', - cookieIsSecure: false, useSecureCookies: true, cookiePath: '', cookieDomain: '', cookieSameSite: 'Lax', - init: function(useSecureCookies, cookiePath, cookieDomain, cookieSameSite) { - this.useSecureCookies = useSecureCookies; this.cookiePath = cookiePath; - this.cookieDomain = cookieDomain; this.cookieSameSite = cookieSameSite; - if(useSecureCookies && location.protocol !== 'https:') { - console.log('Error with setting useSecureCookies: You cannot use this option on http.'); - } else { - this.cookieIsSecure = useSecureCookies; - } - }, - hasConsent: function() { - var consentCookie = this.getCookie(this.CONSENT_COOKIE_NAME); - var removedCookie = this.getCookie(this.CONSENT_REMOVED_COOKIE_NAME); - if (!consentCookie && !removedCookie) { - return true; // No cookies set, so opted in - } - if (removedCookie && consentCookie) { - this.setCookie(this.CONSENT_COOKIE_NAME, '', -129600000); - return false; - } - return (consentCookie || consentCookie !== 0); - }, - consentGiven: function() { - this.setCookie(this.CONSENT_REMOVED_COOKIE_NAME, '', -129600000); - this.setCookie(this.CONSENT_COOKIE_NAME, new Date().getTime(), 946080000000); - }, - consentRevoked: function() { - this.setCookie(this.CONSENT_COOKIE_NAME, '', -129600000); - this.setCookie(this.CONSENT_REMOVED_COOKIE_NAME, new Date().getTime(), 946080000000); - }, - getCookie: function(cookieName) { - var cookiePattern = new RegExp('(^|;)[ ]*' + cookieName + '=([^;]*)'), cookieMatch = cookiePattern.exec(document.cookie); - return cookieMatch ? window.decodeURIComponent(cookieMatch[2]) : 0; - }, - setCookie: function(cookieName, value, msToExpire) { - var expiryDate = new Date(); - expiryDate.setTime((new Date().getTime()) + msToExpire); - document.cookie = cookieName + '=' + window.encodeURIComponent(value) + - (msToExpire ? ';expires=' + expiryDate.toGMTString() : '') + - ';path=' + (this.cookiePath || '/') + - (this.cookieDomain ? ';domain=' + this.cookieDomain : '') + - (this.cookieIsSecure ? ';secure' : '') + - ';SameSite=' + this.cookieSameSite; - if ((!msToExpire || msToExpire >= 0) && this.getCookie(cookieName) !== String(value)) { - console.log('There was an error setting cookie `' + cookieName + '`. Please check domain and path.'); - } - } - }; -JS; - } - - /** - * Get translations used by the opt-out popup - * - * @return array - */ - private function getTranslations(?string $language = null): array - { - return [ - 'OptOutComplete' => Piwik::translate('CoreAdminHome_OptOutComplete', [], $language), - 'OptOutCompleteBis' => Piwik::translate('CoreAdminHome_OptOutCompleteBis', [], $language), - 'YouMayOptOut2' => Piwik::translate('CoreAdminHome_YouMayOptOut2', [], $language), - 'YouMayOptOut3' => Piwik::translate('CoreAdminHome_YouMayOptOut3', [], $language), - 'OptOutErrorNoCookies' => Piwik::translate('CoreAdminHome_OptOutErrorNoCookies', [], $language), - 'OptOutErrorNotHttps' => Piwik::translate('CoreAdminHome_OptOutErrorNotHttps', [], $language), - 'YouAreNotOptedOut' => Piwik::translate('CoreAdminHome_YouAreNotOptedOut', [], $language), - 'UncheckToOptOut' => Piwik::translate('CoreAdminHome_UncheckToOptOut', [], $language), - 'YouAreOptedOut' => Piwik::translate('CoreAdminHome_YouAreOptedOut', [], $language), - 'CheckToOptIn' => Piwik::translate('CoreAdminHome_CheckToOptIn', [], $language), - ]; - } - - /** - * Return the content of the iFrame opt out - * - * @return View - * @throws \Exception - */ - public function getOptOutViewIFrame() - { - if ($this->view) { - return $this->view; - } - - $trackVisits = !IgnoreCookie::isIgnoreCookieFound(); - $dntFound = $this->getDoNotTrackHeaderChecker()->isDoNotTrackFound(); - - $setCookieInNewWindow = Common::getRequestVar('setCookieInNewWindow', false, 'int'); - if ($setCookieInNewWindow) { - $nonce = Common::getRequestVar('nonce', false); - - if ($nonce !== false && !Nonce::verifyNonce('Piwik_OptOut', $nonce)) { - Nonce::discardNonce('Piwik_OptOut'); - $nonce = ''; - } - - $reloadUrl = Url::getCurrentQueryStringWithParametersModified(array( - 'showConfirmOnly' => 1, - 'setCookieInNewWindow' => 0, - 'nonce' => $nonce ? : '', - )); - } else { - $reloadUrl = false; - - $requestNonce = Common::getRequestVar('nonce', false); - if ($requestNonce !== false && Nonce::verifyNonce('Piwik_OptOut', $requestNonce)) { - Nonce::discardNonce('Piwik_OptOut'); - IgnoreCookie::setIgnoreCookie(); - $trackVisits = !$trackVisits; - } - } - - $language = Common::getRequestVar('language', '', 'string'); - $lang = APILanguagesManager::getInstance()->isLanguageAvailable($language) - ? $language - : LanguagesManager::getLanguageCodeForCurrentUser(); - - $nonce = Nonce::getNonce('Piwik_OptOut', 3600); - - $this->addQueryParameters(array( - 'module' => 'CoreAdminHome', - 'action' => 'optOut', - 'language' => $lang, - 'setCookieInNewWindow' => 1, - 'nonce' => $nonce, - ), false); - - if (Common::getRequestVar('applyStyling', 1, 'int')) { - $this->addStylesheet($this->optOutStyling()); - } - - $this->view = new View("@CoreAdminHome/optOut"); - - $this->addJavaScript('plugins/CoreAdminHome/javascripts/optOut.js', false); - - $this->view->setXFrameOptions('allow'); - $this->view->dntFound = $dntFound; - $this->view->trackVisits = $trackVisits; - $this->view->nonce = $nonce; - $this->view->language = $lang; - $this->view->showIntro = Common::getRequestVar('showIntro', 1, 'int'); - $this->view->showConfirmOnly = Common::getRequestVar('showConfirmOnly', false, 'int'); - $this->view->reloadUrl = $reloadUrl; - $this->view->javascripts = $this->getJavaScripts(); - $this->view->stylesheets = $this->getStylesheets(); - $this->view->title = $this->getTitle(); - $this->view->queryParameters = $this->getQueryParameters(); - return $this->view; - } - - /** - * Provide a CSS style sheet based on the chosen opt out style options - * - * @throws \Exception - */ - private function optOutStyling( - ?string $fontSize = null, - ?string $fontColor = null, - ?string $fontFamily = null, - ?string $backgroundColor = null, - bool $noBody = false - ): string { - $cssfontsize = ($fontSize ? : Request::fromRequest()->getStringParameter('fontSize', '')); - $cssfontcolour = ($fontColor ? : Request::fromRequest()->getStringParameter('fontColor', '')); - $cssfontfamily = ($fontFamily ? : Request::fromRequest()->getStringParameter('fontFamily', '')); - $cssbackgroundcolor = ($backgroundColor ? : Request::fromRequest()->getStringParameter('backgroundColor', '')); - - if (!$noBody) { - $cssbody = 'body { '; - } else { - $cssbody = ''; - } - - $hexstrings = array( - 'fontColor' => $cssfontcolour, - 'backgroundColor' => $cssbackgroundcolor, - ); - foreach ($hexstrings as $key => $testcase) { - if ($testcase && !(ctype_xdigit($testcase) && in_array(strlen($testcase), array(3,6), true))) { - throw new \Exception("The URL parameter $key value of '$testcase' is not valid. Expected value is for example 'ffffff' or 'fff'.\n"); - } - } - - /** @noinspection RegExpRedundantEscape */ - if ($cssfontsize && (preg_match("/^[0-9]+[\.]?[0-9]*(px|pt|em|rem|%)$/", $cssfontsize))) { - $cssbody .= 'font-size: ' . $cssfontsize . '; '; - } elseif ($cssfontsize) { - throw new \Exception("The URL parameter fontSize value of '$cssfontsize' is not valid. Expected value is for example '15pt', '1.2em' or '13px'.\n"); - } - - /** @noinspection RegExpRedundantEscape */ - if ($cssfontfamily && (preg_match('/^[a-zA-Z0-9-\ ,\'"]+$/', $cssfontfamily))) { - $cssbody .= 'font-family: ' . $cssfontfamily . '; '; - } elseif ($cssfontfamily) { - throw new \Exception("The URL parameter fontFamily value of '$cssfontfamily' is not valid. Expected value is for example 'sans-serif' or 'Monaco, monospace'.\n"); - } - - if ($cssfontcolour) { - $cssbody .= 'color: #' . $cssfontcolour . '; '; - } - if ($cssbackgroundcolor) { - $cssbody .= 'background-color: #' . $cssbackgroundcolor . '; '; - } - - if (!$noBody) { - $cssbody .= '}'; - } - return $cssbody; - } - /** - * @return DoNotTrackHeaderChecker - */ - protected function getDoNotTrackHeaderChecker() - { - return $this->doNotTrackHeaderChecker; - } -} diff --git a/plugins/CoreAdminHome/SystemSettings.php b/plugins/CoreAdminHome/SystemSettings.php deleted file mode 100644 index 854a53eaf2d093e6e6705be5598537086863ea3d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/SystemSettings.php +++ /dev/null @@ -1,72 +0,0 @@ -title = ' '; // intentionally left blank as it's hidden with css - - $isWritable = Piwik::hasUserSuperUserAccess() && CoreAdminController::isGeneralSettingsAdminEnabled(); - $this->trustedHostnames = $this->createTrustedHostnames(); - $this->trustedHostnames->setIsWritableByCurrentUser($isWritable); - - $isWritable = Piwik::hasUserSuperUserAccess(); - $this->corsDomains = $this->createCorsDomains(); - $this->corsDomains->setIsWritableByCurrentUser($isWritable); - } - - - private function createCorsDomains() - { - return $this->makeSettingManagedInConfigOnly('General', 'cors_domains', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) { - $field->introduction = Piwik::translate('CoreAdminHome_CorsDomains'); - $field->uiControl = FieldConfig::UI_CONTROL_FIELD_ARRAY; - $arrayField = new FieldConfig\ArrayField(Piwik::translate('Overlay_Domain'), FieldConfig::UI_CONTROL_TEXT); - $field->uiControlAttributes['field'] = $arrayField->toArray(); - $field->inlineHelp = Piwik::translate('CoreAdminHome_CorsDomainsHelp'); - $field->transform = function ($values) { - return array_values(array_filter($values)); - }; - }); - } - - private function createTrustedHostnames() - { - return $this->makeSettingManagedInConfigOnly('General', 'trusted_hosts', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) { - $field->introduction = Piwik::translate('CoreAdminHome_TrustedHostSettings'); - $field->uiControl = FieldConfig::UI_CONTROL_FIELD_ARRAY; - $arrayField = new FieldConfig\ArrayField(Piwik::translate('CoreAdminHome_ValidPiwikHostname'), FieldConfig::UI_CONTROL_TEXT); - $field->uiControlAttributes['field'] = $arrayField->toArray(); - $field->transform = function ($values) { - return array_values(array_filter($values)); - }; - }); - } - - public function save() - { - parent::save(); - Cache::deleteTrackerCache(); - } -} diff --git a/plugins/CoreAdminHome/Tasks.php b/plugins/CoreAdminHome/Tasks.php deleted file mode 100644 index 73771489eb81fa0f46321b4b4b990b9386bd3f94..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Tasks.php +++ /dev/null @@ -1,427 +0,0 @@ -archivePurger = $archivePurger; - $this->logger = $logger; - $this->trackingFailures = $failures; - } - - public function schedule() - { - // for browser triggered archiving, make sure we invalidate archives once a day just to make - // sure all archives that need to be invalidated get invalidated - $this->daily('invalidateOutdatedArchives', null, self::HIGH_PRIORITY); - - $this->daily('deleteOldFingerprintSalts', null, self::HIGH_PRIORITY); - - // general data purge on older archive tables, executed daily - $this->daily('purgeOutdatedArchives', null, self::HIGH_PRIORITY); - - // general data purge on invalidated archive records, executed daily - $this->daily('purgeInvalidatedArchives', null, self::LOW_PRIORITY); - $this->daily('purgeBrokenArchivesCurrentMonth', null, self::LOW_PRIORITY); - $this->daily('purgeInvalidationsForDeletedSites', null, self::LOW_PRIORITY); - - $this->weekly('purgeOrphanedArchives', null, self::NORMAL_PRIORITY); - - // lowest priority since tables should be optimized after they are modified - $this->monthly('optimizeArchiveTable', null, self::LOWEST_PRIORITY); - - $this->daily('cleanupTrackingFailures', null, self::LOWEST_PRIORITY); - $this->weekly('notifyTrackingFailures', null, self::LOWEST_PRIORITY); - - $generalConfig = Config::getInstance()->Tracker; - if ((SettingsPiwik::isInternetEnabled() === true) && $generalConfig['enable_spam_filter']) { - $this->weekly('updateSpammerList'); - } - - $this->scheduleTrackingCodeReminderChecks(); - } - - public function purgeInvalidationsForDeletedSites() - { - $coreModel = new CoreModel(); - $coreModel->deleteInvalidationsForDeletedSites(); - } - - public function deleteOldFingerprintSalts() - { - StaticContainer::get(FingerprintSalt::class)->deleteOldSalts(); - } - - public function invalidateOutdatedArchives() - { - if (!Rules::isBrowserTriggerEnabled()) { - $this->logger->info("Browser triggered archiving disabled, archives will be invalidated during core:archive."); - return; - } - - $idSites = Request::processRequest('SitesManager.getAllSitesId'); - $cronArchive = new CronArchive(); - foreach ($idSites as $idSite) { - $cronArchive->invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain($idSite); - } - } - - private function scheduleTrackingCodeReminderChecks() - { - $daysToTrackedVisitsCheck = (int) Config::getInstance()->General['num_days_before_tracking_code_reminder']; - if ($daysToTrackedVisitsCheck <= 0) { - return; - } - - // add check for a site's tracked visits - $sites = Request::processRequest('SitesManager.getAllSites'); - - foreach ($sites as $site) { - $createdTime = Date::factory($site['ts_created']); - $scheduledTime = $createdTime->addDay($daysToTrackedVisitsCheck)->setTime('02:00:00'); - - // we don't want to run this check for every site in an install when this code is introduced, - // so if the site is over 2 * $daysToTrackedVisitsCheck days old, assume the check has run. - $isSiteOld = $createdTime->isEarlier(Date::today()->subDay($daysToTrackedVisitsCheck * 2)); - - if ($isSiteOld || $this->hasTrackingCodeReminderRun($site['idsite'])) { - continue; - } - - $schedule = new SpecificTime($scheduledTime->getTimestamp()); - $this->custom($this, 'checkSiteHasTrackedVisits', $site['idsite'], $schedule); - } - } - - public function checkSiteHasTrackedVisits($idSite) - { - $this->rememberTrackingCodeReminderRan($idSite); - - if (!SitesManager::shouldPerformEmptySiteCheck($idSite)) { - return; - } - - if (SitesManager::hasTrackedAnyTraffic($idSite)) { - return; - } - - // site is still empty after N days, so send an email to the user that created the site - $creatingUser = Site::getCreatorLoginFor($idSite); - if (empty($creatingUser)) { - return; - } - - try { - $user = Request::processRequest('UsersManager.getUser', [ - 'userLogin' => $creatingUser, - ]); - } catch (\Exception $e) { - return; - } - - if (empty($user['email'])) { - return; - } - - $container = StaticContainer::getContainer(); - $email = $container->make(JsTrackingCodeMissingEmail::class, array( - 'login' => $user['login'], - 'emailAddress' => $user['email'], - 'idSite' => $idSite, - )); - $email->send(); - } - - private function hasTrackingCodeReminderRun($idSite) - { - $table = new MeasurableSettingsTable($idSite, 'CoreAdminHome'); - $settings = $table->load(); - return !empty($settings[self::TRACKING_CODE_CHECK_FLAG]); - } - - private function rememberTrackingCodeReminderRan($idSite) - { - $table = new MeasurableSettingsTable($idSite, 'CoreAdminHome'); - $settings = $table->load(); - $settings[self::TRACKING_CODE_CHECK_FLAG] = 1; - $table->save($settings); - } - - /** - * To test execute the following command: - * `./console core:run-scheduled-tasks "Piwik\Plugins\CoreAdminHome\Tasks.cleanupTrackingFailures"` - * - * @throws \Exception - */ - public function cleanupTrackingFailures() - { - // we remove possibly outdated/fixed tracking failures that have not occurred again recently - $this->trackingFailures->removeFailuresOlderThanDays(Failures::CLEANUP_OLD_FAILURES_DAYS); - } - - /** - * To test execute the following command: - * `./console core:run-scheduled-tasks "Piwik\Plugins\CoreAdminHome\Tasks.notifyTrackingFailures"` - * - * @throws \Exception - */ - public function notifyTrackingFailures() - { - $this->cleanupTrackingFailures(); - $failures = $this->trackingFailures->getAllFailures(); - $general = Config::getInstance()->General; - if (!empty($failures) && $general['enable_tracking_failures_notification']) { - $superUsers = Piwik::getAllSuperUserAccessEmailAddresses(); - foreach ($superUsers as $login => $email) { - $email = new TrackingFailuresEmail($login, $email, count($failures)); - $email->send(); - } - } - } - - /** - * @return bool `true` if the purge was executed, `false` if it was skipped. - * @throws \Exception - */ - public function purgeOutdatedArchives() - { - if ($this->willPurgingCausePotentialProblemInUI() && !Rules::$disablePureOutdatedArchive) { - $this->logger->info("Purging temporary archives: skipped (browser triggered archiving not enabled & not running after core:archive)"); - return false; - } - - $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled(); - - $this->logger->info("Purging archives in {tableCount} archive tables.", array('tableCount' => count($archiveTables))); - - // keep track of dates we purge for, since getTablesArchivesInstalled() will return numeric & blob - // tables (so dates will appear two times, and we should only purge once per date) - $datesPurged = array(); - - foreach ($archiveTables as $table) { - $date = ArchiveTableCreator::getDateFromTableName($table); - [$year, $month] = explode('_', $date); - - // Somehow we may have archive tables created with older dates, prevent exception from being thrown - if ($year > 1990) { - if (empty($datesPurged[$date])) { - try { - $dateObj = Date::factory("$year-$month-15"); - } catch (\Exception $e) { - continue; // skip invalid dates - } - - $this->archivePurger->purgeOutdatedArchives($dateObj); - $this->archivePurger->purgeArchivesWithPeriodRange($dateObj); - - $datesPurged[$date] = true; - } else { - $this->logger->debug("Date {date} already purged.", array('date' => $date)); - } - } else { - $this->logger->info("Skipping purging of archive tables *_{year}_{month}, year <= 1990.", array('year' => $year, 'month' => $month)); - } - } - - return true; - } - - public function purgeInvalidatedArchives() - { - $purgedDates = []; - - $archivesToPurge = new ArchivesToPurgeDistributedList(); - foreach ($archivesToPurge->getAllAsDates() as $date) { - $this->archivePurger->purgeInvalidatedArchivesFrom($date); - - $archivesToPurge->removeDate($date); - - $purgedDates[$date->toString('Y-m')] = true; - } - - // purge from today if not done already since we will have many archives to remove - $today = Date::today(); - $todayStr = $today->toString('Y-m'); - if (empty($purgedDates[$todayStr])) { - $this->archivePurger->purgeInvalidatedArchivesFrom($today); - $purgedDates[$todayStr] = true; - } - - // handle yesterday if it belongs to a different month - $yesterday = Date::yesterday(); - $yesterdayStr = $yesterday->toString('Y-m'); - if (empty($purgedDates[$yesterdayStr])) { - $this->archivePurger->purgeInvalidatedArchivesFrom($yesterday); - } - - // handle year start table - $yearStart = $today->toString('Y-01'); - if (empty($purgedDates[$yearStart])) { - $this->archivePurger->purgeInvalidatedArchivesFrom(Date::factory($yearStart . '-01')); - } - } - - /** - * @return bool `true` if the purge was executed, `false` if it was skipped. - * @throws \Exception - */ - public function purgeBrokenArchivesCurrentMonth(): bool - { - if ($this->willPurgingCausePotentialProblemInUI() && !Rules::$disablePureOutdatedArchive) { - $this->logger->info("Purging broken archives: skipped (browser triggered archiving not enabled & not running after core:archive)"); - return false; - } - - $archiveTable = ArchiveTableCreator::getLatestArchiveTableInstalled(); - - if (!empty($archiveTable)) { - $this->logger->info("Purging broken archives in {table} archive table.", ['table' => $archiveTable]); - - $date = ArchiveTableCreator::getDateFromTableName($archiveTable); - [$year, $month] = explode('_', $date); - - $monthPeriod = new Month(Date::factory("$year-$month-01")); - - $this->archivePurger->purgeBrokenArchives($monthPeriod); - } else { - $this->logger->info("No archive tables found"); - } - - return true; - } - - public function optimizeArchiveTable() - { - $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled(); - Db\Schema::getInstance()->optimizeTables($archiveTables); - } - - /** - * Update the referrer spam blacklist - * - * @see https://github.com/matomo-org/referrer-spam-list - */ - public function updateSpammerList() - { - $url = 'https://raw.githubusercontent.com/matomo-org/referrer-spam-list/master/spammers.txt'; - $list = Http::sendHttpRequest($url, 30); - - if (preg_match('/[<>&?"\']/', $list)) { - throw new \Exception(sprintf( - 'The spammers list downloaded from %s contains unexpected characters, considering it a fail', - $url - )); - } - - $list = preg_split("/\r\n|\n|\r/", $list); - if (count($list) < 10) { - throw new \Exception(sprintf( - 'The spammers list downloaded from %s contains less than 10 entries, considering it a fail', - $url - )); - } - - Option::set(ReferrerSpamFilter::OPTION_STORAGE_NAME, serialize($list)); - } - - /** - * To test execute the following command: - * `./console core:run-scheduled-tasks "Piwik\Plugins\CoreAdminHome\Tasks.purgeOrphanedArchives"` - * - * @throws \Exception - */ - public function purgeOrphanedArchives() - { - $eightDaysAgo = Date::factory('now')->subDay(8); - $model = new Model(); - $deletedSegments = $model->getSegmentsDeletedSince($eightDaysAgo); - - $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled('numeric'); - - $datesPurged = array(); - foreach ($archiveTables as $table) { - $date = ArchiveTableCreator::getDateFromTableName($table); - [$year, $month] = explode('_', $date); - - try { - $dateObj = Date::factory("$year-$month-15"); - } catch (\Exception $e) { - continue; // skip invalid dates - } - - $this->archivePurger->purgeDeletedSiteArchives($dateObj); - if (count($deletedSegments)) { - $this->archivePurger->purgeDeletedSegmentArchives($dateObj, $deletedSegments); - } - - $datesPurged[$date] = true; - } - } - - /** - * we should only purge outdated & custom range archives if we know cron archiving has just run, - * or if browser triggered archiving is enabled. if cron archiving has run, then we know the latest - * archives are in the database, and we can remove temporary ones. if browser triggered archiving is - * enabled, then we know any archives that are wrongly purged, can be re-archived on demand. - * this prevents some situations where "no data" is displayed for reports that should have data. - * - * @return bool - */ - private function willPurgingCausePotentialProblemInUI() - { - return !Rules::isRequestAuthorizedToArchive(); - } -} diff --git a/plugins/CoreAdminHome/Tasks/ArchivesToPurgeDistributedList.php b/plugins/CoreAdminHome/Tasks/ArchivesToPurgeDistributedList.php deleted file mode 100644 index 0406506cc4969872d6bb7c35a8bcf26ffcf79f82..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Tasks/ArchivesToPurgeDistributedList.php +++ /dev/null @@ -1,89 +0,0 @@ -convertOldDistributedList($result); - return $result; - } - - public function getAllAsDates() - { - $dates = array(); - foreach ($this->getAll() as $yearMonth) { - try { - $date = Date::factory(str_replace('_', '-', $yearMonth) . '-01'); - } catch (\Exception $ex) { - continue; // invalid year month in distributed list - } - - $dates[] = $date; - } - return $dates; - } - - public function removeDate(Date $date) - { - $yearMonth = $date->toString('Y_m'); - $this->remove($yearMonth); - } - - /** - * Before 2.12.0 Piwik stored this list as an array mapping year months to arrays of site IDs. If this is - * found in the DB, we convert the array to an array of year months to avoid errors and to make sure - * the correct tables are still purged. - */ - private function convertOldDistributedList(&$yearMonths) - { - foreach ($yearMonths as $key => $value) { - if (preg_match("/^[0-9]{4}_[0-9]{2}$/", $key)) { - unset($yearMonths[$key]); - - $yearMonths[] = $key; - } - } - } -} diff --git a/plugins/CoreAdminHome/Widgets/GetTrackingFailures.php b/plugins/CoreAdminHome/Widgets/GetTrackingFailures.php deleted file mode 100644 index 5a4bfa6e499ffd039d0ebfcee188fee10ba11dbe..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/Widgets/GetTrackingFailures.php +++ /dev/null @@ -1,40 +0,0 @@ -setCategoryId('About Matomo'); - $config->setName('CoreAdminHome_TrackingFailures'); - $config->setOrder(5); - - if (!Piwik::isUserHasSomeAdminAccess()) { - $config->disable(); - } - } - - public function render() - { - Piwik::checkUserHasSomeAdminAccess(); - $failures = Request::processRequest('CoreAdminHome.getTrackingFailures'); - $numFailures = count($failures); - - return $this->renderTemplate('getTrackingFailures', array( - 'numFailures' => $numFailures, - )); - } -} diff --git a/plugins/CoreAdminHome/config/config.php b/plugins/CoreAdminHome/config/config.php deleted file mode 100644 index d5be5de26f92a935f318ed4c0a04fe01434bfe66..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/config/config.php +++ /dev/null @@ -1,3 +0,0 @@ - Piwik\DI::decorate(function ($previous) { - /** @var Failures $previous */ - - $generate = \Piwik\Container\StaticContainer::get('test.vars.generateTrackingFailures'); - if ($generate) { - $previous->setNow(\Piwik\Date::factory('2018-07-07 01:02:03')); - $previous->logFailure(Failures::FAILURE_ID_INVALID_SITE, new Request(array( - 'idsite' => 998, 'rec' => '1', - ))); - $previous->logFailure(Failures::FAILURE_ID_NOT_AUTHENTICATED, new Request(array( - 'idsite' => 1, - 'url' => 'https://www.example.com/foo/bar?x=1', - 'action_name' => 'foobar', - 'rec' => '1', - ))); - $previous->logFailure(Failures::FAILURE_ID_INVALID_SITE, new Request(array( - 'idsite' => 999, 'rec' => '1', - ))); - } - - return $previous; - }), - -); diff --git a/plugins/CoreAdminHome/config/tracker.php b/plugins/CoreAdminHome/config/tracker.php deleted file mode 100644 index d5be5de26f92a935f318ed4c0a04fe01434bfe66..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/config/tracker.php +++ /dev/null @@ -1,3 +0,0 @@ - 1200) { - clearInterval(initializationTimer); - initializationTimer = null; - } - } - - initializationTimer = setInterval(checkParentTrackerLoaded, 150); - } -}); - -// Listener for initialization message from parent window -// This will tell us the initial state the form should be in -// based on the first-party cookie value (which we can't access directly) -addEventListener(window, 'message', function(e) { - var data = getDataIfMessageIsForThisFrame(e); - if (!data) { - return; - } - - if (typeof data.maq_opted_in !== 'undefined' - && typeof data.maq_url !== 'undefined' - && typeof data.maq_optout_by_default !== 'undefined' - ) { - // Cancel the interval so that we don't keep sending requests to the parent - if (initializationTimer) { - clearInterval(initializationTimer); - } - - updateText(data.maq_opted_in); - } -}); \ No newline at end of file diff --git a/plugins/CoreAdminHome/javascripts/protocolCheck.js b/plugins/CoreAdminHome/javascripts/protocolCheck.js deleted file mode 100644 index 33eeec0fdf1cf97ae31dd0415c366b74daf8c850..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/javascripts/protocolCheck.js +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -$(document).ready(function () { - - if (!piwik || !location.protocol) { - return; - } - - if (!piwik.hasSuperUserAccess) { - // we show a potential notification only to super users - return; - } - - if (piwik.hasServerDetectedHttps) { - // https was detected, not needed to show a message - return; - } - - var isHttpsUsed = 0 === location.protocol.indexOf('https'); - - if (!isHttpsUsed) { - // not using https anyway, we do not show a message - return; - } - - var params = [ - '"config/config.ini.php"', - '"assume_secure_protocol=1"', - '"[General]"', - '', - '' - ]; - var message = _pk_translate('CoreAdminHome_ProtocolNotDetectedCorrectly') + " " + _pk_translate('CoreAdminHome_ProtocolNotDetectedCorrectlySolution', params); - - var UI = require('piwik/UI'); - var notification = new UI.Notification(); - notification.show(message, {context: 'warning'}); -}); diff --git a/plugins/CoreAdminHome/lang/am.json b/plugins/CoreAdminHome/lang/am.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/am.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/ar.json b/plugins/CoreAdminHome/lang/ar.json deleted file mode 100644 index 129df7ab29f36ba236d3b3114dbd2ffa58e360dc..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ar.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "أضف مُضِيفاً موثوقاً جديداً", - "Administration": "الإدارة", - "ArchivingSettings": "بيانات الأرشفة", - "BrandingSettings": "إعدادات العلامة التجارية", - "ClickHereToOptIn": "انقر هناك للاشتراك.", - "ClickHereToOptOut": "انقر هنا لإلغاء الاشتراك.", - "CustomLogoFeedbackInfo": "إذا قمت بتخصيص شعار بايويك، فقد ترغب أيضاً في إخفاء الرابط %1$s في القائمة العليا. لإجراء هذا، يمكنك تعطيل الملحق البرمجي \"التغذية الراجعة\" في صفحة %2$sإدارة الملحقات%3$s.", - "CustomLogoHelpText": "يمكنك تخصيص شعار بايويك والذي يتم عرضه في صفحة المستخدم والتقارير البريدية.", - "EmailServerSettings": "إعدادات ملقم البريد", - "ForBetaTestersOnly": "لمجربي نسخة بيتا فقط", - "ImageTracking": "صورة التتيع", - "ImageTrackingIntro1": "عندما يقوم أحد الزوار بتعطيل JaveScript، أو عندما لا يمكن استخدامها، فيمكنك أن تستخدم رابط التتبع بالصورة لمتابعة زوارك.", - "ImageTrackingIntro3": "للقائمة الكاملة بالخيارات التي يمكنك استخدامها بواسطة متتبع الصورة، انظر %1$sمستندات واجهة تطبيقات التتبع%2$s.", - "ImageTrackingLink": "رابط صورة التتبع", - "InvalidPluginsYouCanUninstall": "يمكنك تحديث أو إلغاء تثبيت هذه الإضافات عبر صفحة %1$sإدارة الإضافات%2$s", - "JSTrackingIntro2": "ما أن تحصل على كود التتبع لموقعك، انسخه وألصقه في كافة الصفحات التي ترغب من بايويك أن يتتبعها.", - "JSTrackingIntro4": "إذا لم تكن ترغب في استخدام جافاسكريبت لتتبع زوارك، قم %1$sبتوليد رابط تتبع بالصورة أدناه%2$s.", - "JSTracking_CampaignNameParam": "باراميتر اسم الحملة", - "JSTracking_CustomCampaignQueryParam": "استخدم أسماء باراميترات استعلام مخصصة لاسم الحملة وكلماتها الدلالية", - "JSTracking_EnableDoNotTrack": "تفعيل اكتشاف إعدادات عدم التتبع لدى العميل", - "JSTracking_EnableDoNotTrackDesc": "بحيث لن يتم إرسال طلبات التتبع إذا لم يرغب الزوار في ذلك.", - "JSTracking_GroupPageTitlesByDomainDesc1": "بحيث إذا زار أحدهم صفحة 'عنا' على المدونة %1$s سيتم تسجيلها في شكل 'المدونة / عنا'. هذه هي أسهل طريقة للحصول على نظرة عامة حول حركة الزوار في نطاق فرعي.", - "JSTracking_MergeAliasesDesc": "بحيث تكون النقرات على الروابط إلى روابط مماثلة Alias URL (مثل. %s) لن تعتبر كـ'روابط صادرة'.", - "JSTracking_MergeSubdomains": "تتبع كل الزوار القادمين من النطاقات الفرعية ل", - "JSTracking_MergeSubdomainsDesc": "بحيث إذا زار أحدهم %1$s و %2$s، سيتم احتسابه كزائر فريد وحيد.", - "JSTracking_PageCustomVars": "تتبع متغير مخصص لكل عملية عرض صفحة", - "JSTracking_PageCustomVarsDesc": "على سبيل المثال، مع اسم المتغير \"فئة\" وقيمته \"الصفحات البيضاء\".", - "JSTracking_VisitorCustomVars": "تتبع متغيرات مخصصة عند زيارة هذا الزائر", - "JSTracking_VisitorCustomVarsDesc": "على سبيل المثال، باسم متغير \"النوع\" وقيمته \"العميل\".", - "JavaScriptTracking": "التتبع بجافاسكريبت", - "Login": "اسم المستخدم", - "LogoUpload": "اختر شعاراً لرفعه", - "MenuDiagnostic": "التشخيص", - "MenuGeneralSettings": "الإعدادات العامة", - "MenuSystem": "النظام", - "OptOutComplete": "اكتمل إلغاء الاشتراك: لن يتم احتساب زياراتك لهذا الموقع بواسطة أدوات تحليلات ويب الخاصة بنا.", - "OptOutCompleteBis": "لاحظ أنك في حالة مسح الكوكيز Coockies، فإنك بذلك تحذف الكوكيز الخاصة بإلغاء الاشتراك، أو في حالة تغيير جهاز الكمبيوتر أو المتصفح، فستحتاج لإعادة هذا الإجراء مرة أخرى.", - "OptOutExplanation": "Matomo ملتزم بالخصوصية على الإنترنت. لمنح زوارك اختيار إلغاء الاشتراك في تحليلات ويب من Matomo، يمكنك إضافة كود HTML التالي على أحد صفحات موقعك. على سبيل المثال في صفحة سياسة الخصوصية.", - "OptOutForYourVisitors": "إلغاء الاشتراك في Matomo لزوارك", - "PiwikIsInstalledAt": "بايويك مثبت في المسار", - "PluginSettings": "إعدادات الإضافة", - "PluginSettingsIntro": "يمكنك هنا تغيير إعدادات أي من إضافات الطرف الثالث التالية:", - "PluginSettingsSaveFailed": "فَشِل حفظ إعدادات الإضافة", - "PluginSettingsSaveSuccess": "تم تحديث إعدادات الإضافة.", - "SendPluginUpdateCommunication": "أرسل بريداً عند توفر تحديث للإضافة", - "SendPluginUpdateCommunicationHelp": "سيتم إرسال بريد إلى المستخدم الفائق عند توفر نسخة جديدة لإضافة ما.", - "SettingsSaveSuccess": "تم تحديث الإعدادات.", - "TrackAGoal": "تتبع هدف", - "TrackingCode": "كود التتبع", - "TrustedHostConfirm": "هل ترغب حقاً في تغيير اسم المُضيف الموثوق لدى بايويك؟", - "TrustedHostSettings": "مُضيف بايويك الموثوق", - "UpdateSettings": "تحديث الإعدادات", - "UseCustomLogo": "استخدم شعاراً مخصصاً", - "ValidPiwikHostname": "مُضيف بايويك صالح", - "WithOptionalRevenue": "مع أرباح اختيارية", - "YouAreOptedOut": "أنت غير مشترك حالياً.", - "YouMayOptOut": "يمكنك أن تختار ألا تحصل على كوكيز ذات معرف فريد يتم تعيينه لجهازك لتجنب شمول وتحليل البيانات التي يتم جمعها على هذا الموقع.", - "YouMayOptOutBis": "لإجراء هذا الاختيار، الرجاء النقر أدناه للحصول على كوكيز إلغاء الاشتراك." - } -} diff --git a/plugins/CoreAdminHome/lang/az.json b/plugins/CoreAdminHome/lang/az.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/az.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/be.json b/plugins/CoreAdminHome/lang/be.json deleted file mode 100644 index c6ec41f301788c5a6f51180ae1e37b7e938c7cdd..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/be.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "Адміністрацыя", - "BrandingSettings": "Брэндынг наладкі", - "ClickHereToOptIn": "Націсніце тут, каб адмяніць адмову.", - "ClickHereToOptOut": "Націсніце тут, каб адмовіцца.", - "CustomLogoFeedbackInfo": "Калі Вы наладзілі свой лагатып, магчыма вы будзіце зацікаўлены ў схаванні %1$s спасылкі у верхнім меню. Для гэтага, вы можаце адключыць плагін зваротнай сувязі на старонцы %2$sУпраўлення плагінамі%3$s.", - "CustomLogoHelpText": "Вы можаце наладзіць свой лагатып, які будзе адлюстроўвацца ў карыстацкім інтэрфейсе і ў справаздачах, якія атрымліваюць па электроннай пошце.", - "EmailServerSettings": "Наладкі сервера электроннай пошты", - "Login": "лагін", - "LogoUpload": "Выбраць лагатып для загрузкі", - "MenuGeneralSettings": "Агульныя наладкі", - "OptOutComplete": "Адмова завершана; вашы наведванні гэтага вэб-сайта не будуць запісаны інструментам Вэб-Аналітыкі.", - "OptOutCompleteBis": "Заўважце, што калі вы выдаляеце cookies, выдаляеце спецыяльны cookie для адмовы, змяняяце кампутары або вэб-браўзэры, вам трэба выканаць працэдуру адмовы зноў.", - "OptOutExplanation": "Matomo прысвечаны забеспячэнню канфідэнцыяльнасці ў Інтэрнэце. Каб прапанаваць сваім наведвальнікам адмовіцца ад Matomo Вэб-Аналітыкі, вы можаце дадаць наступны код на адной з старонак вашага сайта, напрыклад, на старонцы Палітыка прыватнасці.", - "OptOutForYourVisitors": "Адмова ад Matomo для вашых наведвальнікаў", - "UseCustomLogo": "Выкарыстаць ўласны лагатып", - "YouAreOptedOut": "У дадзены момант Вы адмоўлены.", - "YouMayOptOut": "Вы можаце выбраць, і атрымаць унікальны ідэнтыфікацыйны cookie з нумарам, прысвоеным вашаму кампутару, каб пазбегнуць агрэгацыі і аналізу дадзеных, сабраных на гэтым вэб-сайце.", - "YouMayOptOutBis": "Каб зрабіць гэты выбар, калі ласка, націсніце ніжэй, каб атрымаць спецыяльны cookie для адмовы." - } -} diff --git a/plugins/CoreAdminHome/lang/bg.json b/plugins/CoreAdminHome/lang/bg.json deleted file mode 100644 index 18a149170413e1d145d14c29ca3b0248d10f30e8..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/bg.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Приемете поканата", - "AddNewTrustedHost": "Добави нов доверен хост", - "Administration": "Администрация", - "ArchivingSettings": "Настройки за архивиране", - "BrandingSettings": "Настройки на бранда", - "BruteForce": "Brute Force атака", - "CheckToOptIn": "Поставете отметка в това квадратче, за да се включите.", - "ClickHereToOptIn": "Натиснете тук за съгласие.", - "ClickHereToOptOut": "Натиснете тук за отказ.", - "ConfirmDeleteAllTrackingFailures": "Сигурни ли сте, че искате да изтриете всички неуспешни проследявания?", - "ConfirmDeleteThisTrackingFailure": "Сигурни ли сте, че искате да изтриете този провал в проследяването?", - "Cors": "Домейни споделяне на ресурси за кръстосан произход (CORS)", - "CorsDomains": "Домейни споделяне на ресурси за кръстосан произход (CORS)", - "CorsDomainsHelp": "Можете да дефинирате домейни или поддомейни като http://example.com или http://stats.example.com. Или за да разрешите искания за кръстосани домейни за всички домейни, просто добавете *", - "CustomLogoFeedbackInfo": "Ако персонализирате логото на Matomo, може да Ви е полезно и да скриете връзката %1$s в горното меню. За да направите това, можете да деактивирате плъгина за обратна връзка в страницата %2$sУправление на плъгини%3$s.", - "CustomLogoHelpText": "Можете да модифицирате логото на Matomo, което да се показва в интерфейса на потребителя и имейлите с отчети.", - "DeclineInvite": "Откажете поканата", - "DeleteAllFailures": "Изтрийте всички неуспехи", - "DevelopmentProcess": "Въпреки че нашият процес на разработка включва хиляди автоматизирани тестове, бета тестери играят ключова роля за постигането на „политика без грешки“ в Matomo.", - "EmailServerSettings": "Настройки сървър на е-поща", - "ErrorEmailFromAddressNotValid": "SMTP адресът \"от\" не е валиден", - "FaviconUpload": "Изберете Favicon за качване", - "FileUploadDisabled": "Качването на файлове не е активирано във Вашата PHP конфигурация. За да качите Вашето персонализирано лого, моля, задайте %s в php.ini и рестартирайте Вашия уеб сървър.", - "ForBetaTestersOnly": "Само за бета тестери", - "HowToGetHelp": "Има различни начини да получите помощ. Има безплатна поддръжка чрез общността Matomo и платена поддръжка, предоставена от екипа на Matomo и партньорите на Matomo. Или може би имате грешка за докладване или искате да предложите нова функция?", - "HttpTrackingApi": "API за проследяване на HTTP", - "HttpTrackingApiDescription": "API-то за проследяване на %1$sHTTP%2$s Ви позволява да проследявате всичко. Това може да е полезно, ако използвате език за програмиране, за който все още не съществува SDK. Може също да е полезно, когато искате да проследявате устройства или приложение по специален начин.", - "ImageTracking": "Проследяване на изображенията", - "ImageTrackingIntro1": "Когато посетителят е изключил JavaScript или когато JavaScript не може да бъде използван, може да се използва проследяващата връзка към изображение, за да бъдат проследени посетителите.", - "ImageTrackingIntro2": "Генерирайте връзката по-долу и копирайте и поставете генерирания HTML код в страницата. Ако използвате това като резервен вариант за проследяване на JavaScript, можете да го обградите в тагове %1$s.", - "ImageTrackingIntro3": "За целия списък с опции, които можете да използвате с връзка за проследяване на изображение, вижте %1$sДокументацията на API за проследяване%2$s.", - "ImageTrackingLink": "Връзка към изображение, за което се води отчет", - "ImportFromGoogleAnalytics": "Импортиране от Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Ако използвате Google Анализ и преминавате към Matomo, можете да импортирате съществуващите си данни с помощта на приставката %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Една алтернатива за проследяване на посетителите чрез браузъра (или чрез JavaScript или препратка към файла) е непрекъснато да се внасят сървърните логове. Научете повече за %1$sServer Log File Analytics%2$s.", - "InvalidPluginsWarning": "Следните плъгини не са съвместими с %1$s и не могат да бъдат заредени: %2$s.", - "InvalidPluginsYouCanUninstall": "Може да обновите или деинсталирате тези плъгини чрез %1$sУправление на плъгини%2$s.", - "JSTrackingIntro1": "Можете да проследявате посетителите на Вашия уебсайт по много различни начини. Препоръчителният начин да го направите е чрез JavaScript. За да използвате този метод, трябва да се уверите, че всяка уеб страница на Вашия уебсайт има JavaScript код, който можете да генерирате тук.", - "JSTrackingIntro2": "След като имате нужния JavaScript код за вашия сайт, го копирайте и поставете във всички страници, които искате да следите с Matomo.", - "JSTrackingIntro3a": "В повечето уебсайтове, блогове, CMS и т.н. можете да използвате предварително направен плъгин, който да свърши техническата работа вместо Вас. (Вижте нашия %1$s списък с плъгини, използвани за интегриране на Matomo %2$s.)", - "JSTrackingIntro3b": "Ако не съществува плъгин, можете да редактирате шаблоните на уебсайта си и да добавите проследяващия код на JavaScript към </head> маркер, който често се дефинира в 'header.php', 'header.tpl' или подобен шаблонен файл.", - "JSTrackingIntro4": "В случай, че не искате да използвате JavaScript за водене на статистика за посетителите %1$sгенерирай изображение под формата на проследяваща връзка по-долу%2$s.", - "JSTrackingIntro5": "В случай, че желаете да събирате повече информация за посещенията, моля, вижте %1$sMatomo Javascript Tracking документацията%2$s, за списък с наличните функции. Използвайки тези функции може да следите цели, персонализирани променливи, поръчки, изоставени колички и други.", - "JSTracking_CampaignKwdParam": "Параметър ключова дума на кампанията", - "JSTracking_CampaignNameParam": "Параметър име на кампанията", - "JSTracking_CodeNoteBeforeClosingHead": "Уверете се, че този код е на всяка страница от Вашия уебсайт. Препоръчваме да го поставите непосредствено преди затварящия таг %1$s.", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Уверете се, че този код е вграден чрез скрипт елемент на всяка страница от Вашия уебсайт. Препоръчваме да го поставите непосредствено преди затварящия HEAD таг.", - "JSTracking_CrossDomain": "По подразбиране идентификационният номер на посетителя, който идентифицира уникален посетител, се съхранява в бисквитките на браузъра, които могат да бъдат достъпни само от страници в същия домейн. Активирането на кръстосано свързване на домейни Ви позволява да проследявате всички действия и показвания на страници на конкретен посетител при едно и също посещение, дори когато преглежда страници в няколко домейна. Всеки път когато потребител кликне върху връзка към някой от URL адресите на псевдонима на Вашия уебсайт, той ще добави URL параметър pk_vid, препращащ идентификатора на посетителя.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Забележка: За да използвате кръстосано свързване на домейни, трябва да посочите повече от едно име на домейн (URL) за Вашия уебсайт.", - "JSTracking_CustomCampaignQueryParam": "Използвайте произволно име на параметър заявка за име и ключ на кампанията", - "JSTracking_CustomCampaignQueryParamDesc": "Забележка: %1$sMatomo автоматично ще засече Google Analytics параметрите.%2$s", - "JSTracking_DisableCookies": "Изключване на всички проследяващи бисквитки", - "JSTracking_DisableCookiesDesc": "Деактивира всички бисквитки от първа страна. Съществуващите бисквитки на Matomo за този уебсайт ще бъдат изтрити при следващото показване на страница.", - "JSTracking_EnableCrossDomainLinking": "Активира кръстосано свързване на домейни", - "JSTracking_EnableDoNotTrack": "Активиране на режим за засичане на включена функция „Не проследявай“", - "JSTracking_EnableDoNotTrackDesc": "Заявките за следене няма да бъдат изпратени, ако посетителите не желаят да бъде събирана информация за тях.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Забележка: От страна на сървъра е включена настройката „Не проследявай“, така че тази настройка няма да окаже ефект.", - "JSTracking_EndNote": "Забележка: Можете да генерирате персонализиран код за проследяване в администраторската секция %1$sПроследяващ код%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Добавете домейна на сайта към заглавието на страницата при проследяване", - "JSTracking_GroupPageTitlesByDomainDesc1": "В случай, че някой посети страница „За“ в блога, %1$s ще бъде записан/о в 'Блог / За'. Това е най-лесният начин, за да се направи преглед на трафика по поддомейн.", - "JSTracking_MergeAliases": "В доклада за „Изходните страници“ скрийте кликванията до познати адреси на", - "JSTracking_MergeAliasesDesc": "Така че кликванията върху връзки към URL адреси на псевдоними (напр. %s) няма да се отчитат като „Извън връзка“.", - "JSTracking_MergeSubdomains": "Проследяване на посетителите във всички поддомейни на", - "JSTracking_MergeSubdomainsDesc": "Ако един посетител разгледа %1$s и %2$s, това ще се брои като едно уникално посещение.", - "JSTracking_PageCustomVars": "Проследяване на персонализирана променлива за всеки преглед на страница", - "JSTracking_PageCustomVarsDesc": "Пример: име на променливата „Категория“ и стойност „Бели книжа“.", - "JSTracking_TrackNoScript": "Проследявайте потребители с деактивиран JavaScript", - "JSTracking_VisitorCustomVars": "Проследяване на персонализирани променливи за този посетител", - "JSTracking_VisitorCustomVarsDesc": "Например, с име на променлива „Тип“ и стойност „Клиент“.", - "JavaScriptTracking": "JavaScript Проследяване", - "JsTrackingCodeMissingEmail1": "Преди няколко дни добавихте уебсайта „%s“ към Вашия Matomo Analytics. Току-що проверихме и изглежда, че Вашият Matomo няма записан трафик за този уебсайт.", - "JsTrackingCodeMissingEmail2": "За да започнете да проследявате данни и да получавате информация за потребителите си, ще трябва да настройте проследяване във Вашия уебсайт или мобилно приложение. За уебсайтове просто вградете проследяващия код точно преди тага %s.", - "JsTrackingCodeMissingEmail3": "За да намерите и персонализирате своя проследяващ код, %1$s кликнете тук%2$s (или разгледайте ръководството за %3$sJavaScript Tracking Client %4$s).", - "LearnMore": "Научете повече", - "Login": "вход", - "LogoNotWriteableInstruction": "За да използвате Вашето персонализирано лого вместо логото на Matomo по подразбиране, дайте разрешение за запис на тази директория: %1$s Matomo се нуждае от достъп за запис за Вашите лога, съхранени във файловете %2$s.", - "LogoUpload": "Изберете логото за качване", - "LogoUploadFailed": "Каченият файл не можа да бъде обработен. Моля, проверете дали файлът има валиден формат.", - "LogoUploadHelp": "Моля, качете файла в %1$s формати с минимална височина %2$s пиксела.", - "LtsReleases": "Версиите на LTS (Дългосрочна поддръжка) получават обновления само за сигурност и корекции на грешки.", - "MenuDevelopment": "Развитие", - "MenuDiagnostic": "Диагностика", - "MenuGeneralSettings": "Основни настройки", - "MenuMeasurables": "Измерими", - "MenuSystem": "Система", - "MissingTrackingCodeEmailSubject": "Няма записан трафик за %s в Matomo Analytics, започнете сега", - "NTrackingFailures": "%s неуспехи при проследяване", - "NeedHelp": "Нужда от помощ?", - "NoKnownFailures": "Няма известни грешки при проследяване.", - "OptOutComplete": "Отказът е приет; вашите посещения в този уебсайт няма да бъдат записвани от Инструмента за Уеб анализ.", - "OptOutCompleteBis": "Запомнете, че ако изтриете вашите бисквитки или ако смените компютъра или уеб браузъра ще е нужно да направите процедурата за отказ отново.", - "OptOutCustomOptOutLink": "Можете също така да създадете напълно персонализиран формуляр за отказ с помощта на HTML и JavaScript, както е обяснено в това %1$sръководство за разработчици%2$s.", - "OptOutDntFound": "Не се проследявате, тъй като браузърът Ви съобщава, че не искате. Това е настройка на Вашия браузър, така че няма да можете да се включите, докато не деактивирате функцията „Не проследявай“.", - "OptOutErrorNoCookies": "Функцията за отказ от проследяване изисква бисквитките да бъдат активирани.", - "OptOutErrorNoTracker": "Функцията за отказ от проследяване не успя да намери кода на Matomo Tracker на тази страница", - "OptOutErrorNotHttps": "Функцията за отказ от проследяване може да не работи, защото този сайт не е зареден през HTTPS. Моля, презаредете страницата, за да проверите дали състоянието на отказ от проследяване се е променило.", - "OptOutErrorWindowOpen": "Функцията за отказ от пноследяване може да не работи, защото изглежда, че изскачащият прозорец за отказ е блокиран. Моля, презаредете страницата, за да проверите дали състоянието Ви на отказ се е променило.", - "OptOutExplanation": "Matomo е ангажиран с осигуряването на поверителност в Интернет. За да позволите на потребителите си да се откажат от Matomo Web Analytics, можете да добавите нужният HTML код в една от вашите уеб страници, например в раздела Поверителност.", - "OptOutExplanationIntro": "Този код ще покаже div контейнер, съдържащ връзка за Вашите посетители да се откажат от Matomo, като зададат бисквитка за отказ в своите уеб браузъри. Вижте по-долу (или %1$s кликнете тук%2$s), за да видите съдържанието, което ще се показва от div контейнера.", - "OptOutForYourVisitors": "Matomo отказ за вашите посетители", - "OptingYouOut": "Извършване на отказ от проследяване. Моля, изчакайте…", - "PersonalPluginSettings": "Лични настройки на плъгин", - "PiwikIsInstalledAt": "Matomo е инсталиран на", - "PluginSettingChangeNotAllowed": "Нямате право да променяте стойността на настройката \"%1$s\" в плъгин \"%2$s\"", - "PluginSettingReadNotAllowed": "Нямате право да четете стойността на настройката \"%1$s\" в плъгин \"%2$s\"", - "PluginSettings": "Настройки на плъгин", - "PluginSettingsIntro": "Тук могат да се променят настройките за следните плъгини от трети страни:", - "PluginSettingsSaveFailed": "Не можаха да се запишат настройките на плъгина", - "PluginSettingsSaveSuccess": "Настройките на плъгина са актуализирани.", - "PluginSettingsValueNotAllowed": "Стойността за полето \"%1$s\" в плъгина \"%2$s\" не е разрешена", - "Problem": "Проблем", - "ProtocolNotDetectedCorrectly": "В момента разглеждате Matomo през защитена SSL връзка (използвайки HTTPS), но Matomo може да открие само незащитена връзка на сървъра.", - "ProtocolNotDetectedCorrectlySolution": "За да сте сигурни, че Matomo сигурно изисква и обслужва вашето съдържание през HTTPS, можете да редактирате вашия файл %1$s и или да конфигурирате настройките на прокси сървъра си, или можете да добавите реда %2$s под секцията %3$s. %4$sНаучете повече%5$s", - "ReleaseChannel": "Канал за нови версии", - "SecurityNotificationAllTokenAuthDeletedBody": "Някой е изтрил всички токени за auth в профила Ви.", - "SecurityNotificationCheckTwoFactor": "Моля, проверете приложението или устройството си за двуфакторна автентикация.", - "SecurityNotificationEmailSubject": "Известие за сигурност", - "SecurityNotificationIfItWasYou": "Ако сте били Вие, продължете. Ако не разпознавате тази дейност, моля, сменете паролата си.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Някой е генерирал нови кодове за възстановяване на двуфакторна автентикация за Вашия акаунт.", - "SecurityNotificationRecoveryCodesShowedBody": "Някой е разглеждал кодовете за възстановяване на двуфакторната автентикация на Вашия акаунт.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Друг супер потребител (%1$s) е променил системните настройки. Засегнати настройки: %2$s. Ако знаете за тази дейност, продължете. Ако не разпознавате тази дейност, моля, свържете се с другите супер потребители.", - "SecurityNotificationSettingsChangedByUserBody": "Някой е променил системните настройки. Засегнати настройки: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Някой е създал токен за auth (описание: %s) в профила Ви. Ако не сте били Вие, изтрийте токена.", - "SecurityNotificationTokenAuthDeletedBody": "Някой е изтрил токен за удостоверяване (описание: %s) във Вашия акаунт.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Някой е деактивирал двуфакторната автентикация във Вашия акаунт.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Някой е активирал двуфакторната автентикация във Вашия акаунт.", - "SecurityNotificationUserAcceptInviteBody": "Потребителят (логин: %s) прие поканата.", - "SecurityNotificationUserCreatedBody": "Някой е създал нов потребител (потребителско име: %s) във Вашия акаунт.", - "SecurityNotificationUserDeclinedInviteBody": "Потребител (логин: %s) отказа поканата.", - "SecurityNotificationUserDeletedBody": "Някой е изтрил потребител (потребителско име: %s) във Вашия акаунт.", - "SendPluginUpdateCommunication": "Изпращане на имейл, когато е налична актуализация на плъгин", - "SendPluginUpdateCommunicationHelp": "Ще бъде изпратен имейл до супер потребители, когато има налична нова версия на плъгин.", - "SettingsSaveSuccess": "Настройките са обновени.", - "SinglePageApplicationDescription": "Ако проследявате едностранично приложение (SPA) или прогресивно уеб приложение (PWA), моля, вижте %1$s това ръководство %2$s.", - "Solution": "Решение", - "StableReleases": "Ако Matomo е критично важен за вашият бизнес, използвайте последната стабилна версия. Ако използвате последна бета и откриете бъг или имате предложение, моля %1$sвижте тук%2$s.", - "SystemPluginSettings": "Системни настройки на плъгин", - "TrackAGoal": "Проследяване на цел", - "TrackingCode": "Код за проследяване", - "TrackingCodeIntro": "Matomo Ви предлага различни начини за вграждане на проследяващия код за Вашия уебсайт, мобилно приложение и дори за всяко устройство или приложение.", - "TrackingFailureAuthenticationProblem": "Заявката не беше автентикирана, но се изискваше автентикаране.", - "TrackingFailureAuthenticationSolution": "Задайте или коригирайте „token_auth“ във Вашата заявка за проследяване.", - "TrackingFailureInvalidSiteProblem": "Сайтът не съществува.", - "TrackingFailureInvalidSiteSolution": "Актуализирайте конфигурирания idSite в тракера.", - "TrackingFailures": "Неуспехи при проследяването", - "TrackingFailuresEmail1": "Това е само за да Ви уведомим, че %s различни видове неуспехи при проследяване са възникнали през последните дни.", - "TrackingFailuresEmail2": "За да видите всички неуспешни заявки за проследяване %1$s, кликнете тук %2$s.", - "TrackingFailuresEmailSubject": "Неуспехи при проследяването във Вашия Matomo Analytics", - "TrackingFailuresIntroduction": "Тази страница изброява неуспехите при проследяване, случили се през последните %s дни. Моля, имайте предвид, че се записват само най-често срещаните грешки при проследяване, а не всички.", - "TrackingURL": "URL за проследяване", - "TrustedHostConfirm": "Сигурни ли сте, че желаете да промените довереното Matomo хост име?", - "TrustedHostSettings": "Доверено Matomo хост име", - "TwoFactorAuth": "Двуфакторна автентикация", - "UiDemo": "Демо на потребителския интерфейс", - "UncheckToOptOut": "Махнете отметката от това поле, за да се откажете.", - "UpdateSettings": "Настройки за обновяване", - "UseCustomLogo": "Използвайте изработено лого", - "UserInviteContent": "Можете да приемете тази покана, като кликнете върху бутона за приемане по-долу.", - "UserInviteNotes": "Ако не сте очаквали тази покана, можете да пренебрегнете този имейл. Ако %1$s Ви изпраща твърде много имейли, можете да ги блокирате или да подадете сигнал за злоупотреба. Поканата автоматично изтича след %2$s дни.", - "UserInviteSubject": "%1$s Ви изпрати покана да се присъедините към Matomo Analytics за %2$s.", - "ValidPiwikHostname": "Валидно Matomo хост име", - "ViewAllTrackingFailures": "Вижте всички неуспехи при проследяване", - "WhatIsNew": "Какво ново", - "WhatIsNewNoChanges": "В момента няма нищо ново", - "WhatIsNewNoChangesTitle": "Няма скорошни промени", - "WhatIsNewRemindMeLater": "Напомни ми по-късно", - "WhatIsNewTitle": "Ето какво е новото в Matomo", - "WhatIsNewTooltip": "Научете какво е новото в Matomo", - "WithOptionalRevenue": "с опция за приходите", - "YouAreNotOptedOut": "Не сте се отписали.", - "YouAreOptedOut": "В момента сте отказали.", - "YouMayOptOut": "Можете да изберете да нямате уникална уеб анализ бисквитка с идектификационен номер, свързан към вашият компютър, за да избегнете агрегацията на анализ на събраната информация на този уеб сайт.", - "YouMayOptOut2": "Имате възможност да забраните Вашите действия да бъдат анализирани и свързани с Вас.", - "YouMayOptOut3": "Това ще защити Вашето лично пространство, но ще попречи на собственика да се обучи от Вашите действия и да подобри възможностите за обслужване за Вас и за други потребители.", - "YouMayOptOutBis": "За да направите този избор, моля кликнете долу за да получите биксвитката за отказване." - } -} diff --git a/plugins/CoreAdminHome/lang/bn.json b/plugins/CoreAdminHome/lang/bn.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/bn.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/bs.json b/plugins/CoreAdminHome/lang/bs.json deleted file mode 100644 index 38f9f44f828d9921f3d748c225b20771566c6325..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/bs.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Dodajte novi pouzdani host", - "Administration": "Administracija", - "ArchivingSettings": "Postavke arhiviranja", - "BrandingSettings": "Postavke brendiranja", - "BruteForce": "Brute Force", - "EmailServerSettings": "Postavke email servera", - "Login": "Prijavi se", - "MenuDiagnostic": "Dijagnostika", - "MenuGeneralSettings": "Opšte postavke" - } -} diff --git a/plugins/CoreAdminHome/lang/ca.json b/plugins/CoreAdminHome/lang/ca.json deleted file mode 100644 index 324a9b2b36818ba149701fb5274c21c4dcbcb8a0..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ca.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Accepta la invitació", - "AddNewTrustedHost": "Afegeix un nou hoste de confiança", - "Administration": "Administració", - "ArchivingSettings": "Configuració d'arxivat", - "BrandingSettings": "Preferències del Branding", - "BruteForce": "Força bruta", - "CheckToOptIn": "Marqueu aquesta casella per participar.", - "ClickHereToOptIn": "Feu click aquí per apuntar-vos.", - "ClickHereToOptOut": "Feu click aquí per desapuntar-vos.", - "CloudflareDescription": "Si el vostre lloc web està allotjat a Cloudflare, consulteu %1$saquesta guia%2$s.", - "ConfirmDeleteAllTrackingFailures": "Esteu segur que voleu suprimir tots els errors de seguiment?", - "ConfirmDeleteThisTrackingFailure": "Esteu segur que voleu suprimir aquest error de seguiment?", - "Cors": "CORS", - "CorsDomains": "Dominis de compartició de recursos creuats (CORS)", - "CorsDomainsHelp": "Podeu definir dominis o subdominis com http://example.com o http://stats.example.com. O per permetre sol·licituds entre dominis per a tots els dominis, només cal que afegiu un *", - "CustomLogoFeedbackInfo": "Si heu personalitzat el log de Matomo, potser també estareu interesants en amagar %1$s l'enllaç al menú superior. Per a fer-ho, podeu deshabilitar l'extensió de Feedback a la pàgina %2$sManage Plugins%3$s.", - "CustomLogoHelpText": "Podeu personalitzar el logo de Matomo que es mostrarà a l'interfície d'usuari i als informes d'emails.", - "DeclineInvite": "Rebutja la invitació", - "DeleteAllFailures": "Suprimeix tots els errors", - "DevelopmentProcess": "Tot i que el nostre procés de desenvolupament inclou milers de proves automatitzades, els Beta Testers tenen un paper clau a l'hora d'aconseguir la \"Política sense errors\" a Matomo.", - "EmailServerSettings": "Configuració del servidor de correu", - "ErrorEmailFromAddressNotValid": "L'adreça SMTP de no és vàlida", - "FaviconUpload": "Escull un Favicon per carregar", - "FileUploadDisabled": "La càrrega de fitxers no està activada a la configuració de PHP. Per carregar el vostre logotip personalitzat, configureu %s a php.ini i reinicieu el vostre servidor web.", - "ForBetaTestersOnly": "Només per a beta testers", - "GoogleTagManagerDescription": "Si el vostre lloc web utilitza Google Tag Manager, consulteu %1$saquesta guia%2$s.", - "HideAdvancedOptions": "Amaga les opcions avançades", - "HowToGetHelp": "Hi ha diferents maneres de rebre ajuda. Hi ha assistència gratuïta a través de la comunitat de Matomo i suport de pagament proporcionat per l'equip de Matomo i els socis de Matomo. O potser teniu un error per informar o voleu suggerir una funció nova?", - "HttpTrackingApi": "API de seguiment HTTP", - "HttpTrackingApiDescription": "%1$sL'API de seguiment HTTP%2$s us permet fer un seguiment de qualsevol cosa. Això pot ser útil si utilitzeu un llenguatge de programació per al qual encara no hi ha SDK. També pot ser útil quan voleu fer un seguiment de dispositius o aplicacions d'una manera especial.", - "ImageTracking": "Seguiment per imatge", - "ImageTrackingIntro1": "Quan un visitant ha deshabilitat el JavaScript, o quan el JavaScript no es pot fer servir, podeu fer servir un enllaç a una imatge de seguiment per seguir les vistes.", - "ImageTrackingIntro2": "Generar l'enllaç de sota i copiar-enganxar el codi HTML generat a la pàgina. Si esteu fent servir això com alternativa al seguiment amb JavaScript, heu d'envoltar el codi en %1$s tags.", - "ImageTrackingIntro3": "Per la llista completa d'opcions que podeu fer servir amb una imatge de seguiment, mireu a la %1$sDocumentació de Tracking API%2$s.", - "ImageTrackingLink": "Enllaç de seguiment amb imatge", - "ImportFromGoogleAnalytics": "Importar des de Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Si teniu una propietat de Google Analytics i esteu canviant a Matomo, podeu importar les vostres dades existents mitjançant el connector %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Una alternativa a seguir els visitants a través del navegador (tant amb JavaScript com amb un enllaç de imatge) és important continuament els registres del servidor. Informeu-vos més a %1$sServer Log File Analytics%2$s.", - "InvalidPluginsWarning": "Els connectors següents no són compatibles amb %1$s i no s'han pogut carregar: %2$s.", - "InvalidPluginsYouCanUninstall": "Podeu actualitzar o desinstal·lar aquests connectors a la pàgina %1$sGestiona els connectors%2$s.", - "JSTrackingDocumentationHelp": "Per accedir-hi fàcilment, les opcions avançades més populars estan disponibles a continuació. Per obtenir encara més opcions (incloent com fer el seguiment dels objectius, les variables personalitzades, les comandes de comerç electrònic i els carretons abandonats), consulteu la %1$sDocumentació de seguiment de Javascript de Matomo%2$s.", - "JSTrackingIntro1": "Podeu fer un seguiment dels visitants del vostre lloc web de moltes maneres diferents. La manera recomanada de fer-ho és mitjançant JavaScript. Per utilitzar aquest mètode heu d'assegurar-vos que cada pàgina web del vostre lloc web tingui algun codi JavaScript, que podeu generar aquí.", - "JSTrackingIntro2": "Un cop tingueu el codi de seguiment de JavaScript per al vostre lloc web, copieu-lo i enganxeu-lo a totes les pàgines de les que vulgueu fer un seguiment amb Matomo.", - "JSTrackingIntro3a": "A la majoria de llocs web, blocs, CMS, etc., podeu utilitzar un connector predefinit per fer el treball tècnic per vosaltres. (Consulteu la nostra %1$slista de connectors utilitzats per integrar Matomo%2$s.)", - "JSTrackingIntro3b": "Si no existeix cap connector, podeu editar les plantilles del vostre lloc web i afegir el codi de seguiment de JavaScript a l'etiqueta </head> que sovint es defineix en un fitxer de plantilla \"header.php\", \"header.tpl\" o similar.", - "JSTrackingIntro4": "Si no voleu utilitzar JavaScript per fer un seguiment dels visitants, %1$sgenereu una imatge d'enllaç de seguiment a sota de%2$s.", - "JSTrackingIntro5": "Si desitja fer més que rastrejar visites de pàgina, revisa la %1$sDocumentació javascript de Matomo %2$s sobre la llista de funcions disponibles. Utilitzant aquestes funcions, pots rastrejar objectius, variables personalitzades, compres d'e-comerç, compres abandonades i més.", - "JSTracking_CampaignKwdParam": "Paràmetre de paraula clau de campanya", - "JSTracking_CampaignNameParam": "Paràmetre de nom de campanya", - "JSTracking_CodeNoteBeforeClosingHead": "Feu clic al botó per copiar el fragment de codi i enganxar-lo immediatament abans de l'etiqueta de tancament %1$s (recomanat)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Assegureu-vos que aquest codi estigui incrustat dins d'un element d'script a cada pàgina del vostre lloc web. Recomanem enganxar-lo just abans de l'etiqueta de tancament de capçalera head.", - "JSTracking_ConsentManagerConnected": "Sembla que %1$s ja està configurat per funcionar amb Matomo.", - "JSTracking_ConsentManagerDetected": "S'ha detectat %1$s gestor de consentiments al vostre lloc. Per obtenir informació sobre com es configura Matomo perquè funcioni amb %1$s, visiteu %2$s", - "JSTracking_ConsentManagerEmailNote": "O podeu inserir directament el codi de seguiment al vostre lloc web:", - "JSTracking_CrossDomain": "Per defecte, l'ID de visitant que identifica un visitant únic s'emmagatzema a les galetes pròpies del navegador a les quals només es pot accedir des de les pàgines del mateix domini. L'habilitació de l'enllaç creuat entre dominis us permet fer un seguiment de totes les accions i pàgines vistes d'un visitant específic a la mateixa visita, fins i tot quan vegin pàgines de diversos dominis. Sempre que un usuari faci clic en un enllaç a un dels URL d'àlies del vostre lloc web, afegeix un paràmetre d'URL pk_vid que reenvia l'ID de visitant.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Nota: per utilitzar l'enllaç creuat entre dominis, heu d'especificar més d'un nom de domini (URL) per al vostre lloc web.", - "JSTracking_CustomCampaignQueryParam": "Utilitzeu noms de paràmetres de consulta personalitzats per al nom i la paraula clau de la campanya", - "JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sMatomo detectarà automàticament els paràmetres de Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Desactiva el seguiment dels paràmetres de la campanya", - "JSTracking_DisableCampaignParametersDesc": "Quan aquesta opció està marcada, Matomo no farà un seguiment dels paràmetres de la campanya i s'eliminaran de les URL de seguiment.", - "JSTracking_DisableCookies": "Desactiveu totes les galetes de seguiment", - "JSTracking_DisableCookiesDesc": "Desactiva totes les galetes pròpies. Les galetes de Matomo existents per a aquest lloc web s'eliminaran a la pàgina següent.", - "JSTracking_EnableCrossDomainLinking": "Habilita l'enllaç creuat entre dominis", - "JSTracking_EnableDoNotTrack": "Activa la detecció de DoNotTrack del costat del client", - "JSTracking_EnableDoNotTrackDesc": "Per tant, les sol·licituds de seguiment no s'enviaran si els visitants no volen ser rastrejats.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nota: S'ha habilitat el suport de DoNotTrack del costat del servidor, de manera que aquesta opció no tindrà cap efecte.", - "JSTracking_EndNote": "Nota: podeu generar un codi de seguiment personalitzat a la secció d'administració %1$sCodi de seguiment%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Avantposeu el domini del lloc al títol de la pàgina quan feu el seguiment", - "JSTracking_GroupPageTitlesByDomainDesc1": "Per tant, si algú visita la pàgina \"Quant a\" al bloc.%1$s es registrarà com a \"bloc / Quant a\". Aquesta és la manera més senzilla d'obtenir una visió general del trànsit per subdomini.", - "JSTracking_MergeAliases": "A l'informe \"Enllaços externs\", amagueu els clics als URL d'àlies coneguts de", - "JSTracking_MergeAliasesDesc": "Així els clics als enllaços a URL d'àlies (per exemple, %s) no es comptaran com a \"Enllaç extern\".", - "JSTracking_MergeSubdomains": "Feu un seguiment dels visitants a tots els subdominis de", - "JSTracking_MergeSubdomainsDesc": "Per tant si un visitant visita %1$s i %2$s es comptarà com a visitant únic.", - "JSTracking_PageCustomVars": "Feu un seguiment d'una variable personalitzada per a cada vista de pàgina", - "JSTracking_PageCustomVarsDesc": "Per exemple, amb el nom de variable \"Categoria\" i el valor \"Llibre blanc\".", - "JSTracking_TrackNoScript": "Seguiment dels usuaris amb JavaScript desactivat", - "JSTracking_VisitorCustomVars": "Feu un seguiment de les variables personalitzades per a aquest visitant", - "JSTracking_VisitorCustomVarsDesc": "Per exemple, amb el nom de la variable \"Tipus\" i el valor \"Client\".", - "JavaScriptCode": "Codi Javascript", - "JavaScriptTracking": "Seguiment amb Javascript", - "JsTrackingCodeAdvancedOptionsStep": "Opcional: utilitzeu les opcions avançades per personalitzar el vostre codi de seguiment.", - "JsTrackingCodeMissingEmail1": "Fa uns dies vau afegir el lloc web '%s' al vostre Matomo Analytics. Ho acabem de comprovar i el vostre Matomo no sembla tenir cap trànsit registrat per a aquest lloc web.", - "JsTrackingCodeMissingEmail2": "Per començar a fer un seguiment de les dades i obtenir informació sobre els vostres usuaris, haureu de configurar el seguiment al vostre lloc web o a l'aplicació mòbil. Per als llocs web, simplement inseriu el codi de seguiment just abans de l'etiqueta %s.", - "JsTrackingCodeMissingEmail3": "Per trobar i personalitzar el vostre codi de seguiment, %1$sfeu clic aquí%2$s (o feu una ullada a la %3$sGuia del client de seguiment de JavaScript%4$s).", - "LearnMore": "Aprèn més", - "Login": "Inicia la sessió", - "LogoNotWriteableInstruction": "Per utilitzar el vostre logotip personalitzat en lloc del logotip predeterminat de Matomo, doneu permís d'escriptura a aquest directori: %1$s Matomo necessita accés d'escriptura per als vostres logotips emmagatzemats als fitxers %2$s.", - "LogoUpload": "Seleccioneu un logo per pujar", - "LogoUploadFailed": "El fitxer penjat no s'ha pogut processar. Comproveu si el fitxer té un format vàlid.", - "LogoUploadHelp": "Pengeu un fitxer en formats %1$s amb una alçada mínima de %2$s píxels.", - "LtsReleases": "Les versions LTS (suport a llarg termini) només reben correccions de seguretat i correccions d'errors.", - "MenuDevelopment": "Desenvolupament", - "MenuDiagnostic": "Diagnòstic", - "MenuGeneralSettings": "Configuració general", - "MenuMeasurables": "Mesurables", - "MenuSystem": "Sistema", - "MissingTrackingCodeEmailSubject": "No hi ha trànsit enregistrat per a %s a Matomo Analytics, comença ara", - "NTrackingFailures": "%s errors de seguiment", - "NeedHelp": "Necessiteu ajuda?", - "NoKnownFailures": "No hi ha errors de seguiment coneguts.", - "OptOutComplete": "Baixa complerta. Les teves visites en aquest lloc web no es tindrán en compte per l'eina d'anàlisis Web.", - "OptOutCompleteBis": "Teniu en compte que si borreu les cookies, borreu la cookie de baixa o si canvieu d'ordenador o de navegadaor web, haureu de tornar a realitzar el proces de baixa.", - "OptOutCustomOptOutLink": "També podeu crear un formulari de desactivació totalment personalitzat mitjançant HTML i JavaScript, tal com s'explica en aquesta %1$sguia%2$s per a desenvolupadors.", - "OptOutDntFound": "No se us rastreja perquè el vostre navegador informa que no ho permeteu. Aquesta és una configuració del vostre navegador, de manera que no us podreu inscriure mentre no desactiveu la funció \"No fer el seguiment\".", - "OptOutErrorNoCookies": "La funció de desactivació del seguiment requereix que les galetes estiguin habilitades.", - "OptOutErrorNoTracker": "La funció de desactivació del seguiment no ha pogut trobar el codi de seguiment de Matomo en aquesta pàgina", - "OptOutErrorNotHttps": "És possible que la funció de desactivació del seguiment no funcioni perquè aquest lloc no s'ha carregat mitjançant HTTPS. Torneu a carregar la pàgina per comprovar si l'estat de desactivació ha canviat.", - "OptOutErrorWindowOpen": "És possible que la funció de desactivació de seguiment no funcioni perquè sembla que s'ha bloquejat la finestra emergent de desactivació. Si us plau torneu a carregar la pàgina per comprovar si l'estat de desactivació ha canviat.", - "OptOutExplanation": "El Matomo, podeu afegir el següent codi HTML a una de les pàgiens del vostre lloc web, per exemple a la pàgina de política de privacitat.", - "OptOutExplanationIntro": "Aquest codi mostrarà un div que conté un enllaç per tal que els vostres visitants puguin desactivar Matomo mitjançant la configuració d'una galeta de desactivació als seus navegadors web. Vegeu a continuació (o %1$s feu clic aquí%2$s) per veure el contingut que mostrarà el div.", - "OptOutForYourVisitors": "Pàgina de baixa del Matomo pels vostres visitants", - "OptingYouOut": "Desactivació en marxa, espereu…", - "PersonalPluginSettings": "Configuració del connector personal", - "PiwikIsInstalledAt": "El Matomo està instal·lat a", - "PluginSettingChangeNotAllowed": "No teniu permís per canviar el valor de la configuració \"%1$s\" al connector \"%2$s\"", - "PluginSettingReadNotAllowed": "No teniu permís per llegir el valor de la configuració \"%1$s\" al connector \"%2$s\"", - "PluginSettings": "Configuració del connector", - "PluginSettingsIntro": "Aquí podeu canviar la configuració dels següents connectors de tercers:", - "PluginSettingsSaveFailed": "No s'ha pogut desar la configuració del connector", - "PluginSettingsSaveSuccess": "Configuració del connector actualitzada.", - "PluginSettingsValueNotAllowed": "El valor del camp \"%1$s\" al connector \"%2$s\" no està permès", - "Problem": "Problema", - "ProtocolNotDetectedCorrectly": "Actualment esteu veient Matomo mitjançant una connexió SSL segura (mitjançant HTTPS), però Matomo només ha pogut detectar una connexió no segura al servidor.", - "ProtocolNotDetectedCorrectlySolution": "Per assegurar-vos que Matomo sol·licita i ofereix el vostre contingut de manera segura a través d'HTTPS, podeu editar el vostre fitxer %1$s i ajustar la vostra configuració del servidor intermediari, o bé podeu afegir la línia %2$s a sota de la secció %3$s. %4$sMés informació%5$s", - "ReactDescription": "Si el vostre lloc web utilitza React, consulteu %1$saquesta guia%2$s.", - "ReleaseChannel": "Canal de publicació", - "SecurityNotificationAllTokenAuthDeletedBody": "Algú ha esborrat tots els testimonis d'autenticació del vostre compte.", - "SecurityNotificationAnonymousAccessEnabledBody": "Algú ha activat l'accés d'usuari anònim per a %1$s. Això vol dir que les dades d'aquest lloc ara són accessibles públicament. Si us està bé, podeu ignorar aquest correu electrònic.", - "SecurityNotificationCheckTwoFactor": "Comproveu la vostra aplicació o dispositiu d'autenticació de dos factors.", - "SecurityNotificationEmailSubject": "Notificació de seguretat", - "SecurityNotificationIfItWasYou": "Si heu estat vos, endavant. Si no reconeixeu aquesta activitat, restabliu la vostra contrasenya.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Algú ha generat nous codis de recuperació d'autenticació de dos factors per al vostre compte.", - "SecurityNotificationRecoveryCodesShowedBody": "Algú ha vist els codis de recuperació d'autenticació de dos factors del vostre compte.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Un altre superusuari (%1$s) ha modificat la configuració del sistema. Configuració afectada: %2$s. Si reconeixeu aquesta activitat, continueu. Si no reconeixeu aquesta activitat, poseu-vos en contacte amb els altres súper usuaris.", - "SecurityNotificationSettingsChangedByUserBody": "Algú ha modificat la configuració del sistema. Configuració afectada: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Algú ha creat un testimoni d'autenticació (descripció: %s) al vostre compte. Si no has estat tu, elimina el testimoni.", - "SecurityNotificationTokenAuthDeletedBody": "Algú ha suprimit un testimoni d'autenticació (descripció: %s) del vostre compte.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Algú ha desactivat l'autenticació de dos factors al vostre compte.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Algú ha activat l'autenticació de dos factors al vostre compte.", - "SecurityNotificationUserAcceptInviteBody": "L'usuari (inici de sessió: %s) ha acceptat la invitació.", - "SecurityNotificationUserCreatedBody": "Algú ha creat un usuari nou (inici de sessió: %s) al vostre compte.", - "SecurityNotificationUserDeclinedInviteBody": "L'usuari (inici de sessió: %s) ha rebutjat la invitació.", - "SecurityNotificationUserDeletedBody": "Algú ha suprimit un usuari (inici de sessió: %s) del vostre compte.", - "SendPluginUpdateCommunication": "Enviar un correu electrònic quan hi hagi una actualització del connector disponible", - "SendPluginUpdateCommunicationHelp": "S'enviarà un correu electrònic als Superusuaris quan hi hagi una versió nova disponible per a un connector.", - "SettingsSaveSuccess": "Configuració actualitzada.", - "ShowAdvancedOptions": "Mostra les opcions avançades", - "SinglePageApplicationDescription": "Si feu el seguiment d'una aplicació d'una sola pàgina (SPA) o d'una aplicació web progressiva (PWA), consulteu %1$saquesta guia%2$s.", - "Solution": "Solució", - "StableReleases": "Si Matomo és una part fonamental del vostre negoci us recomanem que utilitzeu la darrera versió estable. Si feu servir la darrera versió beta i trobeu un error o teniu un suggeriment, %1$svegeu aquí%2$s.", - "SystemPluginSettings": "Configuració del connector del sistema", - "TrackAGoal": "Seguiment d'un objectiu", - "TrackingCode": "Codi de seguiment", - "TrackingCodeIntro": "Matomo us ofereix diverses maneres d'incrustar el codi de seguiment per al vostre lloc web, aplicació mòbil i fins i tot per a qualsevol dispositiu o aplicació.", - "TrackingFailureAuthenticationProblem": "La sol·licitud no s'ha autenticat, però calia l'autenticació.", - "TrackingFailureAuthenticationSolution": "Defineix o corregeix un \"token_auth\" a la teva sol·licitud de seguiment.", - "TrackingFailureInvalidSiteProblem": "El lloc no existeix.", - "TrackingFailureInvalidSiteSolution": "Actualitzeu l'idSite configurat al rastrejador.", - "TrackingFailures": "Errors de seguiment", - "TrackingFailuresEmail1": "Això és només per fer-vos saber que %s diferents tipus d'errors de seguiment s'han produït en els últims dies.", - "TrackingFailuresEmail2": "Per veure totes les sol·licituds de seguiment fallides %1$s feu clic aquí%2$s.", - "TrackingFailuresEmailSubject": "Errors de seguiment al vostre Matomo Analytics", - "TrackingFailuresIntroduction": "Aquesta pàgina enumera els errors de seguiment que s'han produït durant els darrers %s dies. Tingueu en compte que només s'enregistren els errors de seguiment més habituals i no pas tots.", - "TrackingURL": "URL de seguiment", - "TrustedHostConfirm": "Esteu segur que voleu canviar el nom de la màquina (hostname) de confiança del Matomo?", - "TrustedHostSettings": "Nom del host de Matomo de confiança", - "TwoFactorAuth": "Autorització de dos factors", - "UiDemo": "Demo de l'interfície d'usuari", - "UncheckToOptOut": "Desmarqueu aquesta casella per excloure-us.", - "UpdateSettings": "Actualitza la configuració", - "UseCustomLogo": "Utilitza un logo personalitzat", - "UserInviteContent": "Pots acceptar aquesta invitació fent clic al botó d'acceptar que hi ha aquí sota.", - "UserInviteNotes": "Si no esperàveu la invitació, podeu ignorar aquest correu electrònic. Si %1$s us està enviant massa correus electrònics, podeu bloquejar-los o informar d'un abús. La invitació caduca automàticament en %2$s dies.", - "UserInviteSubject": "%1$s t'ha enviat una invitació per unir-te a Matomo Analytics per %2$s.", - "ValidPiwikHostname": "Nom del host de Matomo vàlid", - "ViewAllTrackingFailures": "Veure tots els errors de seguiment", - "VueDescription": "Si el vostre lloc web utilitza Vue.js, consulteu %1$saquesta guia%2$s.", - "WhatIsNew": "Què hi ha de nou", - "WhatIsNewDoNotShowAgain": "No ho mostris de nou", - "WhatIsNewNoChanges": "No hi ha res de nou de moment", - "WhatIsNewNoChangesTitle": "No hi ha canvis recents", - "WhatIsNewRemindMeLater": "Recorda-m'ho més tard", - "WhatIsNewTitle": "Aquí teniu les novetats de Matomo", - "WhatIsNewTooltip": "Descobriu les novetats de Matomo", - "WithOptionalRevenue": "amb ingressos opcionals", - "WordpressDescription": "Si el vostre lloc web utilitza Wordpress, consulteu %1$saquesta guia%2$s.", - "YouAreNotOptedOut": "No us heu exclòs.", - "YouAreOptedOut": "Actualment esteu donat de baixa.", - "YouMayOptOut": "Podeu escollir no tenir un únic nombre d'identificació assignat al vostre ordinador per evitar l'agregació i l'anàlisi de la informació recollida en aquest lloc web.", - "YouMayOptOut2": "Podeu optar per evitar que aquest lloc web agregui i analitzi les accions que feu aquí.", - "YouMayOptOut3": "Si ho feu protegireu la vostra privadesa, però també impedireu que el propietari aprengui de les vostres accions i creï una millor experiència per a vos i la resta d'usuaris.", - "YouMayOptOutBis": "Per prendre aquesta decisió, feu click a continuació per rebre una cookie de baixa." - } -} diff --git a/plugins/CoreAdminHome/lang/cs.json b/plugins/CoreAdminHome/lang/cs.json deleted file mode 100644 index 2581f52a8c517ac4012f8eecebb0ebfdc8a66917..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/cs.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Přijmout pozvánku", - "AddNewTrustedHost": "Přidat nového důvěryhodného hostitele", - "Administration": "Administrace", - "ArchivingSettings": "Archivování nastavení", - "BrandingSettings": "Nastavení označení", - "BruteForce": "Hrubá síla", - "CheckToOptIn": "Chcete-li se přihlásit, zaškrtněte toto políčko.", - "ClickHereToOptIn": "Klikněte zde pro přihlášení.", - "ClickHereToOptOut": "Klikněte zde pro vyloučení.", - "CloudflareDescription": "Pokud jsou vaše webové stránky hostovány na serveru Cloudflare, přečtěte si %1$stento návod%2$s.", - "ConfirmDeleteAllTrackingFailures": "Opravdu vymazat všechna selhání sledování?", - "ConfirmDeleteThisTrackingFailure": "Opravdu chcete vymazat toto selhání sledování?", - "Cors": "Sdílené zdroje odjinud (CORS)", - "CorsDomains": "Domény sdílení křížových zdrojů (CORS)", - "CorsDomainsHelp": "Můžete definovat domény nebo subdomény jako http://example.com nebo http://stats.example.com. Nebo pro povolení požadavků napříč doménami pro všechny domény jednoduše přidejte *", - "CustomLogoFeedbackInfo": "Pokud přizpůsobíte logo Matoma, možná by vás zajímalo, jak skrýt odkaz %1$s v horním menu, Pokud to chcete provést, zakažte plugin zpětné vazby na stránce %2$sSpravovat zásuvné moduly%3$s.", - "CustomLogoHelpText": "Můžete přizpůsobit logo Matoma, které bude zobrazeno v uživatelském rozhraní a v e-mailových hlášeních.", - "DeclineInvite": "Odmítnout pozvánku", - "DeleteAllFailures": "Vymazat všechna selhání", - "DevelopmentProcess": "I když náš vývojový proces zahrnuje tisíce automatizovaných testů, Beta testeři hrají klíčovou roli při dosahování „politiky bez chyb“ v Matomu.", - "EmailServerSettings": "Nastavení e-mailového serveru", - "ErrorEmailFromAddressNotValid": "SMTP adresa odesílatele není platná", - "FaviconUpload": "Vyberte favicon, kterou chcete nahrát", - "FileUploadDisabled": "Nahrávání souborů je zakázáno v konfiguraci PHP. Pokud chcete nahrát svoje vlastní logo, nastavte %s v souboru php.ini a restartujte webový server.", - "ForBetaTestersOnly": "Pouze pro beta testery", - "GoogleTagManagerDescription": "Pokud vaše webové stránky používají Google Tag Manager, přečtěte si %1$stento průvodce%2$s.", - "HideAdvancedOptions": "Skrýt pokročilé možnosti", - "HowToGetHelp": "Pomoc můžete získat různými způsoby. K dispozici je bezplatná podpora prostřednictvím komunity Matomo a placená podpora poskytovaná týmem Matomo a partnery společnosti Matomo. Nebo snad chcete nahlásit chybu či navrhnout novou funkci?", - "HttpTrackingApi": "Rozhraní API pro sledování HTTP", - "HttpTrackingApiDescription": "Rozhraní API%1$sHTTP Tracking%2$s umožňuje sledovat cokoli. To může být užitečné, pokud používáte programovací jazyk, pro který zatím neexistuje SDK. Může být také užitečné, pokud chcete sledovat zařízení nebo aplikace zvláštním způsobem.", - "ImageTracking": "Sledování obrázkem", - "ImageTrackingIntro1": "Pokud má návštěvník vypnutý JavaScript nebo nemůže být JavaScript použit, můžete využít obrázku k měření a sledování Vaší návštěvnosti.", - "ImageTrackingIntro2": "Níže vygenerujte odkaz a vložte vygenerované HTML do kódu stránky. Pokud ho používáte jako nouzové řešení místo javascriptového sledování, můžete ho obalit do tagů %1$s.", - "ImageTrackingIntro3": "Všechny možnosti, které lze použít u obrázkového sledovacího odkazu najdete v %1$sdokumentaci sledovacího API%2$s.", - "ImageTrackingLink": "Odkaz pro sledování obrázkem", - "ImportFromGoogleAnalytics": "import z Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Pokud používáte službu Google Analytics a přecházíte na Matomo, můžete stávající data importovat pomocí %1$s GoogleAnalyticsImporter pluginu %2$s.", - "ImportingServerLogsDesc": "Alternativou ke sledování návštěvníků pomocí javascriptu nebo obrázku je neustálý import logu web serveru. Více informací najdeve v dokumentaci %1$sanalýzy log souborů%2$s.", - "InvalidPluginsWarning": "Následující zásuvné moduly nejsou kompatibilní s %1$s a nemohly být načteny %2$s.", - "InvalidPluginsYouCanUninstall": "Tyto zásuvné moduly můžete aktualizovat nebo odinstalovat na stránce %1$ssprávy zásuvných modulů%2$s.", - "JSTrackingDocumentationHelp": "Pro snadný přístup jsou níže k dispozici nejoblíbenější pokročilé možnosti. Ještě více možností (včetně způsobu sledování cílů, vlastních proměnných, objednávek elektronického obchodu a opuštěných košíků) najdete v dokumentaci %1$sMatomo Javascript Tracking%2$s.", - "JSTrackingIntro1": "Můžete sledovat návštěvníky svého webu mnoha různými způsoby. Doporučený způsob je pomocí JavaScriptu. Chcete-li použít tuto metodu, musíte se ujistit, že každá webová stránka vašeho webu obsahuje nějaký kód JavaScript, který můžete vygenerovat zde.", - "JSTrackingIntro2": "Až budete mít sledovací JavaScriptový kód, vložte ho do všech stránek, které mají být Matomem sledovány.", - "JSTrackingIntro3a": "Na většině webových stránek, blogů, CMS atd. můžete použít předinstalovaný plugin k provedení technické práce za vás. (Viz náš %1$sseznam pluginů používaných k integraci Matomo%2$s.)", - "JSTrackingIntro3b": "Pokud žádný zásuvný modul neexistuje, můžete upravit šablony webu a přidat sledovací kód JavaScript do značky </head>, která je často definována v souboru 'header.php', 'header.tpl' nebo podobném souboru šablony.", - "JSTrackingIntro4": "Pokud nechcete ke sledování návštěvníků použít javascript, %1$svygenerujte obrázkový sledovací tag níže%2$s.", - "JSTrackingIntro5": "Pokud chcete ne jen sledovat zobrazení stránek, podívejte se na %1$sdokumentaci javascriptového sledování%2$s, kde naleznete seznam dostupných funkcí. S použitím těchto funkcí můžete sledovat cíle, vlastní proměnné, objednávky v e-obchodech, opuštěné košíky a mnoho dalšího.", - "JSTracking_CampaignKwdParam": "Klíčové slovo kampaně", - "JSTracking_CampaignNameParam": "Název kampaně", - "JSTracking_CodeNoteBeforeClosingHead": "Pro zkopírování tohoto kódu klepněte na tlačítko. Pak ho doporučujeme vložit před uzavírací tag %1$s", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Ujistěte se, že je tento kód vložen do prvku skriptu na každé stránce vašeho webu. Doporučujeme vložit těsně před uzavírací tag záhlaví.", - "JSTracking_ConsentManagerConnected": "Zdá se, že %1$s je již nakonfigurován pro práci se systémem Matomo.", - "JSTracking_ConsentManagerDetected": "Na vašem webu byl zjištěn správce souhlasu %1$s. Chcete-li se dozvědět více o konfiguraci systému Matomo pro práci s %1$s, navštivte prosím %2$s", - "JSTracking_ConsentManagerEmailNote": "Nebo můžete sledovací kód přímo vložit na své webové stránky:", - "JSTracking_CrossDomain": "Ve výchozím stavu je id návštěvníka, které se používá k identifikaci unikátních návštěvníků, je uloženo jako cookie první strany, ke kterým mohou získat přístup pouze stránky ze stejné domény. Povolením odkazování napříč doménami, což vám umožní sledovat akce a zobrazení stránek během návštěvy návštěvníka i na jiných doménách. Pokaždé, když návštěvník navštíví nějaký z vašich URL aliasů, bude do URL přidán parametr pk_vid, který bude obsahovat id návtěvíka.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Poznámka: Chcete-li používat propojení mezi různými doménami, musíte pro svůj web zadat více než jeden název domény (adresy URL).", - "JSTracking_CustomCampaignQueryParam": "Použití vlastních názvů parametrů dotazu pro název kampaně a klíčové slovo", - "JSTracking_CustomCampaignQueryParamDesc": "Poznámka: %1$sMatomo automaticky detekuje parametry pro Google analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Zakázat sledování parametrů kampaně", - "JSTracking_DisableCampaignParametersDesc": "Pokud je tato možnost zaškrtnuta, Matomo nebude sledovat parametry kampaně a ty budou ze sledovaných adres URL odstraněny.", - "JSTracking_DisableCookies": "Zakázat všechny sledovací cookies", - "JSTracking_DisableCookiesDesc": "Zakáže všechny vlastní cookies. Existující cookies Matoma pro tyto stránky budou smazány při další návštěvě.", - "JSTracking_EnableCrossDomainLinking": "Povolit propojení mezi doménami", - "JSTracking_EnableDoNotTrack": "Povolit detekci klientů s povolenou volbou \"nesledovat\"", - "JSTracking_EnableDoNotTrackDesc": "Sledovací požadavky nebudou zaslány, pokud si to návštěvníci nepřejí.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Poznámka: Serverová detekce volby \"nesledovat\" byla povolena, takže tato volba nebude mít vliv.", - "JSTracking_EndNote": "Poznámka: Přizpůsobený sledovací kód můžete vytvořit v administrační sekci %1$sSledovací kód%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Před titulek stránky při sledování připojit doménu stránek", - "JSTracking_GroupPageTitlesByDomainDesc1": "Takže, když někdo navštíví stránku 'o nás' na blog.%1$s, bude zaznamenán jako 'O nás / blog'. To to je nejjednodušší způsob, jak získat přehled provozu podle subdomén.", - "JSTracking_MergeAliases": "Ve \"hlášení externích odkazů\" skrýt kliknutí na známé aliasy", - "JSTracking_MergeAliasesDesc": "Takže kliky na URL aliasů (např. %s) nebudou počítány jako externí odkazy.", - "JSTracking_MergeSubdomains": "Sledovat všechny návštěvníky na všech subdoménách", - "JSTracking_MergeSubdomainsDesc": "Pokud uživatel navštíví %1$s a %2$s, budou zaznamenáni jako jedineční uživatelé.", - "JSTracking_PageCustomVars": "Sledovat vlastní proměnnou pro každé zobrazení stránky", - "JSTracking_PageCustomVarsDesc": "Například proměnná s názvem \"Kategorie\" a hodnotou \"White papers\".", - "JSTracking_TrackNoScript": "Sledovat uživatele se zakázaným javascriptem", - "JSTracking_VisitorCustomVars": "Sledovat vlastní proměnné pro tohoto návštěvníka", - "JSTracking_VisitorCustomVarsDesc": "Například se jménem \"Typ\" a hodnotou \"zákazník\".", - "JavaScriptCode": "Kód JavaScript", - "JavaScriptTracking": "Sledování javascriptem", - "JsTrackingCodeAdvancedOptionsStep": "Volitelně: pomocí pokročilých možností si přizpůsobte kód sledování.", - "JsTrackingCodeMissingEmail1": "Před několika dny jste web '%s' přidali do své analýzy Matomo Analytics. Právě jsme zkontrolovali a zdá se, že váš Matomo nemá žádný zaznamenaný provoz pro tento web.", - "JsTrackingCodeMissingEmail2": "Chcete-li začít sledovat údaje a získávat informace o svých uživatelích, musíte na svém webu nebo mobilní aplikaci nastavit sledování. U webů jednoduše vložte měřicí kód těsně před značku %s.", - "JsTrackingCodeMissingEmail3": "Chcete-li najít a přizpůsobit svůj měřicí kód, %1$sklikněte sem%2$s (nebo se podívejte do %3$spříručky Klienta pro sledování JavaScriptu%4$s).", - "LearnMore": "Další informace", - "Login": "Login", - "LogoNotWriteableInstruction": "Pokud chcete místo výcchozího loga použít vlastní, je nutné, abyste měli práva k zápisu adresáře %1$s. Matomo potřebuje práva k zápisu log umístěných v souborech %2$s.", - "LogoUpload": "Vyberte logo, které chcete nahrát", - "LogoUploadFailed": "Nahraný soubor nemohl být zpracován. Ověřte prosím, že má nahraný soubor správný formát.", - "LogoUploadHelp": "Prosím, nahrajte soubor v jednom z následujících formátů: %1$s, s minimální výškou %2$s pixelů.", - "LtsReleases": "Verze LTS (Long Term Support) dostávají pouze opravy zabezpečení a chyb.", - "MenuDevelopment": "Vývoj", - "MenuDiagnostic": "Diagnostika", - "MenuGeneralSettings": "Hlavní nastavení", - "MenuMeasurables": "Měřitelné", - "MenuSystem": "Systém", - "MissingTrackingCodeEmailSubject": "V Matomo Analytics nebyl zaznamenán žádný provoz pro %s, začněte hned teď", - "NTrackingFailures": "%s selhání sledování", - "NeedHelp": "Potřebujete pomoc?", - "NoKnownFailures": "Nejsou známy žádné poruchy sledování.", - "OptOutComplete": "Vyloučení hotovo. Vaše návštěvy nebudou sledovány nástrojem webové analýzy.", - "OptOutCompleteBis": "Poznámka: pokud smažete cookie, odstraníte vylučovací cookie nebo zmměníte počítač nebo prohlížeč, budete muset provést proceduru vyloučení znovu.", - "OptOutCustomOptOutLink": "Můžete si také vytvořit zcela vlastní formulář pro odhlášení pomocí HTML a JavaScriptu, jak je vysvětleno v tomto vývojářském %1$sprůvodci%2$s.", - "OptOutDntFound": "Nejste sledováni, protože váš prohlížeč hlásí, že si to nepřejete. Jedná se o nastavení prohlížeče, takže se nebudete moci přihlásit, dokud nezakážete funkci 'nesledovat'.", - "OptOutErrorNoCookies": "Funkce odhlášení sledování vyžaduje aby byly povoleny soubory cookie.", - "OptOutErrorNoTracker": "Funkce odhlášení sledování nedokázala na této stránce najít kód nástroje Matomo Tracker", - "OptOutErrorNotHttps": "Funkce odhlášení sledování nemusí fungovat, protože tento web nebyl načten přes HTTPS. Znovu načtěte stránku a zkontrolujte, zda se váš stav odhlášení změnil.", - "OptOutErrorWindowOpen": "Funkce odhlášení sledování nemusí fungovat, protože to vypadá, že vyskakovací okno pro odhlášení bylo zablokováno. Znovu načtěte stránku a zkontrolujte, zda se stav odhlášení nezměnil.", - "OptOutExplanation": "Matomo se zaměřuje na poskytování soukromí na internetu. Pokud chcete dát svým návštěvníkům možnost odhlásit se z webových analýz Matoma, můžete na nějakou stránku (třeba stránku o soukromí) umístit následující HTML kód.", - "OptOutExplanationIntro": "Tento kód zobrazí div s odkazem pro návštěvníky, kteří se mohou odhlásit z Matomo nastavením opt-out cookie v jejich webových prohlížečích. Obsah, který se zobrazí v divu, naleznete níže (nebo %1$sklikněte zde%2$s).", - "OptOutForYourVisitors": "Matomo vyloučení pro Vaše návštěvníky", - "OptingYouOut": "Vylučování, prosím čekejte…", - "PersonalPluginSettings": "Osobní nastavení zásuvných modulů", - "PiwikIsInstalledAt": "Matomo je nainstalováno na", - "PluginSettingChangeNotAllowed": "Nemůžete změnit hodnotu volby %1$s zásuvného modulu \"%2$s\"", - "PluginSettingReadNotAllowed": "Nemůžete číst hodnotu volby %1$s zásuvného modulu \"%2$s\"", - "PluginSettings": "Nastavení zásuvného modulu", - "PluginSettingsIntro": "Zde můžete změnit nastavení následujících pluginů třetích stran:", - "PluginSettingsSaveFailed": "Nelze uložit nastavení pluginu", - "PluginSettingsSaveSuccess": "Nastavení zásuvného modulu aktualizována.", - "PluginSettingsValueNotAllowed": "Hodnota pole „%1$s“ v pluginu „%2$s“ není povolena", - "Problem": "Problém", - "ProtocolNotDetectedCorrectly": "K Matomu nyní přistupujete přes spojení zabezpečené pomocí SSL (HTTPS), ale Matomo na serveru detekuje pouze nezabezpečené spojení.", - "ProtocolNotDetectedCorrectlySolution": "Abyste zajistili, že bude Matomo získávat a poskytovat obsah přes bezpečné HTTPS spojení, můžete upravit váš soubor %1$s a buď nastavit proxy, nebo přidat řádek %2$s pod sekci %3$s. %4$sDozvědět se více%5$s", - "ReactDescription": "Pokud vaše webové stránky používají React, přečtěte si %1$stento návod%2$s.", - "ReleaseChannel": "Kanál vydání", - "SecurityNotificationAllTokenAuthDeletedBody": "Někdo odstranil všechny tokeny autentizace ve vašem účtu.", - "SecurityNotificationAnonymousAccessEnabledBody": "Někdo povolil anonymní přístup pro %1$s. To znamená, že data tohoto webu jsou nyní veřejně přístupná. Pokud vám to nevadí, tento e-mail klidně ignorujte.", - "SecurityNotificationCheckTwoFactor": "Zkontrolujte svou aplikaci nebo zařízení pro dvoufaktorové ověřování.", - "SecurityNotificationEmailSubject": "Bezpečnostní oznámení", - "SecurityNotificationIfItWasYou": "Pokud jste to byl vy, pokračujte. Pokud tuto aktivitu nepoznáváte, obnovte prosím své heslo.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Někdo pro váš účet vygeneroval nové kódy pro obnovení dvoufaktorového ověřování.", - "SecurityNotificationRecoveryCodesShowedBody": "Někdo si prohlédl kódy pro obnovení dvoufaktorového ověřování vašeho účtu.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Jiný superuživatel (%1$s) změnil nastavení systému. Ovlivněné nastavení: %2$s. Pokud o této činnosti víte, pokračujte. Pokud tuto činnost nepoznáte, kontaktujte ostatní superuživatele.", - "SecurityNotificationSettingsChangedByUserBody": "Někdo změnil nastavení systému. Ovlivněné nastavení: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Někdo ve vašem účtu vytvořil autentizační token (popis: %s). Pokud jste to nebyli vy, token odstraňte.", - "SecurityNotificationTokenAuthDeletedBody": "Někdo odstranil autentizační token (popis: %s) ve vašem účtu.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Někdo ve vašem účtu zakázal dvoufaktorové ověřování.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Někdo ve vašem účtu povolil dvoufaktorové ověřování.", - "SecurityNotificationUserAcceptInviteBody": "Uživatel (login: %s) přijal pozvánku.", - "SecurityNotificationUserCreatedBody": "Někdo na vašem účtu vytvořil nového uživatele (login: %s).", - "SecurityNotificationUserDeclinedInviteBody": "Uživatel (login: %s) odmítl pozvánku.", - "SecurityNotificationUserDeletedBody": "Někdo smazal uživatele (login: %s) ve vašem účtu.", - "SendPluginUpdateCommunication": "Upozornit e-mailem na dostupnost aktualizací zásuvných modulů", - "SendPluginUpdateCommunicationHelp": "Super-uživatelům bude odeslán e-mail, pokud bude k dispozici aktualizace zásuvného modulu.", - "SettingsSaveSuccess": "Nastavení aktualizována.", - "ShowAdvancedOptions": "Zobrazit rozšířené možnosti", - "SinglePageApplicationDescription": "Pokud sledujete jednostránkovou aplikaci (SPA) nebo progresivní webovou aplikaci (PWA), přečtěte si %1$stento průvodce%2$s.", - "Solution": "Řešení", - "StableReleases": "Matomo je důležitý nástroj pro měření, doporučujeme vždy používat nejnovější vydání. Pokud používáte nejnovější beta verzi a našli jste chyby, prosíme o jejich nahlášení %1$spřímo zde %2$s.", - "SystemPluginSettings": "Systémová nastavení zásuvných modulů", - "TrackAGoal": "Sledovat cíl", - "TrackingCode": "Sledovací kód", - "TrackingCodeIntro": "Matomo vám nabízí různé způsoby, jak vložit měřicí kód pro váš web, mobilní aplikaci a dokonce i do jakéhokoli zařízení nebo aplikace.", - "TrackingFailureAuthenticationProblem": "Požadavek nebyl ověřen, ale bylo vyžadováno ověření.", - "TrackingFailureAuthenticationSolution": "Nastavte nebo opravte „token_auth“ ve vaší žádosti o sledování.", - "TrackingFailureInvalidSiteProblem": "Stránka neexistuje.", - "TrackingFailureInvalidSiteSolution": "Aktualizujte nakonfigurovaný idSite v trackeru.", - "TrackingFailures": "Selhání sledování", - "TrackingFailuresEmail1": "Je to pouze proto, abychom vás informovali o tom, že v posledních dnech došlo k %s různým druhům selhání sledování.", - "TrackingFailuresEmail2": "Chcete-li zobrazit všechny neúspěšné požadavky na sledování %1$s, klikněte sem%2$s.", - "TrackingFailuresEmailSubject": "Selhání sledování v Matomo Analytics", - "TrackingFailuresIntroduction": "Na této stránce jsou uvedena selhání sledování, ke kterým došlo v posledních %s dnech. Vezměte prosím na vědomí, že jsou zaznamenány pouze nejběžnější druhy poruch sledování a ne všechny.", - "TrackingURL": "Sledovací URL", - "TrustedHostConfirm": "Opravdu chcete změnit důvěryhodné jméno hostitele Matoma?", - "TrustedHostSettings": "Důvěryhodné jméno hostitele Matoma", - "TwoFactorAuth": "Dvoufaktorové ověřování", - "UiDemo": "UI Demo", - "UncheckToOptOut": "Zrušte zaškrtnutí tohoto políčka pro odhlášení.", - "UpdateSettings": "Aktualizovat nastavení", - "UseCustomLogo": "Použít vlastní logo", - "UserInviteContent": "Tuto pozvánku můžete přijmout kliknutím na tlačítko přijmout níže.", - "UserInviteNotes": "Pokud jste tuto pozvánku nečekali, můžete tento e-mail ignorovat. Pokud vám %1$s posílá příliš mnoho e-mailů, můžete je zablokovat nebo nahlásit zneužití. Platnost pozvánky automaticky vyprší za %2$s dní.", - "UserInviteSubject": "%1$s vám poslal pozvánku do služby Matomo Analytics pro %2$s.", - "ValidPiwikHostname": "Platné jméno hostitele Matoma", - "ViewAllTrackingFailures": "Zobrazit všechna selhání sledování", - "VueDescription": "Pokud vaše webové stránky používají Vue.js, přečtěte si %1$stento návod%2$s.", - "WhatIsNew": "Co je nového", - "WhatIsNewDoNotShowAgain": "Nezobrazovat znovu", - "WhatIsNewNoChanges": "Momentálně není nic nového", - "WhatIsNewNoChangesTitle": "Žádné změny v poslední době", - "WhatIsNewRemindMeLater": "Připomenout později", - "WhatIsNewTitle": "Zde jsou novinky v Matomo", - "WhatIsNewTooltip": "Zjistěte, co je nového v aplikaci Matomo", - "WithOptionalRevenue": "s volitelným příjmem", - "WordpressDescription": "Pokud vaše webové stránky používají Wordpress, přečtěte si %1$stento průvodce%2$s.", - "YouAreNotOptedOut": "Nejste vyloučeni.", - "YouAreOptedOut": "Aktuálně jste vyloučeni.", - "YouMayOptOut": "Zde můžete zakázat uložení cookie s identifikačním číslem přiděleným svému počítači a tím zamezit provozovateli tohoto webu shromažďovat a analyzovat statistické údaje.", - "YouMayOptOut2": "Můžete se rozhodnout zabránit tomuto webu v agregaci a analýze akcí, které zde provedete.", - "YouMayOptOut3": "Tím ochráníte své soukromí, ale také zabrání majiteli, aby se poučil z vašich akcí a vytvořil lepší zážitek pro vás a ostatní uživatele.", - "YouMayOptOutBis": "Pokud jste se rozhodli že ne, klikněte na přiložený odkaz pro uložení deaktivačního cookie ve svém prohlížeči." - } -} diff --git a/plugins/CoreAdminHome/lang/cy.json b/plugins/CoreAdminHome/lang/cy.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/cy.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/da.json b/plugins/CoreAdminHome/lang/da.json deleted file mode 100644 index b3a04d8ed9eea1a6e4ad3e3c917c6e610f159621..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/da.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Acceptér invitation", - "AddNewTrustedHost": "Tilføj en ny betroet host", - "Administration": "Administration", - "ArchivingSettings": "Arkiveringsindstillinger", - "BrandingSettings": "Branding-indstillinger", - "BruteForce": "Brute Force", - "CheckToOptIn": "Afkryds feltet for at tillade tracking.", - "ClickHereToOptIn": "Klik her for at vælge.", - "ClickHereToOptOut": "Klik her for at fravælge.", - "ConfirmDeleteAllTrackingFailures": "Er du sikker på, at du vil slette alle sporingsfejl?", - "ConfirmDeleteThisTrackingFailure": "Er du sikker på, at du vil slette denne sporingsfejl?", - "Cors": "Cors", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) domæner", - "CorsDomainsHelp": "Du kan definere domæner eller subdomæner som for eksempel http://eksempel.dk eller http://stats.eksempel.dk. Eller for at tillade tværgående domæneforespørgsler for alle domæner kan du tilføje en *", - "CustomLogoFeedbackInfo": "Hvis du tilpasser Matomo logoet, kan du også være interesseret i at skjule %1$s linket i topmenuen. For at gøre dette, kan du deaktivere tilbagemeldingsmodulet på %2$sUdvidelsesmodul administration%3$s siden.", - "CustomLogoHelpText": "Du kan tilpasse Matomo logo, der bliver vist i brugergrænsefladen og e-mail rapporter.", - "DeclineInvite": "Afvis invitation", - "DeleteAllFailures": "Slet alle fejl", - "DevelopmentProcess": "Mens vores udviklingsproces inkluderer tusindvis af automatiserede tests, spiller Betatestere en nøglerolle i at opnå vores \"Ingen fejl politik\" i Matomo.", - "EmailServerSettings": "E-mailserverindstillinger", - "ErrorEmailFromAddressNotValid": "SMTP adressen er ikke gyldig", - "FaviconUpload": "Vælg Favicon til overførelse", - "FileUploadDisabled": "Overførelse af filer er ikke aktiveret i PHP-konfiguration. For at overføre dit brugerdefinerede logo skal du indstille %s i php.ini og genstarte webserveren.", - "ForBetaTestersOnly": "Kun for beta testere", - "HowToGetHelp": "Det er flere måder at få hjælp på. Gratis støtte fra Matomo-fællesskabet og betalt støtte fra Matomo-teamet og dets tilknyttede partnere. Eller måske har du en fejl du ønsker at rapportere eller ønsker at foreslå en ny funktion?", - "HttpTrackingApi": "HTTP-sporings-API", - "HttpTrackingApiDescription": "%1$s HTTP tracking API %2$s giver dig mulighed for at tracke alt. Det kan måske være brugbart hvis du bruger et programmeringssprog hvor der endnu ikke findes et SDK. Det kan også være brugbart, når du ønsker at tracke enheder eller applikationer på en bestemt måde.", - "ImageTracking": "Sporing vha. et billede", - "ImageTrackingIntro1": "Når en besøgende har deaktiveret JavaScript, eller når JavaScript kan ikke bruges, kan sporing vha. et billede bruges til at spore besøgende.", - "ImageTrackingIntro2": "Generer nedenstående link. Kopier og sæt det genererede HTML ind på siden. Hvis du bruger det som en reserveløsning til JavaScript sporing, kan du omgive det med %1$s tags.", - "ImageTrackingIntro3": "For at se hele listen af muligheder, som kan bruge sammen med sporing vha. billede, se %1$sTracking API Documentation%2$s.", - "ImageTrackingLink": "Link til sporing af vha. et billede", - "ImportFromGoogleAnalytics": "Importer fra Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Hvis du har en Google Analytics bruger og er ved at skifte til Matomo, kan du importere din eksisterende data ved hjælp af %1$sGoogleAnalyticsImporter%2$s plugin'et.", - "ImportingServerLogsDesc": "Et alternativ til sporing af besøgende gennem browseren (enten via JavaScript eller et billed-link) er løbende at importere serverlogfiler. Lær mere om %1$sServerlogfiler analyse%2$s.", - "InvalidPluginsWarning": "Følgende udvidelsesmoduler er ikke kompatible med %1$s og kunne ikke indlæses: %2$s.", - "InvalidPluginsYouCanUninstall": "Du kan opdatere eller afinstallere disse udvidelsesmoduler på %1$sManage Plugins%2$s-siden.", - "JSTrackingIntro1": "Du kan spore besøgende til hjemmesiden på mange forskellige måder. Den anbefalede måde at gøre det på er vha. JavaScript. For at bruge denne metode, skal du sørge for alle sider på hjemmesiden har noget JavaScript-kode, som du kan generere her.", - "JSTrackingIntro2": "Når du har JavaScript sporingskoden til hjemmesiden, kopier og indsæt den på alle de sider, der skal spores med Matomo.", - "JSTrackingIntro3a": "De fleste hjemmesider, blogs, CMS, mv. kan bruge et foruddefineret modul til at gøre det tekniske arbejde for dig. (Se vores %1$s liste med moduler, der kan bruges til at integrere matomo%2$s.)", - "JSTrackingIntro3b": "If no plugin exists you can edit your website templates and add the JavaScript tracking code to the </head> tag which is often defined in a 'header.php', 'header.tpl' or similar template file.", - "JSTrackingIntro4": "Hvis du ikke ønsker at bruge JavaScript til at spore besøgende,%1$sgenerere et billed sporingslink herunder%2$s.", - "JSTrackingIntro5": "Hvis du vil gøre mere end at spore sidevisninger, kan du tjekke %1$sMatomo Javascript sporingsdokumentation%2$s for listen over tilgængelige funktioner. Ved hjælp af disse funktioner kan du spore mål, brugerdefinerede variabler, e-handelsordrer, afbrudte ordrer og meget mere.", - "JSTracking_CampaignKwdParam": "Parameter for kampagnenøgleord", - "JSTracking_CampaignNameParam": "Parameter for kampagnenavn", - "JSTracking_CodeNoteBeforeClosingHead": "Du skal sikre dig at denne kode findes på alle sider af dit website. Vi anbefaler at indsætte den umiddelbart før slut %1$s tag.", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Du skal sikre dig at denne kode er indlejret som et script element på alle sider af dit website. Vi anbefaler at indsætte den umiddelbart før slutning af head tag.", - "JSTracking_CrossDomain": "Som standard, er det Visitor ID som identificere en unik besøgende gemt i browserens første-parts cookies, som kun kan tilgås af sider på samme domæne. Aktivering af kryds domæne linkning lader dig spore alle handlinger og sidevisninger af en bestemt bruger i det samme besøg, selv når de ser sider på adskillige domæner. Når en bruger klikker på et link til et af dine websites alias URL'er, vil der bliver tilføjet en URL paramter pk_vid, som viderestiller brugerens Visitor ID.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Note: For at brug tværgående domænelinking skal du først angive mere end et domænenavn (URLer) for dit website.", - "JSTracking_CustomCampaignQueryParam": "Brug brugerdefineret forespørgsel parameternavne for kampagnenavnet og søgeord", - "JSTracking_CustomCampaignQueryParamDesc": "Note: %1$sMatomo registrerer automatisk Google Analytics parametre.%2$s", - "JSTracking_DisableCookies": "Deaktivere alle sporingscookies", - "JSTracking_DisableCookiesDesc": "Deaktiverer alle førstepartscookies. Eksisterende Matomo cookies for denne hjemmeside vil blive slettet ved den næste sidevisning.", - "JSTracking_EnableCrossDomainLinking": "Aktiverer kryds domæne linkning", - "JSTracking_EnableDoNotTrack": "Aktiver klientside DoNotTrack detektering", - "JSTracking_EnableDoNotTrackDesc": "Så sporing anmodninger sendes ikke, hvis de besøgende ikke vil spores.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Bemærk: Server side DoNotTrack understøttelse er blevet aktiveret, så denne indstilling har ingen virkning.", - "JSTracking_EndNote": "Bemærk: Du kan generere en tilpasset sporingskode i %1$sSporingskode%2$s administrationssektionen.", - "JSTracking_GroupPageTitlesByDomain": "Tilføjer hjemmeside domænet til sidetitel, når sporing", - "JSTracking_GroupPageTitlesByDomainDesc1": "Så hvis nogen besøger 'Om' siden på blog.%1$s vil det blive registreret som 'blog / Om'. Dette er den nemmeste måde at få et overblik over trafikken på subdomæner.", - "JSTracking_MergeAliases": "I rapporten \"udgående links\", skjul klik til kendte alias URL på", - "JSTracking_MergeAliasesDesc": "Så klik på links til alias URL'er (f.eks %s) vil ikke blive talt som \"Udgående link\".", - "JSTracking_MergeSubdomains": "Spor besøgende på tværs af alle underdomæner for", - "JSTracking_MergeSubdomainsDesc": "Så hvis en besøgende besøger %1$s og %2$s, vil de regnes som en unikke besøgende.", - "JSTracking_PageCustomVars": "Spor en brugerdefineret variabel for hver sidevisning", - "JSTracking_PageCustomVarsDesc": "For eksempel med variabelnavn \"Kategori\" og værdi \"Hvidbøger\".", - "JSTracking_TrackNoScript": "Spor brugere med JavaScript déaktiveret", - "JSTracking_VisitorCustomVars": "Spor brugerdefinerede variabler for denne besøgende", - "JSTracking_VisitorCustomVarsDesc": "For eksempel med variabelnavn \"Type\" og værdi \"Kunde\".", - "JavaScriptTracking": "Sporing med JavaScript", - "JsTrackingCodeMissingEmail1": "For få dage siden tilføjede du websitet '%s' til din Matomo Analytics. Vi tjekkede lige og det ser ikke ud til at din Matomo registrerer nogen trafik fra dette website.", - "JsTrackingCodeMissingEmail2": "For at påbegynde tracking og få indsigt i dine brugere, er det nødvendigt at tilslutte tracking til dit website eller mobil-app. For websites skal du blot tilføje trackingkoden lige før %s-taggen.", - "JsTrackingCodeMissingEmail3": "For at finde og tilpasse din trackingkode, skal du %1$s klikke her %2$s (eller kigge nærmere på %3$s JavaScript Tracking Client guide %4$s).", - "LearnMore": "Læs mere", - "Login": "Brugernavn", - "LogoNotWriteableInstruction": "Hvis du vil bruge din brugerdefinerede logo i stedet for standard Matomo logoet, giver skriverettigheder til denne mappe: %1$s Matomo brug skriveadgang til dine logoer gemt i filer %2$s.", - "LogoUpload": "Vælg et logo til overførelse", - "LogoUploadFailed": "Den uploadede fil kunne ikke behandles. Kontroller at filen har et gyldigt format.", - "LogoUploadHelp": "Overfør en fil i %1$s formater med en højde på mindst %2$s pixels.", - "LtsReleases": "LTS (Long Term Support) versioner modtager kun sikkerheds- og fejlrettelser.", - "MenuDevelopment": "Udvikling", - "MenuDiagnostic": "Diagnosticering", - "MenuGeneralSettings": "Generelle indstillinger", - "MenuMeasurables": "Målbare", - "MenuSystem": "System", - "MissingTrackingCodeEmailSubject": "Ingen trafik for %s er registreret i Matomo Analytics. Kom i gang nu", - "NTrackingFailures": "%s sporingsfejl", - "NeedHelp": "Behov for hjælp?", - "NoKnownFailures": "Der er ikke kendte sporingsfejl.", - "OptOutComplete": "Opt-out udført; dine besøg på hjemmesiden bliver ikke registreret af analyseværktøjet.", - "OptOutCompleteBis": "Bemærk, at hvis du sletter dine cookies, sletter opt-out-cookien, eller hvis du skifter computer eller browser, skal du udføre opt-out-proceduren igen.", - "OptOutCustomOptOutLink": "Du kan også oprette en tilpasset formular til fravalg ved hjælp af HTML og JavaScript, som forklaret i denne udvikler %1$svejledning%2$s.", - "OptOutDntFound": "Sporing er ikke aktiv, fordi din browser har meddelt, at du ikke vil spores. Det er en browser indstilling. For at begynde at sporing igen, skal du deaktivere den såkaldte \"Do Not Track\"-indstilling i dine browserindstillinger.", - "OptOutErrorNoCookies": "Tracking tilvalgs-feature kræver, at cookies er aktiveret.", - "OptOutErrorNoTracker": "Fravalg af sporing funktionen kunne ikke finde Matomo sporingskode på denne side", - "OptOutErrorNotHttps": "Det er ikke sikkert at funktionen til fravalg af sporing fungerer, da websiden ikke anvender HTTPS. Hent siden igen for at tjekke om dit fravalg af sporing er ændret.", - "OptOutErrorWindowOpen": "Det er ikke sikkert at funktionen til fravalg af sporing fungerer, da det ser ud til at en pop-up blev blokeret. Hent siden igen for at tjekke om dit fravalg af sporing er ændret.", - "OptOutExplanation": "Matomo er dedikeret til at værne om personlige oplysninger på internettet. For at give dine besøgende valgmulighed for at framelde Matomo Web Analyse, kan du tilføje den følgende HTML-kode på en af dine hjemmesider, f. eks. på en fortrolighedspolitik side.", - "OptOutExplanationIntro": "Koden vil vise en Iframe, der indeholder et link til dine besøgende hvor det er muligt at framelde sig Matomo sporing ved at sætte en fravalg-cookie i browseren. Se herunder (eller %1$sKlik her%2$s) for at få vist indholdet af iframen.", - "OptOutForYourVisitors": "Matomo opt-out for dine besøgende", - "OptingYouOut": "Vælger dig fra, vent venligst…", - "PersonalPluginSettings": "Personlige indstillinger for udvidelsesmoduler", - "PiwikIsInstalledAt": "Matomo er installeret på", - "PluginSettingChangeNotAllowed": "Du må ikke ændre værdien \"%1$s\" i udvidelse \"%2$s\"", - "PluginSettingReadNotAllowed": "Du har ikke tilladelse til at læse værdien af indstillingen \"%1$s\" i udvidelsen \"%2$s\"", - "PluginSettings": "Programudvidelses indstilinger", - "PluginSettingsIntro": "Her kan du ændre indstillingerne for følgende 3. parts plugins:", - "PluginSettingsSaveFailed": "Kunne ikke gemme plugin indstillinger", - "PluginSettingsSaveSuccess": "Udvidelse indstillinger opdateret.", - "PluginSettingsValueNotAllowed": "Værdien for feltet \"%1$s\" i plugin \"%2$s\" er ikke tilladt", - "Problem": "Problem", - "ProtocolNotDetectedCorrectly": "Du benytter i øjeblikket Matomo over en sikker SSL-forbindelse (via HTTPS), men Matomo kunne kun registrere en ikke-sikker forbindelse på serveren.", - "ProtocolNotDetectedCorrectlySolution": "For at sikre at Matomo behandler anmodninger og dit indhold over HTTPS, skal du måske redigere din %1$s fil og enten konfigurere dine proxy indstillinger, eller du kan tilføje linjen %2$s under sektionen %3$s. %4$sLæs mere%5$s", - "ReleaseChannel": "Frigiv kanal", - "SecurityNotificationAllTokenAuthDeletedBody": "Nogen slettede alle autentificerings-tokens på din konto.", - "SecurityNotificationCheckTwoFactor": "Undersøg venligst din to-faktor autentificerings App eller enhed.", - "SecurityNotificationEmailSubject": "Sikkerhedsmeddelelse", - "SecurityNotificationUserAcceptInviteBody": "Bruger (login: %s) accepterede invitationen.", - "SecurityNotificationUserDeclinedInviteBody": "Bruger (login: %s) afviste invitationen.", - "SendPluginUpdateCommunication": "Send en e-mail når der er en opdatering til et plugin", - "SendPluginUpdateCommunicationHelp": "En e-mail vil blive sendt til Superbrugere, når der er en ny version tilgængelig for denne programudvidelse.", - "SettingsSaveSuccess": "Indstillinger opdateret.", - "SinglePageApplicationDescription": "Hvis du sporer et enkeltsidet program (SPA) eller en progressivt WEB-applikation (PWA), tjek %1$sdenne vejledningen%2$s.", - "Solution": "Løsning", - "StableReleases": "Hvis Matomo er en kritisk del af virksomheden, anbefaler vi at man bruger den nyeste stabile udgave. Hvis man bruger den nyeste beta, og finder en fejl eller har et forslag, %1$sse her%2$s.", - "SystemPluginSettings": "Indstillinger for system udvidelsesmoduler", - "TrackAGoal": "Spor et mål", - "TrackingCode": "Sporingskode", - "TrackingCodeIntro": "Matomo tilbyder forskellige metoder til indlejring af sporingskoden på din hjemmesiden, i din mobilapp eller anden enhed eller applikation.", - "TrackingFailureAuthenticationProblem": "Forespørgsel var ikke autentificeret, men autentifikation var krævet.", - "TrackingFailureAuthenticationSolution": "Sæt eller ret et \"token_auth\" i din tracking-forespørgsel.", - "TrackingFailureInvalidSiteProblem": "Sitet eksisterer ikke.", - "TrackingFailureInvalidSiteSolution": "Opdatér det konfigurerede idSite i trackeren.", - "TrackingFailures": "Sporingsfejl", - "TrackingFailuresEmail1": "Dette er blot for at fortælle dig, at der i de seneste dage har optrådt %s forskellige sporingsfejl.", - "TrackingFailuresEmail2": "For at se alle fejlede tracking-forespørgsler, %1$s klik her %2$s.", - "TrackingFailuresEmailSubject": "Trackingfejl i din Matomo Analytics", - "TrackingFailuresIntroduction": "Denne side vider trackingfejl som opstod de sidste %s dage. Vær venligst opmærksom på, at kun de mest almindelige former for trackingfejl er registreret og ikke dem alle.", - "TrackingURL": "Tracking URL", - "TrustedHostConfirm": "Er du sikker på, at du vil ændre det betroede Matomo værtsnavn?", - "TrustedHostSettings": "Betroet Matomo værtsnavn", - "UiDemo": "UI-demo", - "UncheckToOptOut": "Fjern markeringen for at fravælge tracking.", - "UpdateSettings": "Opdater indstillinger", - "UseCustomLogo": "Anvend brugerdefineret logo", - "UserInviteContent": "Du kan acceptere denne invitation ved at klikke på «Acceptér»-knappen herunder.", - "UserInviteNotes": "Hvis du ikke forventede denne invitation, kan du blot ignorere denne e-mail. Hvis %1$s sender for mange e-mails, kan du enten blokkere dem eller rapportere misbrug. Invitationen udløber automatisk om %2$s dage.", - "UserInviteSubject": "%1$s sendte dig en invitation til at deltage i Matomo Analytics for %2$s.", - "ValidPiwikHostname": "Gyldigt Matomo værtsnavn", - "ViewAllTrackingFailures": "Vis alle sporingsfejl", - "WithOptionalRevenue": "med valgfri indtægter", - "YouAreNotOptedOut": "Du tillader tracking.", - "YouAreOptedOut": "Du har fravalgt tracking.", - "YouMayOptOut": "Når du besøger websitet bliver du tildelt et unikt identifikationsnummer, som er placeret i en cookie på din computer, og som bruges til at analysere, hvor mange, der besøger websitet, hvilke sider, der bliver set og lignende.", - "YouMayOptOut2": "Du har mulighed for at vælge at dette website ikke indsamler eller analyserer de handlinger du foretager her.", - "YouMayOptOut3": "Hvis du gør det, beskytter du dit privatliv, men du forhindrer også ejeren af websitet fra at lære af dine handlinger, og dermed blive i stand til at forbedre brugeroplevelsen for dig og andre brugere.", - "YouMayOptOutBis": "Du har mulighed for at fravælge, at denne cookie placeres på din enhed." - } -} diff --git a/plugins/CoreAdminHome/lang/de.json b/plugins/CoreAdminHome/lang/de.json deleted file mode 100644 index 70f6772c77cb282851c02b9330c0930bccb200a3..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/de.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Einladung annehmen", - "AddNewTrustedHost": "Vertrauten Hostnamen hinzufügen", - "Administration": "Administration", - "ArchivingSettings": "Archivierungseinstellungen", - "BrandingSettings": "Branding Einstellungen", - "BruteForce": "Brute Force", - "CheckToOptIn": "Diese Checkbox aktivieren für Opt-In.", - "ClickHereToOptIn": "Klicken Sie hier, um Ihren Besuch wieder erfassen zu lassen.", - "ClickHereToOptOut": "Klicken Sie hier, damit Ihr Besuch nicht mehr erfasst wird.", - "CloudflareDescription": "Wenn Ihre Webseite auf Cloudflare gehostet ist, bitte %1$sdiese Anleitung%2$s beachten.", - "ConfirmDeleteAllTrackingFailures": "Sind Sie sicher, dass Sie alle Tracking-Fehlschläge löschen wollen?", - "ConfirmDeleteThisTrackingFailure": "Sind Sie sicher, dass Sie diesen Tracking-Fehlschlag löschen wollen?", - "Cors": "CORS", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) Domänen", - "CorsDomainsHelp": "Sie können Domänen oder Subdomänen wie http://example.com oder http://stats.example.com definieren. Oder fügen Sie einfach * hinzu, um cross domain requests für alle Domänen zu erlauben.", - "CustomLogoFeedbackInfo": "Wenn Sie das Matomo-Logo anpassen, ist sicher auch das Verstecken des %1$s-Links in der Navigation von Interesse. Bitte dazu das Feedback Plugin auf der %2$sPlugins verwalten%3$s Seite deaktivieren.", - "CustomLogoHelpText": "Hier kann das Matomo-Logo angepasst werden, das in der Benutzeroberfläche sowie in E-Mail-Berichten verwendet wird.", - "DeclineInvite": "Einladung ablehnen", - "DeleteAllFailures": "Alle Fehlschläge löschen", - "DevelopmentProcess": "Auch wenn unser Entwicklungsprozess tausende automatisierte Tests beinhaltet, haben Beta-Tester eine Schlüsselrolle um die \"No Bug Policy\" in Matomo zu gewährleisten.", - "EmailServerSettings": "E-Mail-Server-Einstellungen", - "ErrorEmailFromAddressNotValid": "Die SMTP Von-Adresse ist ungültig", - "FaviconUpload": "Wählen Sie ein Favicon für den Upload aus", - "FileUploadDisabled": "Das Hochladen von Dateien ist in Ihrer PHP-Konfiguration nicht aktiviert. Um Ihr eigenes Logo hochladen zu können setzen Sie bitte %s in Ihrer php.ini und starten Sie den Webserver neu.", - "ForBetaTestersOnly": "Nur für Beta-Tester", - "GoogleTagManagerDescription": "Wenn Ihre Webseite den Google Tag Manager verwendet, bitte %1$sdiese Anleitung%2$s beachten.", - "HideAdvancedOptions": "Erweiterte Optionen verbergen", - "HowToGetHelp": "Es gibt verschiedene Möglichkeiten, wie Sie Hilfe bekommen können. Es gibt kostenlosen Support über die Matomo Community und kostenpflichtigen Support durch das Matomo Team und Partner von Matomo. Oder haben Sie vielleicht einen Fehler zu melden oder wollen Sie eine neue Funktion vorschlagen?", - "HttpTrackingApi": "HTTP Tracking API", - "HttpTrackingApiDescription": "Die %1$sHTTP Tracking API%2$s ermöglicht es beliebige Dinge zu tracken. Das kann hilfreich sein, wenn Sie eine Programmiersprache verwenden, für die noch kein SDK existiert. Auch kann es hilfreich sein, wenn Sie Geräte oder Applikationen in einer besonderen Weise tracken möchten.", - "ImageTracking": "Tracking mithilfe eines Bildes", - "ImageTrackingIntro1": "Für den Fall, dass ein Besucher JavaScript deaktiviert hat, oder JavaScript nicht verwendet werden kann, können Sie das Tracking mithilfe eines Bildes nutzen um Besucher zu tracken.", - "ImageTrackingIntro2": "Generieren Sie den Link unten und kopieren Sie den generierten HTML-Code in Ihre Seite. Sollten Sie dies als Fallback für das JavaScript Tracking verwenden, umschließen sie es mit einem %1$s Tag.", - "ImageTrackingIntro3": "Eine vollständige Liste an Möglichkeiten, die Ihnen das Tracking mit einem Bild bietet, finden Sie in der %1$sTracking API Dokumentation%2$s.", - "ImageTrackingLink": "Link zum Tracking mithilfe eines Bildes", - "ImportFromGoogleAnalytics": "Von Google Analytics importieren", - "ImportFromGoogleAnalyticsDescription": "Wenn Sie über ein Google Analytics-Konto verfügen und zu Matomo wechseln, können Sie Ihre vorhandenen Daten mithilfe des %1$sGoogleAnalyticsImporter-Plugins%2$s importieren.", - "ImportingServerLogsDesc": "Eine Alternative zum Tracken der Besucher im Browser (entweder mit JavaScript oder mit einem Bild-Link) ist der kontinuierliche Import von Server Logdateien. Erfahren Sie mehr über %1$sServer Logdatei Analyse%2$s.", - "InvalidPluginsWarning": "Folgende Plugins sind nicht kompatibel mit %1$s und konnten nicht geladen werden: %2$s.", - "InvalidPluginsYouCanUninstall": "Sie können diese Plugins auf der %1$sPlugins verwalten%2$s Seite aktualisieren oder deinstallieren.", - "JSTrackingDocumentationHelp": "Die beliebtesten erweiterten Optionen sind für einen einfachen Zugriff untenstehend verfügbar. Für den Zugriff auf weitere Optionen (inklusive wie man Ziele, benutzerdefinierte Variablen, E-Commerce Bestellungen und verwaiste Warenkörbe verwendet) verwenden Sie die %1$sMatomo Javascript Tracking Dokumentation%2$s.", - "JSTrackingIntro1": "Es gibt viele verschiedene Möglichkeiten, Besucher Ihrer Webseite zu tracken. Die empfohlene Art und Weise dies zu tun, ist die Verwendung von JavaScript. Um diese Methode zu nutzen, müssen Sie sicher stellen, dass auf jeder Seite Ihrer Webseite der entsprechende JavaScript-Code eingebunden ist. Diesen können Sie hier generieren.", - "JSTrackingIntro2": "Sobald Sie den JavaScript Tracking Code für Ihre Webseite haben, fügen Sie ihn auf allen Seiten ein, die Sie mit Matomo überwachen möchten.", - "JSTrackingIntro3a": "Für die meisten Webseiten, Blogs, CMS usw. können Sie ein Plugin verwenden, das die Implementierung für Sie erledigt. (Siehe unsere %1$sListe der zur Integration von Matomo vorhandenen Plugins%2$s.)", - "JSTrackingIntro3b": "Wenn kein Plugin vorhanden ist, können Sie Ihre Webseitenvorlagen bearbeiten und den JavaScript-Tracking-Code zum </head> Tag hinzufügen, welcher häufig in einer 'header.php', 'header.tpl' oder einer ähnlichen Vorlagendatei definiert ist.", - "JSTrackingIntro4": "Falls Sie kein JavaScript nutzen möchten um Ihre Besucher zu tracken, %1$sgenerieren Sie einen Link zum Tracking mithilfe eines Bildes unterhalb%2$s.", - "JSTrackingIntro5": "Sollte Sie mehr als nur Seitenaufrufe aufzeichnen wollen, werfen Sie einen Blick in die %1$sMatomo Javascript Tracking Dokumentation%2$s für eine Liste an verfügbaren Funktionen. Mit der Verwendung dieser Funktionen können Sie Ziele, benutzerdefinierte Variablen, Ecommerce Bestellungen, verlassene Warenkörbe und mehr aufzeichnen.", - "JSTracking_CampaignKwdParam": "Kampagnen Suchbegriff Parameter", - "JSTracking_CampaignNameParam": "Parameter für Kampagnenname", - "JSTracking_CodeNoteBeforeClosingHead": "Klicken Sie auf die Schaltfläche, um das Code-Snippet zu kopieren, und fügen Sie es unmittelbar vor dem schließenden %1$s-Tag ein (empfohlen)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Stellen Sie sicher, dass dieser Code innerhalb eines Skript-Elementes auf jeder Seite Ihrer Webseite enthalten ist. Wir empfehlen den Code direkt vor dem schließenden Head-Tag einzubauen.", - "JSTracking_ConsentManagerConnected": "%1$s Scheint bereits konfiguriert zu sein um in Matomo zu funktionieren.", - "JSTracking_ConsentManagerDetected": "%1$s Einverständniserklärungs-Manager wurde auf Ihrer Seite entdeckt. Um mehr über die Konfiguration dafür in Matomo zu erfahren %1$s besuchen Sie bitte %2$s", - "JSTracking_ConsentManagerEmailNote": "Oder Sie können stattdessen den Tracking Code direkt in Ihrer Webseite einbinden:", - "JSTracking_CrossDomain": "Standardmäßig wird die Besucher-ID, welche einen eindeutigen Besucher identifiziert, in den Cookies des Browsers, auf welche nur von einer einzelnen Domain zugegriffen werden kann, gespeichert. Wenn Sie Domainübergreifendes Tracking aktivieren, können Sie alle Aktionen und Seitenaufrufe eines bestimmten Besuchers in demselben Besuch verfolgen, auch wenn sie Seiten auf mehreren Domänen anzeigen. Wenn ein Benutzer auf einen Link zu einer der Alias-URL Ihrer Webseite klickt, wird automatisch der URL-Parameter pk_vid angefügt, der die Besucher-ID an die neue Domain übergibt.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Hinweis: Um Cross Domain Linking zu unterstützen, müssen Sie mehr als einen Domainnamen (URLs) für Ihre Webseite definieren.", - "JSTracking_CustomCampaignQueryParam": "Benutzerdefinierte Abfrageparameter für Kampagnennamen und Suchbegriffe verwenden", - "JSTracking_CustomCampaignQueryParamDesc": "Hinweis: %1$sMatomo erkennt Parameter von Google Analytics automatisch.%2$s", - "JSTracking_DisableCampaignParameters": "Tracking von Kampagnen-Parameter deaktivieren", - "JSTracking_DisableCampaignParametersDesc": "Wenn diese Option aktiviert ist, wird Matomo Kampagnen-Parameter nicht tracken und sie werden aus getrackten URLs entfernt.", - "JSTracking_DisableCookies": "Alle Tracking Cookies deaktivieren", - "JSTracking_DisableCookiesDesc": "Deaktiviert alle First-Party Cookies. Bestehende Matomo Cookies für diese Webseite werden beim nächsten Seitenaufruf gelöscht.", - "JSTracking_EnableCrossDomainLinking": "Domainübergreifendes Tracking aktivieren", - "JSTracking_EnableDoNotTrack": "Clientseitige Do-Not-Track Erkennung aktivieren", - "JSTracking_EnableDoNotTrackDesc": "Hierdurch werden Tracking-Anfragen nicht gesendet, falls der Benutzer nicht getrackt werden möchte.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Hinweis: Diese Einstellung hat keine Auswirkung, da die Do-Not-Track Unterstützung serverseitig aktiviert ist.", - "JSTracking_EndNote": "Hinweis: Sie können sich einen angepassten Tracking Code unter Einstellungen > %1$sTracking Code%2$s erzeugen.", - "JSTracking_GroupPageTitlesByDomain": "Domain der Seite beim Tracken dem Seitentitel voranstellen", - "JSTracking_GroupPageTitlesByDomainDesc1": "Wenn jemand die 'About'-Seite auf blog.%1$s besucht, wird dies aufgezeichnet als 'blog / About'. Dies ist der einfachste Weg um einen Überblick über Ihren Traffic nach Sub-Domain zu bekommen.", - "JSTracking_MergeAliases": "Verberge im Bericht über \"ausgehende Verweise\" alle Klicks auf bekannte Alias-URLs von", - "JSTracking_MergeAliasesDesc": "Hierdurch werden Klicks auf Links zu Alias-URLs (z.B. %s) nicht als \"ausgehender Verweis\" gewertet.", - "JSTracking_MergeSubdomains": "Besucher aufzeichnen auf allen Subdomains von", - "JSTracking_MergeSubdomainsDesc": "Hierdurch werden Besucher, die %1$s und %2$s besuchen als eindeutige Besucher gewertet.", - "JSTracking_PageCustomVars": "Eine benutzerdefinierte Variable für jeden Seitenaufruf aufzeichnen", - "JSTracking_PageCustomVarsDesc": "Zum Beispiel mit den Variablennamen \"Kategorie\" und dem Wert \"White Papers\".", - "JSTracking_TrackNoScript": "Benutzer mit deaktiviertem JavaScript tracken", - "JSTracking_VisitorCustomVars": "Benutzerdefinierte Variable für diesen Besucher aufzeichnen", - "JSTracking_VisitorCustomVarsDesc": "Zum Beispiel mit dem Variablennamen \"Typ\" und dem Wert \"Kunde\".", - "JavaScriptCode": "JavaScript-Code", - "JavaScriptTracking": "Tracking mit JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Optional: Nutzen Sie die Erweiterten Einstellungen um den Tracking-Code anzupassen.", - "JsTrackingCodeMissingEmail1": "Sie haben vor ein paar Tagen die Webseite '%s' zu Ihrer Matomo Analytics Installation hinzugefügt. Wir haben soeben nachgeschaut und Ihr Matomo scheint keinen Traffic für diese Webseite aufgezeichnet zu haben.", - "JsTrackingCodeMissingEmail2": "Um damit zu beginnen, Daten aufzuzeichnen und Einblicke in das Benutzerverhalten zu bekommen, müssen Sie das Tracking in Ihrer Webseite oder mobilen App installieren. Für Webseiten betten Sie den Tracking Code direkt vor dem %s Tag ein.", - "JsTrackingCodeMissingEmail3": "Um Ihren Tracking Code zu finden und zu personalisieren, %1$shier klicken%2$s (oder schauen Sie sich die %3$sJavaScript Tracking Client Anleitung%4$s an).", - "LearnMore": "Mehr dazu", - "Login": "Benutzer", - "LogoNotWriteableInstruction": "Um Ihr eigenes Logo anstelle des Matomo Logos verwenden zu können werden Schreibrechte auf diesen Ordner benötigt: %1$s Matomo benötigt Schreibzugriff auf Ihre Logos die gespeichert sind in %2$s.", - "LogoUpload": "Wählen Sie ein Logo für den Upload aus", - "LogoUploadFailed": "Die hochgeladene Datei konnte nicht verarbeitet werden. Bitte überprüfen Sie, ob die Datei ein gültiges Format hat.", - "LogoUploadHelp": "Bitte laden Sie eine Datei in den Formaten %1$s mit einer minimalen Höhe von %2$s Pixeln hoch.", - "LtsReleases": "LTS (Long Term Support / Langzeit Support) Versionen erhalten nur Sicherheitsupdates und Bug Fixes.", - "MenuDevelopment": "Entwicklung", - "MenuDiagnostic": "Diagnose", - "MenuGeneralSettings": "Allgemeine Einstellungen", - "MenuMeasurables": "Messgrößen", - "MenuSystem": "System", - "MissingTrackingCodeEmailSubject": "Kein Traffic für %s in Matomo Analytics aufgezeichnet, jetzt starten", - "NTrackingFailures": "%s Tracking Fehlschläge", - "NeedHelp": "Brauchen Sie Hilfe?", - "NoKnownFailures": "Es gibt keine Tracking Fehlschläge.", - "OptOutComplete": "Opt-out abgeschlossen; Ihre Besuche auf dieser Webseite werden nicht vom Webanalysetool erfasst.", - "OptOutCompleteBis": "Bitte beachten Sie, dass auch der Matomo-Deaktivierungs-Cookie dieser Webseite gelöscht wird, wenn Sie die in Ihrem Browser abgelegten Cookies entfernen. Außerdem müssen Sie, wenn Sie einen anderen Computer oder einen anderen Webbrowser verwenden, die Deaktivierungsprozedur nochmals absolvieren.", - "OptOutCustomOptOutLink": "Sie können auch ein vollständig benutzerdefiniertes Opt-out-Formular mit HTML und JavaScript erstellen, wie in diesem Entwicklerleitfaden %1$sguide%2$s erläutert.", - "OptOutDntFound": "Das Tracking ist bei Ihnen derzeit nicht aktiv, denn Ihr Browser hat uns mitgeteilt, dass Sie kein Tracking wünschen. Hierbei handelt es sich um eine Browsereinstellung. Um das Tracking wieder zu aktivieren, müssen Sie die sogenannte \"Do Not Track\"-Einstellung in Ihren Browsereinstellungen deaktivieren.", - "OptOutErrorNoCookies": "Die Tracking opt-out Funktion benötigt aktivierte Cookies.", - "OptOutErrorNoTracker": "Die Opt-Out-Funktion für das Tracking konnte den Matomo-Tracker-Code auf dieser Seite nicht finden", - "OptOutErrorNotHttps": "Die Tracking Opt-Out Funktion funktioniert möglicherweise nicht, weil diese nicht über HTTPS geladen wurde. Bitte laden Sie die Seite neu, um zu prüfen, ob sich Ihr Opt-Out Status geändert hat.", - "OptOutErrorWindowOpen": "Die Tracking Opt-Out Funktion funktioniert möglicherweise nicht, weil anscheinend das Opt-Out Popup-Fenster blockiert wurde. Bitte laden Sie die Seite neu, um zu prüfen, ob sich Ihr Opt-Out Status geändert hat.", - "OptOutExplanation": "Matomo ist es wichtig, die Privatsphäre Ihrer Besucher zu wahren. Fügen Sie den folgenden HTML-Code auf einer Seite Ihrer Webseite (z.B der Datenschutz-Seite) ein, um den Besuchern Ihrer Webseite die Möglichkeit zu geben, sich gegen eine Erfassung ihres Besuches durch Matomo zu entscheiden.", - "OptOutExplanationIntro": "Dieser Code stellt einen Link zur Verfügung, über den Ihre Besucher das Tracking mit Matomo abwählen können, indem ein Opt-Out-Cookie in ihrem Webbrowser gesetzt wird. Siehe unten (oder %1$shier klicken%2$s), um den Inhalt zu sehen, der durch den Code angezeigt wird.", - "OptOutForYourVisitors": "Matomo-Deaktivierung für Ihre Besucher", - "OptingYouOut": "Deaktivierung wird durchgeführt, bitte warten…", - "PersonalPluginSettings": "Persönliche Plugin Einstellungen", - "PiwikIsInstalledAt": "Matomo ist installiert unter", - "PluginSettingChangeNotAllowed": "Sie sind nicht berechtigt den Wert für die Einstellung \"%1$s\" im Plugin \"%2$s\" zu ändern", - "PluginSettingReadNotAllowed": "Sie haben keine Berechtigung den Wert der Einstellung \"%1$s\" für das Plugin \"%2$s\" auszulesen", - "PluginSettings": "Plugin Einstellungen", - "PluginSettingsIntro": "Hier können Sie die Einstellungen für folgende Drittanbieter Plugins ändern:", - "PluginSettingsSaveFailed": "Plugin-Einstellungen konnten nicht gespeichert werden", - "PluginSettingsSaveSuccess": "Plugin-Einstellungen aktualisiert.", - "PluginSettingsValueNotAllowed": "Der Wert für die Einstellung \"%1$s\" im Plugin \"%2$s\" ist nicht erlaubt.", - "Problem": "Problem", - "ProtocolNotDetectedCorrectly": "Sie greifen aktuell auf Matomo über eine sichere SSL Verbindung zu (durch Verwendung von HTTPS), aber Matomo konnte auf dem Server nur eine nicht sichere Verbindung feststellen.", - "ProtocolNotDetectedCorrectlySolution": "Um sicherzustellen, dass Matomo jegliche Anfragen und Inhalte via HTTPS ausliefert, ist es zwingend notwendig, die %1$s-Datei zu bearbeiten, die Proxy-Einstellungen zu überprüfen oder die Zeile %2$s unter dem Abschnitt %3$s hinzuzufügen. %4$sMehr erfahren%5$s", - "ReactDescription": "Wenn Ihre Webseite React verwendet, bitte %1$sdiese Anleitung%2$s beachten.", - "ReleaseChannel": "Release Kanal", - "SecurityNotificationAllTokenAuthDeletedBody": "Jemand hat alle Authentifizierungs-Token Ihres Benutzerkontos gelöscht.", - "SecurityNotificationAnonymousAccessEnabledBody": "Jemand hat den anonymen Benutzerzugriff für %1$s aktiviert. Das bedeutet, dass die Daten für diese Seite jetzt öffentlich zugänglich sind. Wenn das in Ordnung ist, können Sie diese E-Mail gerne ignorieren.", - "SecurityNotificationCheckTwoFactor": "Bitte prüfen Sie Ihre App oder Ihr Gerät zur Zwei-Faktor Authentifizierung.", - "SecurityNotificationEmailSubject": "Sicherheitsbenachrichtigung", - "SecurityNotificationIfItWasYou": "Wenn Sie das waren, fahren Sie fort. Wenn Sie sich über diese Aktivität nicht sicher sind, setzen Sie bitte Ihr Passwort zurück.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Jemand hat neue Wiederherstellungscodes für Zwei-Faktor-Authentifikation für Ihr Benutzerkonto generiert.", - "SecurityNotificationRecoveryCodesShowedBody": "Jemand hat sich die Wiederherstellungscodes Ihres Benutzerkontos für Zwei-Faktor-Authentifikation angeschaut.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Ein anderer Hauptadministrator (%1$s) hat die Systemeinstellungen verändert. Betroffene Einstellungen: %2$s. Wenn Sie die Aktivität nachvollziehen können, fahren Sie fort. Wenn nicht, kontaktieren Sie bitte den anderen Hauptadministrator.", - "SecurityNotificationSettingsChangedByUserBody": "Jemand hat die Systemeinstellungen verändert. Betroffene Einstellungen: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Jemand hat einen Authentifizierungs-Token (Beschreibung: %s) in Ihrem Benutzerkonto erstellt. Wenn Sie das nicht waren, löschen Sie den Token.", - "SecurityNotificationTokenAuthDeletedBody": "Jemand hat einen Authentifizierungs-Token (Beschreibung: %s) in Ihrem Benutzerkonto gelöscht.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Jemand hat die Zwei-Faktor-Authentifikation in Ihrem Benutzerkonto deaktiviert.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Jemand hat die Zwei-Faktor-Authentifikation in Ihrem Benutzerkonto aktiviert.", - "SecurityNotificationUserAcceptInviteBody": "Der Benutzer %s hat die Einladung angenommen.", - "SecurityNotificationUserCreatedBody": "Jemand hat einen neuen Benutzer (Login: %s) in Ihrem Benutzerkonto erstellt.", - "SecurityNotificationUserDeclinedInviteBody": "Der Benutzer %s hat die Einladung abgelehnt.", - "SecurityNotificationUserDeletedBody": "Jemand hat einen Benutzer (Login: %s) in Ihrem Benutzerkonto gelöscht.", - "SendPluginUpdateCommunication": "Sende mir eine E-Mail wenn eine neue Plugin-Aktualisierung zur Verfügung steht", - "SendPluginUpdateCommunicationHelp": "Der Hauptadministrator wird per E-Mail benachrichtigt, sobald eine neue Version eines Plugins zur Verfügung steht.", - "SettingsSaveSuccess": "Einstellungen aktualisiert.", - "ShowAdvancedOptions": "Erweiterte Optionen anzeigen", - "SinglePageApplicationDescription": "Wenn Sie eine Single-Page-Anwendung (SPA) oder eine progressive Webanwendung (PWA) aufzeichnen, lesen Sie bitte %1$sdiesen Leitfaden%2$s.", - "Solution": "Lösung", - "StableReleases": "Sollte Matomo eine wichtige Komponente Ihres Unternehmens sein, empfehlen wir Ihnen den letzten stabilen Release zu verwenden. Sollten Sie die letzte Beta Version verwenden und einen Fehler finden oder einen Vorschlag haben, %1$slesen Sie bitte hier%2$s.", - "SystemPluginSettings": "Globale Plugin Einstellungen", - "TrackAGoal": "Ein Ziel aufzeichnen", - "TrackingCode": "Tracking-Code", - "TrackingCodeIntro": "Matomo bietet Ihnen verschiedene Möglichkeiten, den Tracking-Code für Ihre Webseite, Ihre Mobile-App und sogar für jedes Gerät oder jede Anwendung einzubetten.", - "TrackingFailureAuthenticationProblem": "Anfrage wurde noch nicht authentifiziert, aber eine Authentifizierung wird benötigt.", - "TrackingFailureAuthenticationSolution": "Setzen oder ändern Sie einen \"token_auth\" in Ihrer Trackinganfrage.", - "TrackingFailureInvalidSiteProblem": "Die Seite existiert nicht.", - "TrackingFailureInvalidSiteSolution": "Die konfigurierte idSite im Tracker aktualisieren.", - "TrackingFailures": "Tracking Fehlschläge", - "TrackingFailuresEmail1": "Dies ist nur um Sie wissen zu lassen, dass in den letzten Tagen %s verschiedene Arten von Tracking Fehlschlägen aufgetreten sind.", - "TrackingFailuresEmail2": "%1$sHier klicken%2$s, um alle Tracking Fehlschläge anzuzeigen.", - "TrackingFailuresEmailSubject": "Fehlschläge in Ihrem Matomo Analytics tracken", - "TrackingFailuresIntroduction": "Diese Seite listet in den letzten %s Tagen aufgetretene Tracking Fehlschläge auf. Beachten Sie bitte dass nur die häufigsten Fehlschlagarten aufgezeichnet werden, nicht alle.", - "TrackingURL": "Tracking URL", - "TrustedHostConfirm": "Wollen Sie wirklich den Vertrauten Matomo Hostnamen ändern?", - "TrustedHostSettings": "Vertrauter Matomo Hostname", - "TwoFactorAuth": "Zwei-Faktor Authentifizierung", - "UiDemo": "Oberflächen Demo", - "UncheckToOptOut": "Diese Checkbox abwählen für Opt-Out.", - "UpdateSettings": "Aktualisierungseinstellungen", - "UseCustomLogo": "Eigenes Logo verwenden", - "UserInviteContent": "Sie können diese Einladung annehmen, indem Sie auf die Schaltfläche \"Einladung annehmen\" unten klicken.", - "UserInviteNotes": "Wenn Sie diese Einladung nicht erwartet haben, können Sie diese E-Mail ignorieren. Wenn %1$s Ihnen zu viele E-Mails schickt, können Sie den Absender blockieren oder Missbrauch melden. Die Einladung läuft automatisch in %2$s Tagen ab.", - "UserInviteSubject": "%1$s hat Ihnen eine Einladung zu Matomo Analytics für %2$s geschickt.", - "ValidPiwikHostname": "Gültiger Matomo Hostname", - "ViewAllTrackingFailures": "Alle Tracking Fehlschläge anzeigen", - "VueDescription": "Wenn Ihre Webseite Vue.js verwendet, bitte %1$sdiese Anleitung%2$s beachten.", - "WhatIsNew": "Was ist neu", - "WhatIsNewDoNotShowAgain": "Nicht mehr anzeigen", - "WhatIsNewNoChanges": "Im Moment gibt es nichts Neues", - "WhatIsNewNoChangesTitle": "Keine aktuellen Änderungen", - "WhatIsNewRemindMeLater": "Später erinnern", - "WhatIsNewTitle": "Das ist neu in Matomo", - "WhatIsNewTooltip": "Erfahren Sie, was es Neues in Matomo gibt", - "WithOptionalRevenue": "mit optionalen Einnahmen", - "WordpressDescription": "Wenn Ihre Webseite Wordpress verwendet, bitte %1$sdiese Anleitung%2$s beachten.", - "YouAreNotOptedOut": "Ihr Besuch dieser Webseite wird aktuell von der Matomo Webanalyse erfasst.", - "YouAreOptedOut": "Ihr Besuch dieser Webseite wird aktuell von der Matomo Webanalyse nicht erfasst.", - "YouMayOptOut": "Sie können sich hier entscheiden, ob in Ihrem Browser ein eindeutiger Webanalyse-Cookie abgelegt werden darf, um dem Betreiber der Webseite die Erfassung und Analyse verschiedener statistischer Daten zu ermöglichen.", - "YouMayOptOut2": "Sie haben die Möglichkeit zu verhindern, dass von Ihnen hier getätigte Aktionen analysiert und verknüpft werden.", - "YouMayOptOut3": "Dies wird Ihre Privatsphäre schützen, aber wird auch den Besitzer daran hindern, aus Ihren Aktionen zu lernen und die Bedienbarkeit für Sie und andere Benutzer zu verbessern.", - "YouMayOptOutBis": "Wenn Sie sich dagegen entscheiden möchten, entfernen Sie den folgenden Haken, um den Matomo-Deaktivierungs-Cookie in Ihrem Browser abzulegen." - } -} diff --git a/plugins/CoreAdminHome/lang/dv.json b/plugins/CoreAdminHome/lang/dv.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/dv.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/el.json b/plugins/CoreAdminHome/lang/el.json deleted file mode 100644 index 6b39a20d2aec2cd95ce7be74b055e04415a5355e..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/el.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Αποδοχή Πρόσκλησης", - "AddNewTrustedHost": "Προσθήκη νέου αξιόπιστου διακομιστή", - "Administration": "Διαχείριση", - "ArchivingSettings": "Ρυθμίσεις αρχειοθέτησης", - "BrandingSettings": "Εταιρικές ρυθμίσεις", - "BruteForce": "Brute Force", - "CheckToOptIn": "Επιλέξτε το πλαίσιο επιλογής για opt-in.", - "ClickHereToOptIn": "Πατήστε εδώ για να ιχνηλατείστε.", - "ClickHereToOptOut": "Πατήστε εδώ για να μην ιχνηλατείστε.", - "CloudflareDescription": "Αν ο ιστοτόπος σας φιλοξενείται στην Cloudflare, δείτε %1$sαυτόν τον οδηγό%2$s.", - "ConfirmDeleteAllTrackingFailures": "Είστε σίγουροι για την διαγραφή όλων των αποτυχιών ιχνηλάτησης;", - "ConfirmDeleteThisTrackingFailure": "Είστε σίγουροι για την διαγραφή αυτής της αποτυχίας ιχνηλάτησης;", - "Cors": "Cors", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) ονόματα χώρου", - "CorsDomainsHelp": "Μπορείτε να καθορίσετε ονόματα ή υποονόματα χώρου όπως http://example.com ή http://stats.example.com. Εναλλακτικά για να επιτρέψετε αιτήσεις από διαφορετικά ονόματα χώρου, απλώς προσθέστε ένα *", - "CustomLogoFeedbackInfo": "Αν προσαρμόσετε το λογότυπο του Matomo, ίσως θέλετε να αποκρύψετε τον σύνδεσμο %1$s στο βασικό μενού. Για να το κάνετε αυτό, μπορείτε να απενεργοποιήσετε το πρόσθετο Feedback στη σελίδα %2$sΔιαχείρισης Προσθέτων%3$s.", - "CustomLogoHelpText": "Μπορείτε να προσαρμόσετε το λογότυπο του Matomo που θα εμφανίζεται στο περιβάλλον εργασίας του χρήστη και στις αναφορές αλληλογραφίας.", - "DeclineInvite": "Απόρριψη Πρόσκλησης", - "DeleteAllFailures": "Διαγραφή όλων των αποτυχιών", - "DevelopmentProcess": "Παρόλο που η διαδικασία μας της ανάπτυξης περιλαμβάνει χιλιάδες αυτοματοποιημένων τεστ, οι Δοκιμαστές Εκδόσεων Βήτα παίζουν ένα κύριο ρόλο στο να πετύχουμε την \"Χωρίς σφάλματα πολιτική\" του Matomo.", - "EmailServerSettings": "Ρυθμίσεις διακομιστή ηλεκτρονικής αλληλογραφίας", - "ErrorEmailFromAddressNotValid": "Η διεύθυνση από στο SMTP δεν είναι έγκυρη", - "FaviconUpload": "Επιλέξτε ένα favicon για ανέβασμα", - "FileUploadDisabled": "Το ανέβασμα των αρχείων δεν είναι ενεργοποιημένο στην παραμετροποίηση της PHP. Για να ανεβάσετε το δικό σας λογότυπο ορίστε το %s στο αρχείο php.ini και κάντε επανεκκίνηση τον διακομιστή ιστού σας.", - "ForBetaTestersOnly": "Για χρήστες δοκιμαστές μόνο", - "GoogleTagManagerDescription": "Αν ο ιστοτόπος σας χρησιμοποιεί το Διαχειριστή Σημάνσεων του Google, δείτε %1$sαυτό τον οδηγό%2$s.", - "HideAdvancedOptions": "Απόκρυψη επιλογών για προχωρημένους", - "HowToGetHelp": "Υπάρχουν διαφορετικοί τρόποι για να λάβετε βοήθεια. Υπάρχει η δωρεάν υποστήριξη από την κοινότητα του Matomo και υποστήριξη επί πληρωμή από την ομάδα και συνεργάτες του Matomo. Ή μήπως έχετε να αναφέρετε ένα σφάλμα ή να προτείνετε ένα νέο χαρακτηριστικό;", - "HttpTrackingApi": "HTTP API Παρακολούθησης", - "HttpTrackingApiDescription": "Το %1$sHTTP API Παρακολούθησης%2$s σας επιτρέπει να παρακολουθείτε τα πάντα. Αυτό είναι χρήσιμο στην περίπτωση που χρησιμοποιείτε μια γλώσσα προγραμματισμού για την οποία δεν υπάρχει ακόμη SDK. Μπορεί ακόμη να είναι χρήσιμο αν θέλετε να παρακολουθείτε συσκευές ή εφαρμογές με ειδικό τρόπο.", - "ImageTracking": "Παρακολούθηση Εικόνων", - "ImageTrackingIntro1": "Όταν ένας επισκέπτης έχει απενεργοποιήσει την JavaScript ή όταν η JavaScript δεν μπορεί να χρησιμοποιηθεί, μπορείτε να χρησιμοποιήσετε ένα σύνδεσμο εντοπισμού εικόνων για να παρακολουθείτε τους επισκέπτες.", - "ImageTrackingIntro2": "Δημιουργήστε τον παρακάτω σύνδεσμο και επικολλήστε την παραγόμενη HTML στη σελίδα. Εάν το χρησιμοποιείτε ως μια εναλλακτική για την παρακολούθηση με JavaScript, μπορείτε να το περιβάλλετε σε ετικέτες %1$s.", - "ImageTrackingIntro3": "Για το σύνολο της λίστας των επιλογών που μπορείτε να χρησιμοποιήσετε με σύνδεσμο εικόνας παρακολούθησης, δείτε την %1$sΤεκμηρίωση API Παρακολούθησης%2$s.", - "ImageTrackingLink": "Σύνδεσμος Εικόνων Παρακολούθησης", - "ImportFromGoogleAnalytics": "Εισαγωγή από το Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Αν έχετε μια ιδιοκτησία του Google Analytics και αλλάζετε στο Matomo, μπορείτε να εισαγάγετε τα υπάρχοντα δεδομένα σας με χρήση του πρόσθετου %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Μια εναλλακτική λύση για την παρακολούθηση επισκεπτών μέσω του προγράμματος περιήγησης (μέσω JavaScript ή σύνδεσμου εικόνας) είναι να εισάγετε συνεχώς τα αρχεία καταγραφής του διακομιστή. Μάθετε περισσότερα για τα %1$sΣτατιστικά Αρχείων Καταγραφής Διακομιστή%2$s.", - "InvalidPluginsAdminDisabled": "Για να ενημερώσετε ή να απεγκαταστήσετε αυτά τα πρόσθετα, επικοινωνήστε με τον διαχειριστή σας του Matomo, που μπορεί να χρησιμοποιήσει τη γραμμή εντολών ή να ενημερώσει την παραμετροποίηση απευθείας.", - "InvalidPluginsWarning": "Τα παρακάτω πρόσθετα δεν είναι συμβατά με το %1$s και δεν ήταν δυνατό να φορτωθούν: %2$s.", - "InvalidPluginsYouCanUninstall": "Μπορείτε να ενημερώσετε ή απεγκαταστήσετε τα πρόσθετα αυτά στη σελίδα %1$sΔιαχείριση πρόσθετων%2$s.", - "InvalidSiteUrlError": "Αυτή η διεύθυνση URL δεν είναι έγκυρη. Το περιεχόμενο ενδέχεται να έχει μετακινηθεί, διαγραφεί ή να μην είναι πλέον διαθέσιμο (το αναγνωριστικό ιστοτόπου έχει οριστεί σε '%s' στη διεύθυνση URL).", - "InvalidSiteUrlErrorHelp": "Παρακαλώ μεταβείτε πίσω στην προηγούμενη σελίδα ή επιστρέψτε στον κεντρικό πίνακα για να επιλέξετε ιστοτόπο.", - "JSTrackingDocumentationHelp": "Για εύκολη πρόσβαση, εμφανίζονται παρακάτω οι πιο δημοφιλείς επιλογές. Για ακόμη περισσότερες επιλογές (συμπεριλαμβανομένου της παρακολούθησης στόχων, προσαρμοσμένων μεταβλητών, παραγγελιών ηλεκτρονικού εμπορίου και καλάθια που άφησε ο χρήστης) δείτε την %1$sΤεκμηρίωση Ιχνηλάτησης Javascript του Matomo%2$s.", - "JSTrackingIntro1": "Μπορείτε να ιχνηλατείτε τους επισκέπτες στον ιστοτόπο σας με πολλούς διαφορετικούς τρόπους. Ο προτεινόμενος τρόπος είναι μέσω JavaScript. Για να χρησιμοποιήσετε αυτόν τον τρόπο βεβαιωθείτε ότι κάθε σελίδα του ιστοτόπου σας περιέχει κάποιο κώδικα JavaScript, που μπορείτε να παράξετε εδώ.", - "JSTrackingIntro2": "Μόλις έχετε το JavaScript κώδικα παρακολούθησης για την ιστοσελίδα σας, αντιγράψετε και επικολλήστε τον σε όλες τις σελίδες που θέλετε να παρακολουθήσετε με το Matomo.", - "JSTrackingIntro3a": "Στους περισσότερους ιστοτόπους, ιστολόγια, CMS, κτλ. μπορείτε να χρησιμοποιήσετε ένα πρόσθετο που θα κάνει την τεχνική δουλειά για εσάς. (Δείτε τη %1$sλίστα των πρόσθετων που είναι για χρήση με το Matomo%2$s.)", - "JSTrackingIntro3b": "Αν δεν υπάρχει πρόσθετο μπορείτε να επεξεργαστείτε τα πρότυπα του ιστοτόπου σας και να προσθέσετε τον κώδικα ιχνηλάτησης στη σήμανση </head> που συχνά υπάρχει σε κάποιο αρχείο 'header.php', 'header.tpl' ή παρόμοιο αρχείο προτύπου σελίδας.", - "JSTrackingIntro4": "Αν δεν θέλετε να χρησιμοποιήσετε JavaScript για να παρακολουθείτε τους επισκέπτες, %1$sΔημιουργήστε ένα σύνδεσμο παρακολούθησης εικόνας παρακάτω%2$s.", - "JSTrackingIntro5": "Αν θέλετε να κάνετε περισσότερα από να παρακολουθείτε προβολές σελίδων, παρακαλώ ελέγξτε το %1$sΤεκμηρίωση Matomo για Παρακολούθηση με Javascript%2$s για να δείτε τη λίστα με τις διαθέσιμες λειτουργίες. Χρησιμοποιώντας αυτές τις λειτουργίες, μπορείτε να παρακολουθείτε τους στόχους, προσαρμοσμένες μεταβλητές, παραγγελίες ηλεκτρονικού εμπορίου, εγκαταλελειμμένα καλάθια αγορών και πολλά άλλα.", - "JSTracking_CampaignKwdParam": "Παράμετρος Κλειδιού Καμπάνιας", - "JSTracking_CampaignNameParam": "Παράμετρος Όνομα Καμπάνιας", - "JSTracking_CodeNoteBeforeClosingHead": "Πατήστε στο πλήκτρο για να αντιγραφεί το κομμάτι κώδικα και να το επικολλήσετε αμέσως πριν τη σήμανση κλεισίματος %1$s (προτείνεται)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Βεβαιωθείτε ότι ο κώδικας είναι ενσωματωμένος σε ένα στοιχείο τύπου script σε κάθε σελίδα στον ιστοτόπο σας. Προτείνουμε να επικολληθεί αμέσως μετά το κλείσιμο της σήμανσης head.", - "JSTracking_ConsentManagerConnected": "Το %1$s φαίνεται να έχει ήδη παραμετροποιηθεί για να λειτουργεί με το Matomo.", - "JSTracking_ConsentManagerDetected": "Ο διαχειριστής συναίνεσης %1$s εντοπίστηκε στον ιστοτόπο σας. Για να μάθετε πως να παραμετροποιείτε το Matomo να λειτουργεί με το %1$s επισκεφθείτε το %2$s", - "JSTracking_ConsentManagerEmailNote": "Ή μπορείτε αντίθετα να ενσωματώσετε τον κώδικα ιχνηλάτησης στον ιστοτόπο σας:", - "JSTracking_CrossDomain": "Εξ ορισμού, το αναγνωριστικό επισκέπτη, που ταυτοποιεί μοναδικά έναν επισκέπτη, αποθηκεύεται στα cookies του προγράμματος πλοήγησης τα οποία είναι προσπελάσιμα από σελίδες από τον ίδιο τομέα ονόματος. Η ενεργοποίηση της σύνδεσης από διάφορους τομείς ονομάτων σάς επιτρέπει την παρακολούθηση των ενεργειών και αναγνώσεων σελίδων ενός συγκεκριμένου επισκέπτη, στην ίδια επίσκεψη, όταν επισκέπεται σελίδες από διάφορους τομείς ονομάτων. Όταν ένας χρήστης κάνει κλικ σε σύνδεσμο σε κάποιο alias του ιστοτόπου σας, θα συμπεριληφθεί μια παράμετρος στη διεύθυνση URL με όνομα pk_vid με το αναγνωριστικό του επισκέπτη.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Σημείωση: Για να χρησιμοποιηθούν συνδέσεις εκτός ονόματος χώρου, θα πρέπει να καθορίσετε περισσότερα από ένα ονόματα χώρου (URL) για τον ιστοτόπο σας.", - "JSTracking_CustomCampaignQueryParam": "Χρήση προσαρμοσμένων ονομάτων παραμέτρων αναζητήσεων για το όνομα της καμπάνιας και τις λέξεις-κλειδιά", - "JSTracking_CustomCampaignQueryParamDesc": "Σημείωση: %1$sΤο Matomo θα ανιχνεύσει αυτόματα τις παραμέτρους του Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Απενεργοποίηση Ιχνηλάτησης Παραμέτρων Καμπάνιας", - "JSTracking_DisableCampaignParametersDesc": "Όταν η επιλογή αυτή είναι ενεργή, το Matomo δε θα ιχνηλατεί τις παραμέτρους καμπάνιας και θα αφαιρεθούν από τις ιχνηλατούμενες διευθύνσεις URL.", - "JSTracking_DisableCookies": "Απενεργοποίηση όλων των cookies παρακολούθησης", - "JSTracking_DisableCookiesDesc": "Απενεργοποιεί όλα τα cookies. Τα υπάρχοντα cookies του Matomo για αυτό τον ιστοτόπο θα διαγραφούν στην επόμενη προβολή σελίδας.", - "JSTracking_EnableCrossDomainLinking": "Ενεργοποίηση σύνδεσης προς διάφορους τομείς ονομάτων", - "JSTracking_EnableDoNotTrack": "Ενεργοποίηση ανίχνευσης DoNotTrack στην πλευρά του πελάτη", - "JSTracking_EnableDoNotTrackDesc": "Για να μη στέλνονται αιτήματα παρακολούθησης εάν οι επισκέπτες δεν επιθυμούν να παρακολουθούνται.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Σημείωση: Έχει ενεργοποιηθεί η υποστήριξη DoNotTrack στην πλευρά του διακομιστή, οπότε αυτή η επιλογή δεν θα έχει αποτέλεσμα.", - "JSTracking_EndNote": "Σημείωση: Μπορείτε να δημιουργήσετε προσαρμοσμένο κώδικα παρακολούθησης στο τμήμα διαχείρισης του %1$sΚώδικα Παρακολούθησης%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Να μπαίνει πρώτα το domain name στον τίτλο της σελίδας, όταν γίνεται παρακολούθηση", - "JSTracking_GroupPageTitlesByDomainDesc1": "Έτσι, αν κάποιος επισκέπτεται πχ τη σελίδα 'Προφίλ' στο blog σας .%1$s θα καταγράφεται ως 'blog / Προφίλ'. Αυτός είναι ο ευκολότερος τρόπος για να πάρετε μια γενική εικόνα της επισκεψιμότητάς σας ανά υπο-domain.", - "JSTracking_MergeAliases": "Στην αναφορά \"Σύνδεσμοι\", να γίνεται απόκρυψη των κλικ στις γνωστές ψευδώνυμες διευθύνσεις URL του", - "JSTracking_MergeAliasesDesc": "Έτσι τα κλικ σε συνδέσμους προς ψευδώνυμες διευθύνσεις URLs (πχ %s) δεν θα υπολογίζονται ως \"Εξωτερικά\".", - "JSTracking_MergeSubdomains": "Παρακολούθηση επισκεπτών σε όλα τα υπο-domains του", - "JSTracking_MergeSubdomainsDesc": "Έτσι, αν κάποιος χρήστης επισκευθεί το %1$s και το %2$s, θα υπολογίζεται ως μοναδικός επισκέπτης.", - "JSTracking_PageCustomVars": "Παρακολούθηση μιας προσαρμοσμένης μεταβλητής για κάθε προβολή σελίδας", - "JSTracking_PageCustomVarsDesc": "Για παράδειγμα, με το όνομα της μεταβλητής \"Κατηγορία\" και τιμή \"Μελέτες\".", - "JSTracking_TrackNoScript": "Παρακολούθηση χρηστών με απενεργοποιημένη τη JavaScript", - "JSTracking_VisitorCustomVars": "Παρακολούθηση προσαρμοσμένων μεταβλητών για αυτόν τον επισκέπτη", - "JSTracking_VisitorCustomVarsDesc": "Για παράδειγμα, με όνομα της μεταβλητής \"Τύπος\" και τιμή \"Πελάτης\".", - "JavaScriptCode": "Κώδικας JavaScript", - "JavaScriptTracking": "Παρακολούθηση με JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Προαιρετικά: χρησιμοποιήστε τις επιλογές για προχωρημένους για να διαμορφώσετε τον κώδικα ιχνηλάτησης.", - "JsTrackingCodeMissingEmail1": "Λίγες μέρες πριν, προσθέσατε τον ιστοτόπο '%s' στο Matomo Analytics. Μόλις έγινε έλεγχος και το Matomo δεν φαίνεται να έχει καταγράψει κίνηση για τον ιστοτόπο αυτόν.", - "JsTrackingCodeMissingEmail2": "Για να ξεκινήσετε την ιχνηλάτηση δεδομένων και τις τάσεις των χρηστών σας, πρέπει να ορίσετε την ιχνηλάτηση στον ιστοτόπο και στην φορητή εφαρμογή σας. Για τους ιστοτόπους απλά ενσωματώστε τον κώδικα ιχνηλάτησης ακριβώς πριν την σήμανση %s.", - "JsTrackingCodeMissingEmail3": "Για να βρείτε και παραμετροποιήσετε τον κώδικα παρακολούθησης, %1$sκάντε κλικ εδώ%2$s (ή δείτε τον %3$sΟδηγό Παρακολούθησης Πελάτη JavaScript%4$s).", - "LearnMore": "Μάθετε περισσότερα", - "Login": "Είσοδος", - "LogoNotWriteableInstruction": "Για να χρησιμοποιήσετε το δικό σας λογότυπο αντί του προκαθορισμένου του Matomo πρέπει να δώσετε δικαίωμα εγγραφής σε αυτό τον κατάλογο: %1$s Το Matomo χρειάζεται πρόσβαση για εγγραφή στα λογότυπά σας που είναι αποθηκευμένα στα αρχεία %2$s.", - "LogoUpload": "Επιλέξτε ένα Λογότυπο για αποστολή", - "LogoUploadFailed": "Δεν ήταν δυνατή η επεξεργασία του αρχείου που ανεβάσατε. Παρακαλώ ελέγξτε αν είναι σε σωστή μορφή.", - "LogoUploadHelp": "Παρακαλώ ανεβάστε ένα αρχείο σε %1$s μορφή με ελάχιστο ύψος %2$s pixel.", - "LtsReleases": "Οι Εκδόσεις με Μακρά Υποστήριξη (Long Term Support) λαμβάνουν μόνο ενημερώσεις ασφαλείας και σφαλμάτων.", - "MenuDevelopment": "Ανάπτυξη", - "MenuDiagnostic": "Διαγνωστικά", - "MenuGeneralSettings": "Γενικές ρυθμίσεις", - "MenuMeasurables": "Μετρήσιμα", - "MenuSystem": "Σύστημα", - "MissingTrackingCodeEmailSubject": "Δεν έχει καταγραφή κίνηση στο Matomo Analytics για το %s, ξεκινήστε τώρα", - "NTrackingFailures": "%s αποτυχίες παρακολούθησης", - "NeedHelp": "Χρειάζεστε βοήθεια;", - "NoKnownFailures": "Δεν υπάρχουν γνωστές αποτυχίες παρακολούθησης.", - "OptOutComplete": "Η απενεργοποίηση ολοκληρώθηκε. Οι επισκέψεις σας σε αυτόν τον ιστότοπο δεν θα καταγράφονται από το εργαλείο Στατιστικών Ιστού.", - "OptOutCompleteBis": "Σημειώστε ότι αν εκκαθαρίσετε τα cookies σας ή διαγράψετε το cookie απενεργοποιήσης ή αλλάξετε υπολογιστές ή φυλλομετρητές Ιστού, θα χρειαστεί να επαναλάβετε ξανά την διαδικασία απενεργοποιήσης.", - "OptOutCustomOptOutLink": "Μπορείτε επίσης να δημιουργήσετε μια καθολική προσαρμοσμένη opt-out φόρμα με χρήση HTML και JavaScript, όπως περιγράφεται στον %1$sοδηγό%2$s για προγραμματιστές.", - "OptOutDntFound": "Η επίσκεψή σας δεν καταγράφεται, καθώς το πρόγραμμα πλοήγησής σας ενημερώνει ότι δεν το επιθυμείτε. Αυτό αποτελεί ρύθμιση στο πρόγραμμα πλοήγησης, έτσι η επίσκεψή σας δεν μπορεί να καταγραφεί αν δεν απενεργοποιήσετε τη λειτουργία «Αποτροπή Καταγραφής» / \"DoNotTrack\".", - "OptOutErrorNoCookies": "Το opt-out χαρακτηριστικό ιχνηλάτησης απαιτεί τα cookies να είναι ενεργοποιημένα.", - "OptOutErrorNoTracker": "Το χαρακτηριστικό opt-out ιχνηλάτησης δεν ήταν δυνατό να βρει τον κώδικα ιχνηλάτησης του Matomo σε αυτή τη σελίδα", - "OptOutErrorNotHttps": "Το opt-out χαρακτηριστικό ιχνηλάτησης ενδέχεται να μη λειτουργεί επειδή ο ιστοτόπος δεν έχει φορτωθεί πάνω από HTTPS. Παρακαλώ επαναφορτώστε τη σελίδα και ελέγξτε αν έχει αλλάξει η κατάσταση του opt-out.", - "OptOutErrorWindowOpen": "Το opt-out χαρακτηριστικό ιχνηλάτησης ενδέχεται να μη λειτουργεί επειδή το αναδυόμενο παράθυρο για το opt-out έχει μπλοκαριστεί. Παρακαλώ επαναφορτώστε τη σελίδα και ελέγξτε αν έχει αλλάξει η κατάσταση του opt-out.", - "OptOutExplanation": "Το Matomo είναι αφοσιωμένο στην παροχή ιδιωτικότητας στο διαδίκτυο. Για να παρέχει στους επισκέπτες σας την επιλογή για μη συμπερίληψη της παρακολούθησής τους από τα Αναλυτικά Ιστού Matomo, μπορείτε να προσθέσετε τον παρακάτω κώδικα HTML σε μία από τις ιστοσελίδες σας, για παράδειγμα στην ιστοσελίδα Πολιτικής Εχεμύθειας.", - "OptOutExplanationIntro": "Ο κώδικας αυτός θα εμφανίσει ένα div που θα περιέχει ένα σύνδεσμο ώστε οι επισκέπτες να μπορούν να επιλέξουν να μην ιχνηλατούνται από το Matomo θέτοντας ένα cookie στα προγράμματα πλοήγησής τους. Δείτε παρακάτω (ή %1$sκάντε κλικ εδώ%2$s) για να δείτε το περιεχόμενο που θα εμφανίζεται το div.", - "OptOutForYourVisitors": "Απενεργοποίηση του Matomo εκ μέρους των επισκεπτών σας", - "OptingYouOut": "Απενεργοποίηση της ιχνηλάτησης, παρακαλώ περιμένετε…", - "PersonalPluginSettings": "Προσωπικές Ρυθμίσεις Πρόσθετου", - "PiwikIsInstalledAt": "Το Matomo εγκαταστάθηκε στο", - "PluginSettingChangeNotAllowed": "Δεν επιτρέπεται να αλλάξετε την τιμή της ρύθμισης \"%1$s\" στο πρόσθετο \"%2$s\"", - "PluginSettingReadNotAllowed": "Δεν επιτρέπεται να δείτε την τιμή της ρύθμισης \"%1$s\" στο πρόσθετο \"%2$s\"", - "PluginSettings": "Ρυθμίσεις πρόσθετου", - "PluginSettingsIntro": "Εδώ μπορείτε να αλλάξετε τις ρυθμίσεις των παρακάτω πρόσθετων από τρίτους:", - "PluginSettingsSaveFailed": "Αποτυχία κατά την αποθήκευση των ρυθμίσεων των πρόσθετων", - "PluginSettingsSaveSuccess": "Οι ρυθμίσεις του πρόσθετου ενημερώθηκαν.", - "PluginSettingsValueNotAllowed": "Η τιμή για το πεδίο \"%1$s\" στο πρόσθετο \"%2$s\" δεν είναι επιτρεπτή", - "Problem": "Πρόβλημα", - "ProtocolNotDetectedCorrectly": "Αυτή τη στιγμή χρησιμοποιείτε το Matomo μέσω ασφαλούς σύνδεσης (με χρήση HTTPS), αλλά το Matomo εντοπίζει μόνο μη ασφαλή σύνδεση σε αυτόν τον διακομιστή.", - "ProtocolNotDetectedCorrectlySolution": "Για να βεβαιωθείτε ότι το Matomo ζητά και στέλνει το περιεχόμενό σας με ασφαλή τρόπο μέσω HTTPS, επεξεργαστείτε το αρχείο %1$s και είτε αλλάξτε τις ρυθμίσεις διαμεσολαβητή, είτε προσθέστε την γραμμή %2$s κάτω από το τμήμα %3$s. %4$sΔείτε περισσότερα%5$s", - "ReactDescription": "Αν ο ιστοτόπος σας υποστηρίζει React, δείτε %1$sαυτόν τον οδηγό%2$s.", - "ReleaseChannel": "Κανάλι εκδόσεων", - "SecurityNotificationAllTokenAuthDeletedBody": "Κάποιος διέγραψε όλα τα τεκμήρια αυθεντικοποίησης στο λογαριασμό σας.", - "SecurityNotificationAnonymousAccessEnabledBody": "Κάποιος ενεργοποίησε την πρόσβαση ανώνυμων χρηστών για %1$s. Αυτό σημαίνει ότι τα δεδομένα αυτού του ιστοτόπου είναι τώρα δημόσια διαθέσιμα. Αν αυτό είναι εντάξει, μπορείτε να αγνοήσετε το παρόν email.", - "SecurityNotificationCheckTwoFactor": "Παρακαλώ ελέγξτε την εφαρμογή ή συσκευή σας αυθεντικοποίησης δύο παραγόντων.", - "SecurityNotificationEmailSubject": "Ειδοποίηση Ασφάλειας", - "SecurityNotificationIfItWasYou": "Αν αυτός ήσασταν εσείς, συνεχίστε. Αν δεν αναγνωρίζετε αυτή τη δραστηριότητα, παρακαλώ αλλάξτε το συνθηματικό σας.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Κάποιος δημιούργησε νέους κωδικούς ανάκτησης για την αυθεντικοποίηση δύο παραγόντων για το λογαριασμό σας.", - "SecurityNotificationRecoveryCodesShowedBody": "Κάποιος είδε τους κωδικούς ανάκτησης αυθεντικοποίησης δύο παραγόντων του λογαριασμού σας.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Κάποιος άλλος υπερ-χρήστης (%1$s) τροποποίησε τις ρυθμίσεις συστήματος. Οι ρυθμίσεις που επηρεάστηκαν: %2$s. Αν γνωρίζετε αυτή τη δραστηριότητα, συνεχίστε. Αν δεν την γνωρίζετε, παρακαλώ επικοινωνήστε με τους άλλους υπερ-χρήστες.", - "SecurityNotificationSettingsChangedByUserBody": "Κάποιος τροποποίησε τις ρυθμίσεις συστήματος. Οι ρυθμίσεις που επηρεάστηκαν: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Κάποιος δημιούργησε ένα τεκμήριο αυθεντικοποίησης (περιγραφή: %s) στο λογαριασμό σας. Αν δεν ήσασταν εσείς, διαγράψτε το τεκμήριο.", - "SecurityNotificationTokenAuthDeletedBody": "Κάποιος διέγραψε ένα τεκμήριο αυθεντικοποίησης (περιγραφή: %s) στο λογαριασμό σας.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Κάποιος απενεργοποίησε την αυθεντικοποίηση δύο παραγόντων στο λογαριασμό σας.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Κάποιος ενεργοποίησε την αυθεντικοποίηση δύο παραγόντων στο λογαριασμό σας.", - "SecurityNotificationUserAcceptInviteBody": "Ο χρήστης (όνομα εισόδου: %s) αποδέχτηκε την πρόσκληση.", - "SecurityNotificationUserCreatedBody": "Κάποιος δημιούργησε ένα νέο χρήστη (όνομα εισόδου: %s) στο λογαριασμό σας.", - "SecurityNotificationUserDeclinedInviteBody": "Ο χρήστης (όνομα εισόδου: %s) απόρριψε την πρόσκληση.", - "SecurityNotificationUserDeletedBody": "Κάποιος διέγραψε ένα χρήστη (όνομα εισόδου: %s) στο λογαριασμό σας.", - "SendPluginUpdateCommunication": "Αποστολή e-mail όταν υπάρχει διαθέσιμη ενημέρωση για ένα πρόσθετο", - "SendPluginUpdateCommunicationHelp": "Ένα e-mail θα στέλνεται στους Υπερ-Χρήστες όταν θα υπάρχει διαθέσιμη νέα έκδοση για ένα πρόσθετο.", - "SettingsSaveSuccess": "Οι ρυθμίσεις ενημερώθηκαν.", - "ShowAdvancedOptions": "Εμφάνιση επιλογών για προχωρημένους", - "SinglePageApplicationDescription": "Αν ιχνηλατείτε μια εφαρμογή μοναδικής σελίδας (ΕΜΣ) ή προοδευτική εφαρμογή ιστού (ΠΕΙ), δείτε αυτό τον %1$sοδηγό%2$s.", - "Solution": "Λύση", - "StableReleases": "Αν το Matomo αποτελεί ένα κρίσιμο κομμάτι της επιχείρησής σας, συνιστούμε να χρησιμοποιείτε την τελευταία σταθερή έκδοση. Αν χρησιμοποιείτε την τελευταία δοκιμαστική έκδοση και βρείτε ένα σφάλμα ή έχετε να κάνετε μια πρόταση, παρακαλώ %1$sδείτε εδώ%2$s.", - "SystemPluginSettings": "Ρυθμίσεις Συστήματος Πρόσθετου", - "TrackAGoal": "Παρακολούθηση ενός στόχου", - "TrackingCode": "Κώδικας παρακολούθησης", - "TrackingCodeIntro": "Το Matomo σας παρέχει διάφορους τρόπους για την ενσωμάτωση του κώδικα παρακολούθησης στον ιστοτόπο σας, εφαρμογή κινητού και σε οποιαδήποτε συσκευή ή εφαρμογή.", - "TrackingFailureAuthenticationProblem": "Η αίτηση δεν αυθεντικοποιήθηκε αλλά η αυθεντικοποίηση απαιτείται.", - "TrackingFailureAuthenticationSolution": "Ορισμός ή διόρθωσης του \"token_auth\" στην αίτησή σας παρακολούθησης.", - "TrackingFailureInvalidSiteProblem": "Ο ιστοτόπος δεν υπάρχει.", - "TrackingFailureInvalidSiteSolution": "Ενημέρωση του παραμετροποιημένου idSite στην παρακολούθηση.", - "TrackingFailures": "Αποτυχίες παρακολούθησης", - "TrackingFailuresEmail1": "Αυτό μόνο και μόνο για να γνωρίζετε ότι %s διαφορετικά είδη αποτυχιών παρακολούθησης έχουν συμβεί τις τελευταίες ημέρες.", - "TrackingFailuresEmail2": "Για να δείτε όλες τις αποτυχημένες αιτήσεις παρακολούθησης %1$sκάντε κλικ εδώ%2$s.", - "TrackingFailuresEmailSubject": "Αποτυχίες παρακολούθησης στο Matomo Analytics", - "TrackingFailuresIntroduction": "Η σελίδα εμφανίζει τις αποτυχίες παρακολούθησης που έχουν συμβεί κατά τη διάρκεια των τελευταίων %s ημερών. Πρέπει να σημειωθεί ότι καταγράφονται τα πιο γνωστά είδη αποτυχιών παρακολούθησης και όχι όλα.", - "TrackingURL": "Διεύθυνση URL παρακολούθησης", - "TrustedHostConfirm": "Είστε βέβαιοι ότι θέλετε να αλλάξετε το αξιόπιστο όνομα του διακομιστή του Matomo;", - "TrustedHostSettings": "Αξιόπιστο Όνομα Διακομιστή Matomo", - "TwoFactorAuth": "Αυθεντικοποίηση δύο παραγόντων", - "UiDemo": "Διεπαφή Επίδειξης", - "UncheckToOptOut": "Αποεπιλέξτε το πλαίσιο επιλογής για opt-out.", - "UpdateSettings": "Ρυθμίσεις ενημέρωσης", - "UseCustomLogo": "Χρησιμοποιήστε προσαρμοσμένο λογότυπο", - "UserInviteContent": "Μπορείτε να αποδεχτείτε την πρόσκληση κάνοντας κλικ παρακάτω στο κουμπί αποδοχής.", - "UserInviteNotes": "Αν δεν περιμένατε την πρόσκληση, μπορείτε να αγνοήσετε αυτό το μήνυμα. Αν ο %1$s σας στέλνει πολλά μηνύματα, μπορείτε να τον μπλοκάρετε ή να αναφέρετε κατάχρηση. Η πρόσκληση λήγει αυτόματα σε %2$s ημέρες.", - "UserInviteSubject": "Ο/Η %1$s σας έστειλε μια πρόσκληση για να συμμετέχετε στο Matomo Analytics για το %2$s.", - "ValidPiwikHostname": "Έγκυρο Όνομα Διακομιστή Matomo", - "ViewAllTrackingFailures": "Εμφάνιση όλων των αποτυχιών παρακολούθησης", - "VueDescription": "Αν ο ιστοτόπος σας χρησιμοποιεί Vue.js, δείτε %1$sαυτό τον οδηγό%2$s.", - "WhatIsNew": "Τι είναι καινούριο", - "WhatIsNewDoNotShowAgain": "Να μην εμφανιστεί ξανά", - "WhatIsNewNoChanges": "Δεν υπάρχει κάτι καινούριο αυτή τη στιγμή", - "WhatIsNewNoChangesTitle": "Δεν υπάρχουν πρόσφατες αλλαγές", - "WhatIsNewRemindMeLater": "Να υπενθυμηθώ αργότερα", - "WhatIsNewTitle": "Εδώ φαίνεται τι υπάρχει καινούριο στο Matomo", - "WhatIsNewTooltip": "Μάθετε τι υπάρχει καινούριο στο Matomo", - "WithOptionalRevenue": "με προαιρετικά έσοδα", - "WordpressDescription": "Αν ο ιστοτόπος σας χρησιμοποιεί Wordpress, δείτε %1$sαυτόν τον οδηγό%2$s.", - "YouAreNotOptedOut": "Δεν έχετε επιλέξει να μην καταγράφεστε.", - "YouAreOptedOut": "Η επίσκεψή σας δεν καταγράφεται.", - "YouMayOptOut": "Μπορείτε να επιλέξετε να μην έχετε cookie με μοναδικό αριθμό ταυτοποίησης στατιστικών ιστού στον υπολογιστή σας για να αποφύγετε την ενσωμάτωση και ανάλυση των συλλεχθέντων δεδομένων σε αυτόν τον ιστότοπο.", - "YouMayOptOut2": "Μπορείτε να επιλέξετε να αποτρέπετε τον ιστοτόπο από το να συγκεντρώνει και να αναλύει τις ενέργειές σας εδώ.", - "YouMayOptOut3": "Κάνοντάς το αυτό θα προστατεύσετε την ιδιωτικότητά σας, αλλά θα αποτρέψετε τον ιδιοκτήτη από το να μαθαίνει από τις ενέργειές σας και να δημιουργεί μια καλύτερη εμπειρία για εσάς και τους άλλους χρήστες.", - "YouMayOptOutBis": "Για να κάνετε αυτή την επιλογή, πατήστε παρακάτω για να λάβετε ένα cookie απενεργοποιήσης." - } -} diff --git a/plugins/CoreAdminHome/lang/en.json b/plugins/CoreAdminHome/lang/en.json deleted file mode 100644 index 478cd956ed45500d2ddf809004462ded3c93e22c..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/en.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Add a new trusted host", - "Administration": "Administration", - "ArchivingSettings": "Archiving settings", - "BrandingSettings": "Branding settings", - "BruteForce": "Brute Force", - "Login": "Login", - "CheckToOptIn": "Check this box to opt-in.", - "ClickHereToOptIn": "Click here to opt in.", - "ClickHereToOptOut": "Click here to opt out.", - "ConfirmDeleteAllTrackingFailures": "Are you sure you want to delete all tracking failures?", - "ConfirmDeleteThisTrackingFailure": "Are you sure you want to delete this tracking failure?", - "Cors": "Cors", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) domains", - "CorsDomainsHelp": "You can define domains or subdomains like http://example.com or http://stats.example.com. Or to allow cross domain requests for all domains simply add a *", - "CustomLogoFeedbackInfo": "If you customize the Matomo logo, you might also be interested to hide the %1$s link in the top menu. To do so, you can disable the Feedback plugin in the %2$sManage Plugins%3$s page.", - "CustomLogoHelpText": "You can customize the Matomo logo which will be displayed in the user interface and email reports.", - "DeleteAllFailures": "Delete all failures", - "DevelopmentProcess": "While our development process includes thousands of automated tests, Beta Testers play a key role in achieving the \"No bug policy\" in Matomo.", - "EmailServerSettings": "Email server settings", - "ErrorEmailFromAddressNotValid": "The SMTP from address is not valid", - "FaviconUpload": "Select a Favicon to upload", - "FileUploadDisabled": "Uploading files is not enabled in your PHP configuration. To upload your custom logo please set %s in php.ini and restart your webserver.", - "ForBetaTestersOnly": "For beta testers only", - "HttpTrackingApi": "HTTP Tracking API", - "HttpTrackingApiDescription": "The %1$sHTTP Tracking API%2$s allows you to track anything. This may be useful if you are using a programming language for which no SDK exists yet. It may also be useful when you want to track devices or applications in a special way.", - "SinglePageApplicationDescription": "If you are tracking a single-page application (SPA) or progressive web application (PWA), please see %1$sthis guide%2$s.", - "CloudflareDescription": "If your website is hosted on Cloudflare, please see %1$sthis guide%2$s.", - "ImageTracking": "Image Tracking", - "ImageTrackingIntro1": "When a visitor has disabled JavaScript, or when JavaScript cannot be used, you can use an image tracking link to track visitors.", - "ImageTrackingIntro2": "Generate the link below and copy-paste the generated HTML in the page. If you're using this as a fallback for JavaScript tracking, you can surround it in %1$s tags.", - "ImageTrackingIntro3": "For the whole list of options you can use with an image tracking link, see the %1$sTracking API Documentation%2$s.", - "ImageTrackingLink": "Image Tracking Link", - "ImportFromGoogleAnalytics": "Import from Google Analytics", - "ImportFromGoogleAnalyticsDescription": "If you have a Google Analytics property and are switching to Matomo, you can import your existing data using the %1$sGoogleAnalyticsImporter%2$s plugin.", - "ImportingServerLogsDesc": "An alternative to tracking visitors through the browser (either via JavaScript or an image link) is to continuously import server logs. Learn more about %1$sServer Log File Analytics%2$s.", - "InvalidSiteUrlError": "This URL is not valid. The content may have been moved, deleted, or is no longer available (website id was set to '%s' on the URL).", - "InvalidSiteUrlErrorHelp": "Please go back to your previous page or return to your dashboard to select a website.", - "InvalidPluginsWarning": "The following plugins are not compatible with %1$s and could not be loaded: %2$s.", - "InvalidPluginsYouCanUninstall": "You can update or uninstall these plugins on the %1$sManage Plugins%2$s page.", - "InvalidPluginsAdminDisabled": "To update or uninstall these plugins, please contact your Matomo administrator, who can use the command line or update the configuration directly.", - "JSTrackingIntro1": "You can track visitors to your website in many different ways. The recommended way to do it is through JavaScript. To use this method you must make sure every webpage of your website has some JavaScript code, which you can generate here.", - "JSTrackingIntro2": "Once you have the JavaScript tracking code for your website, copy and paste it to all the pages you want to track with Matomo.", - "JSTrackingIntro3a": "In most websites, blogs, CMS, etc. you can use a pre-made plugin to do the technical work for you. (See our %1$slist of plugins used to integrate Matomo%2$s.)", - "JSTrackingIntro3b": "If no plugin exists you can edit your website templates and add the JavaScript tracking code to the </head> tag which is often defined in a 'header.php', 'header.tpl' or similar template file.", - "JSTrackingIntro4": "If you don't want to use JavaScript to track visitors, %1$sgenerate an image tracking link below%2$s.", - "JSTrackingIntro5": "If you want to do more than track page views, please check out the %1$sMatomo Javascript Tracking documentation%2$s for the list of available functions. Using these functions you can track goals, custom variables, ecommerce orders, abandoned carts and more.", - "JSTracking_CampaignKwdParam": "Campaign Keyword parameter", - "JSTracking_CampaignNameParam": "Campaign Name parameter", - "JSTracking_CodeNoteBeforeClosingHead": "Click on the button to copy the code snippet and paste it immediately before the closing %1$s tag (recommended)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Make sure this code is embedded within a script element on every page of your website. We recommend pasting it immediately before the closing head tag.", - "JSTracking_ConsentManagerDetected": "%1$s consent manager was detected on your site. To learn about configuring Matomo to work with %1$s please visit %2$s", - "JSTracking_ConsentManagerConnected": "%1$s appears to already be configured to work with Matomo.", - "JSTracking_ConsentManagerEmailNote" : "Or you could directly embed the tracking code in your website instead:", - "JSTracking_CrossDomain": "By default, the visitor ID that identifies a unique visitor is stored in the browser's first party cookies which can only be accessed by pages on the same domain. Enabling cross domain linking lets you track all the actions and pageviews of a specific visitor into the same visit even when they view pages on several domains. Whenever a user clicks on a link to one of your website's alias URLs, it will append a URL parameter pk_vid forwarding the Visitor ID.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Note: To use cross domain linking, you must specify more than one domain name (URLs) for your website.", - "JSTracking_CustomCampaignQueryParam": "Use custom query parameter names for the campaign name and keyword", - "JSTracking_CustomCampaignQueryParamDesc": "Note: %1$sMatomo will automatically detect Google Analytics parameters.%2$s", - "JSTracking_DisableCookies": "Disable all tracking cookies", - "JSTracking_DisableCookiesDesc": "Disables all first party cookies. Existing Matomo cookies for this website will be deleted on the next pageview.", - "JSTracking_EnableCrossDomainLinking": "Enable cross domain linking", - "JSTracking_EnableDoNotTrack": "Enable client side DoNotTrack detection", - "JSTracking_EnableDoNotTrackDesc": "So tracking requests will not be sent if visitors do not wish to be tracked.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Note: Server side DoNotTrack support has been enabled, so this option will have no effect.", - "JSTracking_EndNote": "Note: You can generate a customized tracking code in the %1$sTracking Code%2$s admin section.", - "JSTracking_GroupPageTitlesByDomain": "Prepend the site domain to the page title when tracking", - "JSTracking_GroupPageTitlesByDomainDesc1": "So if someone visits the 'About' page on blog.%1$s it will be recorded as 'blog / About'. This is the easiest way to get an overview of your traffic by sub-domain.", - "JSTracking_MergeAliases": "In the \"Outlinks\" report, hide clicks to known alias URLs of", - "JSTracking_MergeAliasesDesc": "So clicks on links to Alias URLs (eg. %s) will not be counted as \"Outlink\".", - "JSTracking_MergeSubdomains": "Track visitors across all subdomains of", - "JSTracking_MergeSubdomainsDesc": "So if one visitor visits %1$s and %2$s, they will be counted as a unique visitor.", - "JSTracking_PageCustomVars": "Track a custom variable for each page view", - "JSTracking_PageCustomVarsDesc": "For example, with variable name \"Category\" and value \"White Papers\".", - "JSTracking_DisableCampaignParameters": "Disable Campaign Parameters Tracking", - "JSTracking_DisableCampaignParametersDesc": "When this option is checked, Matomo will not track campaign parameters and they will be removed from the tracked URLs.", - "JSTracking_TrackNoScript": "Track users with JavaScript disabled", - "JSTracking_VisitorCustomVars": "Track custom variables for this visitor", - "JSTracking_VisitorCustomVarsDesc": "For example, with variable name \"Type\" and value \"Customer\".", - "JavaScriptTracking": "JavaScript Tracking", - "JsTrackingCodeMissingEmail1": "A few days ago you added the website '%s' to your Matomo Analytics. We just checked and your Matomo doesn't seem to have any recorded traffic for this website.", - "JsTrackingCodeMissingEmail2": "To begin tracking data and getting insights into your users, you'll need to set up tracking in your website or mobile app. For websites simply embed the tracking code right before the %s tag.", - "JsTrackingCodeMissingEmail3": "To find and customize your tracking code, %1$sclick here%2$s (or have a look at the %3$sJavaScript Tracking Client guide%4$s).", - "LearnMore": "Learn more", - "LogoNotWriteableInstruction": "To use your custom logo instead of the default Matomo logo, give write permission to this directory: %1$s Matomo needs write access for your logos stored in the files %2$s.", - "LogoUpload": "Select a Logo to upload", - "LogoUploadFailed": "The uploaded file couldn't be processed. Please check if the file has a valid format.", - "LogoUploadHelp": "Please upload a file in %1$s formats with a minimum height of %2$s pixels.", - "LtsReleases": "LTS (Long Term Support) versions receive only security and bug-fixes.", - "MenuDevelopment": "Development", - "MenuDiagnostic": "Diagnostic", - "MenuGeneralSettings": "General settings", - "MenuMeasurables": "Measurables", - "MenuSystem": "System", - "MissingTrackingCodeEmailSubject": "No traffic for %s recorded in Matomo Analytics, get started now", - "NTrackingFailures": "%s tracking failures", - "NoKnownFailures": "There are no known tracking failures.", - "OptOutComplete": "Opt-out complete; your visits to this website will not be recorded by the Web Analytics tool.", - "OptOutCompleteBis": "Note that if you clear your cookies, delete the opt-out cookie, or if you change computers or Web browsers, you will need to perform the opt-out procedure again.", - "OptOutDntFound": "You are not being tracked since your browser is reporting that you do not want to. This is a setting of your browser so you won't be able to opt-in until you disable the 'Do Not Track' feature.", - "OptOutErrorNoCookies": "The tracking opt-out feature requires cookies to be enabled.", - "OptOutErrorNotHttps": "The tracking opt-out feature may not work because this site was not loaded over HTTPS. Please reload the page to check if your opt out status changed.", - "OptOutErrorWindowOpen": "The tracking opt-out feature may not work because it looks like the opt out popup was blocked. Please reload the page to check if your opt out status changed.", - "OptOutErrorNoTracker": "The tracking opt-out feature was unable to find the Matomo Tracker code on this page", - "OptOutExplanation": "Matomo is dedicated to providing privacy on the Internet. To provide your visitors with the choice of opting-out of Matomo Web Analytics, you can add the following HTML code on one of your website page, for example in a Privacy Policy page.", - "OptOutExplanationIntro": "This code will display a div containing a link for your visitors to opt-out of Matomo by setting an opt-out cookie in their web browsers. See below (or %1$sclick here%2$s) to view the content that will be displayed by the div.", - "OptOutCustomOptOutLink": "You can also create a completely custom opt-out form using HTML and JavaScript, as explained in this developer %1$sguide%2$s.", - "OptOutForYourVisitors": "Matomo opt-out for your visitors", - "OptingYouOut": "Opting you out, please wait…", - "PersonalPluginSettings": "Personal Plugin Settings", - "PiwikIsInstalledAt": "Matomo is installed at", - "PluginSettingChangeNotAllowed": "You are not allowed to change the value of the setting \"%1$s\" in plugin \"%2$s\"", - "PluginSettingReadNotAllowed": "You are not allowed to read the value of the setting \"%1$s\" in plugin \"%2$s\"", - "PluginSettings": "Plugin Settings", - "PluginSettingsIntro": "Here you can change the settings for the following third-party plugins:", - "PluginSettingsSaveFailed": "Could not save plugin settings", - "PluginSettingsSaveSuccess": "Plugin settings updated.", - "PluginSettingsValueNotAllowed": "The value for the \"%1$s\" field in the \"%2$s\" plugin is not allowed", - "Problem": "Problem", - "ProtocolNotDetectedCorrectly": "You are currently viewing Matomo over a secure SSL connection (using HTTPS), but Matomo could only detect a non secure connection on the server.", - "ProtocolNotDetectedCorrectlySolution": "To make sure Matomo securely requests and serves your content over HTTPS, you may edit your %1$s file and either configure your proxy settings, or you may add the line %2$s below the %3$s section. %4$sLearn more%5$s", - "ReleaseChannel": "Release channel", - "SecurityNotificationAllTokenAuthDeletedBody": "Someone deleted all of the auth tokens in your account.", - "SecurityNotificationAnonymousAccessEnabledBody": "Someone enabled anonymous user access for %1$s. This means that the data for this site is now publicly accessible. If this is ok, feel free to ignore this email.", - "SecurityNotificationCheckTwoFactor": "Please check your two-factor authentication app or device.", - "SecurityNotificationEmailSubject": "Security Notification", - "SecurityNotificationIfItWasYou": "If it was you, carry on. If you don't recognize this activity, please reset your password.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Someone generated new two-factor authentication recovery codes for your account.", - "SecurityNotificationRecoveryCodesShowedBody": "Someone viewed the two-factor authentication recovery codes of your account.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Another super user (%1$s) modified the system settings. Affected settings: %2$s. If you know about this activity, carry on. If you don't recognize this activity, please contact the other super users.", - "SecurityNotificationSettingsChangedByUserBody": "Someone modified the system settings. Affected settings: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Someone created an auth token (description: %s) in your account. If it wasn't you, delete the token.", - "SecurityNotificationTokenAuthDeletedBody": "Someone deleted an auth token (description: %s) in your account.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Someone disabled two-factor authentication in your account.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Someone enabled two-factor authentication in your account.", - "SecurityNotificationUserCreatedBody": "Someone created a new user (login: %s) in your account.", - "SecurityNotificationUserDeletedBody": "Someone deleted a user (login: %s) in your account.", - "SendPluginUpdateCommunication": "Send an email when a plugin update is available", - "SendPluginUpdateCommunicationHelp": "An email will be sent to Super Users when there is a new version available for a plugin.", - "SettingsSaveSuccess": "Settings updated.", - "Solution": "Solution", - "StableReleases": "If Matomo is a critical part of your business, we recommend you use the latest stable release. If you use the latest beta and you find a bug or have a suggestion, please %1$ssee here%2$s.", - "SystemPluginSettings": "System Plugin Settings", - "TrackAGoal": "Track a goal", - "TrackingCode": "Tracking Code", - "JavaScriptCode": "JavaScript Code", - "TrackingCodeIntro": "Matomo offers you various ways to embed the tracking code for your website, mobile app, and even for any device or application.", - "TrackingFailureAuthenticationProblem": "Request was not authenticated but authentication was required.", - "TrackingFailureAuthenticationSolution": "Set or correct a \"token_auth\" in your tracking request.", - "TrackingFailureInvalidSiteProblem": "The site does not exist.", - "TrackingFailureInvalidSiteSolution": "Update the configured idSite in the tracker.", - "TrackingFailures": "Tracking failures", - "TrackingFailuresEmail1": "This is just to let you know that %s different kinds of tracking failures have occurred in the last days.", - "TrackingFailuresEmail2": "To view all the failed tracking requests %1$sclick here%2$s.", - "TrackingFailuresEmailSubject": "Tracking failures in your Matomo Analytics", - "TrackingFailuresIntroduction": "This page lists tracking failures that happened during the last %s days. Please note that only the most common kind of tracking failures are recorded and not all of them.", - "TrackingURL": "Tracking URL", - "TrustedHostConfirm": "Are you sure you want to change the trusted Matomo hostname?", - "TrustedHostSettings": "Trusted Matomo Hostname", - "TwoFactorAuth": "Two-factor auth", - "UiDemo": "UI Demo", - "UncheckToOptOut": "Uncheck this box to opt-out.", - "UpdateSettings": "Update settings", - "UseCustomLogo": "Use a custom logo", - "ValidPiwikHostname": "Valid Matomo Hostname", - "ViewAllTrackingFailures": "View all tracking failures", - "WhatIsNew": "What's New", - "WhatIsNewTooltip": "Learn what's new in Matomo", - "WhatIsNewTitle": "Here's what's new in Matomo", - "WhatIsNewNoChangesTitle": "No recent changes", - "WhatIsNewNoChanges": "There's nothing new at the moment", - "WhatIsNewDoNotShowAgain": "Don't show again", - "WhatIsNewRemindMeLater": "Remind me later", - "WithOptionalRevenue": "with optional revenue", - "YouAreNotOptedOut": "You are not opted out.", - "YouAreOptedOut": "You are currently opted out.", - "YouMayOptOut": "You may choose not to have a unique web analytics cookie identification number assigned to your computer to avoid the aggregation and analysis of data collected on this website.", - "YouMayOptOut2": "You may choose to prevent this website from aggregating and analyzing the actions you take here.", - "YouMayOptOut3": "Doing so will protect your privacy, but will also prevent the owner from learning from your actions and creating a better experience for you and other users.", - "YouMayOptOutBis": "To make that choice, please click below to receive an opt-out cookie.", - "UserInviteSubject": "%1$s sent you an invite to join Matomo Analytics for %2$s.", - "AcceptInvite": "Accept Invite", - "DeclineInvite": "Decline Invite", - "UserInviteContent": "You can accept this invitation by clicking the accept button below.", - "UserInviteNotes": "If you were not expecting this invitation, you can ignore this email. If %1$s is sending you too many emails, you can block them or report abuse. The invitation automatically expires in %2$s days.", - "SecurityNotificationUserAcceptInviteBody": "User (login: %s) accepted the invitation.", - "SecurityNotificationUserDeclinedInviteBody": "User (login: %s) declined the invitation.", - "NeedHelp": "Need help?", - "HowToGetHelp": "There are different ways you can get help. There is free support via the Matomo Community and paid support provided by the Matomo team and partners of Matomo. Or maybe do you have a bug to report or want to suggest a new feature?", - "GoogleTagManagerDescription": "If your website is using Google Tag Manager, please see %1$sthis guide%2$s.", - "WordpressDescription": "If your website is using Wordpress, please see %1$sthis guide%2$s.", - "VueDescription": "If your website is using Vue.js, please see %1$sthis guide%2$s.", - "ShowAdvancedOptions": "Show advanced options", - "HideAdvancedOptions": "Hide advanced options", - "JSTrackingDocumentationHelp": "For easy access, the most popular advanced options are available below. For even more options (including how to track goals, custom variables, ecommerce orders and abandoned carts) please check out the %1$sMatomo Javascript Tracking documentation%2$s.", - "ReactDescription": "If your website is using React, please see %1$sthis guide%2$s.", - "JsTrackingCodeAdvancedOptionsStep": "Optional: use the advanced options to customise your tracking code." - } -} diff --git a/plugins/CoreAdminHome/lang/eo.json b/plugins/CoreAdminHome/lang/eo.json deleted file mode 100644 index 7abba561b3b40907f55f6e785b122d04b84d0a2d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/eo.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Aldoni fidendan gastejon", - "Administration": "Administrado", - "ArchivingSettings": "Konservanta agordojn", - "ClickHereToOptIn": "Klaki ĉi tie por permesi.", - "ClickHereToOptOut": "Klaki ĉi tie por malpermesi.", - "FaviconUpload": "Elekti Favicon por alŝuti.", - "ForBetaTestersOnly": "Nur por betaaj uzantoj", - "ImageTracking": "Bildasekvado", - "JSTracking_DisableCookies": "Malebligi ĉiujn sekvantajn kuketojn", - "JSTracking_MergeSubdomains": "Sekvu ĉiujn vizitantojn ĉe ĉiuj subdomajnoj de", - "JSTracking_MergeSubdomainsDesc": "Do, se unu vizitanto vizitas %1$skaj %2$s, ili estos kalkulitaj kiel unika vizitanto.", - "JavaScriptTracking": "Sekvado per JavaSkripto", - "LogoUpload": "Elekti emblemon por alŝuti.", - "LogoUploadHelp": "Bonvole alŝuti dosieron laŭ la formatoj %1$skaj minimuma alteco de %2$spikseloj.", - "MenuDevelopment": "Disvolvigo", - "MenuGeneralSettings": "Ĝeneralaj agordoj", - "MenuSystem": "Sistemo", - "PersonalPluginSettings": "Peronaj agordoj por kromprogramo", - "PiwikIsInstalledAt": "Matomo estas instalita ĉe", - "PluginSettingChangeNotAllowed": "Vi ne rajtas ŝanĝi la valoron de la parametro \"%1$s\" en la kromprogramo \"%2$s\"", - "PluginSettingReadNotAllowed": "Vi ne rajtas legi la valoron de la parametro \"%1$s\" en la kromprogramo \"%2$s\"", - "PluginSettings": "Kromprogramaj agordoj", - "ReleaseChannel": "Liberigi kanalon", - "SettingsSaveSuccess": "Agordoj ĝisdatigitaj" - } -} diff --git a/plugins/CoreAdminHome/lang/es-ar.json b/plugins/CoreAdminHome/lang/es-ar.json deleted file mode 100644 index e598d59b8b31808a34188fce9862d69980a9c26c..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/es-ar.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Agregá un nuevo servidor de confianza", - "Administration": "Administración", - "ArchivingSettings": "Configuración de archivado", - "BrandingSettings": "Configuración de marcas y logos", - "BruteForce": "Fuerza bruta", - "CheckToOptIn": "Seleccioná esta casilla para incluirte.", - "ClickHereToOptIn": "Hacé clic acá para adherirte.", - "ClickHereToOptOut": "Hacé clic acá para quitar adhesión.", - "ConfirmDeleteAllTrackingFailures": "¿Estás seguro que querés eliminar todas las fallas de rastreo?", - "ConfirmDeleteThisTrackingFailure": "¿Estás seguro que querés eliminar esta falla de rastreo?", - "Cors": "Cors", - "CorsDomains": "Dominios de compartición de recursos de origen cruzados (CORS)", - "CorsDomainsHelp": "Podés definir dominios o subdominios como http://ejemplo.com o http://stats.ejemplo.com. O agregar solicitudes de dominios cruzados para todos los dominios, somplemente agregando un asterisco.", - "CustomLogoFeedbackInfo": "Si personalizás el logo de Matomo, quizá también te interese ocultar el enlace de %1$s en el menú principal. Para hacerlo, simplemente deshabilitá el plugin Feedback en la página de %2$sAdministrador de plugins%3$s.", - "CustomLogoHelpText": "Podés personalizar el logo de Matomo, el cual será visualizado en la interface de usuario y en los informes de correo electrónico.", - "DeleteAllFailures": "Eliminar todas las fallas", - "DevelopmentProcess": "Mientras nuestro proceso de desarrollo incluye miles de pruebas automatizadas, los Beta Testers juegan un rol fundamental en lograr la \"Política sin errores\" de Matomo.", - "EmailServerSettings": "Configuración del servidor de correo electrónico", - "ErrorEmailFromAddressNotValid": "La dirección SMTP no es válida", - "FaviconUpload": "Seleccioná un favicón para subir", - "FileUploadDisabled": "No está habilitada la subida de archivos en tu configuración PHP. Para subir un logo personalizado, por favor, establecé %s en php.ini, y reiniciá tu servidor web.", - "ForBetaTestersOnly": "Solamente para probadores de versiones beta", - "HttpTrackingApi": "API de rastreo HTTP", - "HttpTrackingApiDescription": "La %1$sAPI de rastreo HTTP%2$s te permite rastrear todo. Esto puede resultar útil si estás programando un lenguaje para el cual todavía no existe un SDK. También podría ser útil cuando querés rastrear ciertos dispositivos o aplicaciones en particular.", - "ImageTracking": "Rastreo mediante imágenes", - "ImageTrackingIntro1": "Cuando un visitante deshabilitó JavaScript ocuando JavaScript que no se puede usar, podés utilizar un enlace de rastreo mediante imagen para rastrear a los visitantes.", - "ImageTrackingIntro2": "Generá el enlace de abajo y copiá y pegá el código HTML generado en la página. Si estás usando esto como un resguardo para el rastreo mediante JavaScript, podés cubrirlo con %1$s etiquetas.", - "ImageTrackingIntro3": "Para la lista completa de opciones que puede utilizar con un vínculo de seguimiento de imagen, consulte el %1$sTracking API Documentación%2$s.", - "ImageTrackingLink": "Enlace de rastreo mediante imagen", - "ImportFromGoogleAnalytics": "Importar desde Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Si tenés datos existentes en Google Analytics y te estás cambiando a Matomo, podés exportar esos datos usando el plugin %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Una alternativa para el rastreo de los visitantes a través del navegador (ya sea a través de JavaScript o de un enlace de imagen) es importar continuamente los registros del servidor. Aprendé más sobre los %1$sanálisis del archivo de registro del servidor%2$s.", - "InvalidPluginsWarning": "Los siguientes plugins no son compatibles con %1$s y pueden que no se carguen: %2$s.", - "InvalidPluginsYouCanUninstall": "Podés actualizar o desinstalar estos plugins en la página %1$sAdministrar plugins%2$s.", - "JSTrackingIntro1": "Podés rastrear a los visitantes de tu sitio web de diferentes maneras. Lo más recomendado es hacerlo a través de JavaScript. Para usar este método, tenés que asegurarte de que cada página de tu sitio web tiene código JavaScript, el cual podés generar acá.", - "JSTrackingIntro2": "Una vez que tengás el código de rastreo de JavaScript para tu sitio web, copialo y pegalo en todas las páginas en las que querés rastrear con Matomo.", - "JSTrackingIntro3a": "En la mayoría de los sitios web, blogs, foros, etc, podés usar un plugin prediseñado para hacer el trabajo técnico por vos. (Mirá nuestra %1$slista de plugins usados para integrar Matomo%2$s.)", - "JSTrackingIntro3b": "Si no existe ningún plugin, podés editar las plantillas de tu sitio web y agregar el código de seguimiento de JavaScript a la etiqueta </head>, la cual está definida habitualmente en un archivo de plantilla \"headed.php\", \"header.tpl\", o similar.", - "JSTrackingIntro4": "Si no querés usar JavaScript para rastrear visitantes, %1$sgenerá un enlace de imagen de rastreo, abajo%2$s.", - "JSTrackingIntro5": "Si querés hacer más cosas que rastrear las visualizaciones de lás páginas, por favor, revisá la %1$sdocumentación de rastreo de JavaScript de Matomo%2$s para ver la lista de funciones disponibles. Con estas funciones podés rastrear metas, variables personalizadas, órdenes de comercio electrónicos, changuitos abandonados y más.", - "JSTracking_CampaignKwdParam": "Parámetro de palabra clave por campaña", - "JSTracking_CampaignNameParam": "Parámetro de nombre de campaña", - "JSTracking_CodeNoteBeforeClosingHead": "Asegurate de que este código esté en cada página de tu sitio web. Te recomendamos pegarlo inmediatamente antes de la etiqueta de cierre de %1$s.", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Asegurate de que este código esté en cada página de tu sitio web. Te recomendamos pegarlo inmediatamente antes de la etiqueta de cierre del encabezado.", - "JSTracking_CrossDomain": "Predeterminadamente, el identificador del visitante que registra a un visitante único se almacena en la cookie propia en el navegador, la cual sólo se puede acceder por páginas del mismo dominio. Habilitar enlaces de dominio cruzado te permite hacer un seguimiento de todas las acciones y vistas de página de un visitante específico en la misma visita, incluso cuando visita páginas de diferentes dominios. Cuando un usuario hace clic en una de las direcciones web alias de tu sitio, obtendrá un parámetro \"pk_vid\" en la dirección, seguido de la identificación del visitante.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Nota: para usar enlace de dominio cruzado, tenés que especificar más de un nombre de dominio (dirección web) para tu sitio web.", - "JSTracking_CustomCampaignQueryParam": "Usá nombres de parámetros de consultas personalizadas, tanto para el nombre como para la palabra clave", - "JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sMatomo detectará automáticamente los parámetros de Google Analytics.%2$s", - "JSTracking_DisableCookies": "Deshabilitar todas las cookies de rastreo", - "JSTracking_DisableCookiesDesc": "Deshabilita todas las cookies propias. Las cookies existentes de Matomo para este sitio web serán eliminadas en la vista de la próxima página.", - "JSTracking_EnableCrossDomainLinking": "Habilita los enlaces de dominio cruzado", - "JSTracking_EnableDoNotTrack": "Habilitar detección de DoNotTrack en el lado del cliente", - "JSTracking_EnableDoNotTrackDesc": "Por lo tanto, las solicitudes de rastreo no serán enviadas si el visitante no quiere ser rastreado.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nota: el soporte para DoNotTrack en el lado del servidor fue activado, por lo que esta opción no tendrá ningún efecto.", - "JSTracking_EndNote": "Nota: podés generar un código de rastreo personalizado en la sección de administración del %1$s código de rastreo %2$s.", - "JSTracking_GroupPageTitlesByDomain": "Al rastrear, anteponer el dominio del sitio al título", - "JSTracking_GroupPageTitlesByDomainDesc1": "Por lo tanto, si alguien visita la página \"Acerca de …\" de un blog %1$s será registrado como \"blog / Acerca de…\". Esta es la manera más fácil de ver un pantallazo de tu tráfico por subdominio.", - "JSTracking_MergeAliases": "En el informe \"Enlaces externos\", ocultá los clics para conocer los alias de las direcciones web de", - "JSTracking_MergeAliasesDesc": "Así los clics al enlace de las direcciones web alias (por ejemplo: %s) no serán contadas como \"enlace externo\".", - "JSTracking_MergeSubdomains": "Rastrear visitantes en todos los subdominios de", - "JSTracking_MergeSubdomainsDesc": "Entonces si alguien visita %1$s y %2$s, estas serán contados como una única visita.", - "JSTracking_PageCustomVars": "Rastrear una variable personalizada por cada página vista", - "JSTracking_PageCustomVarsDesc": "Por ejemplo, con el nombre de variable \"Categoría\" y el valor \"Libros blancos\".", - "JSTracking_TrackNoScript": "Sigue a los usuarios con JavaScript deshabilitado", - "JSTracking_VisitorCustomVars": "Rastrear variables personalizadas para este visitante", - "JSTracking_VisitorCustomVarsDesc": "Por ejemplo, con el nombre de variable \"Tipo\" y el valor \"Cliente\".", - "JavaScriptTracking": "Seguimiento vía JavaScript", - "JsTrackingCodeMissingEmail1": "Hace unos días agregaste el sitio web \"%s\" a tu cuenta de Matomo Analytics. Recién revisamos y Matomo no parece tener registros de tráfico para este sitio web.", - "JsTrackingCodeMissingEmail2": "Para comenzar a rastrear datos y entender a tus usuarios, necesitás configurar el rastreo en tu sitio web o aplicación móvil. Para el caso de los sitios web, simplemente insertá el código de rastreo justo antes de la etiqueta %s.", - "JsTrackingCodeMissingEmail3": "Para encontrar y personalizar tu código de rastreo, %1$shacé clic acá%2$s (o mirá la %3$sguía de cliente de rastreo de JavaScript%4$s).", - "LearnMore": "Aprendé más", - "Login": "Inicio de sesión", - "LogoNotWriteableInstruction": "Para usar tu logo personalizado en lugar del logo predeterminado de Matomo, dale permiso de escritura a este directorio: %1$sMatomo necesita el acceso de escritura a tus logos guardados en los archivos %2$s.", - "LogoUpload": "Seleccioná un logo para subir", - "LogoUploadFailed": "No se pudo procesar el archivo subido. Por favor, revisá si el archivo tiene un formato válido.", - "LogoUploadHelp": "Please upload a file in %1$s formats with a minimum height of %2$s pixels.", - "LtsReleases": "Las versiones LTS (soporte a largo plazo) reciben sólo actualizaciones de seguridad y correcciones de fallos.", - "MenuDevelopment": "Desarrollo", - "MenuDiagnostic": "Diagnóstico", - "MenuGeneralSettings": "Configuración general", - "MenuMeasurables": "Medibles", - "MenuSystem": "Sistema", - "MissingTrackingCodeEmailSubject": "No hay registro de tráfico para %s en Matomo Analytics; comenzá ahora", - "NTrackingFailures": "%s fallas de rastreo", - "NoKnownFailures": "No hay fallos conocidos de rastreo.", - "OptOutComplete": "Quitado de adhesión completo; tus visitas a este sitio web no serán registradas por la herramienta de análisis web.", - "OptOutCompleteBis": "Tené en cuenta que si eliminás tus cookies, eliminás la cookie de quitado de adhesión, o si cambiás de computadora o navegador web, deberás realizar el proceso de quitado de adhesión nuevamente.", - "OptOutDntFound": "No estás siendo rastreado, ya que tu navegador web está informando que no querés que suceda esto. Esto es una configuración de tu navegador, por lo tanto no vas a poder adherirte hasta que no deshabilités la función \"Do Not Track\" / \"DNT\" / \"Rastreo\".", - "OptOutErrorNoCookies": "La función de no siguimiento requiere que las cookies estén habilitadas.", - "OptOutErrorNotHttps": "La función de no seguimiento puede que no funcione porque este sitio no fue cargado sobre HTTPS. Por favor, recargá la página para saber si cambió tu estado de no seguimiento.", - "OptOutErrorWindowOpen": "La función de no seguimiento puede que no funcione porque parece que la ventana emergente de esta función fue bloqueada. Por favor, recargá la página para saber si cambió tu estado de no seguimiento.", - "OptOutExplanation": "Matomo está comprometida a ofrecer privacidad en Internet. Para proveer a tus visitantes la opción de no recolectar sus datos de navegación con las herramientas de análisis web de Matomo, podés agregar el siguiente código HTML en alguna página de tu sitio web, como por ejemplo la página de \"Política de privacidad\".", - "OptOutExplanationIntro": "Este código mostrará un iFrame conteniendo un enlace para que tus visitantes puedan dejar de ser rastreados por Matomo, estableciendo una cookie de no seguimiento en sus navegadores web. Mirá abajo (o %1$shacé clic acá%2$s) para ver el contenido que será mostrado por el iFrame.", - "OptOutForYourVisitors": "No seguimiento de Matomo para tus visitantes", - "OptingYouOut": "Quitando adhesión. Por favor, esperá…", - "PersonalPluginSettings": "Configuración de plugins personales", - "PiwikIsInstalledAt": "Matomo está instalado en", - "PluginSettingChangeNotAllowed": "No estás permitido de cambiar el valor de la configuración \"%1$s\" en el plugin \"%2$s\"", - "PluginSettingReadNotAllowed": "No tenés permisos para cambiar el valor de la configuración \"%1$s\" en el plugin \"%2$s\"", - "PluginSettings": "Configuración de plugin", - "PluginSettingsIntro": "Acá podés cambiar la configuración de los siguientes plugins de terceros:", - "PluginSettingsSaveFailed": "Ocurrió un error al guardar la configuración del plugin", - "PluginSettingsSaveSuccess": "Se actualizó la configuración del plugin.", - "PluginSettingsValueNotAllowed": "No está permitido el valor para el campo \"%1$s\" en el plugin \"%2$s\"", - "Problem": "Problema", - "ProtocolNotDetectedCorrectly": "Actualmente estás viendo Matomo sobre una conexión SSL segura (usando HTTPS), pero Matomo podría no detectar una conexión no segura en el servidor.", - "ProtocolNotDetectedCorrectlySolution": "Para asegurarte de que Matomo solicita y ofrece tu contenido de forma segura sobre HTTPS, podés editar tu archivo %1$s y, o bien configurar tu proxy, o bien agregar la línea %2$s debajo de la sección %3$s. %4$sAprendé más%5$s", - "ReleaseChannel": "Canal de lanzamiento", - "SecurityNotificationAllTokenAuthDeletedBody": "Alguien eliminó todos los tokens de autenticación en tu cuenta.", - "SecurityNotificationCheckTwoFactor": "Por favor, revisá la aplicación o dispositivo de tu autenticación de dos factores.", - "SecurityNotificationEmailSubject": "Notificación de seguridad", - "SecurityNotificationIfItWasYou": "Si fuiste vos, no pasa nada. Si no reconoés esta actividad, por favor, cambiá tu contraseña.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Alguien generó nuevos códigos de recuperación de la autenticación de dos factores para tu cuenta.", - "SecurityNotificationRecoveryCodesShowedBody": "Alguien vio los códigos de recuperación de la autenticación de dos factores de tu cuenta.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Otro súperusuario (%1$s) modificó la configuración del sistema. Configuración afectada: %2$s. Si estás al tanto de esta actividad, no pasa nada. Pero si no la reconocés, por favor, ponete en contacto con los demás súperusuarios.", - "SecurityNotificationSettingsChangedByUserBody": "Alguién modificó la configuración del sistema: Configuración afectada: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Alguien creó un token de autenticación (descripción: %s) en tu cuenta. Si no fuiste vos, eliminá el token.", - "SecurityNotificationTokenAuthDeletedBody": "Alguien eliminó un token de autenticación (descripción: %s) en tu cuenta.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Alguien deshabilitó la autenticación de dos factores en tu cuenta.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Alguien habilitó la autenticación de dos factores en tu cuenta.", - "SecurityNotificationUserCreatedBody": "Alguien creó un nuevo usuario (nombre de usuario: %s) en tu cuenta.", - "SecurityNotificationUserDeletedBody": "Alguien eliminó un usuario (nombre de usuario: %s) en tu cuenta.", - "SendPluginUpdateCommunication": "Enviar un correo electrónico cuando haya disponible una actualización del plugin", - "SendPluginUpdateCommunicationHelp": "Se enviará un correo electrónico a los súperusuarios cuando haya una nueva versión disponible del plugin.", - "SettingsSaveSuccess": "Configuración actualizada.", - "Solution": "Solución", - "StableReleases": "Si Matomo es parte fundamental de tu modelo de negocios, entonces te recomendamos que usés la última versión estable. Si usás la última versión beta y encontrás algún error o tenés alguna sugerencia, por favor, %1$smirá esto%2$s.", - "SystemPluginSettings": "Configuración de plugin de sistema", - "TrackAGoal": "Rastreá una meta", - "TrackingCode": "Código de rastreo", - "TrackingCodeIntro": "Matomo te ofrece varias formas de insertar el código de rastreo para tu sitio web, aplicación móvil e incluso cualquier dispositivo o aplicación.", - "TrackingFailureAuthenticationProblem": "La solicitud no fue autenticada, pero se requería autenticación.", - "TrackingFailureAuthenticationSolution": "Establecé o corregí la \"token_auth\" en tu solicitud de rastreo.", - "TrackingFailureInvalidSiteProblem": "El sitio no existe.", - "TrackingFailureInvalidSiteSolution": "Actualizá el idSite configurado en el rastreador.", - "TrackingFailures": "Fallas de rastreo", - "TrackingFailuresEmail1": "Esto es sólo para hacerte saber que %s diferentes tipos de fallos de rastreo han ocurrido en los últimos días.", - "TrackingFailuresEmail2": "Para ver todas las solicitudes de rastreo que fallaron, %1$shacé clic acá%2$s.", - "TrackingFailuresEmailSubject": "Fallas de rastreo en tu cuenta de Matomo Analytics", - "TrackingFailuresIntroduction": "Esta página lista los fallos de rastreo que han ocurrido en los últimos %s días. Por favor, tené en cuenta sólo se registran las clases de fallos más comunes y no todos ellos.", - "TrackingURL": "Dirección web de rastreo", - "TrustedHostConfirm": "¿Estás seguro que querés cambiar el nombre de dominio (\"hostname\") de confianza de Matomo?", - "TrustedHostSettings": "Nombre de dominio de confianza de Matomo", - "TwoFactorAuth": "Autenticación de dos factores", - "UiDemo": "Demo de interface gráfica", - "UncheckToOptOut": "No seleccionés esta casilla para excluirte.", - "UpdateSettings": "Configuración de actualización", - "UseCustomLogo": "Usar un logo personalizado", - "ValidPiwikHostname": "Nombre de dominio válido de Matomo", - "ViewAllTrackingFailures": "Ver todas las fallas de rastreo", - "WhatIsNewRemindMeLater": "Recordarme después", - "WithOptionalRevenue": "con una facturación opcional", - "YouAreNotOptedOut": "No estás excluido del seguimiento.", - "YouAreOptedOut": "Actualmente no estás siendo rastrado.", - "YouMayOptOut": "Podés elegir no tener un único número de identificación de la cookie de análisis web asignada a tu computadora para prevenir la agregación y el análisis de datos recolectados en este sitio web.", - "YouMayOptOut2": "Podés evitar que este sitio web agregue y analice las acciones que hagás acá.", - "YouMayOptOut3": "Al hacerlo protegerás tu privacidad, pero también evitarás que el propietario conozca tus acciones y cree una mejor experiencia para vos y para otros usuarios.", - "YouMayOptOutBis": "Para elegir esto, por favor, hacé clic debajo para recibir una cookie para no adherirte a ser rastreado." - } -} diff --git a/plugins/CoreAdminHome/lang/es.json b/plugins/CoreAdminHome/lang/es.json deleted file mode 100644 index 85687a5687048d5706ff28baa1d45a344775b91d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/es.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Aceptar invitación", - "AddNewTrustedHost": "Agregar un nuevo host de confianza", - "Administration": "Administración", - "ArchivingSettings": "Configuración de archivado", - "BrandingSettings": "Configuración del Branding", - "BruteForce": "Fuerza Bruta", - "CheckToOptIn": "Marque esta casilla para adherirse.", - "ClickHereToOptIn": "Haga clic aquí para optar.", - "ClickHereToOptOut": "Haga clic aquí para no ser seguido.", - "CloudflareDescription": "Si su página web está alojado en Cloudflare, consulte %1$sesta guía%2$s.", - "ConfirmDeleteAllTrackingFailures": "Está seguro que desea eliminar todos los fallos de seguimiento?", - "ConfirmDeleteThisTrackingFailure": "¿Está seguro que desea eliminar este fallo de seguimiento?", - "Cors": "El Intercambio de Recursos de Origen Cruzado", - "CorsDomains": "Dominios de Intercambio de recursos de origen cruzado (CORS)", - "CorsDomainsHelp": "Puede definir dominios o subdominios tales como http://example.com o http://stats.example.com. O permitir las peticiones de dominio cruzado para todos los dominios simplemente agregando un *", - "CustomLogoFeedbackInfo": "Si personaliza el logo de Matomo, puede que también esté interesado en ocultar el %1$s enlace en el menú superior. Para hacerlo, puede deshabilitar el complemento Feedback en la página de %2$sAdministración de complementos%3$s.", - "CustomLogoHelpText": "Puede personalizar el logo de Matomo que será mostrado en la interfaz de usuario y los informes por correo electrónico.", - "DeclineInvite": "Rechazar invitación", - "DeleteAllFailures": "Eliminar todos los fallos", - "DevelopmentProcess": "Mientras que nuestro proceso de desarrollo incluye miles de pruebas automatizadas, los Beta testers juegan un rol clave en lograr \"Política de sin errores\" en Matomo.", - "EmailServerSettings": "Configuración del servidor de correo electrónico", - "ErrorEmailFromAddressNotValid": "El SMTP de la dirección no es valido", - "FaviconUpload": "Selecciona un Favicon para subir", - "FileUploadDisabled": "La carga de archivos no está habilitada en su configuración de PHP. Para cargar su logotipo personalizado, introduzca %s en el php.ini y reinicie su servidor web.", - "ForBetaTestersOnly": "Solamente para beta testers", - "GoogleTagManagerDescription": "Si su página web utiliza Google Tag Manager, consulte %1$sesta guía%2$s.", - "HideAdvancedOptions": "Ocultar opciones avanzadas", - "HowToGetHelp": "Hay diferentes maneras de obtener ayuda. Hay soporte gratuito a través de la comunidad de Matomo y soporte de pago proporcionado por el equipo de Matomo y los socios de Matomo. ¿O tal vez tiene un error para informar o desea sugerir una nueva función?", - "HttpTrackingApi": "API de seguimiento HTTP", - "HttpTrackingApiDescription": "La API de seguimiento %1$sHTTP%2$s te permite rastrear cualquier cosa. Esto puede resultar útil si está utilizando un lenguaje de programación para el que aún no existe un SDK. También puede ser útil cuando se desea realizar un seguimiento de dispositivos o aplicaciones de una manera especial.", - "ImageTracking": "Monitoreo mediante imagen", - "ImageTrackingIntro1": "Cuando un visitante ha deshabilitado JavaScript o cuando no puede utilizarse, puede usar un enlace de imagen como vínculo de seguimiento para monitorear visitantes.", - "ImageTrackingIntro2": "Generar el enlace de abajo y copiar y pegar el código HTML generado en la página. Si lo está utilizando como una alternativa para el seguimiento vía JavaScript, puede envolverlo en %1$s identificaciones.", - "ImageTrackingIntro3": "Para la lista completa de opciones que puede utilizar con un vínculo de seguimiento de imagen, consulte la %1$sDocumentación API de rastreo%2$s.", - "ImageTrackingLink": "Enlace de monitoreo por imagen", - "ImportFromGoogleAnalytics": "Importar de Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Si tiene una propiedad de Google Analytics y está migrando a Matomo, puede importar los datos existentes una el plugin %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Una alternativa para el seguimiento de los visitantes a través del navegador (ya sea a través de JavaScript o un enlace de imagen) es importar continuamente los registros del servidor. Aprenda más acerca del %1$sarchivo de registro analítico del servidor%2$s.", - "InvalidPluginsAdminDisabled": "Para actualizar o desinstalar estos complementos, póngase en contacto con su administrador de Matomo, quien podrá utilizar la línea de comandos o actualizar la configuración directamente.", - "InvalidPluginsWarning": "Los siguientes complementos no son compatibles con %1$s y podrían no ser cargados: %2$s.", - "InvalidPluginsYouCanUninstall": "Puede actualizar o desinstalar estos complementos en la página %1$sGestionar Complementos%2$s.", - "InvalidSiteUrlError": "Esta URL no es válida. El contenido puede haber sido trasladado, borrado, o no está más disponible (el id del sitio web fue establecido a '%s' en la URL).", - "InvalidSiteUrlErrorHelp": "Por favor, regresa a tu página anterior o vuelve a tu panel de control para seleccionar un sitio web.", - "JSTrackingDocumentationHelp": "Para un acceso fácil, las opciones avanzadas más populares están disponibles a continuación. Para obtener aún más opciones (incluyendo cómo rastrear objetivos, variables personalizadas, pedidos de comercio electrónico y carritos abandonados), consulte la %1$sdocumentación de seguimiento de Javascript de Matomo%2$s.", - "JSTrackingIntro1": "Puedes rastrear visitantes hacia su sitio web de muchas maneras. La forma recomendada de hacerlo es con JavaScript. Para usar este método solo debe asegurarse de que cada página de su sitio de internet tenga cierto código JavaScript, el cual puede generar aquí.", - "JSTrackingIntro2": "Una vez que tenga el código de seguimiento JavaScript para su sitio web, cópielo y péguelo en todas las páginas que desee rastrear con Matomo.", - "JSTrackingIntro3a": "En la mayoría de sitos web, blogs, CMS, etc. puede utilizar plugins precodificados para que realicen el trabajo técnico por usted. (Vea nuestra %1$slista de plugins para integrar Matomo%2$s.)", - "JSTrackingIntro3b": "Si no existe ningún plugin, puede editar las plantillas de su sitio web y añadir el código de seguimiento JavaScript a la etiqueta </head> que suele estar definida en un archivo de plantilla 'header.php', 'header.tpl' o similar.", - "JSTrackingIntro4": "Si no desea utilizar JavaScript para rastrear visitantes, %1$sgenere un enlace de imagen de rastreo%2$s.", - "JSTrackingIntro5": "Si desea hacer más que rastrear vistas de páginas, revise la %1$sDocumentación de Javascript de Matomo%2$s acerca de las funciones disponibles. Estas puede rastrear objetivos, variables personalizadas, órdenes de comercio electrónico, carritos abandonados y más.", - "JSTracking_CampaignKwdParam": "Parámetro palabra clave de la campaña", - "JSTracking_CampaignNameParam": "Parámetro Nombre de la campaña", - "JSTracking_CodeNoteBeforeClosingHead": "Haga clic en el botón para copiar el fragmento de código y péguelo inmediatamente antes de la etiqueta de cierre %1$s (recomendado)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Asegúrate de que este código es insertado con un elemento script en cada página de su sitio web. Recomendamos pegarlo justo antes de cerrar la etiqueta de cabecera.", - "JSTracking_ConsentManagerConnected": "Parece que %1$s ya está configurado para funcionar con Matomo.", - "JSTracking_ConsentManagerDetected": "Se detectó %1$s administrador de consentimiento en su sitio. Para obtener información sobre cómo configurar Matomo para que funcione con %1$s, visite %2$s", - "JSTracking_ConsentManagerEmailNote": "O podría insertar directamente el código de seguimiento en su sitio web:", - "JSTracking_CrossDomain": "Por defecto, el ID de visitante que identifica a un único visitante se almacena en las cookies de origen del navegador, a las que sólo pueden acceder las páginas del mismo dominio. Habilitar el enlace entre dominios le permite rastrear todas las acciones y páginas vistas de un visitante específico en la misma visita, incluso cuando ven páginas en varios dominios. Cada vez que un usuario haga clic en un enlace a una de las URL de alias de su sitio web, se añadirá un parámetro de URL pk_vid que remitirá el ID del visitante.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Nota: Para usar enlaces cruzados de dominio, debe especificar más de un nombre de dominio (URLs) para su sitio web.", - "JSTracking_CustomCampaignQueryParam": "Utilizar nombres de parámetros de consulta personalizados para el nombre de la campaña y la palabra clave", - "JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sMatomo detectará automáticamente los parámetros de Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Deshabilitar el seguimiento de parámetros de la campaña", - "JSTracking_DisableCampaignParametersDesc": "Cuando esta opción está marcada, Matomo no rastreará los parámetros de la campaña y serán eliminados de las URLs rastreadas.", - "JSTracking_DisableCookies": "Desactivar todas las cookies de rastreo", - "JSTracking_DisableCookiesDesc": "Deshabilite todas las cookies propias. Las cookies de Matomo existentes para este sitio web se eliminarán en las próximas visitas a la página.", - "JSTracking_EnableCrossDomainLinking": "Permitir la vinculación entre dominios", - "JSTracking_EnableDoNotTrack": "Habilitar detección por parte del cliente de DoNotTrack", - "JSTracking_EnableDoNotTrackDesc": "De esta manera las solicitudes de seguimiento no será enviada si el visitante no desea ser seguido.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nota: Soporte del lado del servidor para DoNotTrack ha sido activado, por lo que esta opción no tendrá ningún efecto.", - "JSTracking_EndNote": "Nota: Puede generar un código de seguimiento personalizado en la sección de administración de %1$sCódigo de seguimiento%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Anteponer el dominio del sitio al título de la página a rastrear", - "JSTracking_GroupPageTitlesByDomainDesc1": "De esta manera si alguien visita la página 'About' del blog %1$s se registrará como 'blog/About'. Esta es la forma más fácil de conseguir un resumen del tráfico de acuerdo a los subdominios.", - "JSTracking_MergeAliases": "En el informe *Enlaces salientes\" puede ocultar los clics a los alias URL conocidos de", - "JSTracking_MergeAliasesDesc": "De esta forma los clics que han recibido los enlaces de los alias de URL (por ej. %s) no serán contados como \"Outlink\".", - "JSTracking_MergeSubdomains": "Rastrear visitantes a través de todos los subdominios de", - "JSTracking_MergeSubdomainsDesc": "Entonces si un visitante visita %1$s y %2$s, éstos serán contados como un único visitante.", - "JSTracking_PageCustomVars": "Rastrear una variable personalizada por cada página vista", - "JSTracking_PageCustomVarsDesc": "Por ejemplo, con el nombre de variable \"Categoría\" y el valor \"Libros Blancos\".", - "JSTracking_TrackNoScript": "Rastrear usuarios que tengan JavaScript deshabilitado", - "JSTracking_VisitorCustomVars": "Rastrear variables personalizadas para este visitante", - "JSTracking_VisitorCustomVarsDesc": "Por ejemplo, con el nombre de variable \"Tipo\" y el valor \"Cliente\".", - "JavaScriptCode": "Código JavaScript", - "JavaScriptTracking": "Seguimiento con JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Opcional: utiliza las opciones avanzadas para personalizar tu código de seguimiento.", - "JsTrackingCodeMissingEmail1": "Unos días atrás agregó el sitio weg '%s' a su Matomo Analytics. Lo hemos verificado y su Matomo no parece poseer ningún tráfico registrado para este sitio web.", - "JsTrackingCodeMissingEmail2": "Para empezar a rastrear datos y obtener conocimientos de sus usuarios, necesitará configurarlo, sea en su sitio web o aplicación móvil. Para sitios web simplemente incruste el código de rastreo justo antes de la etiqueta %s.", - "JsTrackingCodeMissingEmail3": "Para encontrar y personalizar su código de rastreo, %1$sclic acá%2$s (o lea la guía %3$sJavascript Tracking Client%4$s).", - "LearnMore": "Aprender más", - "Login": "Iniciar sesión", - "LogoNotWriteableInstruction": "Para utilizar su logo personalizado en lugar del logo estándar de Matomo puede conceder permisos de escritura a este directorio: %1$s Matomo necesita el permiso de escritura para sus logos guardados en los archivos %2$s.", - "LogoUpload": "Seleccione un logo para subir", - "LogoUploadFailed": "El fichero no ha podido subirse de forma correcta. Por favor, comprueba si el fichero tiene un formato correcto.", - "LogoUploadHelp": "Sube un archivo en formato %1$s con una altura mínima de %2$s píxeles.", - "LtsReleases": "Las versiones LTS (soporte a largo plazo) solo reciben seguridad y correcciones de errores.", - "MenuDevelopment": "Desarrollo", - "MenuDiagnostic": "Diagnóstico", - "MenuGeneralSettings": "Configuración general", - "MenuMeasurables": "Medibles", - "MenuSystem": "Sistema", - "MissingTrackingCodeEmailSubject": "Sin tráfico registrado para %s en Matomo Analytics, empieze ahora", - "NTrackingFailures": "%s fallos de seguimiento", - "NeedHelp": "¿Necesitas ayuda?", - "NoKnownFailures": "No existen fallos conocidos en el seguimiento.", - "OptOutComplete": "Opt-out completado; sus visitas a este sitio de internet no serán grabadas por la herramienta de Análisis de internet.", - "OptOutCompleteBis": "Tenga en cuenta que si elimina sus cookies, elimina la cookie opt-out, o si cambia de ordenador o navegador, deberá llevar a cabo el procedimiento opt-out otra vez.", - "OptOutCustomOptOutLink": "También puede crear un formulario de exclusión completamente personalizado usando HTML y JavaScript, como se explica en esta %1$sguía%2$s para desarrolladores.", - "OptOutDntFound": "No está siendo rastreado desde que su navegador está informando que esa es su elección. Esta es una opción de su navegador, así que no será posible hasta tanto no deshabilite la función 'No rastrear'.", - "OptOutErrorNoCookies": "La característica de seguimiento opt-out requiere de cookies para poder habilitarla.", - "OptOutErrorNoTracker": "La función de exclusión del seguimiento no ha podido encontrar el código de Matomo Tracker en esta página", - "OptOutErrorNotHttps": "La característica de seguimiento opt-out puede que no funcione debido a que este sitio no se cargó sobre HTTPS. Por favor recarge y compruebe que el estatus de opt-out ha cambiado.", - "OptOutErrorWindowOpen": "Es posible que la función de exclusión voluntaria de seguimiento no funcione porque parece que la ventana emergente de exclusión voluntaria se bloqueó. Vuelva a cargar la página para verificar si su estado de exclusión cambió.", - "OptOutExplanation": "Matomo se dedica a dar privacidad en internet. Para darles a sus visitantes la opción de no ser rastreados por Matomo, puede añadir el siguiente código HTML en una de sus páginas de su sitio web, por ejemplo, en la página de Política de Privacidad.", - "OptOutExplanationIntro": "Este código mostrará un div que contiene un enlace para que sus visitantes opten por no participar en Matomo configurando una cookie de exclusión voluntaria en sus navegadores web. Consulte a continuación (o %1$shaga clic aquí%2$s) para ver el contenido que mostrará el div.", - "OptOutForYourVisitors": "Opción de no seguimiento de Matomo para sus visitantes", - "OptingYouOut": "Opción a salir, por favor espere…", - "PersonalPluginSettings": "Ajustes de complemento personal", - "PiwikIsInstalledAt": "Matomo está instalado en", - "PluginSettingChangeNotAllowed": "No tiene permitido cambiar el valor de configuración \"%1$s\" en el complemento \"%2$s\"", - "PluginSettingReadNotAllowed": "No está permitido que lea el valor de la opción \"%1$s\" en el complemento \"%2$s\"", - "PluginSettings": "Ajustes de complemento", - "PluginSettingsIntro": "Aquí puede cambiar la configuración de los siguientes complementos de terceros:", - "PluginSettingsSaveFailed": "No se pudo guardar la configuración del complemento", - "PluginSettingsSaveSuccess": "Ajustes del complemento actualizado.", - "PluginSettingsValueNotAllowed": "El valor del campo \"%1$s\" en el complemento \"%2$s\" no está permitido", - "Problem": "Problema", - "ProtocolNotDetectedCorrectly": "Actualmente está viendo Matomo a través de una conexión SSL segura (usando HTTPS), pero Matomo solo pudo detectar una conexión no segura en el servidor.", - "ProtocolNotDetectedCorrectlySolution": "Para asegurarse que Matomo peticiona y satisface de manera segura su contenido a través de HTTPS, puede modificar su archivo %1$s o configurar los datos de su proxy o puede agregar la siguiente línea %2$s bajo la sección %3$s. %4$sAprenda más%5$s", - "ReactDescription": "Si su página web utiliza React, consulte %1$sesta guía%2$s.", - "ReleaseChannel": "Canal de lanzamiento", - "SecurityNotificationAllTokenAuthDeletedBody": "Alguien ha eliminado todos los tokens de autenticación de su cuenta.", - "SecurityNotificationAnonymousAccessEnabledBody": "Alguien ha habilitado el acceso de usuario anónimo para %1$s. Esto significa que los datos de este sitio son ahora de acceso público. Si te parece bien, ignora este mensaje.", - "SecurityNotificationCheckTwoFactor": "Verifique su aplicación o dispositivo de autenticación de dos factores.", - "SecurityNotificationEmailSubject": "Notificación de seguridad", - "SecurityNotificationIfItWasYou": "Si era usted, ignore este mensaje; de lo contrario, cambie la contraseña.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Alguien ha generado nuevos códigos de recuperación de la autenticación de dos factores para tu cuenta.", - "SecurityNotificationRecoveryCodesShowedBody": "Alguien vio los códigos de recuperación de autenticación de dos factores de su cuenta.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Otro super-usuario (%1$s) ha modificado la configuración del sistema. Los parámetros afectados son: %2$s. Si reconoce estos cambios ignore esto, si no contacte con el resto de super-usuarios.", - "SecurityNotificationSettingsChangedByUserBody": "Alguien ha modificado la configuración del sistema. Los parámetros afectados son: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Alguien ha creado un token de autenticación (descripción: %s) en su cuenta. Si no fue usted elimine el token.", - "SecurityNotificationTokenAuthDeletedBody": "Alguien ha eliminado un token de autenticación (descripción: %s) de su cuenta.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Alguien ha deshabilitado la autenticación de 2 pasos en tu cuenta.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Alguien ha habilitado la autenticación de 2 pasos en tu cuenta.", - "SecurityNotificationUserAcceptInviteBody": "El usuario (inicio de sesión: %s) aceptó la invitación.", - "SecurityNotificationUserCreatedBody": "Alguien ha creado un nuevo usuario (login: %s) en su cuenta.", - "SecurityNotificationUserDeclinedInviteBody": "El usuario (inicio de sesión: %s) rechazó la invitación.", - "SecurityNotificationUserDeletedBody": "Alguien ha eliminado un usuario (login: %s) de su cuenta.", - "SendPluginUpdateCommunication": "Envíe un correo electrónico cuando la actualización del complemento esté disponible", - "SendPluginUpdateCommunicationHelp": "Se enviará un correo electrónico a los Super Usuarios cuando haya disponible una nueva versión de un complemento.", - "SettingsSaveSuccess": "Ajustes actualizados.", - "ShowAdvancedOptions": "Mostrar opciones avanzadas", - "SinglePageApplicationDescription": "Si está siguiendo una aplicación de una sola página (SPA) o una aplicación web progresiva (PWA), consulte %1$sesta guía%2$s.", - "Solution": "Solución", - "StableReleases": "Si Matomo es una parte crítica de su negocio, le recomendamos que utilice la última versión estable. Si usa la última versión beta y encuentra un error o tiene alguna sugerencia, por favor %1$sver aquí%2$s.", - "SystemPluginSettings": "Ajustes de complemento del sistema", - "TrackAGoal": "Seguimiento de un objetivo", - "TrackingCode": "Código de seguimiento", - "TrackingCodeIntro": "Matomo le ofrece varias maneras de incrustar el código de rastreo para su sitio web, aplicación móvil e incluso para cualquier dispositivo o aplicación.", - "TrackingFailureAuthenticationProblem": "La solicitud no se autenticó, pero es obligatorio poseer una.", - "TrackingFailureAuthenticationSolution": "Configure o corrija un \"token_auth\" en su solicitud de seguimiento.", - "TrackingFailureInvalidSiteProblem": "Este sitio no existe.", - "TrackingFailureInvalidSiteSolution": "Actualice el idSite configurado en el rastreador.", - "TrackingFailures": "Fallos de seguimiento", - "TrackingFailuresEmail1": "Esto es solo para hacerle saber que %s se han producido diferentes tipos de fallos de seguimiento en los últimos días.", - "TrackingFailuresEmail2": "Para ver todas las peticiones de fallos de seguimiento haga %1$s clic aquí%2$s.", - "TrackingFailuresEmailSubject": "Fallos de seguimiento en su Matomo Analytics", - "TrackingFailuresIntroduction": "Esta página enumera los fallos de seguimiento que se produjeron durante los últimos %s días. Tenga en cuenta que sólo los fallos más comunes de seguimiento se registran, pero no todos.", - "TrackingURL": "URL de seguimiento", - "TrustedHostConfirm": "¿Está seguro que desea cambiar el hostname de confianza Matomo?", - "TrustedHostSettings": "Nombre del servidor de confianza de Matomo", - "TwoFactorAuth": "Autenticación de doble factor", - "UiDemo": "Demo UI", - "UncheckToOptOut": "Desactive esta casilla para no participar.", - "UpdateSettings": "Parámetros de actualización", - "UseCustomLogo": "Usar un logo personalizado", - "UserInviteContent": "Puede aceptar esta invitación haciendo clic en el botón aceptar a continuación.", - "UserInviteNotes": "Si no esperaba esta invitación, puede ignorar este correo electrónico. Si %1$s le envía demasiados correos electrónicos, puede bloquearlos o denunciar abusos. La invitación vence automáticamente en %2$s días.", - "UserInviteSubject": "%1$s le envió una invitación para unirse a Matomo Analytics para %2$s.", - "ValidPiwikHostname": "Nombre válido de servidor de Matomo", - "ViewAllTrackingFailures": "Ver todos los fallos de seguimiento", - "VueDescription": "Si su página web utiliza Vue.js, consulte %1$sesta guía%2$s.", - "WhatIsNew": "Qué hay de nuevo", - "WhatIsNewDoNotShowAgain": "No mostrar de nuevo", - "WhatIsNewNoChanges": "No hay nada nuevo por el momento", - "WhatIsNewNoChangesTitle": "Sin cambios recientes", - "WhatIsNewRemindMeLater": "Recuérdamelo más tarde", - "WhatIsNewTitle": "Esto es lo nuevo en Matomo", - "WhatIsNewTooltip": "Conozca las novedades de Matomo", - "WithOptionalRevenue": "con una facturación opcional", - "WordpressDescription": "Si su página web utiliza Wordpress, consulte %1$sesta guía%2$s.", - "YouAreNotOptedOut": "No está excluido.", - "YouAreOptedOut": "Actualmente está siendo excluido.", - "YouMayOptOut": "Puede escojer no tener un único número de identificación de la cookie de análisis de internet asignado a su ordenador para prevenir la agregación y el análisis de datos recogidos en este sitio de internet.", - "YouMayOptOut2": "Puede optar por evitar que este sitio web agregue y analice las acciones que realiza aquí.", - "YouMayOptOut3": "Al hacerlo, protegerá su privacidad, pero también evitará que el propietario aprenda de sus acciones y cree una mejor experiencia para usted y demás usuarios.", - "YouMayOptOutBis": "Para escoger esto, por favor haga clic debajo para recibir una cookie opt-out (para no ser seguido)." - } -} diff --git a/plugins/CoreAdminHome/lang/et.json b/plugins/CoreAdminHome/lang/et.json deleted file mode 100644 index 7f2439db1f2f387b4b4ce2cbf2a8b4ca3d19a2e3..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/et.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Lisa uus usaldusväärne host", - "Administration": "Administreerimine", - "ArchivingSettings": "Arhiveerimise seaded", - "BrandingSettings": "Brändingu seaded", - "ClickHereToOptIn": "Vajuta et lisada valikusse.", - "ClickHereToOptOut": "Vajuta et eemaldada valikust.", - "EmailServerSettings": "E-posti serveri seaded", - "FaviconUpload": "Vali Favicon, mida üles laadida", - "ForBetaTestersOnly": "Ainult beta testijatele", - "ImageTracking": "Infot koguv pilt", - "ImageTrackingLink": "Infot koguva pildifaili link", - "JSTracking_CampaignKwdParam": "Kampaania märksõna parameeter", - "JSTracking_CampaignNameParam": "Kampaania nime parameeter", - "JSTracking_EnableDoNotTrack": "Aktiveeri kliendipoolne DoNotTrack tuvastamine", - "JavaScriptTracking": "JavaScriptiga info kogumine", - "Login": "Kasutajakonto", - "LogoUpload": "Vali üleslaadimiseks Logo", - "MenuDevelopment": "Arendamine", - "MenuDiagnostic": "Diagnostika", - "MenuGeneralSettings": "Põhiseaded", - "MenuSystem": "Süsteem", - "OptOutForYourVisitors": "Matomo külastajate väljaarvamine", - "PiwikIsInstalledAt": "Matomo on paigaldatud", - "PluginSettings": "Plugina seaded", - "PluginSettingsSaveFailed": "Plugina seadete salvestamine ebaõnnestus", - "ReleaseChannel": "Vabasta kanal", - "SystemPluginSettings": "Süsteemiplugina seaded", - "TrackAGoal": "Kogu infot eesmärgi kohta", - "TrackingCode": "Jälgimiskood", - "TrustedHostSettings": "Usaldatud Matomou server", - "UpdateSettings": "Uuenda seadeid", - "UseCustomLogo": "Kasuta enda logo", - "ValidPiwikHostname": "Kehtiv Matomou server (IP/host)", - "WithOptionalRevenue": "koos valikulise tuluga", - "YouAreOptedOut": "Sa oled valikust väljas." - } -} diff --git a/plugins/CoreAdminHome/lang/eu.json b/plugins/CoreAdminHome/lang/eu.json deleted file mode 100644 index 35a76c7380dd2f90d3d212a396141d39b5372881..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/eu.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Onartu gonbidapena", - "AddNewTrustedHost": "Gehitu ostalari fidagarri berria", - "Administration": "Administrazioa", - "ArchivingSettings": "Artxibatze-ezarpenak", - "BrandingSettings": "Markaren ezarpenak", - "BruteForce": "Indar gordina", - "CheckToOptIn": "Hautatu kontrol-lauki hau onartzeko.", - "ClickHereToOptIn": "Egin klik hemen onartzeko.", - "ClickHereToOptOut": "Egin klik hemen ukatzeko.", - "CloudflareDescription": "Zure webgunea Cloudflare-n ostatatuta badago, ikusi %1$sgida hau%2$s.", - "ConfirmDeleteAllTrackingFailures": "Ziur zaude jarraipenaren huts egite guztiak ezabatu nahi dituzula?", - "ConfirmDeleteThisTrackingFailure": "Ziur zaude jarraipenaren huts egite hau ezabatu nahi duzula?", - "Cors": "CORS", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) domeinuak", - "CorsDomainsHelp": "http://adibidea.eus edo https://estatistikak.adibidea.eus bezalako domeinu edo azpi-domeinuak definitu ditzakezu. Edo edozein domeinutako eskaerak onartu * bat gehituz", - "CustomLogoFeedbackInfo": "Matomoren logoa pertsonalizatzen baduzu, baliteke goiko menuko %1$s esteka ezkutatzea ere interesatzea. Horretarako, Feedback plugina desgaitu behar duzu %2$sKudeatu pluginak%3$s orrian.", - "CustomLogoHelpText": "Erabiltzaile interfazean eta posta elektroniko bidezko txostenetan bistaratzen den Matomo logoa pertsonalizatu dezakezu.", - "DeclineInvite": "Baztertu gonbidapena", - "DeleteAllFailures": "Ezabatu akats guztiak", - "DevelopmentProcess": "Gure garapen prozesuan milaka test automatiko badaude ere, Beta probatzaileak funtsezkoak dira Matomoren \"Errorerik ez\" politikan.", - "EmailServerSettings": "Posta zerbitzariaren ezarpenak", - "ErrorEmailFromAddressNotValid": "SMTP nork helbidea ez da baliozkoa", - "FaviconUpload": "Hautatu ikono bat igotzeko", - "FileUploadDisabled": "Irudiak igotzea ez dago gaituta zure PHP konfigurazioan. Zure logo pertsonalizatua igotzeko, ezarri %s php.ini fitxategian eta berrabiarazi zure web-zerbitzaria.", - "ForBetaTestersOnly": "Beta probatzaileentzat soilik", - "GoogleTagManagerDescription": "Zure webguneak Google Tag Manager erabiltzen badu, ikusi %1$sgida hau%2$s.", - "HideAdvancedOptions": "Ezkutatu aukera aurreratuak", - "HowToGetHelp": "Laguntza lortzeko hainbat modu daude. Matomo komunitateak doako laguntza eskaintzen du, eta Matomo taldeak eta bere bazkideek ordaindutakoa. Edo behar bada errore baten berri eman nahi duzu edo ezaugarri berri bat proposatu?", - "HttpTrackingApi": "HTTP jarraipen APIa", - "HttpTrackingApiDescription": "%1$sHTTP jarraipen APIak%2$s edozein gauzaren jarraipena egiteko aukera ematen dizu. Hau baliagarria izan daiteke oraindik SDK-rik ez duen programazio lengoaia bat erabiltzen ari bazara. Erabilgarria izan daiteke baita ere gailuen edo aplikazioen jarraipena modu berezi batean egin nahi duzunean.", - "ImageTracking": "Irudi-jarraipena", - "ImageTrackingIntro1": "Bisitari batek JavaScript desgaitu duenean, edo JavaScript ezin denean erabili, irudi-jarraipeneko esteka bat erabili dezakezu bisitarien jarraipena egiteko.", - "ImageTrackingIntro2": "Sortu esteka behean eta kopiatu-itsatsi sortutako HTMLa zure orrian. JavaScript jarraipena ez dabilenean erabili nahi baduzu, %1$s etiketekin inguratu dezakezu.", - "ImageTrackingIntro3": "Irudi-jarraipen esteka batekin erabili ditzakezun aukera guztien zerrenda ikusi nahi baduzu, begiratu %1$sJarraipen APIaren dokumentazioa%2$s.", - "ImageTrackingLink": "Irudi-jarraipenaren esteka", - "ImportFromGoogleAnalytics": "Inportatu Google Analytics-etik", - "ImportFromGoogleAnalyticsDescription": "Google Analytics-eko jabetza bat baduzu eta Matomora aldatzekotan bazaude, datuak inportatu ditzakezu %1$sGoogleAnalyticsImporter%2$s plugina erabiliz.", - "ImportingServerLogsDesc": "Bisitarien jarraipena nabigatzailearen bidez (JavaScript edo irudi-esteka bat erabiliz) egitearen alternatiba bat da etengabe zerbitzariko egunkariak inportatzea. Ikasi gehiago %1$sZerbitzariko egunkari-fitxategien analitikari%2$s buruz.", - "InvalidPluginsWarning": "Ondorengo pluginak ez dira %1$s(r)ekin bateragarriak eta ezin izan dira kargatu: %2$s.", - "InvalidPluginsYouCanUninstall": "%1$sKudeatu pluginak%2$s orrian eguneratu edo desinstalatu ditzakezu plugin hauek.", - "JSTrackingDocumentationHelp": "Sarbidea errazteko behean daude aukera aurreratu ohikoenak. Oraindik aukera gehiagorako (jarraipen helburuak, aldagai pertsonalizatuak, merkataritza elektronikoko eskaerak eta utzitako saskiak barne) begiratu %1$sMatomoren JavaScript jarraipenaren dokumentazioa%2$s.", - "JSTrackingIntro1": "Hainbat modutan jarraitu ditzakezu zure webguneko bisitariak. Gomendatutako modua JavaScript bidezkoa da. Metodo hori erabiltzeko zure webguneko orri guztiek hemen sor dezakezun JavaScript kodea dutela ziurtatu behar duzu.", - "JSTrackingIntro2": "Zure webgunearentzako JavaScript jarraipen-kodea prest duzunean, kopiatu eta itsatsi Matomorekin jarraitu nahi dituzun orri guztietan.", - "JSTrackingIntro3a": "Webgune, blog, CMS eta abar gehienetan aurrez prestatutako plugin bat erabil dezakezu zuretzat lan teknikoa egin dezan. (Ikusi %1$sMatomo integratzeko pluginen gure zerrenda%2$s)", - "JSTrackingIntro3b": "Ez badago zuretzako moduko pluginik, webgunearen txantiloiak editatu eta JavaScript jarraipen-kodea gehitu dezakezu </head> etiketan. Askotan 'header.php', 'header.tpl' edo antzerako txantiloi-fitxategi batean definitzen da etiketa hori.", - "JSTrackingIntro4": "Ez baduzu JavaScript erabili nahi bisitarien jarraipena egiteko,%1$ssortu irudi-jarraipenerako esteka bat behean%2$s.", - "JSTrackingIntro5": "Orri-ikustaldien jarraipena baino gehiago egin nahi baduzu, begiratu %1$sMatomoren JavaScript bidezko jarraipenerako dokumentazioa%2$s erabilgarri dauden funtzioen zerrenda ikusteko. Funtzio horiek erabiliz beste hainbat konturen jarraipena egin dezakezu: helburuak, aldagai pertsonalizatuak, merkataritza elektronikoko eskaerak, utzitako saskiak...", - "JSTracking_CampaignKwdParam": "Kanpainaren gako-hitz parametroa", - "JSTracking_CampaignNameParam": "Kanpainaren izena parametroa", - "JSTracking_CodeNoteBeforeClosingHead": "Egin klik botoian kode-zatia kopiatzeko, eta itsatsi justu %1$s etiketa itxi aurretik (gomendatua)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Ziurtatu kode hau script elementu baten barruan dagoela zure webguneko orri guztietan. Justu head etiketa itxi aurretik itsastea gomendatzen dugu.", - "JSTracking_ConsentManagerConnected": "Dirudienez %1$s Matomorekin lan egiteko konfiguratuta dago jada.", - "JSTracking_ConsentManagerDetected": "%1$s baimen-kudeatzailea detektatu da zure webgunean. Matomo %1$s(r)ekin lan egiteko nola konfiguratu ikasteko bisitatu %2$s", - "JSTracking_ConsentManagerEmailNote": "Edo jarraipen-kodea zuzenean txertatu dezakezu zure webgunean:", - "JSTracking_CrossDomain": "Bisitariak identifikatzen dituen bisitariaren IDa nabigatzailearen lehen eskuko cookietan gordetzen da modu lehenetsian. Cookie horiek domeinu bereko orriek soilik atzitu ditzakete. Domeinu arteko estekatzea gaituz gero, bisitari zehatz baten ekintza eta orri-ikustaldi guztien jarraipena bisita bakarrean egin dezakezu, orri-ikustaldiak hainbat domeinutakoak badira ere. Erabiltzaileak zure webgunearen URL alias baten estekan klik egiten duenean pk_vid URL parametroa gehituko dio bisitariaren IDa bidaliz.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Oharra: Domeinu arteko estekatzea erabiltzeko, domeinu-izen (URL) bat baino gehiago zehaztu behar duzu zure webgunearentzat.", - "JSTracking_CustomCampaignQueryParam": "Erabili eskaerako parametro-izen pertsonalizatuak kanpainaren izenarentzat eta gako-hitzarentzat", - "JSTracking_CustomCampaignQueryParamDesc": "Oharra: %1$sMatomok automatikoki detektatuko ditu Google Analytics parametroak.%2$s", - "JSTracking_DisableCookies": "Desgaitu jarraipeneko cookie guztiak", - "JSTracking_DisableCookiesDesc": "Lehen eskuko cookie guztiak desgaitzen ditu. Webgune honentzat lehendik dauden cookie-ak hurrengo orri-ikustaldian ezabatuko dira.", - "JSTracking_EnableCrossDomainLinking": "Gaitu domeinuen artean estekatzea", - "JSTracking_EnableDoNotTrack": "Gaitu bezeroko DoNotTrack detekzioa", - "JSTracking_EnableDoNotTrackDesc": "Jarraituak izan nahi ez duten bisitariei ez zaie jarraipen-eskaerarik bidaliko.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Oharra: Zerbitzari aldeko DoNotTrack gaitu denez, aukera honek ez du eraginik izango.", - "JSTracking_EndNote": "Oharra: Jarraipen-kode pertsonalizatua sortu dezakezu administrazioko %1$sJarraipen-kodea%2$s atalean.", - "JSTracking_GroupPageTitlesByDomain": "Erantsi gunearen domeinua orriaren izenburuaren aurretik jarraipena egitean", - "JSTracking_GroupPageTitlesByDomainDesc1": "Norbaitek blog.%1$s(e)ko 'Honi buruz' orria bisitatzen badu, 'blog / Honi buruz' bezala gordeko da. Hau da zure trafikoaren azpi-domeinuaren araberako ikuspegi orokorra izateko modurik errazena.", - "JSTracking_MergeAliases": "\"Kanpo estekak\" txostenean ezkutatu honen URL alias ezagunen klik egiteak", - "JSTracking_MergeAliasesDesc": "Honela URL alias baten (adibidez %s) esteketan klik egitea ez da \"Kanpo esteka\" bezala kontatuko.", - "JSTracking_MergeSubdomains": "Egin bisitarien jarraipena honen azpi-domeinu guztietan:", - "JSTracking_MergeSubdomainsDesc": "Bisitari batek %1$s eta %2$s bisitatzen baditu, bisitari bakar bat bezala kontatuko da.", - "JSTracking_PageCustomVars": "Egin aldagai pertsonalizatu baten jarraipena orri-ikustaldi bakoitzean", - "JSTracking_PageCustomVarsDesc": "Adibidez, \"Kategoria\" aldagai-izenarekin eta \"Liburu zuriak\" balioarekin.", - "JSTracking_TrackNoScript": "Egin JavaScript desgaituta duten erabiltzaileen jarraipena", - "JSTracking_VisitorCustomVars": "Egin aldagai pertsonalizatuen jarraipena bisitari honentzat", - "JSTracking_VisitorCustomVarsDesc": "Adibidez, \"Mota\" aldagai-izenarekin eta \"Eroslea\" balioarekin.", - "JavaScriptCode": "JavaScript kodea", - "JavaScriptTracking": "JavaScript jarraipena", - "JsTrackingCodeAdvancedOptionsStep": "Hautazkoa: erabili aukera aurreratuak zure jarraipen-kodea pertsonalizatzeko.", - "JsTrackingCodeMissingEmail1": "Duela egun batzuk '%s' webgunea gehitu zenuen zure Matomo analitiketan. Egiaztatu berri dugunez zure Matomoak ez du webgune horretako trafikorik erregistratu.", - "JsTrackingCodeMissingEmail2": "Datuen jarraipena egin eta zure erabiltzaileei buruzko informazioa eskuratzen hasteko, jarraipena konfiguratu behar duzu zure webgunean edo mugikorreko aplikazioan. Webguneen kasuan nahikoa da jarraipen-kodea gehitzea justu %s etiketaren aurretik.", - "JsTrackingCodeMissingEmail3": "Zure jarraipen-kodea aurkitu eta pertsonalizatzeko, %1$segin klik hemen%2$s (edo begiratu %3$sJavaScript jarraipen bezeroaren gida%4$s).", - "LearnMore": "Ikasi gehiago", - "Login": "Saio-hasiera", - "LogoNotWriteableInstruction": "Matomoren logo lehenetsiaren ordez zure logo pertsonalizatua erabiltzeko, eman idazteko baimenak direktorio honi: %1$s Matomok idazteko baimena behar du %2$s fitxategietan gordetako zure logoentzat.", - "LogoUpload": "Hautatu logo bat igotzeko", - "LogoUploadFailed": "Igotako fitxategia ezin izan da prozesatu. Egiaztatu fitxategiak baliozko formatua duen.", - "LogoUploadHelp": "Igo fitxategi bat %1$s formatuetan gutxienez %2$s pixeleko altuerarekin.", - "LtsReleases": "LTS (epe luzeko euskarria) bertsioek segurtasun eguneratzeak eta errore-zuzenketak soilik jasotzen dituzte.", - "MenuDevelopment": "Garapena", - "MenuDiagnostic": "Diagnostikoa", - "MenuGeneralSettings": "Ezarpen orokorrak", - "MenuMeasurables": "Neurgarriak", - "MenuSystem": "Sistema", - "MissingTrackingCodeEmailSubject": "Ez dago trafikorik erregistratu %s(r)entzat Matomo analitiketan, hasi erabiltzen orain", - "NTrackingFailures": "%s jarraipen hutsegite", - "NeedHelp": "Laguntza behar?", - "NoKnownFailures": "Ez dago jarraipen hutsegite ezagunik.", - "OptOutComplete": "Ukatzea osatu da; web analitika tresnak ez ditu erregistratuko webgune honetako zure bisitak.", - "OptOutCompleteBis": "Kontuan izan berriz gauzatu beharko uko egiteko prozedura hauetako bat egiten baduzu: zure cookieak garbitu, ukatzeko cookiea ezabatu edo ordenagailua edo web nabigatzailea aldatu.", - "OptOutCustomOptOutLink": "Uko egiteko formulario guztiz pertsonalizatua ere sor dezakezu HTML eta JavaScript erabiliz, garatzaileentzeko %1$sgida%2$s honetan azaltzen den bezala.", - "OptOutDntFound": "Ez zaizu jarraipenik egiten, zure nabigatzaileak ez duzula nahi jakinarazi duelako. Hori zure nabigatzaileko ezarpen bat da, beraz ezingo duzu onartu 'Do Not Track' (\"Ez jarraitu\") ezaugarria desgaitzen duzun arte.", - "OptOutErrorNoCookies": "Jarraipenari uko egiteko ezaugarriak cookieak gaituta egotea eskatzen du.", - "OptOutErrorNoTracker": "Jarraipenari uko egiteko ezaugarriak ezin izan du Matomoren jarraipen-kodea aurkitu orri honetan", - "OptOutErrorNotHttps": "Baliteke jarraipenari uko egiteko ezaugarriak ez funtzionatzea, gune hau ez delako HTTPS bidez kargatu. Kargatu orria berriro, zure uko egitearen egoera aldatu den ikusteko.", - "OptOutErrorWindowOpen": "Baliteke jarraipenari uko egiteko ezaugarriak ez funtzionatzea, dirudienez uko egiteko laster-leihoa blokeatua izan delako. Kargatu orria berriro, zure uko egitearen egoera aldatu den ikusteko.", - "OptOutExplanation": "Matomok Interneten pribatutasuna eskaintzeko helburua du. Zure bisitariei Matomo web-analitikei uko egiteko aukera emateko, ondorengo HTML kodea gehitu dezakezu zure webguneko orri batean, adibidez pribatutasun-gidalerroen orrian.", - "OptOutExplanationIntro": "Kode honek Matomori uko egiteko esteka bat eskainiko die zure bisitariei div batean. Estekan klik egitean uko egiteko cookie bat ezarriko da haien web zerbitzarian. Ikusi behean (edo %1$segin klik hemen%2$s) div-ean bistaratuko den edukia ikusteko.", - "OptOutForYourVisitors": "Matomori uko egitea zure bisitarientzat", - "OptingYouOut": "Uko egiten, itxaron mesedez…", - "PersonalPluginSettings": "Pluginen ezarpen pertsonalak", - "PiwikIsInstalledAt": "Matomo hemen instalatuta dago", - "PluginSettingChangeNotAllowed": "Ez duzu baimenik \"%2$s\" plugineko \"%1$s\" ezarpenaren balioa aldatzeko", - "PluginSettingReadNotAllowed": "Ez duzu baimenik \"%2$s\" plugineko \"%1$s\" ezarpenaren balioa irakurtzeko", - "PluginSettings": "Plugin ezarpenak", - "PluginSettingsIntro": "Hemen alda ditzakezu ondorengo hirugarrenen pluginen ezarpenak:", - "PluginSettingsSaveFailed": "Ezin izan dira pluginaren ezarpenak gorde", - "PluginSettingsSaveSuccess": "Pluginaren ezarpenak eguneratu dira.", - "PluginSettingsValueNotAllowed": "\"%2$s\" pluginaren \"%1$s\" eremuko balioa ez da onartzen", - "Problem": "Arazoa", - "ProtocolNotDetectedCorrectly": "Une honetan Matomo SSL konexio seguru (HTTPS erabiliz) bidez ikusten ari zara, baina Matomok zure zerbitzarirako konexio ez-segurua soilik detektatu du.", - "ProtocolNotDetectedCorrectlySolution": "Matomok edukia HTTPS bidez eskatu eta zerbitzatzen duela ziurtatzeko, zure %1$s fitxategia editatu dezakezu. Bi aukera dituzu: zure proxy ezarpenak konfiguratzea edo %2$s lerroa gehitzea %3$s atalean. %4$sIkasi gehiago%5$s", - "ReactDescription": "Zure webguneak React erabiltzen badu, ikusi %1$sgida hau%2$s.", - "ReleaseChannel": "Argitalpen kanala", - "SecurityNotificationAllTokenAuthDeletedBody": "Norbaitek zure kontuaren baimen-token guztiak ezabatu ditu.", - "SecurityNotificationAnonymousAccessEnabledBody": "Norbaitek sarbide anonimoa gaitu du hona: %1$s. Horrek esan nahi du gune honen datuak publikoki ikusgai daudela. Ez bada arazoa, ez ikusia egin posta elektroniko honi.", - "SecurityNotificationCheckTwoFactor": "Egiaztatu zure bi faktoreko autentifikaziorako aplikazioa edo gailua.", - "SecurityNotificationEmailSubject": "Segurtasun jakinarazpena", - "SecurityNotificationIfItWasYou": "Zu izan bazara, jarritu. Ez baduzu ekintza hau ezagutzen, mesedez, berrezarri zure pasahitza.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Norbaitek bi faktoreko autentifikazioaren berreskuratze-kode berriak sortu ditu zure kontuarentzat.", - "SecurityNotificationRecoveryCodesShowedBody": "Norbaitek zure kontuaren bi faktoreko autentifikazio kodeak ikusi ditu.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Beste super erabiltzaile batek (%1$s) sistemaren ezarpenak aldatu ditu. Eragindako ezarpenak: %2$s. Aktibitate honen berri bazenuen, ez egin kasurik. Bestela jarri beste super erabiltzaileekin harremanetan.", - "SecurityNotificationSettingsChangedByUserBody": "Norbaitek sistemaren ezarpenak aldatu ditu. Eragindako ezarpenak: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Norbaitek zure kontuan baimen-token bat sortu du (deskribapena: %s). Ez bazinen zu, ezabatu tokena.", - "SecurityNotificationTokenAuthDeletedBody": "Norbaitek zure kontuko baimen-token bat ezabatu du (deskribapena: %s).", - "SecurityNotificationTwoFactorAuthDisabledBody": "Norbaitek zure kontuaren bi faktoreko autentifikazioa desgaitu du.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Norbaitek zure kontuaren bi faktoreko autentifikazioa gaitu du.", - "SecurityNotificationUserAcceptInviteBody": "Erabiltzaileak (saio-hasiera: %s) gonbidapena onartu du.", - "SecurityNotificationUserCreatedBody": "Norbaitek zure kontuan erabiltzaile berria sortu du (erabiltzaile-izena: %s).", - "SecurityNotificationUserDeclinedInviteBody": "Erabiltzaileak (saio-hasiera: %s) gonbidapena baztertu du.", - "SecurityNotificationUserDeletedBody": "Norbaitek zure kontuan erabiltzaile bat ezabatu du (erabiltzaile-izena: %s).", - "SendPluginUpdateCommunication": "Bidali e-posta bat plugin baten eguneratzea eskuragarri dagoenean", - "SendPluginUpdateCommunicationHelp": "E-posta bat bidaliko zaie super erabiltzaileei plugin baten bertsio berri bat eskuragarri dagoenean.", - "SettingsSaveSuccess": "Ezarpenak eguneratuta.", - "ShowAdvancedOptions": "Erakutsi aukera aurreratuak", - "SinglePageApplicationDescription": "Orri bakarreko aplikazio (SPA) baten edo web aplikazio progresibo (PWA) baten jarraipena egiten ari bazara, ikusi %1$sgida hau%2$s.", - "Solution": "Irtenbidea", - "StableReleases": "Matomo ezinbestekoa bada zure negoziorako , azken argitalpen egonkorra erabiltzea gomendatzen dizugu. Azken beta erabiltzen baduzu eta errore baten berri eman edo iradokizun bat egin nahi baduzu, %1$sbegiratu hemen%2$s.", - "SystemPluginSettings": "Sistemaren plugin ezarpenak", - "TrackAGoal": "Jarraitu helburu bat", - "TrackingCode": "Jarraipen kodea", - "TrackingCodeIntro": "Hainbat modutan gehitu dezakezu Matomoren jarraipen-kodea zure webgunean, mugikorreko aplikazioan, edo baita edozein gailu edo aplikaziotan ere.", - "TrackingFailureAuthenticationProblem": "Eskaera ez zegoen autentifikatuta, baina autentifikazioa beharrezkoa zen.", - "TrackingFailureAuthenticationSolution": "Ezarri edo zuzendu \"token_auth\" bat zure jarraipen-eskaeran.", - "TrackingFailureInvalidSiteProblem": "Gunea ez da existitzen.", - "TrackingFailureInvalidSiteSolution": "Eguneratu aztarnarian konfiguratutako idSite.", - "TrackingFailures": "Jarraipen-hutsegiteak", - "TrackingFailuresEmail1": "Azken egunetan %s jarraipen-hutsegite mota gertatu direla jakinarazteko da hau.", - "TrackingFailuresEmail2": "Huts egindako jarraipen-eskaera guztiak ikusteko %1$segin klik hemen%2$s.", - "TrackingFailuresEmailSubject": "Zure Matomo Analytics-eko jarraipen-hutsegiteak", - "TrackingFailuresIntroduction": "Orri honetan azken %s egunetan gertatutako jarraipen-hutsegiteak zerrendatzen dira. Kontuan izan jarraipen-hutsegite mota ohikoenak soilik erregistratzen direla, ez guztiak.", - "TrackingURL": "Jarraipen URLa", - "TrustedHostConfirm": "Ziur zaude Matomoren ostalari-izen fidagarria aldatu nahi duzula?", - "TrustedHostSettings": "Matomo ostalari-izen fidagarria", - "TwoFactorAuth": "Bi faktoreko autorizazioa", - "UiDemo": "UI demoa", - "UncheckToOptOut": "Desautatu kontrol-lauki hau uko egiteko.", - "UpdateSettings": "Eguneratu ezarpenak", - "UseCustomLogo": "Erabili logo pertsonalizatua", - "UserInviteContent": "Gonbidapena onartu dezakezu beheko onartu botoian klik eginez.", - "UserInviteNotes": "Gonbidapen hau ez bazenuen espero, ez ikusia egin diezaiokezu posta honi. %1$s(e)k posta gehiegi bidaltzen badizkizu, blokeatu edo salatu dezakezu. Gonbidapena automatikoki iraungitzen da %2$s egun igarotzean.", - "UserInviteSubject": "%1$s(e)k gonbidapen bat bidali dizu %2$s(r)en Matomo analitiketara batzeko.", - "ValidPiwikHostname": "Baliozko Matomo ostalari-izena", - "ViewAllTrackingFailures": "Ikusi jarraipen huts egite guztiak", - "VueDescription": "Zure webguneak Vue.js erabiltzen badu, ikusi %1$sgida hau%2$s.", - "WhatIsNew": "Zer berri", - "WhatIsNewDoNotShowAgain": "Ez erakutsi berriro", - "WhatIsNewNoChanges": "Ez dago ezer berririk une honetan", - "WhatIsNewNoChangesTitle": "Duela gutxiko aldaketarik ez", - "WhatIsNewRemindMeLater": "Gogorarazi geroago", - "WhatIsNewTitle": "Hemen daude Matomoren berritasunak", - "WhatIsNewTooltip": "Ikasi zer berritasun dauden Matomon", - "WithOptionalRevenue": "hautazko diru-sarrerarekin", - "WordpressDescription": "Zure webguneak Wordpress erabiltzen badu, ikusi %1$sgida hau%2$s.", - "YouAreNotOptedOut": "Ez duzu uko egin.", - "YouAreOptedOut": "Une honetan uko eginda zaude.", - "YouMayOptOut": "Nahi izanez gero uko egin diezaiokezu zure ordenagailuari web-analitiken zenbaki identifikatzaile bakarra duen cookie bat esleitzeari, webgune honetan bildutako datuen agregazioa eta analisia saihesteko.", - "YouMayOptOut2": "Webgune honetan egiten dituzun ekintzak ez agregatu eta analizatzea aukeratu dezakezu.", - "YouMayOptOut3": "Hori eginda zure pribatutasuna hobetuko da, baina gunearen jabeak ezingo du zure ekintzetatik ikasi, eta zuretzat eta beste erabiltzaileentzat esperientzia hobe bat sortu.", - "YouMayOptOutBis": "Aukera hau egiteko, egin klik behean uko egiteko cookie bat jasotzeko." - } -} diff --git a/plugins/CoreAdminHome/lang/fa.json b/plugins/CoreAdminHome/lang/fa.json deleted file mode 100644 index 979b324128b3595ce1db141f8c57548f387f1264..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/fa.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "افزودن میزبان مورد اعتماد جدید", - "Administration": "مدیریت", - "ArchivingSettings": "تنظیمات بایگانی", - "BrandingSettings": "تنظیمات نام تجاری", - "CheckToOptIn": "برای شرکت تیک بزنید.", - "ClickHereToOptIn": "اینجا را کلیک کنید تا انتخاب شوید.", - "ClickHereToOptOut": "اینجا را کلیک کنید تا انتخاب کردن.", - "ConfirmDeleteAllTrackingFailures": "آیا از پاک کردن همه‌ی خطاهای ردیابی اطمینان دارید؟", - "ConfirmDeleteThisTrackingFailure": "آیا از پاک کردن این خطای ردیابی اطمینان دارید؟", - "CorsDomains": "دامنه‌های اشتراک‌گذاری منبع متقابل (CORS)", - "CorsDomainsHelp": "شما می‌تواند دامنه و زیردامنه‌هایی مانند http://example.com یا http://stats.example.com را تعریف کنید. و یا برای اجازه به درخواست عبور از دامنه برای همه‌ی دامنه‌ها، افزودن * کافیست.", - "CustomLogoFeedbackInfo": "اگر شما آرم پیویک را سفارشی کنید , شاید برایتان جالب باشد که لینک %1$s را در منوی بالایی پنهان کنید.برای این کار شما می توانید افزونه ی بازخورد را در صفحه %2$sمدیریت افزونه ها%3$s غیرفعال کنید.", - "CustomLogoHelpText": "شما می توانید آرم Matomo سفارشی است که در رابط کاربری و گزارش پست الکترونیک نمایش داده خواهد شد.", - "DeleteAllFailures": "پاک کردن همه‌ی خطاها", - "DevelopmentProcess": "در حالی که روند توسعه ما شامل هزاران تست خودکار است، تست‌کننده‌های بتا نقش کلیدی در کسب «سیاست بدون باگ» Matomo ایفا می‌کنند.", - "EmailServerSettings": "تنظیمات میل سرور", - "FaviconUpload": "یک Favicon انتخاب کنید تا آپلود شود.", - "FileUploadDisabled": "بارگزاری فایل‌ها در تنظیمات PHP شما فعال نیست. برای بارگزاری لوگوی سفارشی، لطفا %s را در php.in ست کرده و وب‌سرور خود را دوباره راه‌اندازی کنید.", - "ForBetaTestersOnly": "فقط برای استفاده کنندهای موقطی", - "HttpTrackingApi": "API ردیابی HTTP", - "HttpTrackingApiDescription": "%1$sAPI ردیابی HTTP%2$s به شما اجازه‌ی ردیابی هر چیزی را می‌دهد. این در زمانی مفید واقع می‌شود که از زبان برنامه‌‌نویسی‌ای استفاده می‌کنید که SDK ندارد. همچنین زمانی که می‌خواهید دستگاه‌ها و اپلیکیشن‌ها را به صورت خاص ردیابی کنید.", - "ImageTracking": "ردیابی تصویر", - "ImageTrackingIntro1": "زمانی که مشاهده کنندگان جاوا اسکریپت رو غیر فعال کنند , یا از جاوا اسکریپت استفاده نکنند , شما میتونید از عکس اسفاده کنید و لینک را به یازدید کننده بدهید.", - "ImageTrackingIntro2": "لینک زیر را تولید کنید و HTML تولید شده را در صفحه کپی-پیست کنید. اگر از fallback برای ردیاب JavaScript خود استفاده می‌کنید، می‌توانید آن را در تگ %1$s قرار دهید.", - "ImageTrackingIntro3": "برای همه‌ی گزینه‌های لیست می‌توانید از لینک ردیاب تصویری استفاده کنید، در این خصوص %1$sمستندات API ردیاب%2$s را مطالعه کنید.", - "ImageTrackingLink": "لینک ردیابی تصویر", - "ImportingServerLogsDesc": "جایگزینی برای ردیابی بازدیدکننده از طریق مرورگر (با JavaScript یا لینک تصویر) وارد کردن مداوم لاگ‌های سرور است. درباره‌ی %1$sداده‌های تحلیلی فایل لاگ سرور%2$s بیشتر بخوانید.", - "InvalidPluginsWarning": "پلاگین های زیر سازگار نیستند با %1$s و نمی توانند لود شوند: %2$s.", - "InvalidPluginsYouCanUninstall": "شما می‌توانید این افزونه‌ها را در صفحه‌ی %1$sمدیریت افزونه‌ها%2$s بروزرسانی و یا حذف کنید.", - "JSTrackingIntro1": "شما می‌توانید بازدیدکنندگان وبسایت خود را با روش‌های مختلفی ردیابی کنید. روش پیشنهادی استفاده از JavaScript است. برای استفاده از این روش شما باید مطمئن شوید که همه صفحات وبسایت شما از کد JavaScript که اینجا ساخته‌اید، استفاده می‌کنند.", - "JSTrackingIntro2": "یک بار که شما از کد ردیابی جاوااسکریپت استفاده کنید, ان را کپی کرده و در تمام صفحاتی که دوست دارید ردیابی بشود بچسبانید.", - "JSTrackingIntro4": "اگر مایل به استفاده از JavaScript برای دنبال‌کردن بازدیدکننده‌ها نیستید، %1$sلینک دنبال‌کننده تصویری ایجاد کنید%2$s.", - "JSTrackingIntro5": "اگر مایل به انجام کاری بیش از دنبال کردن بازدید صفحات دارید، %1$sمستندات دنبال‌کننده JavaScript Matomo%2$s را برای مشاهده‌ی توابع در دسترس ببینید. با استفاده از این توابع می‌توانید هدف‌ها، متغیر‌های سفارشی، سفارشات خرید، سبد خرید رها شده و… را دنبال کنید.", - "JSTracking_CampaignKwdParam": "کمپین پارامتر کلید واژه", - "JSTracking_CampaignNameParam": "کمپین اسم کلید واژه", - "JSTracking_CodeNoteBeforeClosingHead": "اطمینان پیدا کنید که این کد در همه‌ی صفحات وبسایت شما وجود دارد. ما توصیه می‌کنیم که آن را دقیقا قبل از برچسب بستن %1$s پیست کنید.", - "JSTracking_CrossDomain": "به صورت پیشفرض، آی‌دی بازدیدکننده که بازدیدکننده خاص را مشخص می‌کند در کوکی مرورگر شخص اول ذخیره می‌شود که تنها از طریق صفحاتی از همان دامنه در دسترس است. فعال کردن پیوند دامنه متقابل به شما اجازه‌ی ردیابی تمامی فعالیت‌ها و نمایش صفحات یک بازدیدکننده خاص را در یک بازدید حتی در زمان مشاهده‌ی دامنه‌های متعدد را می‌دهد. هر وقت کاربر روی لینک یکی از آدرس‌های مستعار وبسایت شما کلیک کند، پارامتر pk_vid آدرس را برای آی‌دی ویزیتور اضافه می‌کند.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "نکته: برای استفاده از پیوند دامنه متقابل، باید بیش از یک (آدرس) نام دامنه را برای وبسایت خود تعیین کنید.", - "JSTracking_CustomCampaignQueryParam": "از پارامتر اسمی مختلفی در کمپین اسم و کلید واژه های خود استفاده کنید .", - "JSTracking_CustomCampaignQueryParamDesc": "تذکر : %1$sپیویک اتوماتیک پارامتر گوگل انالتیک را در وبسایت شما پیدا کرد .%2$s", - "JSTracking_DisableCookies": "غیرفعال کردن همه‌ی کوکی‌های ردیابی", - "JSTracking_DisableCookiesDesc": "تمامی کوکی‌های شخص اول را غیرفعال می‌کند. کوکی‌های Matomo موجود برای این وبسایت در بازدید صفحه بعدی حذف خواهند شد.", - "JSTracking_EnableCrossDomainLinking": "ارتباط بین دامنه‌ای را فعال می‌کند", - "JSTracking_EnableDoNotTrack": "فعال کردن ردیابی نکردن توسط استفاده کننده.", - "JSTracking_EnableDoNotTrackDesc": "ردیابی کردن درخواست شما ارسال نشد , اگر بازدید کنندگان شما این را دوست ندارند .", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "تذکر: سرور شما قسمت ردیابی نکردن را فعال کرد , این مزیت هیچ اثری بر شما نمیگزارد.", - "JSTracking_EndNote": "نکته: شما می‌توانید کد ردیابی سفارشی را در بخش %1$sکد ردیابی%2$s بخش مدیریت، ایجاد کنید.", - "JSTracking_GroupPageTitlesByDomain": "دامنه سایت شما در تیتر وبسایت قابل ردیابی است.", - "JSTracking_GroupPageTitlesByDomainDesc1": "بنابر این اگر کسی از صفحه‌‌ی 'About' در وبلاگ بازدید کند.%1$s به صورت 'blog / About' ثبت خواهد شد. این راحت‌ترین راه برای بررسی اجمالی ترافیک زیردامنه است.", - "JSTracking_MergeAliases": "در گزارش لینک های 'خروجی' , قسمت درباره ی لینک را نمایش نده.", - "JSTracking_MergeAliasesDesc": "پس از کلیک بر روی لینک ها با نام مستعار URL ها (به عنوان مثال%s) خواهد عنوان \"لینک خروجی\" شمارش نمی شود.", - "JSTracking_MergeSubdomains": "ردیابی کنید تمام بازدید کنندگان لینک های زیر مجموعه سایت .", - "JSTracking_MergeSubdomainsDesc": "یعنی اگر بازدیدکننده از %1$s و %2$s بازدید کند، به عنوان یک بازدیدکننده شمرده خواهد شد.", - "JSTracking_PageCustomVars": "ردیابی متغییر های سفارشی یرای هر صفحه", - "JSTracking_PageCustomVarsDesc": "برای مثال : با متغییر دسته بندی و متغییر کاغذ سفید", - "JSTracking_TrackNoScript": "دنبال کردن کاربران با JavaScript غیرفعال", - "JSTracking_VisitorCustomVars": "ردیابی متغییر های سفارشی برای هر بازدید کننده", - "JSTracking_VisitorCustomVarsDesc": "برای مثال : با متغییر نوع و متغییر خریدار", - "JavaScriptTracking": "ردیابی جاوااسکریپت", - "JsTrackingCodeMissingEmail1": "چند روز پیش شما وبسایت '%s' را به داده‌های تحلیلی Matomo خود اضافه کردید. ما بررسی کردیم و Matomo شما هیچ ترافیکی برای این وبسایت ثبت نکرده است.", - "JsTrackingCodeMissingEmail2": "برای شروع داده‌های ردیابی و فهم کاربران خود، نیاز به راه‌اندازی ردیابی بر روی وبسایت یا اپ موبایل خود دارید. برای وبسایت‌ها به راحتی کد ردیابی را قبل از برچسب %s قرار دهید.", - "JsTrackingCodeMissingEmail3": "برای سفارشی‌سازی بیشتر کد ردیابی خود، %1$sاینجا را کلیک کنید%2$s (یا %3$sراهنمای ردیابی JavaScript%4$s را مشاهده کنید).", - "LearnMore": "اطلاعات بیشتر", - "Login": "نام کاربری", - "LogoNotWriteableInstruction": "برای استفاده از لوگوی سفارشی به جای لوگوی پیشفرض Matomo، اجازه‌ی نوشتن را در دایرکتوری %1$s را بدهید. Matomo برای ذخیره لوگوها در %2$s نیاز به دسترسی نوشتن دارد.", - "LogoUpload": "انتخاب آرم برای آپلود", - "LogoUploadFailed": "فایل بارگزاری شده قابل پردازش نیست. لطفا صحت فرمت فایل را بررسی کنید.", - "LogoUploadHelp": "لطفا فایل را با فرمت %1$s و با حداقل ارتفاع %2$s پیکسل بارگزاری کنید.", - "LtsReleases": "نسخه‌های پشتیبانی بلند مدت (TLS) تنها شامل رفع باگ‌ها و مشکلات امنیتی هستند.", - "MenuDevelopment": "توسعه", - "MenuDiagnostic": "برشناختی", - "MenuGeneralSettings": "تنظیمات عمومی", - "MenuMeasurables": "قابل اندازه گیری ها", - "MenuSystem": "سیستم", - "MissingTrackingCodeEmailSubject": "هیچ ترافیکی برای %s در داده‌های تحلیلی Matomo ثبت نشده است، الآن شروع کنید", - "NTrackingFailures": "%s خطای ردیابی", - "NoKnownFailures": "هیچ خطای ردیابی شناخته شده‌ای وجود ندارد.", - "OptOutComplete": "انتخاب کردن در خارج کامل بازدیدکننده داشته است خود را به این وب سایت توسط وب ابزار تجزیه و تحلیل می شود ثبت نخواهد شد.", - "OptOutCompleteBis": "توجه داشته باشید که اگر کوکی های خود را به شما روشن، حذف بخش از کوکی برای نگهداری اطلاعات استفاده از انتخاب کردن، و یا اگر شما تغییر کامپیوتر و یا مرورگر وب، شما نیاز به انجام دوباره روش انتخاب کردن.", - "OptOutDntFound": "شما دنبال نمی‌شوید زیرا مرورگر شما نشان می‌دهد که مایل به دنبال شدن نیستید. این به دلیل تنظیمات مرورگر شماست و تا ویژگی 'Do Not Track' را غیرفعال نکنید، ردیابی نخواهید شد.", - "OptOutExplanation": "Matomo به ارائه حریم خصوصی در اینترنت اختصاص داده شده است. به منظور ارائه به بازدید کنندگان خود را با انتخاب از امید بستن به خارج از تجزیه و تحلیل وب سایت Matomo، شما می توانید از کد HTML زیر را در یک صفحه وب سایت خود را اضافه کنید، برای مثال در یک صفحه سیاست حفظ حریم خصوصی است.", - "OptOutExplanationIntro": "این کد در یک iframe حاوی لینک برای بازدیدکننده‌ها برای رد کردن Matomo با تنظیم کردن کوکی رد کردن در مرورگر، نمایش خواهد داد. اینجا را ببینید (یا %1$sاینجا را کلیک کنید%2$s) تا محتوای iFrame را مشاهده کنید.", - "OptOutForYourVisitors": "Matomo انتخاب کردن را برای بازدید کنندگان خود را", - "OptingYouOut": "در حال انصراف، لطفا صبر کنید…", - "PersonalPluginSettings": "تنظیمات افزونه شخصی", - "PiwikIsInstalledAt": "پیویک در این مسیر نصب شد", - "PluginSettingChangeNotAllowed": "شما مجاز به تغییر مقدار \"%1$s\" در پلاگین \"%2$s\" نیستید.", - "PluginSettingReadNotAllowed": "شما مجاز به خواندن مقدار تنظیمات \"%1$s\" در افزونه \"%2$s\" نیستید.", - "PluginSettings": "تنظیمات افزونه", - "PluginSettingsIntro": "در اینجا شما می توانید تغییراتی در تنظیمات پلاگین های زیر انجام دهید :", - "PluginSettingsSaveFailed": "خطا در ذخیره‌ی تنظیمات افزونه", - "PluginSettingsSaveSuccess": "تنظیمات افزونه به‌روزرسانی شد.", - "PluginSettingsValueNotAllowed": "مقدار این رشته \"%1$s\" در پلاگین \"%2$s\" مورد قبول نیست", - "Problem": "مشکل", - "ProtocolNotDetectedCorrectly": "در حال حاضر Matomo را با ارتباط SSL ایمن (با استفاده از https) مشاهده می‌کنید، اما Matomo تنها قادر به شناسایی ارتباط غیرایمن بر روی سرور است.", - "ProtocolNotDetectedCorrectlySolution": "برای اطمینان از اینکه Matomo به صورت ایمن درخواست می‌دهد و اطلاعات را تحت HTTPS ارائه می‌کند، می‌توانید %1$sفایل و تنظیمات پروکسی خود را ویرایش کنید، و یا می‌توانید این کار را با افزودن خط %2$s زیر قسمت %3$s انجام دهید. %4$sبیشتر بدانید%5$s", - "ReleaseChannel": "کانال انتشار", - "SendPluginUpdateCommunication": "در صورت به‌‌روزرسانی افزونه، ایمیل بفرست.", - "SendPluginUpdateCommunicationHelp": "یک ایمیل به کاربران با دسترسی مدیر ارشد در صورت وجود نسخه جدید افزونه ارسال خواهد شد.", - "SettingsSaveSuccess": "تنظیمات به‌روزرسانی شدند.", - "Solution": "راه حل", - "StableReleases": "اگر پیویک قسمتی ار تجارت شماست , ما به شما پیشنهاد میکنیم از اخرین نسخه نهایی ان استفاده کنید .اگر شما از نسخه بتا استفاده میکنید و اگر باگ پیدا کردید یا همانند این , لطفا %1$s اینجا را ببینید %2$s", - "SystemPluginSettings": "تنظیمات افزونه سیستم", - "TrackAGoal": "به دنبال یک هدف", - "TrackingCode": "کد ردیابی", - "TrackingCodeIntro": "Matomo راه‌های مختلفی برای جاسازی کد ردیابی برای وبسایت، اپ موبایل و هر دستگاه و برنامه دیگر ارائه می‌دهد.", - "TrackingFailureAuthenticationProblem": "درخواست معتبر نبود اما نیاز به تائید اعتبار وجود داشت.", - "TrackingFailureAuthenticationSolution": "'token_auth' صحیح را برای درخواست ردیابی خود تنظیم کنید.", - "TrackingFailureInvalidSiteProblem": "سایت وجود ندارد.", - "TrackingFailureInvalidSiteSolution": "idSite تنظیم‌شده در ردیاب را به‌روزرسانی کنید.", - "TrackingFailures": "خطاهای دنبال‌کردن", - "TrackingFailuresEmail1": "این برای اطلاع از وجود %s نوع مختلف از خطاهای ردیابی است که در روزهای اخیر رخ داده است.", - "TrackingFailuresEmail2": "برای مشاهده‌ی همه‌ی خطاهای درخواست ردیابی %1$sاینجا را کلیک کنید%2$s.", - "TrackingFailuresEmailSubject": "خطاهای ردیابی در داده‌های تحلیلی Matomo شما", - "TrackingFailuresIntroduction": "این صفحه شامل خطاهای ردیابی در %s روز اخیر است. لطفا توجه کنید که متداول‌ترین خطاها ثبت شده‌اند، نه همه‌ی آن‌ها.", - "TrackingURL": "آدرس ردیابی", - "TrustedHostConfirm": "آیا از تغییر نام هاست مورد اعتماد پیویک اطمینان دارید؟", - "TrustedHostSettings": "نام هاست مورد اعتماد پیویک", - "UiDemo": "نسخه نمایشی UI", - "UncheckToOptOut": "برای انصراف تیک را بردارید.", - "UpdateSettings": "به‌روزرسانی تنظیمات", - "UseCustomLogo": "استفاده از آرم های سفارشی", - "ValidPiwikHostname": "نام هاست", - "ViewAllTrackingFailures": "مشاهده‌ی همه خطاهای ردیابی", - "WithOptionalRevenue": "با درآمد اختیاری", - "YouAreNotOptedOut": "شما انصراف نداده‌اید.", - "YouAreOptedOut": "شما در حال حاضر تصمیم گرفتند.", - "YouMayOptOut": "شما می توانید به تجزیه و تحلیل ترافیک وب منحصر به فرد کوکی برای نگهداری اطلاعات استفاده می شماره شناسایی اختصاص داده شده را به کامپیوتر خود را برای جلوگیری از تجمع و تجزیه و تحلیل داده های جمع آوری شده در این وب سایت نیست.", - "YouMayOptOut2": "شما می‌توانید مانع جمع آوری و تحلیل فعالیت خود در اینجا توسط این وبسایت شوید.", - "YouMayOptOut3": "انجام این کار از حریم خصوصی شما محافظت می‌کند ولی مانع یادگیری فعالیت شما توسط صاحب سایت برای ساخت تجربه بهتر برای شما و دیگر کاربران می‌شود.", - "YouMayOptOutBis": "برای این انتخاب، لطفا از زیر انتخاب کردن از کوکی برای نگهداری اطلاعات استفاده برای دریافت را کلیک کنید." - } -} diff --git a/plugins/CoreAdminHome/lang/fi.json b/plugins/CoreAdminHome/lang/fi.json deleted file mode 100644 index 1bfc1de65a5429cea5161dd2fcf99f6ac61fa947..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/fi.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Hyväksy kutsu", - "AddNewTrustedHost": "Lisää uusi luotettu palvelin", - "Administration": "Ylläpito", - "ArchivingSettings": "Arkistointiasetukset", - "BrandingSettings": "Käyttöliittymän muokkaaminen", - "BruteForce": "Murtovoimahyökkäys", - "CheckToOptIn": "Lisää valinta osallistuaksesi seurantaan.", - "ClickHereToOptIn": "Klikkaa tästä, jos haluat mukaan seurantaan.", - "ClickHereToOptOut": "Klikkaa tästä poistuaksesi seurannasta.", - "CloudflareDescription": "Jos verkkosivustosi on Cloudflaressa, tutustu %1$stähän ohjeeseen%2$s.", - "ConfirmDeleteAllTrackingFailures": "Haluatko varmasti poistaa kaikki virhetiedot?", - "ConfirmDeleteThisTrackingFailure": "Haluat varmasti poistaa tämän virhetiedon?", - "Cors": "Cors", - "CorsDomains": "CORS (Cross-Origin Resource Sharing)-verkkotunnukset", - "CorsDomainsHelp": "Voit määrittää toimialueita tai alitoimialueita, kuten https://esimerkki.com tai https://tilastot.esimerkki.com. Tai salliaksesi toimialueiden väliset pyynnöt kaikille toimialueille lisäämällä \"*\"", - "CustomLogoFeedbackInfo": "Jos haluat muokata Matomon logoa, voit myös piilottaa %1$s linkin ylävalikosta. Piilottaminen tapahtuu poistamalla Palaute-liitännäinen %2$s Hallitse liitinnäisiä %3$s -sivulta.", - "CustomLogoHelpText": "Voit vaihtaa Matomon logoa, joka näytetään käyttöliittymässä ja sähköpostiraporteissa.", - "DeclineInvite": "Kieltäydy kutsusta", - "DeleteAllFailures": "Poista kaikki virhetiedot", - "DevelopmentProcess": "Vaikka kehitysprosessimme sisältääkin tuhansia automaattisia testejä, ovat beta-testaajamme avainasemassa, jotta pääsemme \"Ei bugeja\"-tavoitteeseemme.", - "EmailServerSettings": "Sähköpostipalvelimen asetukset", - "ErrorEmailFromAddressNotValid": "SMTP:n From-osoite ei ole kelvollinen", - "FaviconUpload": "Valitse lähetettävä ikoni", - "FileUploadDisabled": "Tiedostojen lähettämistä ei ole sallittu PHP-asetuksissasi. Vaihda %s php.ini:ssä ja käynnistä web-serverisi uudelleen ensin.", - "ForBetaTestersOnly": "Vain beta-testaajille", - "GoogleTagManagerDescription": "Jos verkkosivustosi käyttää Google Tag Manageria, tutustu %1$stähän ohjeeseen%2$s.", - "HideAdvancedOptions": "Piilota lisävalinnat", - "HttpTrackingApi": "HTTP-seurantarajapinta", - "HttpTrackingApiDescription": "%1$sHTTP-seurantarajapinnan%2$s avulla voi seurata mitä tahansa tapahtumia. Tästä voi olla hyötyä, jos käytät ohjelmointikieltä, jolle ei ole vielä Matomo SDK:ta. Voit myös käyttää tätä rajapintaa sovelluksesi yksityiskohtaiseen seurantaan.", - "ImageTracking": "Kuvaseuranta", - "ImageTrackingIntro1": "Kun kävijä on poistanut JavaScriptin käytöstä, tai kun JavaScriptiä ei voida käyttää, voit seurata kävijöitä kuvaseurannan avulla.", - "ImageTrackingIntro2": "Luo linkki alle ja kopioi HTML-koodi sivullesi. Jos käytät tätä varasuunnitelmana JavaScript-seurannalle, voit ympäröidä koodin %1$s-tageilla.", - "ImageTrackingIntro3": "Nähdäksesi kaikki kuvaseurannan vaihtoehdot, katso %1$sAPI-seurannan dokumentit%2$s.", - "ImageTrackingLink": "Kuvaseurantalinkki", - "ImportFromGoogleAnalytics": "Tuo Google Analyticsista", - "ImportingServerLogsDesc": "Vaihtoehto kävijöiden seuraamiselle selaimen kautta (joko JavaScriptin tai kuvalinkin kautta) on tuoda jatkuvasti palvelimen lokitietoja. Lue lisää %1$sPalvellimen lokitietoanalyysistä%2$s.", - "InvalidPluginsWarning": "Seuraavat liitännäiset eivät sovi yhteen %1$s:n kanssa, eikä niitä voitu ladata: %2$s.", - "InvalidPluginsYouCanUninstall": "Voit päivittää tai poistaa näiden liitännäisten asennuksen sivulla %1$sLiitännäisten hallinnointi%2$s.", - "JSTrackingIntro1": "Voit seurata sivustosi kävijöitä moninaisin tavoin. Suositelva tapa on käyttäjä Javascriptiä. Käyttääksesi tätä menetelmää, on sinun huolehdittava että jokaisella sivustosi sivulla on lyhyt Javascript-koodi. Voit tuottaa tarvittavan koodin tässä.", - "JSTrackingIntro2": "Kun sinulla on sivustollesi JavaScript-seurantakoodi, kopioi ja liitä se kaikille sivuille, joita haluat seurata Matomon avulla.", - "JSTrackingIntro3a": "Useimmissa sivustoissa, blogeissa ja sisällönhallintajärjestelmissä ja vastaavissa on mahdollista käyttää valmiita liitännäisiä, jotka toteuttavat teknisen työn puolestasi. (Tutustu %1$sMatomon integrointiin tarkoitettujen liitännäisten listaukseen%2$s.)", - "JSTrackingIntro3b": "Jos liitännäistä ei ole olemassa, voit muokata sivupohjaa ja lisätä JavaScript-seurantakoodin </head>-tagiin, joka määritetään useimmiten tiedostossa 'header.php', 'header.tpl' tai vastaavassa.", - "JSTrackingIntro4": "Mikäli et halua käyttää JavaScriptiä kävijöiden seuraamiseksi, %1$sluo kuvaseurantalinkki alapuolella%2$s.", - "JSTrackingIntro5": "Jos haluat seurata enemmän kuin vain sivujen katselumääriä, lue %1$sMatomon Javascript-seurannan dokumentaatio%2$s, joka sisältää listan mahdollisista toiminnoista. Voit seurata tavoitteita, mukauttaa muuttujia, verkkokaupan tilauksia, hylättyjä ostoskoreja ja muuta.", - "JSTracking_CampaignKwdParam": "Kampanjan avainsanojen parametri", - "JSTracking_CampaignNameParam": "Kampanjan nimen parametri", - "JSTracking_CodeNoteBeforeClosingHead": "Kopioi koodinpätkä napsauttamalla painiketta ja liitä se välittömästi ennen sulkevaa %1$s -tagia (suositus)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Varmista, että tämä koodi on upotettu script-elementtiin sivustosi jokaisella sivulla. Suosittelemme liittämään koodin välittömästi ennen sulkevaa head-tagia.", - "JSTracking_ConsentManagerConnected": "%1$s vaikuttaa olevan jo määritetty toimimaan yhdessä Matomon kanssa.", - "JSTracking_ConsentManagerEmailNote": "Tai voit upottaa seurantakoodin suoraan verkkosivustollesi:", - "JSTracking_CrossDomain": "Matomo tallentaa jokaisen kävijän selaimeen hänet yksilöivän kävijätunnuksen. Tämä tunnus on rajoitettu näkymään ainoastaan saman verkkotunnuksen alla oleviin sivustoihin. Jos kytket verkkotunnusrajan ylittävän seurannan päälle, voit seurata kävijää kaikilla sivustoillasi, vaikka ne käyttäisivät eri verkkotunnusta. Matomo toteuttaa tämän lisäämällä jokaiseen omalle sivustollesi vievään linkkiin kävijätunnuksen sisältävän URL-parametrin (pk_vid).", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Hyödyntääksesi verkkotunnusrajan ylittävää seurantaa, pitää sinun määritellä sivustollesi useampia verkkotunnuksia (URLeja).", - "JSTracking_CustomCampaignQueryParam": "Käytä omia parametrejä kampanjoiden nimille ja avainsanoille", - "JSTracking_CustomCampaignQueryParamDesc": "Huomaa: %1$sMatomo jäljittää automaattisesti Google Analytics -parametrejä.%2$s", - "JSTracking_DisableCookies": "Poista kaikki seurantaevästeet käytöstä", - "JSTracking_DisableCookiesDesc": "Poista kaikki ensimmäisen osapuolen evästeet käytöstä. Tämän sivun evästeet poistetaan, kun käyttäjä avaa minkä tahansa sivun seuraavan kerran.", - "JSTracking_EnableCrossDomainLinking": "Verkkotunnusrajat ylittävä seuranta", - "JSTracking_EnableDoNotTrack": "Ota käyttöön selaimessa tapahtuva \"DoNotTrack\"-tunnistus", - "JSTracking_EnableDoNotTrackDesc": "Seurantapyyntöjä ei lähetetä, mikäli kävijät eivät halua tulla seuratuiksi.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Huomio: Palvelintuki \"DoNotTrack\"-toiminteelle on aktivoitu, joten tällä valinnalla ei ole vaikutusta.", - "JSTracking_EndNote": "Huomautus: Voit luoda mukautetun seurantakoodin %1$sSeurantakoodi%2$s-järjestelmänvalvoja-osiossa.", - "JSTracking_GroupPageTitlesByDomain": "Liitä sivuston toimialue sivun otsikon eteen seurattaessa", - "JSTracking_GroupPageTitlesByDomainDesc1": "Eli jos joku käy \"Tietoa\"-sivulla blog.%1$s, tämä tallentuu muodossa \"blog / Tietoa\". Tämä on helpoin tapa saada yleisnäkymä liikenteeseen aliverkkotunnuksillasi.", - "JSTracking_MergeAliases": "Piilota \"Lähtevät linkit\"-raportissa siirtymät tämän sivuston vaihtoehtoisiin osoitteisiin:", - "JSTracking_MergeAliasesDesc": "Siirtymisiä tämän sivuston vaihtoehtoisiin osoitteisiin (esim. %s) ei lasketa \"lähteviksi linkeiksi\".", - "JSTracking_MergeSubdomains": "Seuraa kävijöitä kaikilla aladomaineilla", - "JSTracking_MergeSubdomainsDesc": "Eli jos yksi kävijä vierailee sivuilla %1$s ja %2$s, tämä lasketaan yhdeksi kävijäksi.", - "JSTracking_PageCustomVars": "Jäljitä sopeutettu muuttuja jokaiselle sivulla vierailulle", - "JSTracking_PageCustomVarsDesc": "Esimerkiksi muuttujan nimi \"kategoria\" ja arvo \"valkoiset paperit\".", - "JSTracking_TrackNoScript": "Seuraa myös niitä käyttäjiä, joilla ei ole Javascript käytössä", - "JSTracking_VisitorCustomVars": "Seuraa tämän kävijän kohdalla mukautettuja muuttujia", - "JSTracking_VisitorCustomVarsDesc": "Esimerkiksi muuttujan nimi \"tyyppi\" ja arvo \"asiakas\".", - "JavaScriptTracking": "JavaScript-seuranta", - "JsTrackingCodeAdvancedOptionsStep": "Valinnainen: käytä lisävalintoja mukauttaaksesi seurantakoodia.", - "JsTrackingCodeMissingEmail1": "Lisäsit sivuston '%s' Matomo-analytikkaasi joitain päiviä sitten. Tarkastimme juuri, ettei Matomo vaikuta tallentaneen lainkaan liikennettä tämän sivuston osalta.", - "LearnMore": "Lisätietoa", - "Login": "käyttäjätunnus", - "LogoNotWriteableInstruction": "Jotta voisit käyttää omaa logoasi Matomon logon sijaan, on sinun annettava Matomolle kirjoitusoikeudet tähän hakemistoon: %1$sMatomo tarvitsee kirjoitusoikeudet myös näihin tiedostoihin: %2$s", - "LogoUpload": "Valitse tallennettava logo", - "LogoUploadFailed": "Lähetettyä tiedostoja ei voitu käsitellä. Tarkista, että tiedosto on oikeassa muodossa.", - "LogoUploadHelp": "Lähetä tiedosto formaatissa %1$s ja %2$s pikselin vähimmäiskorkeudella.", - "LtsReleases": "Pitkäaikaisesti tuetuille LTS-versioille tehdään vain tietoturva- ja bugikorjauksia.", - "MenuDevelopment": "Kehitys", - "MenuDiagnostic": "Vianmääritys", - "MenuGeneralSettings": "Yleiset asetukset", - "MenuMeasurables": "Mitattavat", - "MenuSystem": "Järjestelmä", - "MissingTrackingCodeEmailSubject": "Sivuston %s osalta ei ole tallennettu liikennettä Matomo-analytiikkaan, aloitetaanpa", - "NTrackingFailures": "%s seurantavirhettä", - "NeedHelp": "Tarvitsetko apua?", - "NoKnownFailures": "Ei havaittuja seurantavirheitä.", - "OptOutComplete": "Olet poistanut itsesi seurannasta; käyntejä tälle sivulle ei seurata.", - "OptOutCompleteBis": "Huomioi, että jos poistat evästeet, poistat tämän sivun asettaman evästeen, vaihdat tietokonetta tai selainta, sinun täytyy suorittaa tämä uudelleen.", - "OptOutDntFound": "Sinua ei seurata, koska selaimesi ilmoittaa ettet halua näin tehtävän. Tämä on selaimessasi oleva asetus, etkä voi sallia seurantaa ennenkuin kytket sen pois. Asetus on nimeltään jotain sen kaltaista kuin 'Do Not Track'.", - "OptOutErrorNoCookies": "Seurannasta irtautumisen ominaisuus vaatii, että evästeet ovat käytössä.", - "OptOutExplanation": "Matomo on mukana mahdollistamassa yksityisyyttä internetissä. Jos haluat antaa kävijöillesi mahdollisuuden kieltää seuranta, lisää seuraava HTML-koodi verkkosivullesi, esimerkiksi \"Yksityisyyskäytännöt\"-sivulle.", - "OptOutExplanationIntro": "Tämä koodi näyttää IFRAME:n, joka sisältää linkin jolla käyttäjäsi voivat kieltää seuraamisensa Matomoassa. Tämä toteutetaan asettamalla käyttäjän selaimeen eväste. Alla näet mitä käyttäjä näkee selaimessaan (voit myös katsoa %1$stästä%2$s)", - "OptOutForYourVisitors": "Matomon poistaminen käytöstä kävijöillesi (opt-out)", - "OptingYouOut": "Seurantasi estetään, hetkinen…", - "PersonalPluginSettings": "Omat liitännäisasetukset", - "PiwikIsInstalledAt": "Matomo on asennettu kohteeseen", - "PluginSettingChangeNotAllowed": "Arvojen muuttaminen \"%1$s\" liitännäisessä \"%2$s\" -asetuksissa ei ole sallittua", - "PluginSettingReadNotAllowed": "Et voi lukea asetusta \"%1$s\" liitännäisestä \"%2$s\"", - "PluginSettings": "Liitännäisen asetukset", - "PluginSettingsIntro": "Täällä voit muuttaa kolmannen osapuolen liitännäisten asetuksia:", - "PluginSettingsSaveFailed": "Liitännäisen asetusten tallentaminen ei onnistunut", - "PluginSettingsSaveSuccess": "Liitännäisen asetukset päivitetty.", - "PluginSettingsValueNotAllowed": "Arvo kentälle \"%1$s\" liitännäisessä \"%2$s\" ei ole sallittu", - "Problem": "Ongelma", - "ReactDescription": "Jos verkkosivustosi käyttää Reactia, tutustu %1$stähän ohjeeseen%2$s.", - "ReleaseChannel": "Julkaisukanava", - "SecurityNotificationEmailSubject": "Tietoturvailmoitus", - "SecurityNotificationSettingsChangedByUserBody": "Joku muokkasi järjestelmän asetuksia. Vaikutukset asetuksiin: %s.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Joku poisti käytöstä kaksivaiheisen todennuksen tililtäsi.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Joku asetti kaksivaiheisen todennuksen käyttöön tilillesi.", - "SecurityNotificationUserAcceptInviteBody": "Käyttäjä (tunnus: %s) hyväksyi kutsun.", - "SecurityNotificationUserDeclinedInviteBody": "Käyttäjä (tunnus: %s) kieltäytyi kutsusta.", - "SendPluginUpdateCommunication": "Lähetä sähköpostia, kun liitännäisiin on saatavissa päivityksiä", - "SendPluginUpdateCommunicationHelp": "Pääkäyttäjät saavat sähköpostia kun liitännäisestä on saatavilla uusi versio.", - "SettingsSaveSuccess": "Asetukset päivitetty.", - "ShowAdvancedOptions": "Näytä lisävalinnat", - "Solution": "Ratkaisu", - "StableReleases": "Jos Matomo on tärkeä osa liiketointasi, suosittelemme päivittämistä uusimpaan versioon. Jos käytät uusinta beta-versiota ja löydät bugin tai sinulla on ehdotus, %1$slue tämä%2$s.", - "SystemPluginSettings": "Järjestelmän liitännäisasetukset", - "TrackAGoal": "Seuraa tavoitetta", - "TrackingCode": "Seurantakoodi", - "TrackingCodeIntro": "Matomo tarjoaa useita tapoja asettaa seurantakoodi sivustollesi, mobiilisovellukseesi tai mihin tahansa laitteeseen tai sovellukseen.", - "TrackingFailureAuthenticationProblem": "Pyynnössä ei ollut tunnisteita, mutta niitä vaadittiin.", - "TrackingFailureAuthenticationSolution": "Aseta tai korjaa \"token_auth\" seurantapyynnössäsi.", - "TrackingFailureInvalidSiteProblem": "Sivustoa ei ole olemassa", - "TrackingFailureInvalidSiteSolution": "Päivitä seurantakoodin idSite", - "TrackingFailures": "Seurantavirheet", - "TrackingFailuresEmail1": "Ilmoitamme, että Matomassasi on havaittu %s erityyppistä seurantavirhettä viime päivien aikana.", - "TrackingFailuresEmail2": "Nähdäksesi kaikki seurantavirheet, voit seurata %1$stätä linkkiä%2$s.", - "TrackingFailuresEmailSubject": "Seurantavirheet Matomo-analytiikassasi", - "TrackingFailuresIntroduction": "Tällä sivulla näytetään seurantavirheet, jotka ovat sattuneet viimeisen %späivän aikana. Huomaathan, että ainoastaan yleisimmät seurantavirheet tallennetaan, eikä niistäkään kaikkia.", - "TrackingURL": "Seurannan URL", - "TrustedHostConfirm": "Haluatko varmasti vaihtaa luotettua Matomon konenimeä?", - "TrustedHostSettings": "Luotettu Matomo-palvelimen osoite", - "TwoFactorAuth": "Kaksivaiheinen tunnistautuminen", - "UiDemo": "Käyttöliittymädemo", - "UncheckToOptOut": "Poista valinta tästä estääksesi seurannan.", - "UpdateSettings": "Päivitysasetukset", - "UseCustomLogo": "Käytä kustomoitua logoa", - "UserInviteContent": "Voit hyväksyä tämän kutsun napsauttamalla alla olevaa Hyväksy-painiketta.", - "ValidPiwikHostname": "Voimassaoleva Matomon isäntänimi", - "ViewAllTrackingFailures": "Näytä kaikki seurantavirheet", - "VueDescription": "Jos verkkosivustosi käyttää Vue.js:ää, tutustu %1$stähän ohjeeseen%2$s.", - "WhatIsNew": "Mitä uutta", - "WhatIsNewNoChanges": "Ei mitään uutta tällä hetkellä", - "WhatIsNewNoChangesTitle": "Ei viimeaikaisia muutoksia", - "WhatIsNewRemindMeLater": "Muistuta myöhemmin", - "WhatIsNewTitle": "Tässä Matomon uutuuksia", - "WhatIsNewTooltip": "Katso mitä uutta Matomo sisältää", - "WithOptionalRevenue": "valinnaisten tuottojen kanssa", - "WordpressDescription": "Jos verkkosivustosi käyttää Wordpressiä, tutustu %1$stähän ohjeeseen%2$s.", - "YouAreNotOptedOut": "Et ole kieltänyt seurantaa.", - "YouAreOptedOut": "Et ole mukana seurannassa.", - "YouMayOptOut": "Jos haluat, voit estää yksilöllisen tunnisteen tallentamisen tietokoneellesi, ja samalla estää tämän sivun analytiikan osaltasi.", - "YouMayOptOut2": "Voit päättää, ettet halua sinua ja tekemiäsi seurattavan tällä sivustolla.", - "YouMayOptOut3": "Niin toimimalla suojaat yksityisyyttäsi, mutta samalla estät sivuston omistajaa oppimasta toimistasi ja siten estät paremman käyttökokemuksen kehittämisen sinulle sekä muille sivuston käyttäjille.", - "YouMayOptOutBis": "Tee valinta klikkaamalla alla olevaa linkkiä." - } -} diff --git a/plugins/CoreAdminHome/lang/fr.json b/plugins/CoreAdminHome/lang/fr.json deleted file mode 100644 index 432ceac93f649aefd5fe0fc759733ad3244e590f..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/fr.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Accepter l'invitation", - "AddNewTrustedHost": "Ajouter un nouvel hôte de confiance", - "Administration": "Administration", - "ArchivingSettings": "Paramètres d'archivage", - "BrandingSettings": "Paramètres de la marque", - "BruteForce": "Force brute", - "CheckToOptIn": "Cochez cette case si vous acceptez d'être suivi.", - "ClickHereToOptIn": "Cliquez ici pour vous inscrire.", - "ClickHereToOptOut": "Cliquez ici pour vous désinscrire.", - "CloudflareDescription": "Si votre site web est hébergé sur Cloudflare, veuillez consulter %1$sce guide%2$s.", - "ConfirmDeleteAllTrackingFailures": "Voulez-vous vraiment supprimer toutes les erreurs de suivi ?", - "ConfirmDeleteThisTrackingFailure": "Voulez-vous vraiment supprimer cette erreur de suivi ?", - "Cors": "cors", - "CorsDomains": "Domaines CORS (Cross-Origin Resource Sharing)", - "CorsDomainsHelp": "Vous pouvez définir des noms de domaines ou sous-domaines tels que http://exemple.com ou http://stats.exemple.com. Pour autoriser les requêtes entre tous les domaines ajoutez simplement une *", - "CustomLogoFeedbackInfo": "Si vous personnalisez le logo Matomo, vous pourriez aussi vouloir cacher le lien %1$s du menu du haut. Pour ce faire, vous pouvez désactiver l'extension « Feedback » dans la page de %2$sGestionnaire d'extensions%3$s.", - "CustomLogoHelpText": "Vous pouvez personnaliser le logo Matomo qui sera affiché dans l'interface utilisateur et les rapports par courriel.", - "DeclineInvite": "Décliner l'invitation", - "DeleteAllFailures": "Supprimer toutes les erreurs", - "DevelopmentProcess": "Bien que nos processus de développement incluent des milliers de tests automatisés, les bêta-testeurs jouent un rôle clé dans l'accomplissement de notre « politique zéro bogue » pour Matomo.", - "EmailServerSettings": "Paramètres du serveur de courriels", - "ErrorEmailFromAddressNotValid": "L'adresse d'expéditeur SMTP n'est pas valide", - "FaviconUpload": "Sélectionnez un favicon à télécharger", - "FileUploadDisabled": "Le téléversement de fichiers n'est pas activé dans votre configuration PHP. Pour téléverser un logo personnalisé veuillez définir %s dans php.ini et redémarrer votre serveur web.", - "ForBetaTestersOnly": "Pour les bêta testeurs uniquement", - "GoogleTagManagerDescription": "Si votre site web utilise Google Tag Manager, veuillez consulter %1$sce guide%2$s.", - "HideAdvancedOptions": "Masquer les options avancées", - "HowToGetHelp": "Vous pouvez obtenir de l'aide de plusieurs manières. Soit de manière gratuite via la communauté de Matomo sur le forum, soit de manière payante via l'équipe de Matomo et ses partenaires. Peut être souhaitez vous également nous remonter un bug ou un développement spécifique ?", - "HttpTrackingApi": "API de suivi HTTP", - "HttpTrackingApiDescription": "%1$sL'API de suivi HTTP %2$svous permet de suivre ce que vous souhaitez. Elle peut être utile si vous utilisez un langage de programmation qui n'a pas encore de SDK. Cela peut aussi être utile si vous souhaitez suivre des appareils ou des applications de manière particulière.", - "ImageTracking": "Suivi par image", - "ImageTrackingIntro1": "Quand un visiteur désactive JavaScript, ou quand JavaScript ne peut être utilisé, vous pouvez utiliser le lien de suivi par image pour enregistrer les visiteurs.", - "ImageTrackingIntro2": "Générez le lien ci-dessous et copiez-collez le code HTML dans la page web. Si vous utilisez cela comme méthode de secours au suivi JavaScript, vous pouvez l'insérer entre des balises%1$s.", - "ImageTrackingIntro3": "Pour la liste complète des options que vous pouvez utiliser avec un lien de suivi par image, consultez la %1$sDocumentation de l'API de suivi%2$s.", - "ImageTrackingLink": "Lien de suivi par image", - "ImportFromGoogleAnalytics": "Importer depuis Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Si vous avez une propriété Google Analytics et que vous passez à Matomo, vous pouvez importer vos données existantes en utilisant l'extension %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Une alternative au suivi des visiteurs via leur navigateur (par JavaScript ou par image) est d'importer de manière continue les logs du serveur. Apprenez-en plus à propos des %1$sstatistiques via les logs serveur%2$s.", - "InvalidPluginsAdminDisabled": "Pour mettre à jour ou désinstaller ces plugins, veuillez contacter votre administrateur Matomo, qui peut utiliser la ligne de commande ou mettre à jour la configuration directement.", - "InvalidPluginsWarning": "Les extensions suivantes ne sont pas compatibles avec %1$s et ne peuvent pas être chargées : %2$s.", - "InvalidPluginsYouCanUninstall": "Vous pouvez mettre à jour ou désinstaller ces extensions sur la page %1$sExtensions%2$s.", - "InvalidSiteUrlError": "Cette URL n'est pas valide. Le contenu peut avoir été déplacé, supprimé ou n'est plus disponible (l'id de site web était définie sur l'URL '%s').", - "InvalidSiteUrlErrorHelp": "Veuillez retourner à votre page précédente ou retourner à votre tableau de bord pour sélectionner un site Web.", - "JSTrackingDocumentationHelp": "Pour un accès facile, les options avancées les plus populaires sont disponibles ci-dessous. Pour encore plus d'options (y compris comment suivre les objectifs, les variables personnalisées, les commandes de commerce électronique et les paniers abandonnés), veuillez consulter la %1$sdocumentation du suivi Javascript de Matomo%2$s.", - "JSTrackingIntro1": "Vous pouvez suivre les visiteurs de votre site web de différentes manières. La méthode recommandée est de le faire via JavaScript. Pour utiliser cette méthode, vous devez vous assurer que chaque page de votre site web contient du code JavaScript ; que vous pouvez générer ici.", - "JSTrackingIntro2": "Une fois que vous avez le code de suivi JavaScript pour votre site web, copiez-collez le sur toutes les pages dont vous voulez effectuer le suivi avec Matomo.", - "JSTrackingIntro3a": "Dans la plupart des sites web, blogs, CMS, etc. vous pouvez utiliser un extension pour faire le travail technique à votre place (voir notre %1$sliste d'extensions existantes pour intégrer Matomo%2$s.)", - "JSTrackingIntro3b": "Si aucune extension n'existe, vous pouvez modifier les pages modèles du site Web et placer le code de suivi JavaScript dans la balise </head> qui se trouve souvent dans un fichier de modèle 'header.php', 'header.tpl' ou similaire.", - "JSTrackingIntro4": "Si vous ne souhaitez pas utiliser JavaScript pour effectuer le suivi des visiteurs, %1$sgénérez un lien de suivi par image ci-dessous%2$s.", - "JSTrackingIntro5": "Si vous voulez faire plus qu'effectuer le suivi des visites de pages, veuillez consulter %1$sla documentation Matomo JavaScript Tracking%2$s pour connaître la liste des fonctions disponibles. En utilisant ces fonctions vous pouvez effectuer le suivi des objectifs, variables personnalisées, commandes de e-commerce, chariots/paniers abandonnés et plus encore.", - "JSTracking_CampaignKwdParam": "Paramètre de la campagne de mot-clé", - "JSTracking_CampaignNameParam": "Paramètre nom de la campagne", - "JSTracking_CodeNoteBeforeClosingHead": "Cliquer sur le bouton pour copier le morceau de code et le coller directement avant la balise %1$s de fermeture (recommandé)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Assurez-vous que ce code est intégré dans un élément de script sur chaque page de votre site web. Nous vous conseillons de le coller juste avant la balise de fermeture « head ».", - "JSTracking_ConsentManagerConnected": "%1$s semble déjà être configuré pour fonctionner avec Matomo.", - "JSTracking_ConsentManagerDetected": "Le gestionnaire de consentement %1$s a été détecté sur votre site. Pour en savoir plus sur la configuration de Matomo pour fonctionner avec %1$s, veuillez visiter %2$s", - "JSTracking_ConsentManagerEmailNote": "Ou vous pouvez directement intégrer le code de suivi dans votre site Web à la place :", - "JSTracking_CrossDomain": "Par défaut, l'ID du visiteur qui identifie un visiteur unique est stocké dans les cookies de premier niveau du navigateur qui sont accessible uniquement aux pages du même domaine. Activer les cookies inter- domaines vous permet de suivre toutes les actions et vues de pages d'un visiteur spécifique sur plusieurs domaines. Quand un utilisateur clique sur le lien vers une des URL alias de votre site web, cela va ajouter un paramètre d'URL pk_vid faisant suivre l'ID du visiteur.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Note : pour utiliser les cookies inter-domaine, vous devez spécifier plus qu'un nom de domaine (URL) pour votre site web.", - "JSTracking_CustomCampaignQueryParam": "Utiliser des noms de paramètres de requête personnalisés pour le nom de la campagne et le mot clé", - "JSTracking_CustomCampaignQueryParamDesc": "Note : %1$sMatomo détectera automatiquement les paramètres de Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Désactiver les paramètres de suivi de la campagne", - "JSTracking_DisableCampaignParametersDesc": "Quand cette option est cochée, Matomo ne va pas suivre les paramètres de la campagne et ils seront supprimés des URLs suivies.", - "JSTracking_DisableCookies": "Désactiver tous les cookies de suivi", - "JSTracking_DisableCookiesDesc": "Désactive tous les cookies originaux. Les cookies Matomo existants pour ce site web seront supprimés lors de la prochaine visite de la page.", - "JSTracking_EnableCrossDomainLinking": "Active les cookies inter-domaines", - "JSTracking_EnableDoNotTrack": "Activer la détection côté client de « ne pas suivre »", - "JSTracking_EnableDoNotTrackDesc": "Ainsi, les requêtes de suivi ne seront pas envoyées si les visiteurs ne le souhaitent pas.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Note : la détection côté serveur de « ne pas suivre » est activée, cette option n'aura donc aucun effet.", - "JSTracking_EndNote": "Note : vous pouvez générer un code de suivi personnalisé dans la section d'administration %1$sCode de suivi%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Préfixer le domaine du site au titre de la page lors du suivi", - "JSTracking_GroupPageTitlesByDomainDesc1": "Si un internaute visite la page « À propos » sur le blog.%1$s, la visite sera enregistrée en tant que « blog / À propos ». C'est la manière la plus facile d'avoir un aperçu du trafic par sous-domaine.", - "JSTracking_MergeAliases": "Dans le rapport des liens sortants, masquer les clics vers des alias d'adresses connues telles que", - "JSTracking_MergeAliasesDesc": "Ainsi un clic sur les adresses d'alias (ex %s) ne sera pas compté comme un lien sortant.", - "JSTracking_MergeSubdomains": "Suivre les visiteurs sur tous les sous-domaines de", - "JSTracking_MergeSubdomainsDesc": "Ainsi si un visiteur visite %1$s et %2$s, cela sera comptabilisé comme une visite unique.", - "JSTracking_PageCustomVars": "Suivre une variable personnalisée pour chaque affichage de page", - "JSTracking_PageCustomVarsDesc": "Par exemple, avec une variable nommée « categorie » et la valeur « livre blancs ».", - "JSTracking_TrackNoScript": "Suivre les utilisateurs qui ont désactivé JavaScript", - "JSTracking_VisitorCustomVars": "Effectuer le suivi des variables personnalisées pour ce visiteur", - "JSTracking_VisitorCustomVarsDesc": "Par exemple, avec une variable nommée « type » et la valeur « client ».", - "JavaScriptCode": "Code JavaScript", - "JavaScriptTracking": "Suivi par JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Optionnel : utilisez les options avancées pour personnaliser votre code de suivi.", - "JsTrackingCodeMissingEmail1": "Il y a quelques jours vous avez ajouté le site web '%s' à votre Matomo. Nous venons de vérifier et il semble que votre Matomo n'ait pas enregistré de trafic pour ce site web.", - "JsTrackingCodeMissingEmail2": "Pour commencer à suivre les données et obtenir des informations sur vos utilisateurs, vous devez configurer le suivi sur votre site Web ou votre application mobile. Pour les sites Web, intégrez simplement le code de suivi juste avant la balise %s.", - "JsTrackingCodeMissingEmail3": "Afin de trouver et de personnaliser votre code de suivi, %1$scliquez ici%2$s (or bien consultez le %3$sguide du client JavaScript de suivi %4$s).", - "LearnMore": "En savoir plus", - "Login": "Identifiant", - "LogoNotWriteableInstruction": "Afin d'utiliser votre logo personnalité au lieu du logo par défaut Matomo, modifiez des permissions de ce répertoire : %1$s Matomo a besoin d'un accès en écriture à vos logos stockés dans les fichiers %2$s.", - "LogoUpload": "Sélectionnez le logo à téléverser", - "LogoUploadFailed": "Le fichier téléversé n'a pas pu être traité. Veuillez vérifier que le fichier est d'un format valide.", - "LogoUploadHelp": "Veuillez téléverser un fichier dans un des formats suivants %1$s avec une hauteur minimale de %2$s pixels.", - "LtsReleases": "Les versions LTS (Long Term Support) ne reçoivent que des correctifs de sécurité et de bogues.", - "MenuDevelopment": "Développement", - "MenuDiagnostic": "Diagnostic", - "MenuGeneralSettings": "Paramètres généraux", - "MenuMeasurables": "Éléments mesurables", - "MenuSystem": "Système", - "MissingTrackingCodeEmailSubject": "Aucun trafic enregistré dans les statistiques Matomo pour %s, démarrez maintenant", - "NTrackingFailures": "%s erreurs de suivi", - "NeedHelp": "Besoin d'aide ?", - "NoKnownFailures": "Il n'y a aucune erreur de suivi connue.", - "OptOutComplete": "Cookie d'exclusion installé. Vos visites sur ce site web ne seront PAS enregistrées par notre outil d'analyse web.", - "OptOutCompleteBis": "Note : si vous nettoyez vos cookies et supprimez le cookie d'exclusion, ou bien si vous changez d'ordinateur et/ou de navigateur, il vous faudra de nouveau effectuer la procédure d'exclusion.", - "OptOutCustomOptOutLink": "Vous pouvez également créer un formulaire de désinscription entièrement personnalisé à l'aide de HTML et de JavaScript, comme expliqué dans ce %1$sguide%2$s du développeur.", - "OptOutDntFound": "Vous n'êtes pas suivi car votre navigateur indique que vous ne le souhaitez pas. Il s'agit d'un paramètre de votre navigateur ; vous ne pourrez donc pas activer le suivi tant que vous aurez activé la fonction « Ne pas suivre ».", - "OptOutErrorNoCookies": "La fonctionnalité de désactivation du suivi nécessite que les cookies soient autorisés.", - "OptOutErrorNoTracker": "La fonction de désactivation du suivi n'a pas pu trouver le code Matomo Tracker sur cette page", - "OptOutErrorNotHttps": "La fonctionnalité de désactivation du suivi pourrait ne pas fonctionner car ce site n'a pas été chargé en HTTPS. Veuillez recharger la page pour vérifier que le statut de ce suivi a bien été changé.", - "OptOutErrorWindowOpen": "La fonction de désactivation du suivi peut ne pas fonctionner car il semble que la fenêtre contextuelle de désactivation ait été bloquée. Veuillez recharger la page pour vérifier si votre statut de désinscription a changé.", - "OptOutExplanation": "Matomo met un point d'honneur à respecter la vie privée sur l'Internet. Pour fournir à vos visiteurs le choix de ne pas apparaître dans les analyses de Matomo, vous pouvez ajouter le code HTML suivant sur une des pages de votre site web, par exemple dans la page « Politique de confidentialité ».", - "OptOutExplanationIntro": "Ce code affichera un div contenant un lien permettant à vos visiteurs de se désabonner de Matomo en définissant un cookie de désactivation dans leurs navigateurs Web. Voir ci-dessous (ou %1$scliquez ici%2$s) pour voir le contenu qui sera affiché par la div.", - "OptOutForYourVisitors": "Désactivation de Matomo pour vos visiteurs", - "OptingYouOut": "Désactivation en cours, veuillez patienter…", - "PersonalPluginSettings": "Paramètres personnels d'extension", - "PiwikIsInstalledAt": "Matomo est installé à l'adresse", - "PluginSettingChangeNotAllowed": "Vous n'avez pas l'autorisation de modifier la valeur du paramètre \"%1$s\" de l'extension \"%2$s\"", - "PluginSettingReadNotAllowed": "Vous n'avez pas l'autorisation de voir la valeur du paramètre \"%1$s\" de l'extension \"%2$s\"", - "PluginSettings": "Paramètres des extensions", - "PluginSettingsIntro": "Vous pouvez modifier ici les paramètres des extensions tierces suivantes :", - "PluginSettingsSaveFailed": "Impossible d'enregistrer les paramètres de l'extension", - "PluginSettingsSaveSuccess": "Paramètres de l'extension mis à jour.", - "PluginSettingsValueNotAllowed": "La valeur du champ \"%1$s\" dans l'extension \"%2$s\" n'est pas autorisée", - "Problem": "Problème", - "ProtocolNotDetectedCorrectly": "Vous affichez actuellement Matomo via une connexion SSL sécurisée (en utilisant HTTPS), mais Matomo ne peut détecter qu'une connexion non sécurisée sur le serveur.", - "ProtocolNotDetectedCorrectlySolution": "Afin de vous assurer que Matomo demande et serve votre contenu de manière sécurisée via HTTPS, vous devriez modifier votre fichier %1$s et soit configurer vos paramètres de proxy, soit ajouter la ligne %2$s sous la section %3$s %4$sen savoir plus%5$s", - "ReactDescription": "Si votre site web utilise React, veuillez consulter %1$sce guide%2$s.", - "ReleaseChannel": "Canal de publication", - "SecurityNotificationAllTokenAuthDeletedBody": "Quelqu'un a supprimé tous les jetons d'authentification de votre compte.", - "SecurityNotificationAnonymousAccessEnabledBody": "Quelqu'un a activé l'accès utilisateur anonyme pour %1$s. Cela veut dire que les données de ce site sont maintenant accessibles publiquement. Si cela est correct, vous pouvez ignorer ce courriel.", - "SecurityNotificationCheckTwoFactor": "Veuillez vérifier votre application ou appareil pour l'authentification à deux facteurs.", - "SecurityNotificationEmailSubject": "Notification de sécurité", - "SecurityNotificationIfItWasYou": "Si c'était vous, continuez. Si vous ne reconnaissez pas cette activité, veuillez réinitialiser votre mot de passe.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Quelqu'un a généré de nouveaux codes de récupération d'authentification à deux facteurs pour votre compte.", - "SecurityNotificationRecoveryCodesShowedBody": "Quelqu'un a consulté les codes de récupération d'authentification à deux facteurs de votre compte.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Un autre super utilisateur (%1$s) a modifié les paramètres système. Paramètres concernés : %2$s. Si vous êtes au courant de cette activité, continuez. Si vous ne l'êtes pas, veuillez contacter les autres super utilisateurs.", - "SecurityNotificationSettingsChangedByUserBody": "Quelqu'un a modifié les paramètres du système. Paramètres concernés : %s.", - "SecurityNotificationTokenAuthCreatedBody": "Quelqu'un a créé un jeton d'authentification (description : %s) dans votre compte. Si ce n'est pas vous, supprimez le jeton.", - "SecurityNotificationTokenAuthDeletedBody": "Quelqu'un a supprimé un jeton d'authentification (description : %s) dans votre compte.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Quelqu'un a désactivé l'authentification à deux facteurs dans votre compte.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Quelqu'un a activé l'authentification à deux facteurs dans votre compte.", - "SecurityNotificationUserAcceptInviteBody": "L'utilisateur (identifiant : %s) a accepté l'invitation.", - "SecurityNotificationUserCreatedBody": "Quelqu'un a créé un nouvel utilisateur (connexion : %s) dans votre compte.", - "SecurityNotificationUserDeclinedInviteBody": "L'utilisateur (identifiant : %s) a décliné l'invitation.", - "SecurityNotificationUserDeletedBody": "Quelqu'un a supprimé un utilisateur (connexion : %s) de votre compte.", - "SendPluginUpdateCommunication": "Envoyer un courriel lorsqu'une mise à jour d'une extension est disponible", - "SendPluginUpdateCommunicationHelp": "Un courriel sera envoyé aux super utilisateurs quand une nouvelle version d'une extension sera disponible.", - "SettingsSaveSuccess": "Paramètres mis à jour.", - "ShowAdvancedOptions": "Afficher les options avancées", - "SinglePageApplicationDescription": "Si vous suivez une application à page unique (SPA) ou une application Web progressive (PWA), veuillez consulter %1$sce guide%2$s.", - "Solution": "solution", - "StableReleases": "Si Matomo est essentiel pour votre entreprise, nous vous recommandons d'utiliser la dernière version stable. Si vous utilisez la dernière version bêta et que vous trouverez un bogue ou avez une suggestion, %1$scliquez ici%2$s svp.", - "SystemPluginSettings": "Paramètres des extensions", - "TrackAGoal": "Effectuer le suivi d'un objectif", - "TrackingCode": "Code de suivi", - "TrackingCodeIntro": "Matomo vous permet d'intégrer le code de suivi dans votre site web, application mobile ou même pour n'importe quel périphérique ou application de plusieurs manières.", - "TrackingFailureAuthenticationProblem": "La requête n'était pas authentifiée alors qu'elle était requise.", - "TrackingFailureAuthenticationSolution": "Définissez ou corrigez « token_auth » dans vos requêtes de suivi.", - "TrackingFailureInvalidSiteProblem": "Ce site n'existe pas.", - "TrackingFailureInvalidSiteSolution": "Mettez à jour le idSite configuré.", - "TrackingFailures": "Erreurs de suivi", - "TrackingFailuresEmail1": "C'est simplement pour vous avertir que %s différents types d'erreurs de suivi sont survenus ces derniers jours.", - "TrackingFailuresEmail2": "Afin de visualiser toutes les erreurs de suivi %1$scliquez ici%2$s.", - "TrackingFailuresEmailSubject": "Erreurs de suivi dans Matomo", - "TrackingFailuresIntroduction": "Cette page répertorie les erreurs de suivi apparues durant les %s derniers jours. Veuillez noter que toutes les erreurs ne sont pas enregistrées mais uniquement les types les plus courants.", - "TrackingURL": "URL de suivi", - "TrustedHostConfirm": "Voulez-vous vraiment modifier le nom d'hôte de confiance ?", - "TrustedHostSettings": "Nom d'hôte de confiance de Matomo", - "TwoFactorAuth": "Authentification à deux facteurs", - "UiDemo": "Démo d'interface utilisateur", - "UncheckToOptOut": "Décochez cette case pour vous exclure.", - "UpdateSettings": "Paramètres de mise à jour", - "UseCustomLogo": "Utiliser un logo personnalisé", - "UserInviteContent": "Vous pouvez accepter cette invitation en cliquant sur le bouton d'acceptation ci-dessous.", - "UserInviteNotes": "Si vous ne vous attendiez pas à cette invitation, vous pouvez ignorer cet e-mail. Si %1$s vous envoie trop d'e-mails, vous pouvez les bloquer ou signaler les abus. L'invitation expire automatiquement dans %2$s jours.", - "UserInviteSubject": "%1$s vous a invité à rejoindre Matomo Analytics pour %2$s.", - "ValidPiwikHostname": "Nom d'hôte Matomo valide", - "ViewAllTrackingFailures": "Afficher toutes les erreurs de suivi", - "VueDescription": "Si votre site web utilise Vue.js, veuillez consulter %1$sce guide%2$s.", - "WhatIsNew": "Quoi de neuf", - "WhatIsNewDoNotShowAgain": "Ne plus afficher", - "WhatIsNewNoChanges": "Il n'y a rien de nouveau pour le moment", - "WhatIsNewNoChangesTitle": "Aucun changement récent", - "WhatIsNewRemindMeLater": "Me le rappeler plus tard", - "WhatIsNewTitle": "Voici les nouveautés de Matomo", - "WhatIsNewTooltip": "Découvrez les nouveautés de Matomo", - "WithOptionalRevenue": "avec revenu optionnel", - "WordpressDescription": "Si votre site web utilise Wordpress, veuillez consulter %1$sce guide%2$s.", - "YouAreNotOptedOut": "Vous n'êtes pas exclu(e).", - "YouAreOptedOut": "Vous n'êtes actuellement pas suivi(e).", - "YouMayOptOut": "Vous pouvez choisir ici de NE PAS autoriser le suivi de votre ordinateur via un cookie lui assignant un numéro d'identification unique. Notre outil d'analyse web n'enregistrera pas l'activité de votre ordinateur.", - "YouMayOptOut2": "Vous pouvez vous opposer au suivi de votre navigation sur ce site web.", - "YouMayOptOut3": "Cela protégera votre vie privée, mais empêchera également le propriétaire d'apprendre de vos actions et de créer une meilleure expérience pour vous et les autres utilisateurs.", - "YouMayOptOutBis": "Pour faire ce choix et installer un cookie d'exclusion, veuillez cliquer ci-dessous." - } -} diff --git a/plugins/CoreAdminHome/lang/ga.json b/plugins/CoreAdminHome/lang/ga.json deleted file mode 100644 index 5e158fe89cf602e4ddf81494a9f51de35c776879..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ga.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Glac Cuireadh", - "AddNewTrustedHost": "Cuir óstríomhaire iontaofa nua leis", - "Administration": "Riarachán", - "ArchivingSettings": "Socruithe cartlannaithe", - "BrandingSettings": "Socruithe brandála", - "BruteForce": "Fórsa Brute", - "CheckToOptIn": "Cuir tic sa bhosca seo le roghnú.", - "ClickHereToOptIn": "Cliceáil anseo chun roghnú.", - "ClickHereToOptOut": "Cliceáil anseo chun díliostáil.", - "CloudflareDescription": "Má óstáiltear do láithreán gréasáin ar Cloudflare, féach %1$sthis guide%2$s.", - "ConfirmDeleteAllTrackingFailures": "An bhfuil tú cinnte go bhfuil fonn ort gach teip rianaithe a scriosadh?", - "ConfirmDeleteThisTrackingFailure": "An bhfuil tú cinnte go bhfuil fonn ort an teip rianaithe seo a scriosadh?", - "Cors": "Corsaicis", - "CorsDomains": "Fearainn um Chomhroinnt Acmhainní Trastionscnaimh (CORS)", - "CorsDomainsHelp": "Is féidir leat fearainn nó subdomains cosúil le http://example.com nó http://stats.example.com a shainiú. Nó chun iarratais tras-fearainn a cheadú do gach fearann cuir *", - "CustomLogoFeedbackInfo": "Má shaincheapann tú lógó Matomo, b'fhéidir go mbeadh suim agat an nasc %1$s a cheilt sa roghchlár barr. Chun é sin a dhéanamh, is féidir leat an breiseán Aiseolais a dhíchumasú sa leathanach %2$sManage Plugins%3$s.", - "CustomLogoHelpText": "Is féidir leat an lógó Matomo a shaincheapadh a thaispeánfar sa chomhéadan úsáideora agus sna tuarascálacha ríomhphoist.", - "DeclineInvite": "Diúltaigh Cuireadh", - "DeleteAllFailures": "Scrios gach teip", - "DevelopmentProcess": "Cé go n-áirítear ár bpróiseas forbartha na mílte tástálacha uathoibrithe, tá ról lárnach ag Beta Testers maidir leis an \"Polasaí Gan fhabht\" a bhaint amach i Matomo.", - "EmailServerSettings": "Socruithe freastalaí ríomhphoist", - "ErrorEmailFromAddressNotValid": "Níl an SMTP ón seoladh bailí", - "FaviconUpload": "Roghnaigh Favicon le huaslódáil", - "FileUploadDisabled": "Níl comhaid a uaslódáil cumasaithe i do chumraíocht PHP. Chun do lógó saincheaptha a uaslódáil, socraigh %s i php.ini agus atosaigh do fhreastalaí gréasáin.", - "ForBetaTestersOnly": "I gcás tástálaithe béite amháin", - "GoogleTagManagerDescription": "Má tá Bainisteoir Clibe Google in úsáid ar do láithreán gréasáin, féach %1$sthis guide%2$s.", - "HideAdvancedOptions": "Folaigh ardroghanna", - "HowToGetHelp": "Tá bealaí éagsúla ann ar féidir leat cabhair a fháil. Tá tacaíocht saor in aisce trí Phobal Matomo agus tacaíocht íoctha curtha ar fáil ag foireann Matomo agus comhpháirtithe Matomo. Nó b'fhéidir an bhfuil fabht agat le tuairisciú nó ar mhaith leat gné nua a mholadh?", - "HttpTrackingApi": "API Rianaithe HTTP", - "HttpTrackingApiDescription": "Ligeann API%1$sHTTP Rianú API%2$s duit aon rud a rianú. D'fhéadfadh sé seo a bheith úsáideach má tá tú ag úsáid teanga ríomhchlárúcháin nach bhfuil aon SDK ann go fóill. D'fhéadfadh sé a bheith úsáideach freisin nuair is mian leat feistí nó feidhmchláir a rianú ar bhealach speisialta.", - "ImageTracking": "Rianú Íomhánna", - "ImageTrackingIntro1": "Nuair a bhíonn JavaScript díchumasaithe ag cuairteoir, nó nuair nach féidir JavaScript a úsáid, is féidir leat nasc rianaithe íomhá a úsáid chun cuairteoirí a rianú.", - "ImageTrackingIntro2": "Gin an nasc thíos agus cóipeáil an HTML a ghintear ar an leathanach. Má tá sé seo á úsáid agat mar chúltaca le haghaidh rianú JavaScript, is féidir leat é a thimpeallú i gclibeanna%1$s.", - "ImageTrackingIntro3": "Le haghaidh liosta iomlán na roghanna is féidir leat a úsáid le nasc rianaithe íomhá, féach an %1$sTracking API Documentation%2$s.", - "ImageTrackingLink": "Nasc Rianaithe Íomhá", - "ImportFromGoogleAnalytics": "Iompórtáil ó Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Má tá maoin Google Analytics agat agus má tá tú ag aistriú go Matomo, is féidir leat do chuid sonraí atá ann cheana a allmhairiú ag baint úsáide as breiseán %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Rogha eile ar chuairteoirí a rianú tríd an mbrabhsálaí (trí JavaScript nó nasc íomhá) is ea logaí freastalaí a iompórtáil go leanúnach. Foghlaim tuilleadh faoi %1$sServer Log File Analytics%2$s.", - "InvalidPluginsAdminDisabled": "Chun na breiseáin seo a nuashonrú nó a dhíshuiteáil, déan teagmháil le riarthóir do Matomo, a fhéadann an líne ordaithe a úsáid nó an chumraíocht a nuashonrú go díreach.", - "InvalidPluginsWarning": "Níl na breiseáin seo a leanas comhoiriúnach le%1$s agus níorbh fhéidir iad a luchtú:%2$s.", - "InvalidPluginsYouCanUninstall": "Is féidir leat na breiseáin seo a nuashonrú nó a dhíshuiteáil ar an leathanach %1$sManage Plugins%2$s.", - "InvalidSiteUrlError": "Níl an URL seo bailí. B’fhéidir gur aistríodh, gur scriosadh, nó nach bhfuil sé ar fáil a thuilleadh (socraíodh aitheantas an tsuímh ghréasáin go '%s' ar an URL).", - "InvalidSiteUrlErrorHelp": "Téigh ar ais chuig do leathanach roimhe seo nó fill ar do phainéal rialaithe chun suíomh Gréasáin a roghnú.", - "JSTrackingDocumentationHelp": "Le haghaidh rochtain éasca, tá na roghanna chun cinn is coitianta ar fáil thíos. Le haghaidh roghanna níos mó fós (lena n-áirítear conas spriocanna, athróga saincheaptha, orduithe ríomhthráchtála agus cairteacha tréigthe a rianú) féach ar dhoiciméadú%1$sMatomo Javascript Rianú%2$s.", - "JSTrackingIntro1": "Is féidir leat cuairteoirí ar do láithreán gréasáin a rianú ar go leor bealaí éagsúla. Is é an bealach molta chun é a dhéanamh trí JavaScript. Chun an modh seo a úsáid ní mór duit a chinntiú go bhfuil cód JavaScript ag gach leathanach Gréasáin de do láithreán gréasáin, ar féidir leat a ghiniúint anseo.", - "JSTrackingIntro2": "Nuair a bheidh an cód rianaithe JavaScript agat le do láithreán gréasáin, cóipeáil agus greamaigh é chuig na leathanaigh go léir is mian leat a rianú le Matomo.", - "JSTrackingIntro3a": "I bhformhór na suíomhanna gréasáin, blaganna, CMS, etc. is féidir leat breiseán réamhdhéanta a úsáid chun an obair theicniúil a dhéanamh duit. (Féach ar ár %1$slist de bhreiseáin a úsáidtear chun Matomo%2$s a chomhtháthú.)", - "JSTrackingIntro3b": "Mura bhfuil aon bhreiseán ann is féidir leat do theimpléid láithreán gréasáin a chur in eagar agus an cód rianaithe JavaScript a chur leis an </head> gclib a shainmhínítear go minic i gcomhad teimpléid 'header.php', 'header.tpl' nó i gcomhad teimpléid den chineál céanna.", - "JSTrackingIntro4": "Mura bhfuil tú ag iarraidh JavaScript a úsáid chun cuairteoirí a rianú, %1$sgenerate an image tracking link below%2$s.", - "JSTrackingIntro5": "Más mian leat níos mó a dhéanamh ná tuairimí leathanaigh a rianú, féach ar na doiciméid rianaithe Javascript %1$sMatomo Javascript%2$s le haghaidh liosta na bhfeidhmeanna atá ar fáil. Ag baint úsáide as na feidhmeanna seo is féidir leat spriocanna, athróga saincheaptha, orduithe ríomhthráchtála, cairteacha tréigthe agus níos mó a rianú.", - "JSTracking_CampaignKwdParam": "Paraiméadar Eochairfhocal an Fheachtais", - "JSTracking_CampaignNameParam": "Paraiméadar Ainm an Fheachtais", - "JSTracking_CodeNoteBeforeClosingHead": "Cliceáil ar an gcnaipe chun blúire an chóid a chóipeáil agus é a ghreamú díreach roimh an gclib %1$s deiridh (molta)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Cinntigh go bhfuil an cód seo leabaithe laistigh de ghné scripte ar gach leathanach de do láithreán gréasáin. Molaimid é a ghreamú díreach roimh an gclib ceann deiridh.", - "JSTracking_ConsentManagerConnected": "Is cosúil go bhfuil %1$s cumraithe cheana féin chun oibriú le Matomo.", - "JSTracking_ConsentManagerDetected": "Braitheadh bainisteoir toilithe %1$s ar do shuíomh. Chun foghlaim faoi Matomo a chumrú chun oibriú le %1$s tabhair cuairt ar %2$s", - "JSTracking_ConsentManagerEmailNote": "Nó d'fhéadfá an cód rianaithe a leabú go díreach i do láithreán gréasáin ina ionad:", - "JSTracking_CrossDomain": "De réir réamhshocraithe, stóráiltear an t-aitheantas cuairteora a aithníonn cuairteoir uathúil i bhfianáin chéad pháirtí an bhrabhsálaí nach féidir rochtain a fháil orthu ach amháin trí leathanaigh ar an bhfearann céanna. Ligeann nascadh tras-fhearainn duit na gníomhartha agus na radharcanna leathanaigh go léir a bhaineann le cuairteoir ar leith a rianú isteach sa chuairt chéanna fiú nuair a amharcann siad ar leathanaigh ar roinnt réimsí. Aon uair a chliceálann úsáideoir ar nasc chuig ceann de URLanna ailias do láithreán gréasáin, cuirfidh sé paraiméadar URL leis pk_vid an ID Cuairteora a chur ar aghaidh.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "nóta: Chun nasc tras-fearainn a úsáid, ní mór duit níos mó ná ainm fearainn amháin (URLanna) a shonrú le do láithreán gréasáin.", - "JSTracking_CustomCampaignQueryParam": "Bain úsáid as ainmneacha paraiméadar cheist saincheaptha le haghaidh ainm an fheachtais agus eochairfhocal", - "JSTracking_CustomCampaignQueryParamDesc": "Nóta: Braithfidh %1$sMatomo paraiméadair Google Analytics go huathoibríoch.%2$s", - "JSTracking_DisableCampaignParameters": "Díchumasaigh Rianú Paraiméadair Feachtais", - "JSTracking_DisableCampaignParametersDesc": "Nuair a dhéantar an rogha seo a sheiceáil, ní rianóidh Matomo paraiméadair an fheachtais agus bainfear iad as na URLanna rianaithe.", - "JSTracking_DisableCookies": "Díchumasaigh gach fianán rianaithe", - "JSTracking_DisableCookiesDesc": "Díchumasaigh gach fianán chéad pháirtí. Scriosfar fianáin Matomo atá ann cheana don láithreán gréasáin seo ar an gcéad amharc leathanaigh eile.", - "JSTracking_EnableCrossDomainLinking": "Cumasaigh nascadh tras-fhearainn", - "JSTracking_EnableDoNotTrack": "Cumasaigh aimsiú DoNotTrack taobh an chliaint", - "JSTracking_EnableDoNotTrackDesc": "Mar sin, ní sheolfar iarratais rianaithe mura mian le cuairteoirí a rianú.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nóta: Cumasaíodh tacaíocht DoNotTrack taobh freastalaí, mar sin ní bheidh aon éifeacht ag an rogha seo.", - "JSTracking_EndNote": "Nóta: Is féidir leat cód rianaithe saincheaptha a ghiniúint sa rannán %1$sTracking Code%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Prepend fearann an tsuímh chuig teideal an leathanaigh agus tú ag rianú", - "JSTracking_GroupPageTitlesByDomainDesc1": "Mar sin, má thugann duine cuairt ar an leathanach 'Maidir' ar bhlag.%1$s déanfar é a thaifeadadh mar 'blog / About'. Is é seo an bealach is éasca chun forbhreathnú a fháil ar do thrácht trí fho-fhearann.", - "JSTracking_MergeAliases": "Sa tuarascáil \"Outlinks\", folaigh cad a tharlaíonn nuair a", - "JSTracking_MergeAliasesDesc": "Mar sin, ní áireofar cad a tharlaíonn ar naisc chuig URLanna Ailias (m.sh. %s) mar \"Outlink\".", - "JSTracking_MergeSubdomains": "Rianaigh cuairteoirí ar fud gach fo-alt", - "JSTracking_MergeSubdomainsDesc": "Mar sin, má thugann cuairteoir amháin cuairt ar %1$s agus %2$s, áireofar iad mar chuairteoir uathúil.", - "JSTracking_PageCustomVars": "Rianaigh athróg saincheaptha do gach amharc leathanaigh", - "JSTracking_PageCustomVarsDesc": "Mar shampla, leis an ainm athraitheach \"Catagóir\" agus luach \"Páipéir Bhána\".", - "JSTracking_TrackNoScript": "Rianaigh úsáideoirí le javaScript díchumasaithe", - "JSTracking_VisitorCustomVars": "Rianaigh athróga saincheaptha don chuairteoir seo", - "JSTracking_VisitorCustomVarsDesc": "Mar shampla, leis an ainm athraitheach \"Cineál\" agus luach \"Custaiméir\".", - "JavaScriptCode": "Cód JavaScript", - "JavaScriptTracking": "Rianú JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Roghnach: bain úsáid as na roghanna chun cinn chun do chód rianaithe a shaincheapadh.", - "JsTrackingCodeMissingEmail1": "Cúpla lá ó shin chuir tú an suíomh gréasáin '%s' le do Matomo Analytics. Rinneamar seiceáil díreach agus ní cosúil go bhfuil aon trácht taifeadta ag do Matomo don láithreán gréasáin seo.", - "JsTrackingCodeMissingEmail2": "Chun tús a chur le sonraí a rianú agus léargais a fháil ar d'úsáideoirí, beidh ort rianú a chur ar bun i do láithreán gréasáin nó i d'aip soghluaiste. I gcás suíomhanna Gréasáin, ní gá ach an cód rianaithe a leabú díreach roimh an gclib %s.", - "JsTrackingCodeMissingEmail3": "Chun do chód rianaithe a aimsiú agus a shaincheapadh, %1$sclick here%2$s (nó féach ar an %3$sJavaScript Tracking Client guide%4$s).", - "LearnMore": "Faigh tuilleadh eolais", - "Login": "Logáil Isteach", - "LogoNotWriteableInstruction": "Chun do lógó saincheaptha a úsáid in ionad lógó réamhshocraithe Matomo, tabhair cead scríofa don chomhadlann seo: %1$sNí mór do Matomo rochtain a scríobh ar do lógónna atá stóráilte sna comhaid%2$s.", - "LogoUpload": "Roghnaigh Lógó le huaslódáil", - "LogoUploadFailed": "Níorbh fhéidir an comhad uaslódáilte a phróiseáil. Seiceáil an bhfuil formáid bhailí ag an gcomhad.", - "LogoUploadHelp": "Uaslódáil comhad i bhformáidí%1$s le híosairde picteilín %2$s.", - "LtsReleases": "Ní fhaigheann leaganacha LTS (Tacaíocht Fhadtéarmach) ach slándáil agus ceartúcháin fabhtanna.", - "MenuDevelopment": "Forbairt", - "MenuDiagnostic": "Diagnóisic", - "MenuGeneralSettings": "Socruithe ginearálta", - "MenuMeasurables": "Intomhaiste", - "MenuSystem": "Córas", - "MissingTrackingCodeEmailSubject": "Níl trácht ar %s taifeadta i Matomo Analytics, tosaithe anois", - "NTrackingFailures": "Teipeanna rianaithe %s", - "NeedHelp": "An bhfuil cabhair uait?", - "NoKnownFailures": "Níl aon teipeanna rianaithe ar eolas.", - "OptOutComplete": "Díliostáil curtha i gcrích; ní thaifeadfaidh an uirlis Web Analytics do chuairteanna ar an láithreán gréasáin seo.", - "OptOutCompleteBis": "Tabhair faoi deara má ghlanann tú d'fhianáin, má scriosann tú an fianán díliostála, nó má athraíonn tú ríomhairí nó brabhsálaithe Gréasáin, beidh ort an nós imeachta díliostála a dhéanamh arís.", - "OptOutCustomOptOutLink": "Is féidir leat foirm díliostála saincheaptha a chruthú freisin ag baint úsáide as HTML agus JavaScript, mar a mhínítear san fhorbróir seo %1$sguide%2$s.", - "OptOutDntFound": "Níl tú á rianú ós rud é go bhfuil do bhrabhsálaí ag tuairisciú nach bhfuil tú ag iarraidh. Is socrú é seo de do bhrabhsálaí ionas nach mbeidh tú in ann rogha a dhéanamh go dtí go ndíchumasóidh tú an ghné 'Ná Rianaigh'.", - "OptOutErrorNoCookies": "Éilíonn an ghné rianaithe díliostála fianáin a chumasú.", - "OptOutErrorNoTracker": "Ní raibh an ghné díliostála rianaithe in ann cód Rianaithe Matomo a aimsiú ar an leathanach seo", - "OptOutErrorNotHttps": "B'fhéidir nach n-oibreoidh an ghné díliostála rianaithe toisc nach raibh an suíomh seo luchtaithe thar HTTPS. Athluchtaigh an leathanach le seiceáil ar athraigh do stádas díliostála.", - "OptOutErrorWindowOpen": "B'fhéidir nach n-oibreoidh an ghné díliostála rianaithe toisc go bhfuil an chuma air gur cuireadh bac ar phreabfhuinneog an diúltaithe. Athluchtaigh an leathanach le seiceáil ar athraigh do stádas díliostála.", - "OptOutExplanation": "Tá Matomo tiomanta do phríobháideacht a sholáthar ar an Idirlíon. Chun rogha a thabhairt le do chuairteoirí diúltú do Matomo Web Analytics, is féidir leat an cód HTML seo a leanas a chur ar cheann de do leathanach láithreán gréasáin, mar shampla i leathanach Polasaí Príobháideachta.", - "OptOutExplanationIntro": "Taispeánfaidh an cód seo tumadóireacht ina bhfuil nasc do chuairteoirí chun diúltú do Matomo trí fhianán díliostála a leagan síos ina mbrabhsálaithe gréasáin. Féach thíos (nó%1$sclick here%2$s) chun amharc ar an ábhar a thaispeánfaidh an div.", - "OptOutForYourVisitors": "Matomo rogha an diúltaithe le do chuairteoirí", - "OptingYouOut": "Ag roghnú duit, fan go fóill…", - "PersonalPluginSettings": "Socruithe Breiseáin Phearsanta", - "PiwikIsInstalledAt": "Tá Matomo suiteáilte ag", - "PluginSettingChangeNotAllowed": "Níl cead agat luach an tsocraithe \"%1$s\" a athrú i mbreiseán \"%2$s\"", - "PluginSettingReadNotAllowed": "Níl cead agat luach an tsocraithe \"%1$s\" a léamh i mbreiseán \"%2$s\"", - "PluginSettings": "Socruithe breiseáin", - "PluginSettingsIntro": "Anseo is féidir leat na socruithe do na breiseáin tríú páirtí seo a leanas a athrú:", - "PluginSettingsSaveFailed": "Níorbh fhéidir socruithe breiseáin a shábháil", - "PluginSettingsSaveSuccess": "Nuashonraíodh socruithe breiseáin.", - "PluginSettingsValueNotAllowed": "Ní cheadaítear luach réimse \"%1$s\" i mbreiseán \"%2$s\"", - "Problem": "Fadhb", - "ProtocolNotDetectedCorrectly": "Tá tú ag féachaint ar Matomo faoi láthair thar nasc SSL slán (ag baint úsáide as HTTPS), ach ní fhéadfadh Matomo ach nasc neamhshlán a bhrath ar an bhfreastalaí.", - "ProtocolNotDetectedCorrectlySolution": "Chun a chinntiú go n-iarrann Matomo d'inneachar go slán agus go bhfreastalaíonn sé ar HTTPS, is féidir leat do chomhad %1$s a chur in eagar agus do shocruithe seachfhreastalaí a chumrú, nó is féidir leat an líne %2$s a chur leis faoi bhun na rannóige %3$s. %4$sLearn more%5$s", - "ReactDescription": "Má tá React in úsáid ag do shuíomh gréasáin, féach %1$sthis guide%2$s.", - "ReleaseChannel": "Cainéal scaoilte", - "SecurityNotificationAllTokenAuthDeletedBody": "Scrios duine éigin gach ceann de na comharthaí auth i do chuntas.", - "SecurityNotificationAnonymousAccessEnabledBody": "Chumasaigh duine éigin rochtain úsáideora gan ainm le haghaidh %1$s. Ciallaíonn sé seo go bhfuil na sonraí don suíomh seo inrochtana go poiblí anois. Má tá sé seo ceart go leor, bíodh leisce ort neamhaird a dhéanamh ar an ríomhphost seo.", - "SecurityNotificationCheckTwoFactor": "Seiceáil d'fheidhmchlár nó do ghléas fíordheimhnithe dhá fhachtóir le do thoil.", - "SecurityNotificationEmailSubject": "Fógra Slándála", - "SecurityNotificationIfItWasYou": "Más tusa a bhí ann, carry on. Mura n-aithníonn tú an ghníomhaíocht seo, athshocraigh do phasfhocal le do thoil.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Ghin duine éigin cóid aisghabhála fíordheimhnithe nua dhá fhachtóir le do chuntas.", - "SecurityNotificationRecoveryCodesShowedBody": "D'fhéach duine éigin ar na cóid aisghabhála fíordheimhnithe dhá fhachtóir de do chuntas.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Rinne sárúsáideoir eile (%1$s) socruithe an chórais a mhodhnú. Socruithe a bhfuil tionchar orthu:%2$s. Má tá a fhios agat faoin ngníomhaíocht seo, lean ar aghaidh. Mura n-aithníonn tú an ghníomhaíocht seo, téigh i dteagmháil leis na sárúsáideoirí eile.", - "SecurityNotificationSettingsChangedByUserBody": "D'athraigh duine éigin socruithe an chórais. Socruithe a bhfuil tionchar orthu: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Chruthaigh duine éigin comhartha auth (cur síos: %s) i do chuntas. Mura raibh sé agat, scrios an comhartha.", - "SecurityNotificationTokenAuthDeletedBody": "Scrios duine éigin comhartha auth (cur síos: %s) i do chuntas.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Duine éigin díchumasaithe fíordheimhniú dhá fhachtóir i do chuntas.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Chuir duine éigin fíordheimhniú dhá fhachtóir ar chumas i do chuntas.", - "SecurityNotificationUserAcceptInviteBody": "Ghlac an t-úsáideoir (logáil isteach: %s) leis an gcuireadh.", - "SecurityNotificationUserCreatedBody": "Chruthaigh duine éigin úsáideoir nua (logáil isteach: %s) i do chuntas.", - "SecurityNotificationUserDeclinedInviteBody": "Dhiúltaigh an t-úsáideoir (logáil isteach: %s) an cuireadh.", - "SecurityNotificationUserDeletedBody": "Scrios duine éigin úsáideoir (logáil isteach: %s) i do chuntas.", - "SendPluginUpdateCommunication": "Seol ríomhphost nuair atá nuashonrú breiseáin ar fáil", - "SendPluginUpdateCommunicationHelp": "Seolfar ríomhphost chuig Úsáideoirí Super nuair a bhíonn leagan nua ar fáil le haghaidh breiseán.", - "SettingsSaveSuccess": "Nuashonraíodh na socruithe.", - "ShowAdvancedOptions": "Taispeáin ardroghanna", - "SinglePageApplicationDescription": "Má tá feidhmchlár aon leathanaigh (SPA) nó feidhmchlár gréasáin forásach (PWA) á rianú agat, féach %1$sthis guide%2$s.", - "Solution": "Réiteach", - "StableReleases": "Más cuid ríthábhachtach de do ghnó é Matomo, molaimid duit an scaoileadh cobhsaí is déanaí a úsáid. Má úsáideann tú an béite is déanaí agus má aimsíonn tú fabht nó má tá moladh agat, le do thoil%1$ssee here%2$s.", - "SystemPluginSettings": "Socruithe Breiseáin an Chórais", - "TrackAGoal": "Rianaigh sprioc", - "TrackingCode": "Cód Rianaithe", - "TrackingCodeIntro": "Matomo Cuireann tú bealaí éagsúla a leabú an cód rianú le do láithreán gréasáin, app soghluaiste, agus fiú le haghaidh aon fheiste nó iarratas.", - "TrackingFailureAuthenticationProblem": "Níor fíordheimhníodh an t-iarratas ach bhí fíordheimhniú ag teastáil.", - "TrackingFailureAuthenticationSolution": "Socraigh nó ceartaigh \"token_auth\" i d'iarratas rianaithe.", - "TrackingFailureInvalidSiteProblem": "Níl an suíomh ann.", - "TrackingFailureInvalidSiteSolution": "Nuashonraigh an idSite cumraithe sa lorgaire.", - "TrackingFailures": "Teipeanna rianaithe", - "TrackingFailuresEmail1": "Níl anseo ach a chur in iúl duit gur tharla %s cineálacha éagsúla teipeanna rianaithe le laethanta beaga anuas.", - "TrackingFailuresEmail2": "Chun amharc ar na hiarratais rianaithe teipthe %1$sclick here%2$s.", - "TrackingFailuresEmailSubject": "Teipeanna rianaithe i do Matomo Analytics", - "TrackingFailuresIntroduction": "Liostaítear ar an leathanach seo teipeanna rianaithe a tharla le linn na laethanta %s deireanacha. Tabhair faoi deara le do thoil nach ndéantar ach an cineál teipeanna rianaithe is coitianta a thaifeadadh agus ní gach ceann acu.", - "TrackingURL": "URL Rianaithe", - "TrustedHostConfirm": "An bhfuil tú cinnte go bhfuil fonn ort an t-óstainm iontaofa Matomo a athrú?", - "TrustedHostSettings": "Óstainm Matomo Iontaofa", - "TwoFactorAuth": "Údarú dhá fhachtóir", - "UiDemo": "Taispeántas UI", - "UncheckToOptOut": "Díthiceáil an bosca seo le díliostáil.", - "UpdateSettings": "Nuashonraigh socruithe", - "UseCustomLogo": "Úsáid lógó saincheaptha", - "UserInviteContent": "Is féidir leat glacadh leis an gcuireadh seo trí chliceáil ar an gcnaipe glac leis thíos.", - "UserInviteNotes": "Mura raibh tú ag súil leis an gcuireadh seo, is féidir leat neamhaird a dhéanamh den ríomhphost seo. Má tá %1$s ag seoladh an iomarca ríomhphoist chugat, is féidir leat iad a bhlocáil nó mí-úsáid a thuairisciú. Téann an cuireadh in éag go huathoibríoch i %2$s lá.", - "UserInviteSubject": "Sheol %1$s cuireadh chugat chun dul isteach i Matomo Analytics le haghaidh %2$s.", - "ValidPiwikHostname": "Óstainm Bailí Matomo", - "ViewAllTrackingFailures": "Féach ar gach teip rianaithe", - "VueDescription": "Má tá Vue.js á úsáid ag do shuíomh gréasáin, féach %1$sthis guide%2$s.", - "WhatIsNew": "Cad atá Nua", - "WhatIsNewDoNotShowAgain": "Ná taispeáin arís", - "WhatIsNewNoChanges": "Níl aon rud nua i láthair na huaire", - "WhatIsNewNoChangesTitle": "Gan aon athruithe le déanaí", - "WhatIsNewRemindMeLater": "Cuir i gcuimhne dom níos déanaí", - "WhatIsNewTitle": "Seo an méid atá nua i Matomo", - "WhatIsNewTooltip": "Foghlaim cad atá nua i Matomo", - "WithOptionalRevenue": "le hioncam roghnach", - "WordpressDescription": "Má tá wordpress á úsáid ag do láithreán gréasáin, féach %1$sthis guide%2$s.", - "YouAreNotOptedOut": "Níl tú díliostáilte.", - "YouAreOptedOut": "Tá tú díliostáilte faoi láthair.", - "YouMayOptOut": "Féadfaidh tú rogha a dhéanamh gan uimhir aitheantais uathúil fianán anailísíochta gréasáin a shannadh le do ríomhaire chun comhiomlánú agus anailís na sonraí a bhailítear ar an láithreán gréasáin seo a sheachaint.", - "YouMayOptOut2": "Is féidir leat a roghnú chun cosc a chur ar an láithreán gréasáin seo ó chomhiomlánú agus anailís a dhéanamh ar na gníomhartha a ghlacann tú anseo.", - "YouMayOptOut3": "Cosnóidh sé sin do phríobháideacht, ach cuirfidh sé cosc ar an úinéir foghlaim ó do ghníomhartha agus eispéireas níos fearr a chruthú duit féin agus d'úsáideoirí eile.", - "YouMayOptOutBis": "Chun an rogha sin a dhéanamh, cliceáil thíos chun fianán díliostála a fháil." - } -} diff --git a/plugins/CoreAdminHome/lang/gl.json b/plugins/CoreAdminHome/lang/gl.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/gl.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/gu.json b/plugins/CoreAdminHome/lang/gu.json deleted file mode 100644 index 0836fc541ff6256dd107b045f2c2d46f4cb76962..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/gu.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "આમંત્રણ સ્વીકારો", - "AddNewTrustedHost": "એક નવો વિશ્વસનીય હોસ્ટ ઉમેરો", - "Administration": "વહીવટ", - "ArchivingSettings": "આર્કાઇવિંગ સેટિંગ્સ", - "BrandingSettings": "બ્રાન્ડિંગ સેટિંગ્સ", - "BruteForce": "બ્રૂટ ફોર્સ", - "CheckToOptIn": "પસંદ કરવા માટે આ બોક્સને ચેક કરો.", - "ClickHereToOptIn": "પસંદ કરવા માટે અહીં ક્લિક કરો.", - "ClickHereToOptOut": "નાપસંદ કરવા માટે અહીં ક્લિક કરો.", - "CloudflareDescription": "જો તમારી વેબસાઇટ Cloudflare પર હોસ્ટ કરવામાં આવી હોય, તો કૃપા કરીને %1$s આ માર્ગદર્શિકા%2$s જુઓ.", - "ConfirmDeleteAllTrackingFailures": "શું તમે ખરેખર બધી ટ્રેકિંગ નિષ્ફળતાઓ કાઢી નાખવા માંગો છો?", - "ConfirmDeleteThisTrackingFailure": "શું તમે ખરેખર આ ટ્રેકિંગ નિષ્ફળતાને કાઢી નાખવા માંગો છો?", - "Cors": "કોર્સ", - "CorsDomains": "ક્રોસ-ઓરિજિન રીસોર્સ શેરિંગ (CORS) ડોમેન્સ", - "CorsDomainsHelp": "તમે http://example.com કે http://stats.example.com જેવા ડોમેઇન્સ અથવા સબડોમેઇન્સની વ્યાખ્યા કરી શકો છો. અથવા બધા ડોમેઇન્સ માટે ક્રોસ ડોમેઇન વિનંતીઓની મંજૂરી આપવા માટે ફક્ત * ઉમેરો", - "CustomLogoFeedbackInfo": "જો તમે Matomo લોગોને કસ્ટમાઇઝ કરો છો, તો તમને ટોચના મેનૂમાં %1$s લિંકને છુપાવવામાં પણ રસ હોઈ શકે છે. આમ કરવા માટે, તમે %2$s પ્લગઈન્સ મેનેજ કરો%3$s પેજમાં ફીડબેક પ્લગઈનને અક્ષમ કરી શકો છો.", - "CustomLogoHelpText": "તમે Matomo લોગોને કસ્ટમાઇઝ કરી શકો છો જે વપરાશકર્તા ઇન્ટરફેસ અને ઇમેઇલ રિપોર્ટ્સમાં પ્રદર્શિત થશે.", - "DeclineInvite": "આમંત્રણ નકારો", - "DeleteAllFailures": "બધા નિષ્ફળતાઓ કાઢી નાખો", - "DevelopmentProcess": "જ્યારે અમારી વિકાસ પ્રક્રિયામાં હજારો સ્વચાલિત પરીક્ષણોનો સમાવેશ થાય છે, ત્યારે બીટા પરીક્ષકો Matomo માં \"નો બગ નીતિ\" હાંસલ કરવામાં મુખ્ય ભૂમિકા ભજવે છે.", - "EmailServerSettings": "ઇમેઇલ સર્વર સેટિંગ્સ", - "ErrorEmailFromAddressNotValid": "SMTP ફ્રોમ સરનામું માન્ય નથી", - "FaviconUpload": "અપલોડ માટે એક Favicon પસંદ કરો", - "FileUploadDisabled": "તમારા PHP કોન્ફિગુરેશનમાં ફાઇલો અપલોડ કરવાની સક્ષમતા નથી. તમારો કસ્ટમ લોગો અપલોડ કરવા માટે કૃપા કરીને php.ini માં %s સેટ કરો અને તમારો વેબસર્વર ફરીથી શરૂ કરો.", - "ForBetaTestersOnly": "માત્ર બેટા ટેસ્ટર્સ માટે", - "GoogleTagManagerDescription": "જો તમારી વેબસાઇટ Google ટેગ મેનેજરનો ઉપયોગ કરી રહી છે, તો કૃપા કરીને %1$sઆ માર્ગદર્શિકા%2$s જુઓ.", - "HideAdvancedOptions": "વિગતવાર વિકલ્પો છુપાવો", - "HowToGetHelp": "તમે વિવિધ રીતે મદદ મેળવી શકો છો. Matomo સમુદાય દ્વારા મફત સપોર્ટ છે અને Matomo ટીમ અને Matomo ના ભાગીદારો દ્વારા આપવામાં આવેલ પેઇડ સપોર્ટ છે. અથવા કદાચ તમારી પાસે જાણ કરવા માટે કોઈ બગ છે અથવા કોઈ નવી સુવિધા સૂચવવા માંગો છો?", - "HttpTrackingApi": "HTTP ટ્રેકિંગ API", - "HttpTrackingApiDescription": "%1$sHTTP ટ્રેકિંગ API%2$s તમને કંઈપણ ટ્રૅક કરવાની મંજૂરી આપે છે. જો તમે પ્રોગ્રામિંગ ભાષાનો ઉપયોગ કરી રહ્યાં હોવ જેના માટે હજુ સુધી કોઈ SDK અસ્તિત્વમાં નથી તો આ ઉપયોગી થઈ શકે છે. જ્યારે તમે વિશિષ્ટ રીતે ઉપકરણો અથવા એપ્લિકેશનને ટ્રૅક કરવા માંગતા હોવ ત્યારે તે ઉપયોગી પણ હોઈ શકે છે.", - "ImageTracking": "ઇમેજ ટ્રેકિંગ", - "ImageTrackingIntro1": "જ્યારે કોઈ મુલાકાતીએ JavaScript અક્ષમ કરી હોય, અથવા જ્યારે JavaScript નો ઉપયોગ કરી શકાતો નથી, ત્યારે તમે મુલાકાતીઓને ટ્રૅક કરવા માટે ઇમેજ ટ્રૅકિંગ લિંકનો ઉપયોગ કરી શકો છો.", - "ImageTrackingIntro2": "નીચેની લિંક જનરેટ કરો અને પેજમાં જનરેટ કરેલ HTML કોપી-પેસ્ટ કરો. જો તમે JavaScript ટ્રેકિંગ માટે ફોલબેક તરીકે આનો ઉપયોગ કરી રહ્યાં છો, તો તમે તેને %1$s ટૅગ્સમાં આવૃત કરી શકો છો.", - "ImageTrackingIntro3": "વિકલ્પોની સંપૂર્ણ સૂચિ માટે તમે છબી ટ્રેકિંગ લિંક સાથે ઉપયોગ કરી શકો છો, %1$s ટ્રેકિંગ API દસ્તાવેજીકરણ%2$s જુઓ.", - "ImageTrackingLink": "ઇમેજ ટ્રેકિંગ લિંક", - "ImportFromGoogleAnalytics": "ગૂગલ એનાલિટિક્સ માંથી આયાત કરો", - "ImportFromGoogleAnalyticsDescription": "જો તમારી પાસે ગૂગલ એનાલિટિક્સ પ્રોપર્ટી હોય અને તમે Matomo પર સ્વિચ કરી રહ્યાં છો, તો તમે તમારા વિદ્યમાન ડેટાને %1$sGoogleAnalyticsImporter%2$s પ્લગઇન વાપરીને આયાત કરી શકો છો.", - "ImportingServerLogsDesc": "બ્રાઉઝર દ્વારા મુલાકાતીઓને ટ્રેક કરવાનું એક વૈકલ્પિક વિકલ્પ (JavaScript અથવા છબી લિંક દ્વારા) સર્વર લૉગ્સને લગાતાર આયાત કરવું છે. %1$sસર્વર લોગ ફાઇલ એનાલિટિક્સ%2$s વિશે વધુ જાણો.", - "InvalidPluginsWarning": "નીચેના પ્લગઈન્સ %1$s સાથે સુસંગત નથી અને તેને લોડ કરી શકાયું નથી: %2$s.", - "InvalidPluginsYouCanUninstall": "તમે %1$s પ્લગઇન્સ મેનેજ કરો%2$s પેજ પર આ પ્લગિન્સને અપડેટ અથવા અનઇન્સ્ટોલ કરી શકો છો.", - "JSTrackingDocumentationHelp": "સરળ ઍક્સેસ માટે, સૌથી વધુ લોકપ્રિય વિગતવાર વિકલ્પો નીચે ઉપલબ્ધ છે. હજી વધુ વિકલ્પો માટે (ગોલ, કસ્ટમ વેરિયેબલ્સ, ઈકોમર્સ ઓર્ડર્સ અને ત્યજી દેવાયેલા કાર્ટને કેવી રીતે ટ્રૅક કરવા સહિત) માટે કૃપા કરીને %1$sMatomo Javascript ટ્રેકિંગ દસ્તાવેજીકરણ%2$s તપાસો.", - "JSTrackingIntro1": "તમે તમારી વેબસાઇટના મુલાકાતીઓને ઘણી અલગ અલગ રીતે ટ્રૅક કરી શકો છો. તે કરવાની ભલામણ કરેલ રીત JavaScript દ્વારા છે. આ પદ્ધતિનો ઉપયોગ કરવા માટે તમારે ખાતરી કરવી આવશ્યક છે કે તમારી વેબસાઇટના દરેક વેબપેજમાં અમુક JavaScript કોડ છે, જે તમે અહીં જનરેટ કરી શકો છો.", - "JSTrackingIntro2": "એકવાર તમારી પાસે તમારી વેબસાઇટ માટે JavaScript ટ્રેકિંગ કોડ આવી જાય, પછી તમે Matomo સાથે ટ્રૅક કરવા માંગતા હો તે બધા પૃષ્ઠો પર તેને કૉપિ કરો અને પેસ્ટ કરો.", - "JSTrackingIntro3a": "મોટાભાગની વેબસાઇટ્સ, બ્લોગ્સ, CMS વગેરેમાં તમે તમારા માટે ટેકનિકલ કામ કરવા માટે પહેલાથી બનાવેલા પ્લગઇનનો ઉપયોગ કરી શકો છો. (અમારી %1$sMatomoને એકીકૃત કરવા માટે વપરાયેલ પ્લગઈન્સની યાદી%2$s જુઓ.)", - "JSTrackingIntro3b": "જો કોઈ પ્લગઇન અસ્તિત્વમાં ન હોય તો તમે તમારા વેબસાઇટ ટેમ્પલેટ્સમાં ફેરફાર કરી શકો છો અને JavaScript ટ્રેકિંગ કોડને </head> ટેગ કે જે ઘણીવાર 'header.php', 'header.tpl' અથવા સમાન ટેમ્પલેટ ફાઇલમાં વ્યાખ્યાયિત કરવામાં આવે છે.", - "JSTrackingIntro4": "જો તમે મુલાકાતીઓને ટ્રેક કરવા માટે JavaScript વાપરવા માંગતા નથી, %1$sનીચે છબી ટ્રેકિંગ લિંક ઉત્પન્ન કરો%2$s.", - "JSTrackingIntro5": "જો તમે ટ્રૅક પેજ વ્યૂ કરતાં વધુ કરવા માગો છો, તો કૃપા કરીને ઉપલબ્ધ કાર્યોની સૂચિ માટે %1$sMatomo Javascript ટ્રેકિંગ દસ્તાવેજીકરણ%2$s તપાસો. આ કાર્યોનો ઉપયોગ કરીને તમે લક્ષ્યો, કસ્ટમ ચલો, ઈકોમર્સ ઓર્ડર્સ, ત્યજી દેવાયેલા કાર્ટ્સ અને વધુને ટ્રૅક કરી શકો છો.", - "JSTracking_CampaignKwdParam": "ઝુંબેશ કીવર્ડ પરિમાણ", - "JSTracking_CampaignNameParam": "ઝુંબેશ નામ પરિમાણ", - "JSTracking_CodeNoteBeforeClosingHead": "કોડ સ્નિપેટની કૉપિ કરવા માટે બટન પર ક્લિક કરો અને તેને બંધ થતા %1$s ટૅગ પહેલાં તરત જ પેસ્ટ કરો (ભલામણ કરેલ)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "ખાતરી કરો કે આ કોડ તમારી વેબસાઇટના દરેક પૃષ્ઠ પર સ્ક્રિપ્ટ ઘટકમાં એમ્બેડ કરેલ છે. અમે તેને બંધ હેડ ટૅગ પહેલાં તરત જ પેસ્ટ કરવાની ભલામણ કરીએ છીએ.", - "JSTracking_ConsentManagerConnected": "%1$s પહેલાથી જ માટોમો સાથે કામ કરવા માટે રૂપરેખાંકિત લાગે છે.", - "JSTracking_ConsentManagerDetected": "તમારી સાઇટ પર %1$s સંમતિ મેનેજર મળી આવ્યો હતો. %1$s સાથે કામ કરવા માટે Matomo ને ગોઠવવા વિશે જાણવા માટે કૃપા કરીને %2$s ની મુલાકાત લો", - "JSTracking_ConsentManagerEmailNote": "અથવા તમે તેના બદલે તમારી વેબસાઇટમાં સીધા જ ટ્રેકિંગ કોડને એમ્બેડ કરી શકો છો:", - "JSTracking_CrossDomain": "ડિફૉલ્ટ રૂપે, મુલાકાતી ID કે જે અનન્ય મુલાકાતીને ઓળખે છે તે બ્રાઉઝરની પ્રથમ પક્ષ કૂકીઝમાં સંગ્રહિત થાય છે જે ફક્ત સમાન ડોમેન પરના પૃષ્ઠો દ્વારા જ ઍક્સેસ કરી શકાય છે. ક્રોસ ડોમેન લિંકિંગને સક્ષમ કરવાથી તમે ચોક્કસ મુલાકાતીઓની બધી ક્રિયાઓ અને પૃષ્ઠ દૃશ્યોને એક જ મુલાકાતમાં ટ્રૅક કરી શકો છો, પછી ભલે તેઓ ઘણા ડોમેન્સ પર પૃષ્ઠો જુએ. જ્યારે પણ વપરાશકર્તા તમારી વેબસાઇટના ઉપનામ URL ની લિંક પર ક્લિક કરે છે, ત્યારે તે વિઝિટર ID ને ફોરવર્ડ કરતા URL પેરામીટર pk_vid ઉમેરશે.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "નોંધ: ક્રોસ ડોમેન લિંકિંગનો ઉપયોગ કરવા માટે, તમારે તમારી વેબસાઇટ માટે એક કરતાં વધુ ડોમેન નામ (URL) નો ઉલ્લેખ કરવો આવશ્યક છે.", - "JSTracking_CustomCampaignQueryParam": "ઝુંબેશ નામ અને કીવર્ડ માટે કસ્ટમ ક્વેરી પરિમાણ નામો વાપરો", - "JSTracking_CustomCampaignQueryParamDesc": "નોંધ: %1$sMatomo આપમેળેગૂગલ એનાલિટિક્સ પરિમાણોને શોધી લેશે.%2$s", - "JSTracking_DisableCampaignParameters": "ઝુંબેશ પરિમાણો ટ્રેકિંગને અક્ષમ કરો", - "JSTracking_DisableCampaignParametersDesc": "જ્યારે આ વિકલ્પ ચકાસવામાં આવે છે, ત્યારે Matomo ઝુંબેશના પરિમાણોને ટ્રૅક કરશે નહીં અને તે ટ્રૅક કરેલા URL માંથી દૂર કરવામાં આવશે.", - "JSTracking_DisableCookies": "બધા ટ્રેકિંગ કૂકીઝ નિષ્ક્રિય કરો", - "JSTracking_DisableCookiesDesc": "બધા પ્રથમ પક્ષના કૂકીઝ નિષ્ક્રિય કરે છે. આ વેબસાઇટ માટેના વિદ્યમાન Matomo કૂકીઝ આગામી પૃષ્ઠ દૃશ્ય પર કાઢી નાખવામાં આવશે.", - "JSTracking_EnableCrossDomainLinking": "ક્રોસ ડોમેન લિંકિંગ સક્ષમ કરો", - "JSTracking_EnableDoNotTrack": "ક્લાઈન્ટ સાઇડ DoNotTrack ડિટેક્શન સક્ષમ કરો", - "JSTracking_EnableDoNotTrackDesc": "તેથી જો મુલાકાતીઓ ટ્રેક કરવા માંગતા ન હોય તો ટ્રેકિંગ વિનંતીઓ મોકલવામાં આવશે નહીં.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "નોંધ: સર્વર બાજુ DoNotTrack સપોર્ટ સક્ષમ કરવામાં આવ્યો છે, તેથી આ વિકલ્પની કોઈ અસર થશે નહીં.", - "JSTracking_EndNote": "નોંધ: તમે %1$sટ્રેકિંગ કોડ%2$s વ્યવસ્થાપક વિભાગમાં વૈવિધ્યપૂર્ણ ટ્રેકિંગ કોડ ઉત્પન્ન કરી શકો છો.", - "JSTracking_GroupPageTitlesByDomain": "ટ્રેકિંગ કરતી વખતે પેજ શીર્ષકને સાઇટ ડોમેન પહેલા ઉમેરો", - "JSTracking_GroupPageTitlesByDomainDesc1": "તેથી જો કોઈ વ્યક્તિ બ્લોગ પર 'વિશે' પૃષ્ઠની મુલાકાત લે છે.%1$s તે 'બ્લોગ / વિશે' તરીકે રેકોર્ડ કરવામાં આવશે. સબ-ડોમેન દ્વારા તમારા ટ્રાફિકની ઝાંખી મેળવવાનો આ સૌથી સહેલો રસ્તો છે.", - "JSTracking_MergeAliases": "\"આઉટલિંક્સ\" અહેવાલમાં, જાણીતા ઉપનામ URLs પર ક્લિક્સ છુપાવો", - "JSTracking_MergeAliasesDesc": "તેથી ઉપનામ URL (દા.ત. %s) ની લિંક્સ પરની ક્લિકને \"આઉટલિંક\" તરીકે ગણવામાં આવશે નહીં.", - "JSTracking_MergeSubdomains": "ના તમામ સબડોમેન્સ પર મુલાકાતીઓને ટ્રૅક કરો", - "JSTracking_MergeSubdomainsDesc": "તેથી જો એક મુલાકાતી %1$s અને %2$s ની મુલાકાત લે છે, તો તેઓને અનન્ય મુલાકાતી તરીકે ગણવામાં આવશે.", - "JSTracking_PageCustomVars": "દરેક પૃષ્ઠ દૃશ્ય માટે કસ્ટમ વેરીએબલને ટ્રૅક કરો", - "JSTracking_PageCustomVarsDesc": "ઉદાહરણ તરીકે, વેરીયેબલ નામ \"કેટેગરી\" અને મૂલ્ય \"વ્હાઇટ પેપર્સ\" સાથે.", - "JSTracking_TrackNoScript": "JavaScript અક્ષમ હોય તેવા વપરાશકર્તાઓને ટ્રૅક કરો", - "JSTracking_VisitorCustomVars": "આ મુલાકાતી માટે કસ્ટમ વેરિયેબલ્સ ટ્રૅક કરો", - "JSTracking_VisitorCustomVarsDesc": "ઉદાહરણ તરીકે, વેરીયેબલ નામ \"પ્રકાર\" અને મૂલ્ય \"ગ્રાહક\" સાથે.", - "JavaScriptCode": "JavaScript કોડ", - "JavaScriptTracking": "JavaScript ટ્રેકિંગ", - "JsTrackingCodeAdvancedOptionsStep": "વૈકલ્પિક: તમારા ટ્રેકિંગ કોડને કસ્ટમાઇઝ કરવા માટે વિગતવાર વિકલ્પોનો ઉપયોગ કરો.", - "JsTrackingCodeMissingEmail1": "થોડા દિવસો પહેલા તમે તમારા Matomo એનાલિટિક્સમાં '%s' વેબસાઈટ ઉમેરી. અમે હમણાં જ તપાસ કરી છે અને તમારા Matomo પાસે આ વેબસાઇટ માટે કોઈ રેકોર્ડ કરેલ ટ્રાફિક હોય તેવું લાગતું નથી.", - "JsTrackingCodeMissingEmail2": "ડેટા ટ્રૅક કરવાનું શરૂ કરવા અને તમારા વપરાશકર્તાઓની આંતરદૃષ્ટિ મેળવવા માટે, તમારે તમારી વેબસાઇટ અથવા મોબાઇલ એપ્લિકેશનમાં ટ્રેકિંગ સેટ કરવાની જરૂર પડશે. વેબસાઇટ્સ માટે ફક્ત %s ટેગની પહેલાં જ ટ્રેકિંગ કોડને એમ્બેડ કરો.", - "JsTrackingCodeMissingEmail3": "તમારો ટ્રેકિંગ કોડ શોધવા અને કસ્ટમાઇઝ કરવા માટે, %1$sઅહીં ક્લિક કરો%2$s (અથવા %3$sJavaScript ટ્રેકિંગ ક્લાયન્ટ માર્ગદર્શિકા%4$s પર એક નજર નાખો).", - "LearnMore": "વધુ જાણો", - "Login": "લૉગિન", - "LogoNotWriteableInstruction": "ડિફૉલ્ટ Matomo લોગોને બદલે તમારા કસ્ટમ લોગોનો ઉપયોગ કરવા માટે, આ નિર્દેશિકાને લખવાની પરવાનગી આપો: %1$s Matomo ને %2$s ફાઇલોમાં સંગ્રહિત તમારા લોગો માટે લખવાની ઍક્સેસની જરૂર છે.", - "LogoUpload": "અપલોડ માટે એક લોગો પસંદ કરો", - "LogoUploadFailed": "અપલોડ કરેલી ફાઇલ પર પ્રક્રિયા કરી શકાઈ નથી. કૃપા કરીને તપાસો કે ફાઇલમાં માન્ય ફોર્મેટ છે કે નહીં.", - "LogoUploadHelp": "કૃપા કરીને %2$s પિક્સેલ્સની ન્યૂનતમ ઊંચાઈ સાથે %1$s ફોર્મેટમાં ફાઇલ અપલોડ કરો.", - "LtsReleases": "LTS (લોંગ ટર્મ સપોર્ટ) વર્ઝન માત્ર સુરક્ષા અને બગ-ફિક્સ મેળવે છે.", - "MenuDevelopment": "વિકાસ", - "MenuDiagnostic": "નોંધાયેલું", - "MenuGeneralSettings": "સામાન્ય સેટિંગ્સ", - "MenuMeasurables": "માપી શકાય તેવા", - "MenuSystem": "સિસ્ટમ", - "MissingTrackingCodeEmailSubject": "Matomo એનાલિટિક્સમાં %s માટે કોઈ ટ્રાફિક રેકોર્ડ નથી, હવે શરૂ કરો", - "NTrackingFailures": "%s ટ્રેકિંગ નિષ્ફળતાઓ", - "NeedHelp": "મદદ જોઈએ છે?", - "NoKnownFailures": "કોઈ જાણીતા ટ્રેકિંગ નિષ્ફળતાઓ નથી.", - "OptOutComplete": "ઓપ્ટ-આઉટ પૂર્ણ; વેબ ઍનલિટિક્સ ટૂલ દ્વારા આ વેબસાઇટની તમારી મુલાકાતો રેકોર્ડ કરવામાં આવશે નહીં.", - "OptOutCompleteBis": "નોંધ કરો કે જો તમે તમારી કૂકીઝ સાફ કરો છો, નાપસંદ કૂકી કાઢી નાખો છો, અથવા જો તમે કમ્પ્યુટર અથવા વેબ બ્રાઉઝર બદલો છો, તો તમારે ફરીથી નાપસંદ કરવાની પ્રક્રિયા કરવાની જરૂર પડશે.", - "OptOutCustomOptOutLink": "તમે આ ડેવલપર %1$sguide%2$s માં સમજાવ્યા મુજબ, HTML અને JavaScript નો ઉપયોગ કરીને સંપૂર્ણપણે કસ્ટમ ઓપ્ટ-આઉટ ફોર્મ પણ બનાવી શકો છો.", - "OptOutDntFound": "તમારું બ્રાઉઝર જાણ કરી રહ્યું છે કે તમે ઇચ્છતા નથી તેથી તમને ટ્રૅક કરવામાં આવી રહ્યો નથી. આ તમારા બ્રાઉઝરનું સેટિંગ છે જેથી જ્યાં સુધી તમે 'ટ્રૅક ન કરો' સુવિધાને અક્ષમ ન કરો ત્યાં સુધી તમે ઑપ્ટ-ઇન કરી શકશો નહીં.", - "OptOutErrorNoCookies": "ટ્રેકિંગ ઓપ્ટ-આઉટ સુવિધા માટે કૂકીઝ સક્ષમ કરવાની જરૂર છે.", - "OptOutErrorNoTracker": "ટ્રેકિંગ ઓપ્ટ-આઉટ સુવિધા આ પૃષ્ઠ પર Matomo ટ્રેકર કોડ શોધવામાં અસમર્થ હતી", - "OptOutErrorNotHttps": "ટ્રૅકિંગ ઑપ્ટ-આઉટ સુવિધા કદાચ કામ ન કરે કારણ કે આ સાઇટ HTTPS પર લોડ કરવામાં આવી ન હતી. તમારી નાપસંદ સ્થિતિ બદલાઈ છે કે કેમ તે તપાસવા માટે કૃપા કરીને પૃષ્ઠને ફરીથી લોડ કરો.", - "OptOutErrorWindowOpen": "ટ્રેકિંગ ઑપ્ટ-આઉટ સુવિધા કદાચ કામ ન કરે કારણ કે એવું લાગે છે કે ઑપ્ટ આઉટ પૉપઅપ બ્લૉક કરવામાં આવ્યું હતું. તમારી નાપસંદ સ્થિતિ બદલાઈ છે કે કેમ તે તપાસવા માટે કૃપા કરીને પૃષ્ઠને ફરીથી લોડ કરો.", - "OptOutExplanation": "Matomo ઇન્ટરનેટ પર ગોપનીયતા પ્રદાન કરવા માટે સમર્પિત છે. તમારા મુલાકાતીઓને Matomo વેબ ઍનલિટિક્સમાંથી નાપસંદ કરવાની પસંદગી પ્રદાન કરવા માટે, તમે તમારી વેબસાઇટ પૃષ્ઠોમાંથી એક પર નીચેનો HTML કોડ ઉમેરી શકો છો, ઉદાહરણ તરીકે ગોપનીયતા નીતિ પૃષ્ઠમાં.", - "OptOutExplanationIntro": "આ કોડ તમારા મુલાકાતીઓ માટે તેમના વેબ બ્રાઉઝર્સમાં ઑપ્ટ-આઉટ કૂકી સેટ કરીને Matomoમાંથી નાપસંદ કરવા માટે એક લિંક ધરાવતું ડિવ પ્રદર્શિત કરશે. ડિવ દ્વારા પ્રદર્શિત કરવામાં આવશે તે સામગ્રી જોવા માટે નીચે જુઓ (અથવા %1$sઅહીં ક્લિક કરો%2$s).", - "OptOutForYourVisitors": "તમારા મુલાકાતીઓ માટે Matomo ઓપ્ટ-આઉટ", - "OptingYouOut": "તમને બહાર કરી રહ્યાં છીએ, કૃપા કરીને રાહ જુઓ…", - "PersonalPluginSettings": "વ્યક્તિગત પ્લગઇન સેટિંગ્સ", - "PiwikIsInstalledAt": "Matomo પર ઇન્સ્ટોલ કરેલ છે", - "PluginSettingChangeNotAllowed": "તમને પ્લગઇન \"%2$s\" માં સેટિંગ \"%1$s\" નું મૂલ્ય બદલવાની મંજૂરી નથી", - "PluginSettingReadNotAllowed": "તમને પ્લગઇન \"%2$s\" માં સેટિંગ \"%1$s\" નું મૂલ્ય વાંચવાની મંજૂરી નથી", - "PluginSettings": "પ્લગઇન સેટિંગ્સ", - "PluginSettingsIntro": "અહીં તમે નીચેના તૃતીય-પક્ષ પ્લગિન્સ માટે સેટિંગ્સ બદલી શકો છો:", - "PluginSettingsSaveFailed": "પ્લગઇન સેટિંગ્સ સાચવી શકાઈ નથી", - "PluginSettingsSaveSuccess": "પ્લગઇન સેટિંગ્સ અપડેટ કરી.", - "PluginSettingsValueNotAllowed": "\"%2$s\" પ્લગઇનમાં \"%1$s\" ફીલ્ડ માટેના મૂલ્યને મંજૂરી નથી", - "Problem": "સમસ્યા", - "ProtocolNotDetectedCorrectly": "તમે હાલમાં Matomoને સુરક્ષિત SSL કનેક્શન (HTTPS નો ઉપયોગ કરીને) પર જોઈ રહ્યા છો, પરંતુ Matomo માત્ર સર્વર પર બિન-સુરક્ષિત કનેક્શન શોધી શકે છે.", - "ProtocolNotDetectedCorrectlySolution": "Matomo સુરક્ષિત રીતે HTTPS પર તમારી સામગ્રીની વિનંતી કરે છે અને સેવા આપે છે તેની ખાતરી કરવા માટે, તમે તમારી %1$s ફાઇલને સંપાદિત કરી શકો છો અને કાં તો તમારી પ્રોક્સી સેટિંગ્સને ગોઠવી શકો છો અથવા તમે %3$s વિભાગની નીચે %2$s રેખા ઉમેરી શકો છો. %4$sવધુ જાણો%5$s", - "ReactDescription": "જો તમારી વેબસાઇટ React વાપરી રહી છે, તો કૃપા કરીને %1$sઆ માર્ગદર્શિકા%2$s જુઓ.", - "ReleaseChannel": "રિલીઝ ચેનલ", - "SecurityNotificationAllTokenAuthDeletedBody": "કોઈએ તમારા એકાઉન્ટમાંના તમામ ઓથ ટોકન્સ કાઢી નાખ્યા છે.", - "SecurityNotificationAnonymousAccessEnabledBody": "કોઈકે %1$s માટે અનામી વપરાશકર્તા ઍક્સેસ સક્ષમ કરી છે. આનો અર્થ એ છે કે આ સાઇટ માટેનો ડેટા હવે સાર્વજનિક રૂપે ઍક્સેસિબલ છે. જો આ ઠીક છે, તો આ ઇમેઇલને અવગણો.", - "SecurityNotificationCheckTwoFactor": "કૃપા કરીને તમારી દ્વિ-પરિબળ પ્રમાણીકરણ એપ્લિકેશન અથવા ઉપકરણ તપાસો.", - "SecurityNotificationEmailSubject": "સુરક્ષા સૂચના", - "SecurityNotificationIfItWasYou": "જો તે તમે હતા, તો ચાલુ રાખો. જો તમે આ પ્રવૃત્તિને ઓળખતા નથી, તો કૃપા કરીને તમારો પાસવર્ડ રીસેટ કરો.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "કોઈએ તમારા એકાઉન્ટ માટે નવા દ્વિ-પરિબળ પ્રમાણીકરણ પુનઃપ્રાપ્તિ કોડ જનરેટ કર્યા છે.", - "SecurityNotificationRecoveryCodesShowedBody": "કોઈએ તમારા એકાઉન્ટના દ્વિ-પરિબળ પ્રમાણીકરણ પુનઃપ્રાપ્તિ કોડ્સ જોયા છે.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "અન્ય સુપર વપરાશકર્તા (%1$s) એ સિસ્ટમ સેટિંગ્સમાં ફેરફાર કર્યો. પ્રભાવિત સેટિંગ્સ: %2$s. જો તમે આ પ્રવૃત્તિ વિશે જાણો છો, તો ચાલુ રાખો. જો તમે આ પ્રવૃત્તિને ઓળખતા નથી, તો કૃપા કરીને અન્ય સુપર વપરાશકર્તાઓનો સંપર્ક કરો.", - "SecurityNotificationSettingsChangedByUserBody": "કોઈએ સિસ્ટમ સેટિંગ્સમાં ફેરફાર કર્યો છે. પ્રભાવિત સેટિંગ્સ: %s.", - "SecurityNotificationTokenAuthCreatedBody": "કોઈએ તમારા એકાઉન્ટમાં ઓથ ટોકન (વર્ણન: %s) બનાવ્યું છે. જો તે તમે ન હતા, તો ટોકન કાઢી નાખો.", - "SecurityNotificationTokenAuthDeletedBody": "કોઈએ તમારા એકાઉન્ટમાંથી ઓથ ટોકન (વર્ણન: %s) કાઢી નાખ્યું છે.", - "SecurityNotificationTwoFactorAuthDisabledBody": "કોઈએ તમારા એકાઉન્ટમાં દ્વિ-પરિબળ પ્રમાણીકરણ અક્ષમ કર્યું છે.", - "SecurityNotificationTwoFactorAuthEnabledBody": "કોઈએ તમારા એકાઉન્ટમાં દ્વિ-પરિબળ પ્રમાણીકરણ સક્ષમ કર્યું છે.", - "SecurityNotificationUserAcceptInviteBody": "વપરાશકર્તા (લોગિન: %s)એ આમંત્રણને સ્વીકાર્યું.", - "SecurityNotificationUserCreatedBody": "કોઈએ તમારા એકાઉન્ટમાં નવો વપરાશકર્તા (લોગિન: %s) બનાવ્યો છે.", - "SecurityNotificationUserDeclinedInviteBody": "વપરાશકર્તા (લોગિન: %s)એ આમંત્રણને નકારી દીધું.", - "SecurityNotificationUserDeletedBody": "કોઈએ તમારા એકાઉન્ટમાંથી વપરાશકર્તા (લોગિન: %s) કાઢી નાખ્યો છે.", - "SendPluginUpdateCommunication": "જ્યારે પ્લગઇન અપડેટ ઉપલબ્ધ હોય ત્યારે ઇમેઇલ મોકલો", - "SendPluginUpdateCommunicationHelp": "જ્યારે પ્લગઇન માટે નવું સંસ્કરણ ઉપલબ્ધ હશે ત્યારે સુપર વપરાશકર્તાઓને એક ઇમેઇલ મોકલવામાં આવશે.", - "SettingsSaveSuccess": "સેટિંગ્સ અપડેટ કરી છે.", - "ShowAdvancedOptions": "વિગતવાર વિકલ્પો બતાવો", - "SinglePageApplicationDescription": "જો તમે સિંગલ-પેજ એપ્લિકેશન (SPA) અથવા પ્રોગ્રેસિવ વેબ એપ્લિકેશન (PWA) ની ટ્રેકિંગ કરી રહ્યાં છો, તો કૃપા કરીને %1$sઆ માર્ગદર્શિકા%2$s જુઓ.", - "Solution": "સમાધાન", - "StableReleases": "જો Matomo તમારા વ્યવસાયનો મહત્વપૂર્ણ ભાગ છે, તો અમે તમને નવીનતમ સ્થિર પ્રકાશનનો ઉપયોગ કરવાની ભલામણ કરીએ છીએ. જો તમે નવીનતમ બીટાનો ઉપયોગ કરો છો અને તમને કોઈ બગ મળે છે અથવા કોઈ સૂચન છે, તો કૃપા કરીને %1$sઅહીં જુઓ%2$s.", - "SystemPluginSettings": "સિસ્ટમ પ્લગઇન સેટિંગ્સ", - "TrackAGoal": "લક્ષ્ય ટ્રેક કરો", - "TrackingCode": "ટ્રેકિંગ કોડ", - "TrackingCodeIntro": "Matomo તમને તમારી વેબસાઇટ, મોબાઇલ એપ્લિકેશન અને કોઈપણ ઉપકરણ અથવા એપ્લિકેશન માટે ટ્રેકિંગ કોડને એમ્બેડ કરવાની વિવિધ રીતો પ્રદાન કરે છે.", - "TrackingFailureAuthenticationProblem": "વિનંતી પ્રમાણીકરણ વિના કરવામાં આવી હતી પરંતુ પ્રમાણીકરણ જરૂરી હતું.", - "TrackingFailureAuthenticationSolution": "તમારી ટ્રેકિંગ વિનંતીમાં \"token_auth\" સેટ કરો અથવા સુધારો.", - "TrackingFailureInvalidSiteProblem": "સાઇટ અસ્તિત્વમાં નથી.", - "TrackingFailureInvalidSiteSolution": "ટ્રેકરમાં કન્ફિગર્ડ idSite અપડેટ કરો.", - "TrackingFailures": "ટ્રેકિંગ નિષ્ફળતાઓ", - "TrackingFailuresEmail1": "આ માત્ર તમને જણાવવા માટે છે કે છેલ્લા દિવસોમાં %s વિવિધ પ્રકારની ટ્રેકિંગ નિષ્ફળતાઓ આવી છે.", - "TrackingFailuresEmail2": "બધી નિષ્ફળ ટ્રેકિંગ વિનંતીઓ જોવા માટે %1$s અહીં ક્લિક કરો %2$s.", - "TrackingFailuresEmailSubject": "તમારા Matomo એનાલિટિક્સમાં ટ્રેકિંગ નિષ્ફળતાઓ", - "TrackingFailuresIntroduction": "આ પૃષ્ઠ છેલ્લા %s દિવસો દરમિયાન થયેલી ટ્રેકિંગ નિષ્ફળતાઓની યાદી આપે છે. મહેરબાની કરીને નોંધ કરો કે માત્ર સૌથી સામાન્ય પ્રકારની ટ્રેકિંગ નિષ્ફળતાઓ જ રેકોર્ડ કરવામાં આવે છે અને તે બધી જ નહીં.", - "TrackingURL": "ટ્રેકિંગ URL", - "TrustedHostConfirm": "શું તમે ખરેખર વિશ્વસનીય Matomo હોસ્ટનામને ફેરફાર કરવા માંગો છો?", - "TrustedHostSettings": "વિશ્વસનીય Matomo હોસ્ટનામ", - "TwoFactorAuth": "બે-ફેક્ટર ઓથેન્ટિકેશન", - "UiDemo": "UI ડેમો", - "UncheckToOptOut": "નાપસંદ કરવા માટે આ બૉક્સને અનચેક કરો.", - "UpdateSettings": "અપડેટ સેટિંગ્સ", - "UseCustomLogo": "એક કસ્ટમ લોગો વાપરો", - "UserInviteContent": "તમે નીચે આપેલ સ્વીકાર બટન પર ક્લિક કરીને આ આમંત્રણને સ્વીકારી શકો છો.", - "UserInviteNotes": "જો તમે આ આમંત્રણની અપેક્ષા ન કરી રહ્યા હોવ તો, તમે આ ઇમેઇલને અવગણી શકો છો. જો %1$s તમને વધુ ઇમેઇલ્સ મોકલી રહ્યા છે, તો તમે તેમને બ્લોક કરી શકો છો અથવા દુરુપયોગ અહેવાલ કરી શકો છો. આમંત્રણ %2$s દિવસોમાં સ્વયંચાલિત રીતે સમાપ્ત થઈ જશે.", - "UserInviteSubject": "%1$s એ તમને %2$s માટે Matomo એનાલિટિક્સમાં જોડાવા માટે આમંત્રણ મોકલ્યું છે.", - "ValidPiwikHostname": "માન્ય Matomo હોસ્ટનામ", - "ViewAllTrackingFailures": "બધી ટ્રેકિંગ નિષ્ફળતાઓ જુઓ", - "VueDescription": "જો તમારી વેબસાઇટ Vue.js વાપરી રહી છે, તો કૃપા કરીને %1$sઆ માર્ગદર્શિકા%2$s જુઓ.", - "WhatIsNew": "શું નવું છે", - "WhatIsNewDoNotShowAgain": "ફરી બતાવશો નહીં", - "WhatIsNewNoChanges": "હાલમાં કંઈ નવું નથી", - "WhatIsNewNoChangesTitle": "તાજેતરમાં કોઈ ફેરફાર નથી", - "WhatIsNewRemindMeLater": "મને પછી યાદ કરાવો", - "WhatIsNewTitle": "Matomoમાં શું નવું છે", - "WhatIsNewTooltip": "Matomoમાં નવું શું છે તે જાણો", - "WithOptionalRevenue": "વૈકલ્પિક આવક સાથે", - "WordpressDescription": "જો તમારી વેબસાઇટ વર્ડપ્રેસનો ઉપયોગ કરી રહી છે, તો કૃપા કરીને %1$sઆ માર્ગદર્શિકા%2$s જુઓ.", - "YouAreNotOptedOut": "તમે નાપસંદ કરેલ નથી.", - "YouAreOptedOut": "તમે હાલમાં નાપસંદ કરેલ છે.", - "YouMayOptOut": "તમે આ વેબસાઇટ પર એકત્રીત અને વિશ્લેષણ કરવામાં આવેલ ડેટાને ટાળવા માટે તમારા કમ્પ્યુટરને અનન્ય વેબ એનાલિટિક્સ કૂકી ઓળખણ નંબર ન આપવાની પસંદગી કરી શકો છો.", - "YouMayOptOut2": "તમે આ વેબસાઇટને અહીં તમે જે ક્રિયાઓ લો તેને એકત્રીકરણ અને વિશ્લેષણ કરવામાં રોકવાની પસંદગી કરી શકો છો.", - "YouMayOptOut3": "આમ કરવાથી તમારી ગોપનીયતાનું રક્ષણ થશે, પરંતુ તે માલિકને તમારી ક્રિયાઓમાંથી શીખવાથી અને તમારા અને અન્ય વપરાશકર્તાઓ માટે બહેતર અનુભવ બનાવવાથી પણ અટકાવશે.", - "YouMayOptOutBis": "તે પસંદગી કરવા માટે, કૃપા કરીને નાપસંદ કૂકી મેળવવા માટે નીચે ક્લિક કરો." - } -} diff --git a/plugins/CoreAdminHome/lang/he.json b/plugins/CoreAdminHome/lang/he.json deleted file mode 100644 index 65f29895543251f60f91e5f676355e96e7e65bd1..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/he.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "ניהול", - "BrandingSettings": "הגדרות מיתוג", - "ClickHereToOptIn": "לחץ כאן להצטרפות.", - "ClickHereToOptOut": "לחץ כאן לביטול.", - "EmailServerSettings": "הגדרות שרת אימייל", - "ForBetaTestersOnly": "עבור גרסת ניסיון בלבד", - "ImageTracking": "תמונת מעקב", - "ImageTrackingIntro1": "כאשר המבקרים ביטלו את יישום הג'אווה או שלא בשימוש, אתה יכול להשתמש בתמונת קישור למעקב אחרי המבקרים", - "ImageTrackingLink": "קישור מעקב כתמונה", - "JavaScriptTracking": "מעקב בג'אווה-סקריפט", - "Login": "משתמש", - "LogoUpload": "בחירת קובץ לוגו", - "MenuDiagnostic": "אבחון", - "MenuGeneralSettings": "הגדרות כלליות", - "MenuMeasurables": "מדידים", - "MenuSystem": "כללי", - "OptOutForYourVisitors": "התחמקות מ-Matomo עבור גולשיך", - "PiwikIsInstalledAt": "Matomo מותקן ב", - "TrackAGoal": "עקיבה אחר יעד", - "TrackingCode": "קוד מעקב", - "TrustedHostSettings": "מארח מהימן ע״י Matomo", - "UseCustomLogo": "להשתמש בלוגו מותאם אישית" - } -} diff --git a/plugins/CoreAdminHome/lang/hi.json b/plugins/CoreAdminHome/lang/hi.json deleted file mode 100644 index 61ae673cb3da68ae7d041ec1f5cca5142a75ec3c..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/hi.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "प्रशासन", - "ArchivingSettings": "संग्रह सेटिंग", - "BrandingSettings": "ब्रांडिंग सेटिंग्स", - "ClickHereToOptIn": "इस विकल्प को चुनने के लिए यहाँ क्लिक करें।", - "ClickHereToOptOut": "बाहर निकलना के लिए यहां क्लिक करें.", - "CustomLogoFeedbackInfo": "आप Matomo प्रतीक चिन्‍ह अनुकूलित करे, तो आप भी शीर्ष मेनू में लिंक %1$s को छिपाने के लिए दिलचस्पी हो सकती है. ऐसा करने के लिए, आप प्रबंधित प्लगइन्स पृष्ठ में %2$s प्रतिक्रिया प्लगइन %3$s निष्क्रिय कर सकते हैं.", - "CustomLogoHelpText": "आप Matomo प्रतीक चिन्‍ह को अनुकूलित कर सकते हैं जो यूजर इंटरफेस और ईमेल रिपोर्ट में प्रदर्शित किया जाएगा", - "EmailServerSettings": "ईमेल सर्वर की सेटिंग्स", - "ForBetaTestersOnly": "केवल बीटा परीक्षकों के लिए", - "ImageTracking": "इमेज ट्रैकिंग", - "ImageTrackingIntro1": "एक आगंतुक जावास्क्रिप्ट निष्क्रिय कर दिया या जावास्क्रिप्ट प्रयोग नहीं किया, आप आगंतुकों को ट्रैक करने के लिए एक छवि ट्रैकिंग लिंक का उपयोग कर सकते हैं.", - "ImageTrackingIntro2": "नीचे लिंक उत्पन्न करें और उत्पन्न HTML को पृष्ठ में कॉपी पेस्ट करें. आप जावास्क्रिप्ट पर नज़र रखने के लिए एक fallback के रूप में इस का उपयोग कर रहे हैं, तो आप %1$s टैग में घेर कर सकते हैं.", - "ImageTrackingIntro3": "विकल्पों की पूरी सूची के लिए एक छवि ट्रैकिंग लिंक का उपयोग कर सकते हैं , %1$s ट्रैकिंग एपीआई प्रलेखन %2$s देखें.", - "ImageTrackingLink": "इमेज ट्रैकिंग का लिंक", - "ImportingServerLogsDesc": "ब्राउज़र (या तो जावास्क्रिप्ट या एक छवि लिंक के माध्यम से) के माध्यम से दर्शकों ट्रैकिंग के लिए एक विकल्प लगातार सर्वर लॉग आयात है. सर्वर %1$s लॉग फ़ाइल एनालिटिक्स %2$s के बारे में अधिक जानें.", - "JSTrackingIntro2": "एक बार जब आप अपनी वेबसाइट के लिए जावास्क्रिप्ट ट्रैकिंग कोड है कॉपी और सभी पृष्ठों पर जोड़ दें आप Matomo के साथ ट्रैक करना चाहते हैं", - "JSTrackingIntro4": "आप आगंतुकों को ट्रैक करने के लिए जावास्क्रिप्ट का उपयोग नहीं करना चाहते हैं, %1$s तो नीचे एक छवि ट्रैकिंग %2$s लिंक उत्पन्न करते हैं.", - "JSTrackingIntro5": "आप ट्रैक पृष्ठ विचारों से अधिक करना चाहते हैं, उपलब्ध कार्यों की सूची के लिए %1$s Matomo जावास्क्रिप्ट ट्रैकिंग दस्तावेज़ीकरण %2$s की जाँच करें. इन कार्यों का उपयोग कर आप लक्ष्यों, कस्टम चर, ईकॉमर्स आदेश, परित्यक्त गाड़ियां और अधिक ट्रैक कर सकते हैं.", - "JSTracking_CampaignKwdParam": "अभियान खोजशब्द प्राचल", - "JSTracking_CampaignNameParam": "अभियान का नाम प्राचल", - "JSTracking_CustomCampaignQueryParam": "अभियान का नाम और कीवर्ड के लिए कस्टम क्वेरी प्राचल नाम का प्रयोग करें", - "JSTracking_CustomCampaignQueryParamDesc": "नोट: %1$s Matomo स्वतः गूगल एनालिटिक्स मापदंडों की पहचान करेगा.%2$s", - "JSTracking_EnableDoNotTrack": "ग्राहक की ओर \"ट्रैक नहीं\" का पता लगाना सक्षम", - "JSTracking_EnableDoNotTrackDesc": "आगंतुकों को ट्रैक करना नहीं चाहते हैं तो ट्रैकिंग अनुरोध को नहीं भेजा जाएगा.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "नोट: सर्वर साइड, समर्थन सक्षम किया गया है \"ट्रैक नहीं\" इसलिए इस विकल्प का कोई प्रभाव नहीं पड़ेगा.", - "JSTracking_GroupPageTitlesByDomain": "ट्रैकिंग से पहले साइट डोमेन पृष्ठ शीर्षक में जोड़े", - "JSTracking_GroupPageTitlesByDomainDesc1": "किसी के ब्लॉग पर 'के बारे में' पृष्ठ पर जाता है तो अगर. %1$s यह ब्लॉग के बारे में / 'के रूप में दर्ज किया जाएगा. इस उप डोमेन से अपने यातायात का अवलोकन प्राप्त करने के लिए सबसे आसान तरीका है.", - "JSTracking_MergeAliases": "\"आउटलिंक\" रिपोर्ट में,", - "JSTracking_MergeSubdomains": "के सभी उप डोमेंस भर में आगंतुकों खोज", - "JSTracking_MergeSubdomainsDesc": "तो एक आगंतुक का दौरा %1$s और %2$s अगर वे एक अद्वितीय आगंतुक के रूप में गिना जाएगा.", - "JSTracking_PageCustomVars": "प्रत्येक पृष्ठ को देखने के लिए एक विशिष्ट चर खोज", - "JSTracking_PageCustomVarsDesc": "उदाहरण के लिए, चर नाम \"श्रेणी\" के साथ और मूल्य \"श्वेत पत्र\".", - "JSTracking_VisitorCustomVars": "इस आगंतुक के लिए कस्टम चर खोजे", - "JSTracking_VisitorCustomVarsDesc": "उदाहरण के लिए, चर नाम \"प्रकार\" के साथ और मूल्य \"ग्राहक\".", - "JavaScriptTracking": "जावास्क्रिप्ट ट्रैकिंग", - "Login": "लॉगिन", - "LogoUpload": "अपलोड करने के लिए किसी लोगो को चुनें", - "MenuDiagnostic": "डायग्नोस्टिक", - "MenuGeneralSettings": "सामान्य सेटिंग्स", - "MenuMeasurables": "औसत दर्जे का", - "OptOutComplete": "ऑप्ट-आउट कम्पलीट: इस वेबसाइट के लिए अपने दौरे वेब विश्लेषिकी उपकरण द्वारा दर्ज नहीं किया जाएगा.", - "OptOutCompleteBis": "आप अपने कुकी साफ़ करें, अगर कुकी को हटा सकते हैं, या आप कंप्यूटर या वेब ब्राउज़र को बदलते हैं, तो आप फिर से ऑप्ट-आउट कार्यविधि को पूरा करने की आवश्यकता होगी.", - "OptOutDntFound": "आप अपने ब्राउज़र आप नहीं करना चाहते हैं कि रिपोर्ट कर रहा है के बाद से नज़र रखी जा रही नहीं कर रहे हैं । आप ' ट्रैक न करें' सुविधा का प्रयोग नहीं जब तक आप चुनते में करने में सक्षम नहीं होगा, तो यह आपके ब्राउजर की एक सेटिंग है।", - "OptOutExplanation": "Matomo इंटरनेट पर गोपनीयता प्रदान करने के लिए समर्पित है. Matomo वेब विश्लेषिकी से बाहर निकलने के विकल्प के साथ अपने आगंतुकों प्रदान करने के लिए, आप अपनी वेबसाइट के पेज में से एक पर निम्नलिखित HTML कोड जोड़ सकते हैं, एक गोपनीयता नीति पेज में उदाहरण के लिए.", - "OptOutForYourVisitors": "अपने दर्शकों के लिए Matomo ऑप्ट आउट", - "OptingYouOut": "आप छोड़ने पर, कृपया प्रतीक्षा करें …", - "PiwikIsInstalledAt": "Matomo में स्थापित किया गया है", - "StableReleases": "Matomo अपने व्यापार का एक महत्वपूर्ण हिस्सा है, तो हम आपको नवीनतम स्थिर रिलीज उपयोग की सलाह देते हैं. आप नवीनतम बीटा का उपयोग करें और आप एक बग मिल या एक सलाह देना चाहते हैं, %1$sयहां देखें%2$s.", - "TrackAGoal": "एक लक्ष्य की खोज", - "TrackingCode": "कोड देखना", - "TrustedHostConfirm": "क्या आप विश्वसनीय Matomo परिचारक नाम बदलना चाहते हैं?", - "TrustedHostSettings": "Matomo विश्वसनीय परिचारक नाम", - "UseCustomLogo": "एक विशिष्ट प्रतीक चिन्‍ह का प्रयोग करें", - "ValidPiwikHostname": "Matomo वैध परिचारक नाम", - "WithOptionalRevenue": "वैकल्पिक राजस्व के साथ", - "YouAreOptedOut": "आप वर्तमान में बाहर निकले जाते हैं.", - "YouMayOptOut": "आप इस वेबसाइट पर एकत्र आंकड़ों का एकत्रीकरण और विश्लेषण से बचने के लिए अपने कंप्यूटर के लिए आवंटित एक अद्वितीय वेब विश्लेषण कुकी पहचान संख्या नहीं चुन सकते हैं.", - "YouMayOptOutBis": "उसे विकल्प बनाने के लिए, कुकी को प्राप्त करने के लिए नीचे क्लिक करें." - } -} diff --git a/plugins/CoreAdminHome/lang/hr.json b/plugins/CoreAdminHome/lang/hr.json deleted file mode 100644 index 2082fbbdeaca05720f9f080e8c27d5b7495f8462..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/hr.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "Administracija", - "EmailServerSettings": "Postavke email servera", - "JSTracking_ConsentManagerConnected": "Čini se da je %1$s već konfiguriran za rad s Matomom.", - "JSTracking_MergeAliases": "U izvještaju „Vanjske poveznice” sakrij klikove na poznate alias URL-ove od", - "JSTracking_MergeAliasesDesc": "Na taj se način klikovi na poveznice prema alias URL-ovima (npr. %s) neće brojati kao „Vanjska poveznica”.", - "LearnMore": "Saznaj više", - "LogoUpload": "Odaberi logo za upload", - "MenuDevelopment": "Razvoj", - "MenuDiagnostic": "Dijagnostika", - "MenuGeneralSettings": "Opće postavke", - "MenuMeasurables": "Mjerljive jedinice", - "MenuSystem": "Sustav", - "PiwikIsInstalledAt": "Matomo je instaliran na", - "TrackingCode": "Kod za praćenje" - } -} diff --git a/plugins/CoreAdminHome/lang/hu.json b/plugins/CoreAdminHome/lang/hu.json deleted file mode 100644 index 6c33b3c1ae916e3df5b928c61c0c312072f95ad5..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/hu.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Új megbízható host hozzáadása", - "Administration": "Adminisztráció", - "ArchivingSettings": "Archiválási beállítások", - "BrandingSettings": "Arculat beállítások", - "CheckToOptIn": "Pipálja be a követés engedélyezéséhez.", - "ClickHereToOptIn": "Kattintson ide a bekapcsoláshoz.", - "ClickHereToOptOut": "Kattintson ide a kikapcsoláshoz.", - "CustomLogoFeedbackInfo": "A Matomo logó konfigurálása esetén érdekes lehet a felső menüben található %1$s link eltávolítása is. Ehhez a %2$sBővítmények%3$s oldalon ki kell kapcsolni a Feedback bővítményt.", - "CustomLogoHelpText": "A felhasználói felületen és az e-mail jelentésekben megjelenő Matomo logó testreszabható.", - "EmailServerSettings": "E-mail szerver beállítások", - "FaviconUpload": "Válasszon egy Favicon-t a feltöltéshez", - "FileUploadDisabled": "A fájlfeltöltés nincs engedélyezve a PHP konfigurációban. Egyedi logó feltöltéséhez be kell állítani a php.ini fájlban a következőt: %s. A webszerver újraindítása is szükséges lehet.", - "ForBetaTestersOnly": "Csak béta tesztelőknek", - "ImageTracking": "Kép Követés", - "ImageTrackingIntro1": "Ha egy látogatónál le van tiltva a JavaScript, vagy JavaScript egyéb okokból nem használható, lehetőség van egy kép követési link segítségével követni a látogatókat.", - "ImageTrackingIntro2": "Erre használható az alább generált HTML kód az oldalba ágyazva. %1$s tagbe illesztve helyettesíthető a JavaScript követő kód, ha az valamiért nem használható.", - "ImageTrackingIntro3": "Az összes lehetséges opciót %1$sKövetés API dokumentáció%2$s tartalmazza.", - "ImageTrackingLink": "Kép Követési Link", - "ImportingServerLogsDesc": "A látogatók böngésző (JavaScript vagy kép) általi követése helyett lehetőség van a szervernaplók folyamatos importálására. További részletek: %1$sSzervernapló analízis%2$s.", - "InvalidPluginsWarning": "A következő bővítmény nem kompatibilisek evvel: %1$s ezért nem lehet őket betölteni: %2$s.", - "InvalidPluginsYouCanUninstall": "A bővítmények frissíthetők vagy törölhetők a %1$sBővítmények%2$s oldalon.", - "JSTrackingIntro2": "A lent látható generált kódnak (vagy annak egy módosított változatának) szerepelnie kell minden oldalon, amit a Matomonek követnie kell.", - "JSTrackingIntro4": "JavaScript követés helyett lehetőség van kép alapú követés használatára is, mely %1$saz alábbi linkre kattintva generálható%2$s.", - "JSTrackingIntro5": "Ha az oldalmegtekintések követése nem elég, tekintse meg a %1$sMatomo Javascript Követés dokumentációt%2$s a további funkciókért. Ezek használatával lehetőség van egyéni célok, saját változók, ecommerce rendelések, otthagyott bevásárló kosarak, stb, követésére.", - "JSTracking_CampaignKwdParam": "Kampány Kulcsszó paraméter", - "JSTracking_CampaignNameParam": "Kampány Név paraméter", - "JSTracking_CustomCampaignQueryParam": "Saját paraméter nevek használata a kampány név és a kulcsszó mezőkhöz", - "JSTracking_CustomCampaignQueryParamDesc": "Megjegyzés: A %1$sMatomo automatikusan felismeri a Googly Analytics paramétereket.%2$s", - "JSTracking_DisableCookies": "Minden követő süti tiltása", - "JSTracking_DisableCookiesDesc": "Letilt minden első féltől származó sütit. A már meglévő sütik a következő oldalbetöltéskor törlődni fognak.", - "JSTracking_EnableDoNotTrack": "Kliens oldali DoNotTrack engedélyezése", - "JSTracking_EnableDoNotTrackDesc": "A látogatónak lehetősége van a követés megtiltására, így a követési kérések nem lesznek elküldve.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Megjegyzés: A szerver oldali DoNotTrack már engedélyezve van, így ennek az opciónak arra nincs hatása.", - "JSTracking_GroupPageTitlesByDomain": "Az weboldal domain nevének hozzáfűzése az oldal címéhez", - "JSTracking_GroupPageTitlesByDomainDesc1": "Ha valaki a 'Rólunk' oldalt látogatja meg a(z) blog.%1$s weboldalon, a naplóban 'blog / Rólunk' fog szerepelni. Ez a legegyszerűbb módja a látogatások aldomain szerinti áttekintésének.", - "JSTracking_MergeAliases": "A \"Kilépési lapok\" jelentésben az ismert álnevek (URLek) elrejtése a következőnél:", - "JSTracking_MergeAliasesDesc": "Egy álnevet (URLt) (pl. %s) tartalmazó linkre kattintás nem lesz \"Kilépési lapként\" számolva.", - "JSTracking_MergeSubdomains": "Látogatók követése a következő összes aldomainjén:", - "JSTracking_MergeSubdomainsDesc": "Ha egy látogató meglátogatja a(z) %1$s és %2$s weboldalakat, akkor egyedi látogatásként lesz számolva.", - "JSTracking_PageCustomVars": "Saját változók követése minden oldalmegtekintésnél", - "JSTracking_PageCustomVarsDesc": "Példa: változó: \"Kategória\", érték: \"Újság\".", - "JSTracking_VisitorCustomVars": "Saját változó kovetése látogatónként", - "JSTracking_VisitorCustomVarsDesc": "Példa: változó: \"Típus\", érték: \"Ügyfél\".", - "JavaScriptTracking": "JavaScript Követés", - "Login": "felhasználó", - "LogoNotWriteableInstruction": "Egyedi logó használatához írási jogosultságra van szükség a következő könyvtárhoz: %1$s A logók tárolásához a következőfájlokhoz írási jogosultság szükséges: %2$s.", - "LogoUpload": "Válasszon egy logót a feltöltéshez", - "LogoUploadFailed": "A feltöltött fájl nem feldolgozható. Kérjük ellenőrizze, hogy a fájl formátuma érvényes-e.", - "LogoUploadHelp": "A feltöltött fájlnak %1$s formátumban, minimum %2$s pixel magasnak kell lennie.", - "LtsReleases": "LTS (Hosszútávú támogatás) kiadások csak biztonsági és hibajavítási frissítéseket kapnak", - "MenuDevelopment": "Fejlesztés", - "MenuDiagnostic": "Diagnosztika", - "MenuGeneralSettings": "Alapbeállítások", - "MenuMeasurables": "mérhetők", - "OptOutComplete": "Követés kikapcsolva; a látogatások semmilyen statisztikában nem fognak szerepelni.", - "OptOutCompleteBis": "Megjegyzés: abban az esetben, ha a követést tiltó süti törlődik, más számítógépről vagy böngészőből látogatja meg a weboldalt, a követést ismét le kell tiltania.", - "OptOutDntFound": "Ön nem lekövethető, mert a böngészője azt jelzni, hogy ön ezt nem kívánta. Ez az állapot nem fog addig változni, amíg le nem tiltja a 'Do Not Track' funkciót.", - "OptOutExplanation": "A Matomo tiszteletben tartja a magánéletet Internet. Annak érdekében, hogy látogatóinak lehetősége legyen a követés kikapcsolására, helyezze el az alábbi HTML kódot például egy Adatvédelmi Tájékoztató oldalon.", - "OptOutForYourVisitors": "Matomo követés letiltása látogatók által", - "OptingYouOut": "Kiléptetés alatt, kis türelmet…", - "PersonalPluginSettings": "Személyes bővítmény beállítások", - "PiwikIsInstalledAt": "Matomo telepítve itt:", - "PluginSettingChangeNotAllowed": "Önnek nincs jogosultsága a(z) \"%1$s\" beállítás módosításához a(z) \"%2$s\" bővítményben", - "PluginSettingReadNotAllowed": "Önnek nincs jogosultséga a(z) \"%1$s\" beállítás megtekintéséhez a(z) \"%2$s\" bővítményben", - "PluginSettings": "Bővítmény beállítások", - "PluginSettingsIntro": "Itt módosíthatók a harmadik féltől származó bővítmények beállításai:", - "PluginSettingsSaveFailed": "A bővítmény beállítások mentése sikertelen", - "PluginSettingsValueNotAllowed": "A(z) \"%1$s\" mező értéke a(z) \"%2$s\" bővítményben érvénytelen", - "ProtocolNotDetectedCorrectly": "Jelenleg biztonságos SSL kapcsolat van ön és a Matomo csak nem biztonságos kapcsolatot tudott észlelni.", - "ProtocolNotDetectedCorrectlySolution": "Hogy biztos minden kérés és kiszolgálás HTTPS-en keresztül biztonságosan történjen, szerkeszteni kell a %1$s fájlt és ellenőrizni a proxy beállításokat vagy hozzá kell adni a %2$s sort, lentebb a %3$s szekcióban. %4$sTovábbi információk%5$s", - "ReleaseChannel": "Release csatorna", - "SendPluginUpdateCommunication": "Küldjön egy emailt, mikor egy bővítmény frissítés elérhetővé válik", - "SendPluginUpdateCommunicationHelp": "Az adminisztrátorok emailben értesülnek ha egy bővítményhez frissítés érhető el.", - "StableReleases": "Ha a Matomo fontos része a vállalkozásának, javasoljuk, hogy a legfrissebb stabil kiadást használja. Ha a legfrissebb béte kiadást használja és hibát talál vagy javaslata van, kérjük %1$skattintson ide%2$s.", - "SystemPluginSettings": "Rendszer bővítmény beállításai", - "TrackAGoal": "Cél követése", - "TrackingCode": "Követőkód", - "TrustedHostConfirm": "Biztosan meg akarja változtatni a megbízható Matomo hosztnevet?", - "TrustedHostSettings": "Megbízható Matomo Hosztnév", - "UncheckToOptOut": "A tiltáshoz kattintsa ki ezt a checkboxot.", - "UpdateSettings": "Beállítások frissítése", - "UseCustomLogo": "Saját logó használata", - "ValidPiwikHostname": "Érvényes Matomo Hosztnév", - "WithOptionalRevenue": "opcionális jövedelemmel", - "YouAreNotOptedOut": "A követés engedélyezett.", - "YouAreOptedOut": "A követés jelenleg ki van kapcsolva.", - "YouMayOptOut": "Lehetőség van a számítógépen tárolt egyedi azonosító süti letiltására, hogy a látogatás ne szerepeljen semmilyen statisztikában.", - "YouMayOptOut2": "Megtilthatja, hogy ez a weboldal adatot gyűjtsön az ezen a weboldalon történő látogatásairól és azokat analalitikai célokra felhasználja.", - "YouMayOptOut3": "Ha így tesz, azzal digitális adatvédelmét erősíti, de egyúttal megakadályozza, hogy a weboldal tulajdonosa tanuljon látogatásai szokásaiból és ezáltal egy jobb felhasználói élményt nyújthasson Önnek és más látogatóknak.", - "YouMayOptOutBis": "Az alábbi kapcsoló segítségével engedélyezhető a követő süti használata." - } -} diff --git a/plugins/CoreAdminHome/lang/hy.json b/plugins/CoreAdminHome/lang/hy.json deleted file mode 100644 index 1d2c674b5ab4fde425b5389f04c722891a77892e..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/hy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "Ադմինիստրատիվ", - "DeleteAllFailures": "ջնջել բոլոր ձախողումները", - "MenuGeneralSettings": "Ընդհանուր կայանքները" - } -} diff --git a/plugins/CoreAdminHome/lang/id.json b/plugins/CoreAdminHome/lang/id.json deleted file mode 100644 index db5d40b9e7f27b8596f2fd04c12eb549ce29b927..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/id.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Terima Undangan", - "AddNewTrustedHost": "Tambahkan host tepercaya yang baru", - "Administration": "Administrasi", - "ArchivingSettings": "Pengaturan pengarsipan", - "BrandingSettings": "Pengaturan merek", - "BruteForce": "Paksaan", - "CheckToOptIn": "Centang kotak ini untuk ikut serta.", - "ClickHereToOptIn": "Klik di sini untuk ikut serta.", - "ClickHereToOptOut": "Klik di sini untuk memilih keluar.", - "CloudflareDescription": "Jika situs web Anda dihosting di Cloudflare, silakan lihat %1$spanduan ini%2$s.", - "ConfirmDeleteAllTrackingFailures": "Apakah Anda yakin ingin menghapus semua kegagalan pelacakan?", - "ConfirmDeleteThisTrackingFailure": "Apakah Anda yakin ingin menghapus kegagalan pelacakan ini?", - "Cors": "CORS", - "CorsDomains": "Domain Cross-Origin Resource Sharing (CORS)", - "CorsDomainsHelp": "Anda dapat menentukan domain atau subdomain seperti http://contoh.com atau http://statistik.contoh.com atau untuk mengizinkan permintaan lintas domain untuk semua domain, cukup tambahkan *", - "CustomLogoFeedbackInfo": "Jika Anda menyesuaikan logo Matomo, Anda mungkin juga tertarik untuk menyembunyikan tautan %1$s di menu atas. Untuk melakukannya, Anda mematikan pengaya Umpan Balik di halaman %2$s Pengelolaan Pengaya%3$s.", - "CustomLogoHelpText": "Anda dapat Anda dapat menyesuaikan logo Matomo yang akan ditampilkan dalam antarmuka pengguna dan laporan surel.", - "DeclineInvite": "Tolak Undangan", - "DeleteAllFailures": "Hapus semua kegagalan", - "DevelopmentProcess": "Proses pengembangan kami mencakup ribuan pengujian otomatis. Penguji Beta memainkan peran kunci dalam mencapai \"Kebijakan tanpa kesalahan\" di Matomo.", - "EmailServerSettings": "Pengaturan server surel", - "ErrorEmailFromAddressNotValid": "SMTP tidak valid", - "FaviconUpload": "Pilih Favicon untuk diunggah", - "FileUploadDisabled": "Pengunggahan berkas tidak diaktifkan dalam konfigurasi PHP Anda. Untuk mengunggah logo khusus Anda, harap setel %s di php.ini dan mulai ulang server web Anda.", - "ForBetaTestersOnly": "Hanya untuk penguji beta saja", - "GoogleTagManagerDescription": "Jika situs web Anda menggunakan Google Tag Manager, silakan lihat %1$spanduan ini%2$s.", - "HideAdvancedOptions": "Sembunyikan opsi lanjutan", - "HowToGetHelp": "Anda bisa mendapatkan bantuan melalui berbagai cara. Ada dukungan gratis melalui Komunitas Matomo dan dukungan berbayar yang diberikan oleh tim Matomo dan mitra Matomo. Atau mungkin Anda memiliki bug untuk dilaporkan atau ingin menyarankan fitur baru?", - "HttpTrackingApi": "API Pelacakan HTTP", - "HttpTrackingApiDescription": "%1$sAPI Pelacakan HTTP%2$s memungkinkan Anda untuk melacak apa pun. Ini akan berguna jika Anda menggunakan bahasa pemrograman yang belum memiliki SDK. Mungkin juga berguna saat Anda ingin melacak perangkat atau aplikasi dengan cara khusus.", - "ImageTracking": "Pelacakan Gambar", - "ImageTrackingIntro1": "Ketika pengunjung mematikan JavaScript, atau ketika JavaScript tidak dapat digunakan, Anda dapat menggunakan tautan pelacakan gambar untuk melacak pengunjung.", - "ImageTrackingIntro2": "Buat tautan di bawah ini dan salin-tempel HTML yang dihasilkan di halaman. Jika Anda menggunakan ini sebagai pengganti untuk pelacakan JavaScript, Anda dapat mengapitnya dalam tag %1$s.", - "ImageTrackingIntro3": "Untuk seluruh daftar opsi yang dapat Anda gunakan dengan tautan pelacakan gambar, lihat %1$sDokumentasi API Pelacakan%2$s.", - "ImageTrackingLink": "Tautan Pelacakan Gambar", - "ImportFromGoogleAnalytics": "Impor dari Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Jika Anda memiliki atribut Google Analytics dan beralih ke Matomo, Anda dapat mengimpor data yang ada menggunakan pengaya %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Sebuah cara alternatif untuk melacak pengunjung melalui peramban (melalui JavaScript atau tautan gambar) adalah secara berkelanjutan mengimpor catatan peladen. Pelajari selengkapnya tentang %1$sAnalisis Berkas Catatan Peladen%2$s.", - "InvalidPluginsWarning": "Pengaya berikut ini tidak kompatibel dengan %1$s dan tidak dapat dimuat: %2$s.", - "InvalidPluginsYouCanUninstall": "Anda dapat memperbarui atau mencopot pemasangan pengaya ini di halaman %1$sKelola Pengaya%2$s.", - "JSTrackingDocumentationHelp": "Untuk akses yang mudah, opsi lanjutan yang paling populer tersedia di bawah ini. Untuk lebih banyak opsi (termasuk cara melacak sasaran, variabel khusus, pesanan niaga-el, dan keranjang yang ditinggalkan), silakan lihat %1$sdokumentasi Pelacakan Javascript Matomo%2$s.", - "JSTrackingIntro1": "Anda dapat melacak pengunjung situs web Anda dengan berbagai cara. Cara yang disarankan untuk melakukannya adalah melalui JavaScript. Untuk menggunakan metode ini, Anda harus memastikan setiap halaman pada situs web Anda memiliki beberapa kode JavaScript, yang mana bisa Anda buat di sini.", - "JSTrackingIntro2": "Sekali Anda memiliki kode pelacakan JavaScript untuk situs Anda, salin dan tempel dalam setiap halaman yang ingin dilacak menggunakan Matomo.", - "JSTrackingIntro3a": "Di sebagian besar situs web, blog, CMS, dll. Anda dapat menggunakan pengaya yang sudah jadi untuk melakukan pekerjaan teknis untuk Anda. (Lihat daftar pengaya %1$s kami yang digunakan untuk mengintegrasikan Matomo%2$s.)", - "JSTrackingIntro3b": "Jika tidak ada pengaya, Anda dapat mengedit templat situs web dan menambahkan kode pelacakan JavaScript ke </head> tag yang sering didefinisikan di dalam 'header.php', 'header.tpl', atau berkas templat yang serupa.", - "JSTrackingIntro4": "Bila Anda tidak ingin menggunakan JavaScript untuk melacak pengunjung, %1$sbuat sebuah gambar pelacakan di tautan berikut%2$s.", - "JSTrackingIntro5": "Jika Anda ingin melakukan lebih dari sekadar melacak tampilan halaman, silakan lihat daftar fungsi yang tersedia di %1$sdokumentasi Pelacakan Javascript Matomo%2$s. Dengan menggunakan fungsi ini, Anda dapat melacak sasaran, variabel khusus, pesanan niaga-el, troli yang ditinggalkan, dan masih banyak lagi.", - "JSTracking_CampaignKwdParam": "Parameter Kata Kunci Kampanye", - "JSTracking_CampaignNameParam": "Parameter Nama Kampanye", - "JSTracking_CodeNoteBeforeClosingHead": "Klik pada tombol untuk menyalin potongan kode dan tempelkan segera sebelum tag %1$s penutup (disarankan)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Pastikan kode ini disematkan dalam elemen skrip di setiap halaman situs web Anda. Kami merekomendasikan untuk menempelkannya segera sebelum tag penutup kepala.", - "JSTracking_ConsentManagerConnected": "%1$s tampaknya sudah diatur untuk bekerja dengan Matomo.", - "JSTracking_ConsentManagerDetected": "%1$s manajer persetujuan terdeteksi di situs Anda. Untuk mempelajari tentang pengaturan Matomo %1$s, silakan kunjungi %2$s", - "JSTracking_ConsentManagerEmailNote": "Atau Anda bisa langsung menyematkan kode pelacakan di situs web Anda:", - "JSTracking_CrossDomain": "Secara bawaan, ID pengunjung yang mengidentifikasi pengunjung unik disimpan di kuki peramban pihak pertama yang hanya dapat diakses oleh halaman di domain yang sama. Mengaktifkan penautan lintas domain memungkinkan Anda untuk melacak semua tindakan dan tampilan halaman pengunjung tertentu ke dalam kunjungan yang sama bahkan saat mereka melihat halaman di beberapa domain. Setiap kali pengguna mengeklik tautan ke salah satu URL alias situs web Anda, itu akan menambahkan parameter URL pk_vid yang meneruskan ID Pengunjung.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Catatan: Untuk menggunakan penautan lintas domain, Anda harus menentukan lebih dari satu nama domain (URL) untuk situs web Anda.", - "JSTracking_CustomCampaignQueryParam": "Gunakan nama parameter kueri khusus untuk nama kampanye dan kata kunci", - "JSTracking_CustomCampaignQueryParamDesc": "Catatan: %1$sMatomo akan secara otomastis mendeteksi parameter Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Nonaktifkan Pelacakan Parameter Kampanye", - "JSTracking_DisableCampaignParametersDesc": "Saat opsi ini dipilih, Matomo tidak akan melacak parameter kampanye dan parameter tersebut akan dihapus dari URL yang dilacak.", - "JSTracking_DisableCookies": "Nonaktifkan semua kuki pelacakan", - "JSTracking_DisableCookiesDesc": "Menonaktifkan semua kuki pihak pertama. Kuki Matomo yang ada untuk situs web ini akan dihapus pada tampilan halaman berikutnya.", - "JSTracking_EnableCrossDomainLinking": "Aktifkan penautan lintas domain", - "JSTracking_EnableDoNotTrack": "Mengaktifkan pendeteksian Jangan Lacak sisi klien", - "JSTracking_EnableDoNotTrackDesc": "Jadi permintaan pelacakan tidak akan dikirim bila pengunjung tidak ingin terlacak.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Catatan: Dukungan Jangan Lacak sisi peladen telah diaktifkan, sehingga opsi ini tidak akan berpengaruh.", - "JSTracking_EndNote": "Catatan: Anda dapat membuat kode pelacakan khusus di bagian admin %1$sKode Pelacakan%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Tambahkan domain situs ke judul halaman saat sedang melacak", - "JSTracking_GroupPageTitlesByDomainDesc1": "Jadi jika seseorang mengunjungi halaman 'Tentang' di blog.%1$s maka akan dicatat sebagai 'blog/Tentang'. Ini adalah cara termudah untuk mendapatkan ikhtisar lalu lintas Anda berdasarkan subdomain.", - "JSTracking_MergeAliases": "Dalam laporan \"Tautan Keluar\", sembunyikan klik menuju URL alias yang diketahui", - "JSTracking_MergeAliasesDesc": "Sehingga bila mengeklik tautan terhadap URL Alias (misal %s) tidak akan dihitung sebagai \"Tautan keluar\".", - "JSTracking_MergeSubdomains": "Lacak pengunjung di semua subdomain dari", - "JSTracking_MergeSubdomainsDesc": "Jadi jika satu pengunjung mengunjungi %1$s dan %2$s, mereka akan dihitung sebagai pengunjung unik.", - "JSTracking_PageCustomVars": "Melacak variabel khusus untuk setiap tampilan halaman", - "JSTracking_PageCustomVarsDesc": "Misalnya, dengan nama variabel \"Kategori\" dan nilai \"Kertas Putih\".", - "JSTracking_TrackNoScript": "Lacak pengguna dengan JavaScript dinonaktifkan", - "JSTracking_VisitorCustomVars": "Lacak variabel khusus untuk pengunjung ini", - "JSTracking_VisitorCustomVarsDesc": "Sebagai contoh, dengan nama variabel \"Jenis\" dengan nilai \"Pelanggan\".", - "JavaScriptCode": "Kode JavaScript", - "JavaScriptTracking": "Pelacakan JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Opsional: gunakan opsi lanjutan untuk menyesuaikan kode pelacakan Anda.", - "JsTrackingCodeMissingEmail1": "Beberapa hari yang lalu, Anda menambahkan situs web '%s' ke Matomo Analytics Anda. Kami baru saja memeriksa dan Matomo Anda tampaknya tidak memiliki catatan lalu lintas untuk situs web ini.", - "JsTrackingCodeMissingEmail2": "Untuk mulai melacak data dan mendapatkan wawasan tentang pengguna, Anda harus menyiapkan pelacakan di situs web atau aplikasi seluler Anda. Untuk situs web, cukup sematkan kode pelacakan tepat sebelum tag %s.", - "JsTrackingCodeMissingEmail3": "Untuk menemukan dan menyesuaikan kode pelacakan Anda, %1$sklik di sini%2$s (atau lihat %3$spanduan Klien Pelacakan JavaScript Klien%4$s).", - "LearnMore": "Pelajari", - "Login": "Log Masuk", - "LogoNotWriteableInstruction": "Untuk menggunakan logo khusus Anda sendiri, berikan izin menulis ke direktori ini: %1$s Matomo membutuhkan akses tulis untuk logo Anda yang disimpan di dalam berkas %2$s.", - "LogoUpload": "Pilih Logo untuk diunggah", - "LogoUploadFailed": "Berkas yang diunggah tidak dapat diproses. Silakan periksa apakah berkas tersebut memiliki format yang valid.", - "LogoUploadHelp": "Harap mengunggah berkas dalam bentuk %1$s dengan tinggi minimal %2$s pixel.", - "LtsReleases": "Versi DJP (Dukungan Jangka Panjang) hanya menerima keamanan dan perbaikan kesalahan.", - "MenuDevelopment": "Pengembangan", - "MenuDiagnostic": "Diagnosis", - "MenuGeneralSettings": "Pengaturan Umum", - "MenuMeasurables": "Terukur", - "MenuSystem": "Sistem", - "MissingTrackingCodeEmailSubject": "Tidak ada lalu lintas untuk %s yang tercatat di Matomo Analytics, mulailah sekarang", - "NTrackingFailures": "%s kegagalan pelacakan", - "NeedHelp": "Butuh bantuan?", - "NoKnownFailures": "Tidak ada kegagalan pelacakan yang diketahui.", - "OptOutComplete": "Jangan Lacak selesai. Bila Anda mengunjungi situs ini, Anda tidak akan terekam oleh alat Analisis Web.", - "OptOutCompleteBis": "Perhatikan bahwa jika Anda menghapus kuki Anda, menghapus kuki Jangan Lacak, atau jika Anda mengganti komputer atau peramban web, Anda perlu melakukan prosedur Jangan Lacak lagi.", - "OptOutCustomOptOutLink": "Anda juga dapat membuat formulir ketidakikutsertaan yang sepenuhnya khusus menggunakan HTML dan JavaScript, seperti yang dijelaskan dalam %1$spanduan%2$s pengembang ini.", - "OptOutDntFound": "Anda tidak dilacak karena peramban Anda melaporkan bahwa Anda tidak menginginkannya. Ini adalah pengaturan peramban Anda sehingga Anda tidak dapat ikut serta sampai Anda menonaktifkan fitur 'Jangan Lacak'.", - "OptOutErrorNoCookies": "Fitur Jangan Lacak mengharuskan kuki untuk diaktifkan.", - "OptOutErrorNoTracker": "Fitur Jangan Lacak tidak dapat menemukan kode Matomo Tracker di halaman ini", - "OptOutErrorNotHttps": "Fitur Jangan Lacak mungkin tidak berfungsi karena situs ini tidak dimuat melalui HTTPS. Muat ulang halaman untuk memeriksa apakah status Jangan Lacak Anda berubah.", - "OptOutErrorWindowOpen": "Fitur Jangan Lacak mungkin tidak berfungsi karena sepertinya popup diblokir. Muat ulang halaman untuk memeriksa apakah status Jangan Lacak Anda berubah.", - "OptOutExplanation": "Matomo berdedikasi untuk menyediakan privasi di Internet. Demi memberikan pengunjung Anda pilihan untuk keluar dari Matomo Web Analytics, Anda dapat menambahkan kode HTML berikut di salah satu halaman situs web Anda, misalnya di halaman Kebijakan Privasi.", - "OptOutExplanationIntro": "Kode ini akan menampilkan div yang berisi tautan bagi pengunjung Anda untuk memilih keluar dari Matomo dengan menyetel cookie keluar di browser web mereka. Lihat di bawah (atau %1$sklik di sini%2$s) untuk melihat konten yang akan ditampilkan oleh div.", - "OptOutForYourVisitors": "Matomo memilih untuk tidak melacak pengunjung Anda", - "OptingYouOut": "Mengeluarkan Anda, harap tunggu…", - "PersonalPluginSettings": "Pengaturan Pengaya Pribadi", - "PiwikIsInstalledAt": "Matomo terpasang di", - "PluginSettingChangeNotAllowed": "Anda tidak diperbolehkan untuk mengubah nilai pengaturan \"%1$s\" di pengaya \"%2$s\"", - "PluginSettingReadNotAllowed": "Anda tidak diperbolehkan untuk membaca nilai pengaturan \"%1$s\" di pengaya \"%2$s\"", - "PluginSettings": "Pengaturan Pengaya", - "PluginSettingsIntro": "Di sini Anda dapat mengubah pengaturan untuk pengaya pihak ketiga berikut ini:", - "PluginSettingsSaveFailed": "Tidak dapat menyimpan pengaturan pengaya", - "PluginSettingsSaveSuccess": "Pengaturan pengaya diperbarui.", - "PluginSettingsValueNotAllowed": "Nilai untuk kolom \"%1$s\" di pengaya \"%2$s\" tidak diizinkan", - "Problem": "Masalah", - "ProtocolNotDetectedCorrectly": "Anda sedang melihat Matomo melalui koneksi SSL yang aman (menggunakan HTTPS), tetapi Matomo hanya dapat mendeteksi koneksi yang tidak aman di server.", - "ProtocolNotDetectedCorrectlySolution": "Untuk memastikan Matomo secara aman meminta dan menyajikan konten Anda melalui HTTPS, Anda dapat mengedit berkas %1$s dan mengatur proksi Anda, atau Anda dapat menambahkan baris %2$s di bawah bagian %3$s. %4$sPelajari lebih lanjut%5$s", - "ReactDescription": "Jika situs web Anda menggunakan React, silakan lihat %1$spanduan ini%2$s.", - "ReleaseChannel": "Saluran rilis", - "SecurityNotificationAllTokenAuthDeletedBody": "Seseorang telah menghapus semua token autentikasi di akun Anda.", - "SecurityNotificationAnonymousAccessEnabledBody": "Seseorang telah mengaktifkan akses pengguna anonim untuk %1$s. Ini berarti data untuk situs ini sekarang dapat diakses secara publik. Jika ini memang sengaja, silakan abaikan email ini.", - "SecurityNotificationCheckTwoFactor": "Silakan periksa aplikasi atau perangkat autentikasi dua faktor Anda.", - "SecurityNotificationEmailSubject": "Notifikasi Keamanan", - "SecurityNotificationIfItWasYou": "Jika itu Anda, lanjutkan. Jika Anda tidak mengenali aktivitas ini, harap atur ulang kata sandi Anda.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Seseorang telah membuat kode pemulihan autentikasi dua faktor baru untuk akun Anda.", - "SecurityNotificationRecoveryCodesShowedBody": "Seseorang telah melihat kode pemulihan autentikasi dua faktor akun Anda.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Pengguna super lain (%1$s) memodifikasi pengaturan sistem. Pengaturan yang terpengaruh: %2$s. Jika Anda mengetahui tentang kegiatan ini, lanjutkan. Jika Anda tidak mengenali aktivitas ini, harap hubungi pengguna super lainnya.", - "SecurityNotificationSettingsChangedByUserBody": "Seseorang sudah mengubah pengaturan sistem. Pengaturan yang terpengaruh: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Seseorang telah membuat token autentikasi (deskripsi: %s) di akun Anda. Jika bukan Anda, hapus tokennya.", - "SecurityNotificationTokenAuthDeletedBody": "Seseorang telah menghapus token autentikasi (deskripsi: %s) di akun Anda.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Seseorang sudah menonaktifkan autentikasi dua faktor di akun Anda.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Seseorang telah mengaktifkan autentikasi dua faktor di akun Anda.", - "SecurityNotificationUserAcceptInviteBody": "Pengguna (login: %s) menerima undangan.", - "SecurityNotificationUserCreatedBody": "Seseorang telah membuat pengguna baru (login: %s) di akun Anda.", - "SecurityNotificationUserDeclinedInviteBody": "Pengguna (login: %s) menolak undangan.", - "SecurityNotificationUserDeletedBody": "Seseorang telah menghapus pengguna (login: %s) di akun Anda.", - "SendPluginUpdateCommunication": "Mengirim surel saat pembaruan pengaya telah tersedia", - "SendPluginUpdateCommunicationHelp": "Surel akan dikirimkan ke Pengguna Super ketika ada pengaya versi baru yang tersedia.", - "SettingsSaveSuccess": "Pengaturan diperbarui.", - "ShowAdvancedOptions": "Tampilkan opsi lanjutan", - "SinglePageApplicationDescription": "Jika Anda melacak single-page application (SPA) atau aplikasi web progresif (AWP), silakan lihat %1$spanduan ini%2$s.", - "Solution": "Solusi", - "StableReleases": "Bila Matomo merupakan hal yang penting dalam usaha Anda, kami menyarankan Anda menggunakan rilis stabil terkini. \tBila Anda menggunakan beta terkini dan Anda menemukan sebuah kesalahan atau memiliki sebuah saran, harap %1$slihat di sini%2$s.", - "SystemPluginSettings": "Pengaturan Sistem Pengaya", - "TrackAGoal": "Lacak sebuah sasaran", - "TrackingCode": "Kode Palacakan", - "TrackingCodeIntro": "Matomo menawarkan berbagai cara untuk menyematkan kode pelacakan untuk situs web, aplikasi seluler, dan bahkan untuk perangkat atau aplikasi apa pun.", - "TrackingFailureAuthenticationProblem": "Permintaan tidak diautentikasi tetapi autentikasi diperlukan.", - "TrackingFailureAuthenticationSolution": "Atur atau perbaiki \"token_auth\" dalam permintaan pelacakan Anda.", - "TrackingFailureInvalidSiteProblem": "Situs tersebut tidak ada.", - "TrackingFailureInvalidSiteSolution": "Perbarui idSite yang diatur di pelacak.", - "TrackingFailures": "Kegagalan pelacakan", - "TrackingFailuresEmail1": "Ini hanya untuk memberi tahu Anda bahwa %s jenis kegagalan pelacakan telah terjadi dalam beberapa hari terakhir.", - "TrackingFailuresEmail2": "Untuk melihat semua permintaan pelacakan yang gagal %1$sklik di sini%2$s.", - "TrackingFailuresEmailSubject": "Kegagalan pelacakan dalam Matomo Analytics Anda", - "TrackingFailuresIntroduction": "Halaman ini mencantumkan kegagalan pelacakan yang terjadi selama %s hari terakhir. Harap perhatikan bahwa hanya jenis kegagalan pelacakan yang paling umum yang dicatat dan tidak semuanya.", - "TrackingURL": "URL Pelacakan", - "TrustedHostConfirm": "Apakah Anda yakin ingin mengubah nama host Matomo yang tepercaya?", - "TrustedHostSettings": "Nama Host Matomo Tepercaya", - "TwoFactorAuth": "Autentikasi dua faktor", - "UiDemo": "Demo UI", - "UncheckToOptOut": "Hapus centang pada kotak ini untuk memilih keluar.", - "UpdateSettings": "Perbarui pengaturan", - "UseCustomLogo": "Gunakan logo kustom", - "UserInviteContent": "Anda dapat menerima undangan ini dengan mengeklik tombol terima di bawah ini.", - "UserInviteNotes": "Jika Anda tidak mengharapkan undangan ini, Anda dapat mengabaikan surel ini. Jika %1$s mengirimi Anda terlalu banyak surel, Anda dapat memblokirnya atau melaporkan penyalahgunaan. Undangan secara otomatis kedaluwarsa dalam %2$s hari.", - "UserInviteSubject": "%1$s mengirimi Anda undangan untuk bergabung dengan Matomo Analytics untuk %2$s.", - "ValidPiwikHostname": "Nama Host Matomo yang Valid", - "ViewAllTrackingFailures": "Lihat semua kegagalan pelacakan", - "VueDescription": "Jika situs web Anda menggunakan Vue.js, silakan lihat %1$spanduan ini%2$s.", - "WhatIsNew": "Yang baru", - "WhatIsNewDoNotShowAgain": "Jangan tampilkan lagi", - "WhatIsNewNoChanges": "Belum ada yang baru", - "WhatIsNewNoChangesTitle": "Tidak ada perubahan", - "WhatIsNewRemindMeLater": "Ingatkan saya nani", - "WhatIsNewTitle": "Berikut yang baru dari Matomo", - "WhatIsNewTooltip": "Pelajari apa yang baru di Matomo", - "WithOptionalRevenue": "dengan pendapatan opsional", - "WordpressDescription": "Jika situs web Anda menggunakan Wordpress, silakan lihat %1$spanduan ini%2$s.", - "YouAreNotOptedOut": "Anda tidak memilih untuk keluar.", - "YouAreOptedOut": "Anda sekarang tak terekam.", - "YouMayOptOut": "Anda dapat memilih untuk tidak memiliki nomor identifikasi kuki analitik web unik yang ditetapkan ke komputer Anda untuk menghindari agregasi dan analisis data yang dikumpulkan di situs web ini.", - "YouMayOptOut2": "Anda dapat memilih untuk mencegah situs web ini untuk mengumpulkan dan menganalisis tindakan yang Anda ambil di sini.", - "YouMayOptOut3": "Melakukannya akan melindungi privasi Anda, tetapi juga akan mencegah pemilik untuk belajar dari tindakan Anda dan menciptakan pengalaman yang lebih baik untuk Anda dan pengguna lain.", - "YouMayOptOutBis": "Untuk membuat pilihan itu, silakan klik di bawah ini untuk menerima kuki Jangan Lacak." - } -} diff --git a/plugins/CoreAdminHome/lang/is.json b/plugins/CoreAdminHome/lang/is.json deleted file mode 100644 index 67f4db0500dad3fee433b3da0234ebfce1dc3605..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/is.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "Umsjón", - "EmailServerSettings": "Póstþjóns stillingar", - "MenuGeneralSettings": "Almennar stillingar", - "OptOutExplanation": "Matomo er tileinkað að bjóða uppá persónuvernd á netinu. Til að veita gestum þínum val á að kjósa ekki að taka þátt í Matomo vefumferðar mælingum þá getur þú bætt við eftirfarandi HTML kóða á eina af síðum vefjarins tildæmis á persónuverndarstefnu síðunni.", - "OptOutForYourVisitors": "Matomo er útvalið fyrir þína gesti", - "YouAreOptedOut": "Þú ert nú útvalinn", - "YouMayOptOutBis": "Til að framkvæma það val, vinsamlegast smelltu hér fyrir neðan til að fá útvals smáköku." - } -} diff --git a/plugins/CoreAdminHome/lang/it.json b/plugins/CoreAdminHome/lang/it.json deleted file mode 100644 index f561330f8d67d91234260cef478a32b66fa8fbe8..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/it.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Accetta l'invito", - "AddNewTrustedHost": "Aggiungi un nuovo host affidabile", - "Administration": "Amministrazione", - "ArchivingSettings": "Impostazioni archiviazione", - "BrandingSettings": "Impostazioni di personalizzazione", - "BruteForce": "Forza Bruta", - "CheckToOptIn": "Metti la spunta a questa casella per abilitarti (opt-in).", - "ClickHereToOptIn": "Clicca qui per accettare (opt-in).", - "ClickHereToOptOut": "Clicca qui per rifiutare (opt-out).", - "CloudflareDescription": "Se il tuo sito web è ospitato su Cloudflare, per favore segui %1$squesta guida%2$s.", - "ConfirmDeleteAllTrackingFailures": "Sei sicuro di voler eliminare tutti gli errori di tracking?", - "ConfirmDeleteThisTrackingFailure": "Sei sicuro di voler eliminare questo errore di tracking?", - "Cors": "CORS", - "CorsDomains": "Domini CORS", - "CorsDomainsHelp": "Puoi definire domini o sottodomini come http://example.com o http://stats.example.com. Oppure, per consentire le richieste \"cross domains\" per tutti i domini è sufficiente aggiungere un *", - "CustomLogoFeedbackInfo": "Se si personalizza il logo Matomo, si potrebbe anche essere interessati a nascondere il link %1$s nel menu in alto. A tale scopo, è possibile disattivare il plugin Feedback nella pagina di %2$sGestione Plugin%3$s.", - "CustomLogoHelpText": "È possibile personalizzare il logo Matomo che verrà visualizzato nell'interfaccia utente e nei report via e-mail.", - "DeclineInvite": "Rifiuta l'invito", - "DeleteAllFailures": "Cancella tutti gli errori", - "DevelopmentProcess": "Dato che il nostro processo di sviluppo include migliaia di test automatici, i Beta Tester svolgono un ruolo chiave nel raggiungimento della \"No bug policy\" di Matomo.", - "EmailServerSettings": "Impostazioni server e-mail", - "ErrorEmailFromAddressNotValid": "L'SMTP da indirizzo non è validio", - "FaviconUpload": "Seleziona una Favicon da caricare", - "FileUploadDisabled": "Il caricamento dei files non è abilitato nella configurazione del tuo PHP. Per caricare il tuo logo personalizzato devi impostare %s nel php.ini e riavviare il server.", - "ForBetaTestersOnly": "Solo per beta tester", - "GoogleTagManagerDescription": "Se il tuo sito web utilizza Google Tag Manager, per favore consulta %1$squesta guida%2$s.", - "HideAdvancedOptions": "Nascondi le opzioni avanzate", - "HowToGetHelp": "Ci sono diversi modi in cui ottenere aiuto. Esistono il supporto gratuito offerto dalla comunità di Matomo e il supporto a pagamento fornito dal team di Matomo e dai relativi partner. Oppure hai un bug da segnalare o vuoi suggerire una nuova funzionalità?", - "HttpTrackingApi": "API di Tracciamento HTTP", - "HttpTrackingApiDescription": "L'%1$sAPI di Tracciamento HTTP%2$s ti consente di tracciare ogni cosa. Può essere utile se stai usando un linguaggio di programmazione per il quale ancora non esiste un SDK. Può anche essere utile quando vuoi tracciare dispositivi o applicazioni in qualche modo particolare.", - "ImageTracking": "Tracking Immagini", - "ImageTrackingIntro1": "Quando un visitatore ha disattivato JavaScript o quando JavaScript non può essere utilizzato, è possibile utilizzare un collegamento di tracciamento immagine per tracciare i visitatori.", - "ImageTrackingIntro2": "Genera il link qui sotto e copia-incolla nella pagina il codice HTML generato. Se si utilizza questo come ripiego per il tracciamento JavaScript, è possibile limitarlo a %1$s tags.", - "ImageTrackingIntro3": "Per la lista completa delle opzioni che è possibile utilizzare con un link di tracciamento dell'immagine, vedi la%1$sDocumentazione API Tracciamento%2$s.", - "ImageTrackingLink": "Link Tracciamento Immagine", - "ImportFromGoogleAnalytics": "Importazione da Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Se hai una proprietà Google Analytics e stai passando a Matomo, puoi importare i dati esistenti utilizzando il plugin %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Un'alternativa al tracciamento dei visitatori tramite browser (JavaScript o immagine) è quella di importare i log del server web. Impara di più su %1$sStatistiche tramite Server Log File%2$s.", - "InvalidPluginsWarning": "I seguenti plugin non sono compatibili con %1$s e non possono essere caricati: %2$s.", - "InvalidPluginsYouCanUninstall": "Puoi aggiornare o disinstallare questi plugin nella pagina %1$sGestione Plugin%2$s.", - "JSTrackingDocumentationHelp": "Per facilitare l'accesso, le opzioni avanzate più popolari sono disponibili di seguito. Per ulteriori opzioni (tra cui il tracciamento degli obiettivi, delle variabili personalizzate, degli ordini ecommerce e dei carrelli abbandonati), consulta la %1$sdocumentazione sul tracciamento tramite Javascript di Matomo%2$s.", - "JSTrackingIntro1": "Puoi tenere traccia dei visitatori del tuo sito web in molti modi diversi. Il modo consigliato per farlo è tramite JavaScript. Per utilizzare questo metodo devi assicurarti che ogni pagina web del tuo sito web abbia il codice JavaScript che puoi generare qui.", - "JSTrackingIntro2": "Una volta ottenuto il codice JavaScript per il tuo sito web, copialo e incollalo in tutte le pagine che vuoi monitorare con Matomo.", - "JSTrackingIntro3a": "Nella maggior parte dei siti web, blog, CMS, ecc. È possibile utilizzare un plug-in già pronto per eseguire per te il lavoro tecnico. (Vedi il nostro %1$selenco di plugin usati per integrare Matomo%2$s.)", - "JSTrackingIntro3b": "Se non esiste alcun plug-in, puoi modificare i modelli del tuo sito web e aggiungere il codice JavaScript per il tracking al tag </head> che viene spesso definito in 'header.php', 'header.tpl' o in un file di template simile.", - "JSTrackingIntro4": "Se non vuoi usare il codice JavaScript per monitorare i visitatori, %1$sgenera qui sotto un'immagine per monitorare senza JavaScript%2$s.", - "JSTrackingIntro5": "Se volete fare altro oltre che tracciare le viste pagina, preghiamo di controllare la %1$sDocumentazione Matomo Javascript Tracking%2$s per l'elenco delle funzioni disponibili. Utilizzando queste funzioni potrete tracciare obiettivi, variabili personalizzate, ordini ecommerce, carrelli abbandonati e altro.", - "JSTracking_CampaignKwdParam": "Parametro Keyword Campagna", - "JSTracking_CampaignNameParam": "Parametro Nome Campagna", - "JSTracking_CodeNoteBeforeClosingHead": "Clicca sul pulsante per copiare la porzione di codice e incollalo appena prima della chiusura del tag %1$s (consigliato)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Assicurati che questo codice sia incorporato in un elemento dello script in ogni pagina del tuo sito web. Ti consigliamo di incollarlo immediatamente prima del tag head di chiusura.", - "JSTracking_ConsentManagerConnected": "%1$s sembra essere già configurato per funzionare con Matomo.", - "JSTracking_ConsentManagerDetected": "Il manager consensi %1$s è stato rilevato sul tuo sito. Per imparare come configurare Matomo per funzionare con %1$s per favore visita %2$s", - "JSTracking_ConsentManagerEmailNote": "Oppure, in alternativa, potresti direttamente incorporare il codice di tracciamento nel tuo sito web:", - "JSTracking_CrossDomain": "Per impostazione predefinita, l'ID visitatore che identifica un visitatore unico è memorizzato nel primo gruppo di cookies del browser al quale si può accedere solamente dalle pagine che si trovano nello stesso dominio. Abilitando i collegamenti cross domain, potrai tracciare tutte le azioni e le pagine viste da un determinato visitatore nell'ambito della stessa visita, anche quando esso visita le pagine di diversi domini. Quando un utente clicca su un link a un URL di uno degli alias del tuo sito web, verrà aggiunto un parametro URL pk_vid dopo l'ID Visitatore.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Nota: Per usare i collegamenti cross domain, devi specificare più di un nome di dominio (URL) per il tuo sito web.", - "JSTracking_CustomCampaignQueryParam": "Utilizza i nomi dei parametri di query personalizzati per il nome della campagna e parola chiave", - "JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sMatomo individuerà automaticamente i parametri di Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Disabilita il monitoraggio dei parametri della campagna", - "JSTracking_DisableCampaignParametersDesc": "Se questa opzione è selezionata, Matomo non monitorerà i parametri della campagna e questi verranno rimossi dagli URL monitorati.", - "JSTracking_DisableCookies": "Disabilita tutti i cookies di tracking", - "JSTracking_DisableCookiesDesc": "Disabilita tutti i cookies proprietari. I cookies di Matomo esistenti per questo sito web verranno cancellati alla prossima visualizzazione della pagina.", - "JSTracking_EnableCrossDomainLinking": "Abilita il collegamento tra domini", - "JSTracking_EnableDoNotTrack": "Abilita l'individuazione DoNotTrack lato client", - "JSTracking_EnableDoNotTrackDesc": "In questo modo le richieste di tracciamento non verranno inviate se il visitatore non vuole essere tracciato.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nota: È stato abilitato il supporto DoNotTrack lato server, così questa opzione non avrà effetto.", - "JSTracking_EndNote": "Nota: Puoi generare un codice di tracciamento personalizzato nella sezione di amministrazione %1$sTracking Code %2$s.", - "JSTracking_GroupPageTitlesByDomain": "Aggiungi il dominio del sito prima del titolo della pagina quando viene tracciata", - "JSTracking_GroupPageTitlesByDomainDesc1": "Così se qualcuno visita la pagina \"About\" sul blog %1$s, la visita verrà registrata come 'blog /About'. Questo è il modo più semplice per avere una panoramica del traffico di un sub-dominio.", - "JSTracking_MergeAliases": "Nel report \"Outlink\", nascondi i clic agli alias URL conosciuti di", - "JSTracking_MergeAliasesDesc": "Così i clic sui links agli alias URL (es. %s) non verranno conteggiati come \"Outlink\".", - "JSTracking_MergeSubdomains": "Traccia i visitatori in tutti i sottodomini di", - "JSTracking_MergeSubdomainsDesc": "Se un visitatore visita %1$s e %2$s, sarà contato come visitatore unico.", - "JSTracking_PageCustomVars": "Traccia una variabile personalizzata per ciascuna vista pagina", - "JSTracking_PageCustomVarsDesc": "Per esempio, come il nome di variabile \"categoria\" e il valore \"Carte Bianche\".", - "JSTracking_TrackNoScript": "Traccia utenti con JavaScript disabilitato", - "JSTracking_VisitorCustomVars": "Traccia le variabili personalizzate per questo visitatore", - "JSTracking_VisitorCustomVarsDesc": "Per esempio, con il nome di variabile \"Tipo\" e il valore \"Cliente\".", - "JavaScriptCode": "Codice JavaScript", - "JavaScriptTracking": "Tracciamento JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Opzionale: usa le opzioni avanzate per personalizzare il tuo codice di tracciamento.", - "JsTrackingCodeMissingEmail1": "Qualche giorno fa hai aggiunto il sito web '%s' al tuo Matomo Analytics. Abbiamo appena controllato, e il tuo Matomo non sembra avere alcun traffico registrato per questo sito.", - "JsTrackingCodeMissingEmail2": "Per iniziare a monitorare i dati e ottenere informazioni approfondite sui tuoi utenti, devi impostare il tracking nel tuo sito web o nella tua app per dispositivi mobili. Per i siti web è sufficiente incorporare il codice di tracking subito prima del tag %s.", - "JsTrackingCodeMissingEmail3": "Per trovare e personalizzare il codice di monitoraggio, %1$sclicca qui%2$s (o dai un'occhiata alla %3$sGuida del Client di Tracking JavaScript%4$s).", - "LearnMore": "Per saperne di più", - "Login": "Login", - "LogoNotWriteableInstruction": "Per utilizzare il tuo logo personalizzato al posto del logo predefinito di Matomo, devi dare l'accesso in scrittura a questa directory: %1$sMatomo richiede l'accesso in scrittura per i tuoi loghi conservati nei files %2$s.", - "LogoUpload": "Seleziona un logo da caricare", - "LogoUploadFailed": "È stato impossibile leggere il file caricato. Assicurati che esso abbia un formato valido.", - "LogoUploadHelp": "Caricate un file nei formati %1$s con un'altezza minima di %2$s pixel.", - "LtsReleases": "Le versioni LTS (Supporto a Lungo termine) riceveranno assistenza solo per le correzioni dei bug e della sicurezza.", - "MenuDevelopment": "Sviluppo", - "MenuDiagnostic": "Diagnostica", - "MenuGeneralSettings": "Impostazioni generali", - "MenuMeasurables": "Misurabili", - "MenuSystem": "Sistema", - "MissingTrackingCodeEmailSubject": "Non è stato registrato traffico per %s in Matomo Analytics, comincia ora", - "NTrackingFailures": "%s errori di tracking", - "NeedHelp": "Hai bisogno di aiuto?", - "NoKnownFailures": "Non ci sono errori di tracking riconosciuti.", - "OptOutComplete": "Opt-out completato. Le tue visite a questo sito non verranno registrate dallo strumento di Web Analytics.", - "OptOutCompleteBis": "Nota che se cancelli i tuoi cookie, cancelli anche il cookie di opt-out, e se cambi computer o browser web, devi fare nuovamente la procedura di opt-out.", - "OptOutCustomOptOutLink": "Puoi anche creare un modulo opt-out completamente personalizzato utilizzando HTML e JavaScript, come spiegato in questa %1$sguida%2$s per lo sviluppatore.", - "OptOutDntFound": "Non vieni tracciato poiché il tuo browser comunica che non lo desideri. Questa è un'impostazione del tuo browser, dunque non potrai effettuare l'opt-in finchè non disabiliti la funzionalità \"Non Tracciare\".", - "OptOutErrorNoCookies": "La funzione per l'opt-out dal monitoraggio richiede che siano abilitati i cookies.", - "OptOutErrorNoTracker": "La funzionalità di tracciamento opt-out non è riuscita a trovare il codice Matomo Tracker su questa pagina", - "OptOutErrorNotHttps": "La funzione di esclusione dal monitoraggio (opt-out) potrebbe non funzionare perché questo sito non è stato caricato su HTTPS. Ricarica la pagina per verificare se il tuo stato di rinuncia è cambiato.", - "OptOutErrorWindowOpen": "La funzione di esclusione dal monitoraggio (opt-out) potrebbe non funzionare perché sembra che il popup di disattivazione sia stato bloccato. Ricarica la pagina per verificare se il tuo stato di opt-out è cambiato.", - "OptOutExplanation": "Matomo è impegnato ad assicurare la riservatezza su Internet. Per dare ai tuoi visitatori la possibilità di escludersi dalle Statistiche Web di Matomo, è possibile aggiungere il seguente codice HTML in una pagina del tuo sito web, ad esempio in una pagina sulla privacy.", - "OptOutExplanationIntro": "Questo codice mostrerà ai tuoi visitatori un div contenente un link per escludersi da Matomo (opt-out) impostando un cookie apposito nel loro browser. Guarda qui di seguito (o %1$sclicca qui%2$s) per vedere il contenuto che verrà mostrato dal div.", - "OptOutForYourVisitors": "Matomo opt-out per i tuoi visitatori", - "OptingYouOut": "Sto acquisendo la tua rinuncia, attendi…", - "PersonalPluginSettings": "Impostazioni Personali Plugin", - "PiwikIsInstalledAt": "Matomo è installato su", - "PluginSettingChangeNotAllowed": "Non sei abilitato a cambiare il valore dell'impostazione \"%1$s\" nel plugin \"%2$s\"", - "PluginSettingReadNotAllowed": "Non sei abilitato a leggere il valore dell'impostazione \"%1$s\" nel plugin \"%2$s\"", - "PluginSettings": "Impostazioni plugin", - "PluginSettingsIntro": "Qui puoi cambiare le impostazioni dei seguenti plugin di terze parti:", - "PluginSettingsSaveFailed": "Salvataggio delle impostazioni del plugin fallito", - "PluginSettingsSaveSuccess": "Impostazioni del plugin aggiornate.", - "PluginSettingsValueNotAllowed": "Il valore contenuto nel campo \"%1$s\" nel plugin \"%2$s\" non è consentito", - "Problem": "Problema", - "ProtocolNotDetectedCorrectly": "Al momento stai guardando Matomo su una connessione sicura SSL (con l'utilizzo dell'HTTPS), ma Matomo ha potuto rilevare sul server solo una connessione non protetta.", - "ProtocolNotDetectedCorrectlySolution": "Per assicurarti che Matomo richieda e offra con sicurezza il tuo contenuto tramite HTTPS, puoi modificare il file %1$s e configurare le impostazioni del proxy, o puoi aggiungere la riga %2$s sotto la sezione %3$s. %4$sLeggi di più%5$s", - "ReactDescription": "Se il tuo sito web utilizza React, per favore consulta %1$squesta guida%2$s.", - "ReleaseChannel": "Canale release", - "SecurityNotificationAllTokenAuthDeletedBody": "Qualcuno ha eliminato tutti i token di autorizzazione nel tuo account.", - "SecurityNotificationAnonymousAccessEnabledBody": "Qualcuno ha abilitato l'accesso utente anonimo per %1$s. Ciò significa che i dati di questo sito sono ora accessibili pubblicamente. Se va bene, sentiti libero di ignorare questa email.", - "SecurityNotificationCheckTwoFactor": "Controlla la tua app o il dispositivo di autenticazione a due-fattori.", - "SecurityNotificationEmailSubject": "Notifica di Sicurezza", - "SecurityNotificationIfItWasYou": "Se sei stato tu, continua. Se non riconosci questa attività, reimposta la password.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Qualcuno ha generato nuovi codici di ripristino dell'autenticazione a due-fattori per il tuo account.", - "SecurityNotificationRecoveryCodesShowedBody": "Qualcuno ha visualizzato i codici di ripristino dell'autenticazione a due-fattori del tuo account.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Un altro super user (%1$s) ha modificato le impostazioni di sistema. Impostazioni interessate: %2$s. Se conosci questa attività, continua. Se non riconosci questa attività, contatta gli altri super user.", - "SecurityNotificationSettingsChangedByUserBody": "Qualcuno ha modificato le impostazioni del sistema. Impostazioni interessate: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Qualcuno ha creato un token di autorizzazione (descrizione: %s) nel tuo account. Se non sei stato tu, cancella il token.", - "SecurityNotificationTokenAuthDeletedBody": "Qualcuno ha eliminato un token di autorizzazione (descrizione: %s) nel tuo account.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Qualcuno ha disabilitato l'autenticazione a due-fattori nel tuo account.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Qualcuno ha abilitato l'autenticazione a due-fattori nel tuo account.", - "SecurityNotificationUserAcceptInviteBody": "L'utente (login:; %s) ha accettato l'invito.", - "SecurityNotificationUserCreatedBody": "Qualcuno ha creato un nuovo utente (login: %s) nel tuo account.", - "SecurityNotificationUserDeclinedInviteBody": "L'utente (login %s) ha rifiutato l'invito.", - "SecurityNotificationUserDeletedBody": "Qualcuno ha eliminato un utente (login: %s) nel tuo account.", - "SendPluginUpdateCommunication": "Manda un'email quando è disponibile l'aggiornamento di un plugin", - "SendPluginUpdateCommunicationHelp": "Verrà inviata una email ai Super User quando è disponibile una nuova versione di un plugin.", - "SettingsSaveSuccess": "Impostazioni aggiornate.", - "ShowAdvancedOptions": "Mostra le opzioni avanzate", - "SinglePageApplicationDescription": "Se stati tracciando una single-page app (SPA) o una webapp (PWA), per favore guarda %1$squesta guida%2$s.", - "Solution": "Soluzione", - "StableReleases": "Se Matomo rappresenta una parte fondamentale nella vostra attività, vi raccomandiamo di utilizzare l'ultima versione stabile. Se utilizzate l'ultima versione beta e riscontrate un bug o avete dei suggerimenti, per favore %1$sguardate qui%2$s.", - "SystemPluginSettings": "Impostazioni di Sistema del Plugin", - "TrackAGoal": "Traccia un obiettivo", - "TrackingCode": "Codice di Tracciamento", - "TrackingCodeIntro": "Matomo ti offre svariati modi per incorporare il codice di tracciamento nel tuo sito web, applicazione mobile e persino per ogni dispositivo o applicazione.", - "TrackingFailureAuthenticationProblem": "La richiesta non è stata autenticata ma è richiesta l'autenticazione.", - "TrackingFailureAuthenticationSolution": "Imposta o correggi il \"token_auth\" nella tua richiesta di tracking.", - "TrackingFailureInvalidSiteProblem": "Il sito non esiste.", - "TrackingFailureInvalidSiteSolution": "Aggiorna l'idSito configurato nel tracker.", - "TrackingFailures": "Errori di tracking", - "TrackingFailuresEmail1": "Questo è solo per farti sapere che %s diversi tipi di errori di tracking si sono verificati negli ultimi giorni.", - "TrackingFailuresEmail2": "Per visualizzare tutte le richieste di tracking fallite %1$sclicca qui%2$s.", - "TrackingFailuresEmailSubject": "Errori di tracking nel tuo Matomo Analytics", - "TrackingFailuresIntroduction": "Questa pagina elenca gli errori di tracking avvenuti durante gli ultimi %sgiorni. Si noti che solo il tipo più comune di errori di tracking viene registrato e non tutti.", - "TrackingURL": "URL Tracking", - "TrustedHostConfirm": "Sei sicuro di voler cambiare il nome dell'host affidabile di Matomo?", - "TrustedHostSettings": "Nome Host Affidabile", - "TwoFactorAuth": "Autorizzazione a due-fattori", - "UiDemo": "UI Demo", - "UncheckToOptOut": "Togli la spunta a questa casella per escluderti (opt-out).", - "UpdateSettings": "Impostazioni degli aggiornamenti", - "UseCustomLogo": "Usa un logo personalizzato", - "UserInviteContent": "Puoi accettare questo invito cliccando sul pulsante Accetta qui di seguito.", - "UserInviteNotes": "Se non ti aspettavi di ricevere questo invito, puoi ignorare questa email. Se %1$s ti sta inviando troppe email, puoi bloccarlo o segnalare l'abuso. L'invito scade automaticamente dopo %2$s giorni.", - "UserInviteSubject": "%1$s ti ha inviato un invito per accedere a Matomo Analytics per %2$s.", - "ValidPiwikHostname": "Nome Host Matomo Valido", - "ViewAllTrackingFailures": "Visualizza tutti gli errori di tracking", - "VueDescription": "Se il tuo sito web utilizza Vue.js, per favore consulta %1$squesta guida%2$s.", - "WhatIsNew": "Novità", - "WhatIsNewDoNotShowAgain": "Non mostrare di nuovo", - "WhatIsNewNoChanges": "Non c'è nulla di nuovo per ora", - "WhatIsNewNoChangesTitle": "Nessuna modifica recente", - "WhatIsNewRemindMeLater": "Ricordamelo più tardi", - "WhatIsNewTitle": "Ecco cosa c'è di nuovo in Matomo", - "WhatIsNewTooltip": "Scopri cosa c'è di nuovo in Matomo", - "WithOptionalRevenue": "con entrate opzionali", - "WordpressDescription": "Se il tuo sito web utilizza Wordpress, per favore consulta %1$squesta guida%2$s.", - "YouAreNotOptedOut": "Al momento le tue visite vengono tracciate.", - "YouAreOptedOut": "Al momento le tue visite non vengono tracciate.", - "YouMayOptOut": "Puoi scegliere di non avere un cookie univoco di identificazione per web analytics assegnato al tuo computer al fine di evitare l'aggregazione e l'analisi dei dati raccolti su questo sito web.", - "YouMayOptOut2": "Puoi scegliere di impedire a questo sito web di aggregare e analizzare le azioni che intraprendi qui.", - "YouMayOptOut3": "Ciò proteggerà la tua privacy, ma impedirà al proprietario di imparare dalle tue azioni e di creare un'esperienza migliore per te e per gli altri utenti.", - "YouMayOptOutBis": "Per fare questa scelta, clicca qui di seguito per ricevere un cookie di opt-out." - } -} diff --git a/plugins/CoreAdminHome/lang/ja.json b/plugins/CoreAdminHome/lang/ja.json deleted file mode 100644 index c3b250cf26b732c41639eabc62f0458434e30869..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ja.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "招待を受け入れる", - "AddNewTrustedHost": "新しい信頼できるホストを追加する", - "Administration": "管理", - "ArchivingSettings": "アーカイブ設定", - "BrandingSettings": "ブランディング設定", - "BruteForce": "ブルートフォース", - "CheckToOptIn": "オプトインするには、このチェックボックスをオンにします。", - "ClickHereToOptIn": "オプトインするにはここをクリックしてください。", - "ClickHereToOptOut": "オプトアウトするにはここをクリックしてください。", - "CloudflareDescription": "ウェブサイトがCloudflareでホストされている場合は、%1$sこのガイド%2$sを参照してください。", - "ConfirmDeleteAllTrackingFailures": "すべてのトラッキングエラーを削除してもよろしいですか?", - "ConfirmDeleteThisTrackingFailure": "このトラッキングエラーを削除してもよろしいですか?", - "Cors": "オリジン間リソース共有", - "CorsDomains": "クロスオリジンリソース共有( CORS )ドメイン", - "CorsDomainsHelp": "http://example.com や http://stats.example.com のようなドメインやサブドメインを定義することができます。 または、すべてのドメインに対してクロスドメイン要求を許可するには、単純に * を追加します", - "CustomLogoFeedbackInfo": "Matomo ロゴをカスタマイズする場合は、トップメニューの%1$sリンクを非表示にすることもできます。 これを行うには、%2$sプラグインの管理ページ%3$sでフィードバックプラグインを無効にします。", - "CustomLogoHelpText": "Matomo のロゴをカスタマイズして、ユーザーインターフェース画面とEメールリポートに表示できます。", - "DeclineInvite": "招待を辞退する", - "DeleteAllFailures": "すべての失敗を削除する", - "DevelopmentProcess": "我々の開発プロセスには何千もの自動テストが含まれていますが、ベータテスター は Matomo の「バグなしポリシー」を達成するために重要な役割を果たします。", - "EmailServerSettings": "メールサーバの設定", - "ErrorEmailFromAddressNotValid": "SMTP からのアドレスが無効です", - "FaviconUpload": "アップロードするファビコンを選択", - "FileUploadDisabled": "PHP の設定でファイルのアップロードが有効になっていません。カスタムロゴをアップロードするには、 php.ini で %s を設定し Web サーバを再起動してください。", - "ForBetaTestersOnly": "ベータテスターのみ", - "GoogleTagManagerDescription": "ウェブサイトがGoogleタグマネージャを使用している場合は、%1$sこのガイド%2$sを参照してください。", - "HideAdvancedOptions": "高度なオプションを非表示にする", - "HowToGetHelp": "ヘルプを得るにはさまざまな方法があります。 Matomo コミュニティによる無料サポートと Matomo チームおよび Matomo のパートナーによる有料サポートがあります。 または、報告するバグがあるか、新しい機能を提案したいですか?", - "HttpTrackingApi": "HTTPトラッキング API", - "HttpTrackingApiDescription": "%1$sHTTP トラッキング API%2$s を使用すると、様々な追跡が可能です。 これは、SDK がまだ存在しないプログラミング言語を使用している場合に便利です。 特別な方法でデバイスやアプリケーションをトラッキングする場合にも便利です。", - "ImageTracking": "画像トラッキング", - "ImageTrackingIntro1": "ビジターが JavaScript を無効にした場合、または JavaScript を使用できない場合は、画像追跡リンクを使用してビジターを追跡できます。", - "ImageTrackingIntro2": "下のリンクを生成し、生成された HTML をページにコピーして貼り付けます。 これを JavaScript トラッキングの代わりとして使用している場合は、%1$s タグで囲むことができます。", - "ImageTrackingIntro3": "画像によるトラッキングのリンクで使えるオプションの全リストについては、%1$sTracking API ドキュメント%2$sを参照してください。", - "ImageTrackingLink": "画像トラッキングリンク", - "ImportFromGoogleAnalytics": "Google アナリティクス からインポート", - "ImportFromGoogleAnalyticsDescription": "Google アナリティクスのプロパティがあり、Matomo に切り替える場合、%1$sGoogleAnalyticsImporter%2$s プラグインを使用して既存のデータをインポートできます。", - "ImportingServerLogsDesc": "ブラウザ経由で ( JavaScript または画像リンク経由で ) ビジターを追跡する代わりに、サーバーログを継続的にインポートすることもできます。 %1$sサーバーログファイル分析%2$sの詳細をご覧ください。", - "InvalidPluginsWarning": "以下のプラグインは、 %1$s と互換性がないためロードできませんでした。:%2$s.", - "InvalidPluginsYouCanUninstall": "これらのプラグインは、 %1$sプラグイン管理%2$s ページでアップデートまたはアンインストールすることができます。", - "JSTrackingDocumentationHelp": "簡単にアクセスできるように、最も一般的な詳細オプションを以下に示します。さらに多くのオプション(目標、カスタム変数、eコマース注文、放棄されたカートを追跡する方法を含む)については、%1$sMatomo Javascript Tracking documentation%2$s をご覧ください。", - "JSTrackingIntro1": "Web サイトへのビジターをさまざまな方法で追跡できます。 推奨される方法は JavaScript を使用することです。 この方法を使用するには、Web サイトのすべての Web ページに JavaScript コードがあることを確認する必要があります。これはここで生成できます。", - "JSTrackingIntro2": "WebサイトのJavaScriptトラッキングコードを入手したら、それをコピーしてMatomoで追跡したいすべてのページに貼り付けます。", - "JSTrackingIntro3a": "ほとんどの Web サイト、ブログ、CMS などでは、事前に作成されたプラグインを使用して技術的な作業を行うことができます。 ( %1$sMatomo の統合に使用されるプラグインのリスト%2$sを参照してください。)", - "JSTrackingIntro3b": "プラグインが存在しない場合は、ウェブサイトテンプレートを編集して、JavaScriptトラッキングコードを< / head>に追加できます。 'header.php'、 'header.tpl'または同様のテンプレートファイルで定義されることが多いタグ。", - "JSTrackingIntro4": "ビジターの追跡に JavaScript を使用したくない場合は、%1$s以下の画像によるトラッキングリンクを生成します。%2$s", - "JSTrackingIntro5": "ページビューを追跡する以外にも、%1$sMatomo Javascript Tracking のドキュメント%2$sで利用可能な機能のリストを確認してください。 これらの機能を使用すると、目標、カスタム変数、e コマース注文、放棄されたカートなどを追跡できます。", - "JSTracking_CampaignKwdParam": "キャンペーン用キーワードパラメータ", - "JSTracking_CampaignNameParam": "キャンペーン名パラメータ", - "JSTracking_CodeNoteBeforeClosingHead": "このコードがあなたのウェブサイトのすべてのページにあることを確認してください。 %1$sタグを閉じる直前に貼り付けることをお勧めします。", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "このコードが Web サイトのすべてのページのスクリプト要素に埋め込まれていることを確認してください。 終了タグの直前に貼り付けることをお勧めします。", - "JSTracking_ConsentManagerConnected": "%1$s は既に Matomoで動作するように構成されているようです。", - "JSTracking_ConsentManagerDetected": "サイトで %1$s の同意マネージャーが検出されました。 Matomo を %1$s で動作するように設定する方法については、%2$s を参照してください", - "JSTracking_ConsentManagerEmailNote": "または、代わりにトラッキング コードをウェブサイトに直接埋め込むこともできます:", - "JSTracking_CrossDomain": "デフォルトでは、ユニークビジターを識別するビジター ID は、同じドメインのページからのみアクセスできるブラウザのファーストパーティの Cookie に格納されます。 クロスドメインリンクを有効にすると、複数のドメインのページを表示している場合でも、特定のビジターのすべてのアクションとページビューを同じ訪問でトラッキングすることができます。 ユーザーがウェブサイトのエイリアス URL のいずれかへのリンクをクリックするたびに、ビジター ID を転送する URL パラメータ pk_vid が追加されます。", - "JSTracking_CrossDomain_NeedsMultipleDomains": "注意:クロスドメインリンクを使用するには、ウェブサイトに複数のドメイン名 ( URL ) を指定する必要があります。", - "JSTracking_CustomCampaignQueryParam": "キャンペーン名とキーワードにカスタム クエリ パラメータ名を使用する", - "JSTracking_CustomCampaignQueryParamDesc": "注: %1$sMatomo は自動的に Google Analytics のパラメータを検出します。%2$s", - "JSTracking_DisableCookies": "すべてのトラッキングクッキーを無効にする", - "JSTracking_DisableCookiesDesc": "すべてのファーストパーティCookieを無効にします。 このWebサイトの既存のMatomoCookieは、次のページビューで削除されます。", - "JSTracking_EnableCrossDomainLinking": "クロスドメインリンクを有効にする", - "JSTracking_EnableDoNotTrack": "クライアント側の DoNotTrack の検出を有効にする", - "JSTracking_EnableDoNotTrackDesc": "ビジターが追跡されることを望まない場合、トラッキングのリクエストは送信されません。", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "注:サーバー側 DoNotTrack サポートが有効になっているため、このオプションは無効です。", - "JSTracking_EndNote": "注:カスタマイズしたトラッキングコードは、%1$sトラッキングコード%2$s管理セクションで生成できます。", - "JSTracking_GroupPageTitlesByDomain": "トラッキング時にサイトドメインをページタイトルの前に追加する", - "JSTracking_GroupPageTitlesByDomainDesc1": "誰かがブログ %1$s の About ページを訪れたら、 blog / About として記録されます。これは、サブドメインでトラフィックの概要を取得するための最も簡単な方法です。", - "JSTracking_MergeAliases": "” アウトリンク ” レポートでは、次のような既知のエイリアス URL へのクリックを非表示にします", - "JSTracking_MergeAliasesDesc": "したがって、エイリアス URL ( 例:%s ) へのリンクのクリックは \" アウトリンク \" としてカウントされません。", - "JSTracking_MergeSubdomains": "のすべてのサブドメインのビジターをトラッキングする", - "JSTracking_MergeSubdomainsDesc": "したがって、1 人のビジターが %1$s と %2$s を訪問した場合、それらはユニークビジターとしてカウントされます。", - "JSTracking_PageCustomVars": "各ページビューのカスタム変数をトラッキングする", - "JSTracking_PageCustomVarsDesc": "たとえば、変数名 \"Category\" で、値が \"White Papers\" の場合。", - "JSTracking_TrackNoScript": "JavaScript を無効にしてユーザーを追跡する", - "JSTracking_VisitorCustomVars": "このユーザーのカスタム変数を追跡する", - "JSTracking_VisitorCustomVarsDesc": "たとえば、変数名 \" Type \" と値 \" Customer \" を使用します。", - "JavaScriptTracking": "JavaScript トラッキング", - "JsTrackingCodeMissingEmail1": "数日前にあなたはサイト '%s' を matomo 解析に追加しました。チェックしましたが、あなたの matomo はまだいかなるトラフィックも記録していません。", - "JsTrackingCodeMissingEmail2": "データの追跡とユーザーへの洞察の取得を開始するには、Web サイトまたはモバイルアプリで追跡を設定する必要があります。 Web サイトでは、%sタグの直前にトラッキングコードを埋め込むだけです。", - "JsTrackingCodeMissingEmail3": "トラッキングコードを検索してカスタマイズするには、%1$sここをクリック%2$sしてください(または%3$sJavaScript トラッキングクライアントガイド%4$sをご覧ください)。", - "LearnMore": "もっと詳しく知る", - "Login": "ログイン", - "LogoNotWriteableInstruction": "Matomo デフォルトロゴの代わりにカスタムロゴを使用するには、このディレクトリへの書込権限を与えて下さい。 :%1$s ロゴをファイルに保存するには、書込アクセスが必要です。%2$s", - "LogoUpload": "アップロードするロゴを選択", - "LogoUploadFailed": "アップロードされたファイルを処理できませんでした。ファイルが有効な形式であることを確認してください。", - "LogoUploadHelp": "%2$sピクセル以上の高さの %1$s形式ファイルをアップロードしてください。", - "LtsReleases": "LTS(ロングタームサポート)バージョンは、セキュリティとバグ修正のみを受け取ります。", - "MenuDevelopment": "開発", - "MenuDiagnostic": "診断", - "MenuGeneralSettings": "一般設定", - "MenuMeasurables": "測定可能なもの", - "MenuSystem": "システム", - "MissingTrackingCodeEmailSubject": "Matomo Analytics に %s のトラフィックが記録されていません、今すぐ始めましょう", - "NTrackingFailures": "%sトラッキングエラー", - "NeedHelp": "助けが必要ですか?", - "NoKnownFailures": "既知のトラッキングエラーはありません。", - "OptOutComplete": "オプトアウト完了; このWebサイトへの訪問は、Web Analyticsツールによって記録されません。", - "OptOutCompleteBis": "Cookie のクリア、オプトアウト Cookie の削除、コンピュータやブラウザを変更した場合は、オプトアウト手続きを再度実行する必要があることに注意してください。", - "OptOutCustomOptOutLink": "この開発者%1$sガイド%2$sで説明されているように、HTML と JavaScript を使用して完全にカスタムのオプトアウト フォームを作成することもできます。", - "OptOutDntFound": "ユーザーにより、このブラウザではトラッキングしない設定になっています。これはブラウザの設定によるもので、'Do Not Track' 機能を無効にするまでオプトインできません。", - "OptOutErrorNoCookies": "追跡オプトアウト機能では、Cookieを有効にする必要があります。", - "OptOutErrorNoTracker": "追跡オプトアウト機能は、このページで Matomoトラッカー コードを見つけることができませんでした", - "OptOutErrorNotHttps": "このサイトはHTTPS経由で読み込まれなかったため、追跡オプトアウト機能が機能しない場合があります。 ページをリロードして、オプトアウトステータスが変更されたかどうかを確認してください。", - "OptOutErrorWindowOpen": "オプトアウト ポップアップがブロックされたように見えるため、トラッキング オプトアウト機能が機能しない可能性があります。 ページを再読み込みして、オプトアウト ステータスが変更されたかどうかを確認してください。", - "OptOutExplanation": "Matomo はインターネット上でのプライバシーを提供することに注力しています。 ビジターにMatomo Web Analytics オプトアウトの選択肢を提供するため、Web サイトページの 1 つ、たとえばプライバシーポリシーページに次の HTML コードを追加することができます。", - "OptOutExplanationIntro": "このコードは、ビジターが Web ブラウザにオプトアウト Cookie を設定して Matomo をオプトアウトするためのリンクを含む div を表示します。 以下を参照 (または%1$sここをクリック%2$s) して、div によって表示されるコンテンツを表示します。", - "OptOutForYourVisitors": "ビジター用の Matomo オプトアウト", - "OptingYouOut": "オプトアウトして、お待ちください…", - "PersonalPluginSettings": "パーソナルプラグインの設定", - "PiwikIsInstalledAt": "Matomo がインストールされているのは", - "PluginSettingChangeNotAllowed": "プラグイン \"%2$s\"の設定 \"%1$s\"の値を変更することはできません", - "PluginSettingReadNotAllowed": "プラグイン \"%2$s\"の設定 \"%1$s\"の値の読み取りは許可されていません", - "PluginSettings": "プラグイン設定", - "PluginSettingsIntro": "ここで、次のサードパーティプラグインの設定を変更できます:", - "PluginSettingsSaveFailed": "プラグイン設定を保存できませんでした", - "PluginSettingsSaveSuccess": "プラグインの設定が更新されました。", - "PluginSettingsValueNotAllowed": "\"%2$s\"プラグインの\"%1$s\"フィールドの値は許可されていません", - "Problem": "問題", - "ProtocolNotDetectedCorrectly": "現在、(HTTPSを使用した)安全なSSL接続を介してMatomoを表示していますが、Matomoはサーバー上で安全でない接続しか検出できませんでした。", - "ProtocolNotDetectedCorrectlySolution": "Matomo が HTTPS 経由でコンテンツを安全に要求して配信するには、%1$sファイルを編集してプロキシ設定を行うか、%3$sセクションの下に%2$s行を追加することができます。 %4$sもっと詳しく知る%5$s", - "ReactDescription": "Reactを使用している場合は、%1$sこのガイド%2$sを参照してください。", - "ReleaseChannel": "リリース チャネル", - "SecurityNotificationAllTokenAuthDeletedBody": "誰かがあなたのアカウントのすべての認証トークンを削除しました。", - "SecurityNotificationCheckTwoFactor": "二要素認証アプリまたはデバイスを確認してください。", - "SecurityNotificationEmailSubject": "セキュリティ通知", - "SecurityNotificationIfItWasYou": "あなたの場合は続けてください。 このアクティビティに気付かない場合は、パスワードをリセットしてください。", - "SecurityNotificationRecoveryCodesRegeneratedBody": "誰かがあなたのアカウントに新しい2要素認証回復コードを生成しました。", - "SecurityNotificationRecoveryCodesShowedBody": "誰かがあなたのアカウントの2要素認証回復コードを見ました。", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "別のスーパーユーザー(%1$s)がシステム設定を変更しました。 影響を受ける設定:%2$s。 この活動について知っているなら、続けてください。 このアクティビティに気付かない場合は、他のスーパーユーザーに連絡してください。", - "SecurityNotificationSettingsChangedByUserBody": "誰かがシステム設定を変更しました。 影響を受ける設定:%s", - "SecurityNotificationTokenAuthCreatedBody": "誰かがあなたのアカウントに認証トークン(説明:%s)を作成しました。 あなたでない場合は、トークンを削除してください。", - "SecurityNotificationTokenAuthDeletedBody": "誰かがあなたのアカウントの認証トークン(説明:%s)を削除しました。", - "SecurityNotificationTwoFactorAuthDisabledBody": "誰かがあなたのアカウントで2要素認証を無効にしました。", - "SecurityNotificationTwoFactorAuthEnabledBody": "誰かがあなたのアカウントで2要素認証を有効にしました。", - "SecurityNotificationUserAcceptInviteBody": "ユーザー (ログイン: %s) は招待を受け入れました。", - "SecurityNotificationUserCreatedBody": "誰かがあなたのアカウントに新しいユーザー(ログイン:%s)を作成しました。", - "SecurityNotificationUserDeclinedInviteBody": "ユーザー (ログイン: %s) は招待を辞退しました。", - "SecurityNotificationUserDeletedBody": "誰かがあなたのアカウントのユーザー(ログイン:%s)を削除しました。", - "SendPluginUpdateCommunication": "プラグインの更新が利用可能になった時、メールを送信します", - "SendPluginUpdateCommunicationHelp": "使用可能な新しいプラグインのバージョンがある場合、ユーザーユーザーへメールが通知されます。", - "SettingsSaveSuccess": "設定が更新されました。", - "ShowAdvancedOptions": "詳細オプションを表示する", - "SinglePageApplicationDescription": "シングルページ アプリケーション (SPA) またはプログレッシブ Web アプリケーション (PWA) を追跡している場合は、%1$sこのガイド%2$sを参照してください。", - "Solution": "ソリューション", - "StableReleases": "Matomo がビジネスにおいて重要である場合、最新の安定版を使用することを推奨します。また、最新のベータ版を使用中にバグを見つけたり、提案がある場合は%1$sこちらをご覧ください%2$s。", - "SystemPluginSettings": "システムプラグイン設定", - "TrackAGoal": "目標を追跡する", - "TrackingCode": "トラッキングコード", - "TrackingCodeIntro": "Matomo は、ウェブサイト、モバイルアプリ、さらにはデバイスやアプリケーションにも、さまざまな方法でトラッキングコードを埋め込むことができます。", - "TrackingFailureAuthenticationProblem": "リクエストは認証されませんでしたが、認証が必要でした。", - "TrackingFailureAuthenticationSolution": "トラッキングリクエストで ” token_auth ” を設定または修正します。", - "TrackingFailureInvalidSiteProblem": "このサイトは存在しません。", - "TrackingFailureInvalidSiteSolution": "トラッカーに設定された idSite を更新します。", - "TrackingFailures": "トラッキングの失敗", - "TrackingFailuresEmail1": "これは、直近で%s 種類のトラッキング障害が発生したことを伝えるためです。", - "TrackingFailuresEmail2": "失敗した追跡リクエストをすべて表示するには、%1$s ここをクリック %2$s してください。", - "TrackingFailuresEmailSubject": "Matomo Analytics のトラッキングエラー", - "TrackingFailuresIntroduction": "このページには、最後の %s 日間に発生したトラッキングの失敗のリストが表示されます。 最も一般的な種類のトラッキングエラーのみが記録され、すべてが記録されるわけではありません。", - "TrackingURL": "トラッキングURL", - "TrustedHostConfirm": "信頼できる Matomo ホスト名を変更してもよろしいですか?", - "TrustedHostSettings": "信頼できる Matomo ホスト名", - "TwoFactorAuth": "二要素認証", - "UiDemo": "UI デモ", - "UncheckToOptOut": "オプトアウトするには、このチェックボックスをオフにします。", - "UpdateSettings": "アップデートの設定", - "UseCustomLogo": "カスタムロゴを使用する", - "UserInviteContent": "下の 承諾 ボタンをクリックすると、この招待を承諾できます。", - "UserInviteNotes": "この招待を予期していなかった場合は、このメールを無視してください。 %1$s からのメールが多すぎる場合は、それらのメールをブロックするか、迷惑メールを報告してください。 招待は %2$s 日で自動的に期限切れになります。", - "UserInviteSubject": "%1$s は、%2$sの Matomo Analytics に参加するための招待状をあなたに送りました。", - "ValidPiwikHostname": "有効な Matomo ホスト名", - "ViewAllTrackingFailures": "すべてのトラッキングエラーを表示する", - "VueDescription": "あなたのウェブサイトがVue.jsを使用している場合は、%1$sこのガイド%2$sを参照してください。", - "WhatIsNew": "新着情報", - "WhatIsNewNoChanges": "今のところ目新しい物がない", - "WhatIsNewNoChangesTitle": "最近変遷がない", - "WhatIsNewRemindMeLater": "後で通知する", - "WhatIsNewTitle": "Matomoの新機能を紹介します", - "WhatIsNewTooltip": "Matomoの新機能について説明します", - "WithOptionalRevenue": "オプションの収益と", - "WordpressDescription": "あなたのウェブサイトがWordpressを使用している場合は、%1$sこのガイド%2$sを参照してください。", - "YouAreNotOptedOut": "オプトアウトされていません。", - "YouAreOptedOut": "現在オプトアウトされています。", - "YouMayOptOut": "このWebサイトで収集されたデータの集計と分析を回避するために、ユニークなWeb分析Cookie識別番号をコンピュータに割り当てないように選択することができます。", - "YouMayOptOut2": "あなたがこのウェブサイトでとった行動を集約し分析することを拒否できます。", - "YouMayOptOut3": "そうすることであなたのプライバシーは保護されますが、所有者があなたの行動から学び、あなたや他のユーザーにとってより良い経験を生み出すことも妨げられます。", - "YouMayOptOutBis": "これを選択するには、以下をクリックしてオプトアウト Cookie を受信してください。" - } -} diff --git a/plugins/CoreAdminHome/lang/ka.json b/plugins/CoreAdminHome/lang/ka.json deleted file mode 100644 index a711f8f7552ea7a0575b94a6b3eabbeded47ef32..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ka.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "ადმინისტრირება", - "EmailServerSettings": "ელ.ფოსტის სერვერის პარამეტრები", - "Login": "მომხმარებლის სახელი", - "MenuGeneralSettings": "ძირითადი პარამეტრები", - "OptOutComplete": "უარი დაფიქსირდა; ამ საიტზე თქვენი ვიზიტები არ ჩაიწერება ვებ ანალიზატორის ინსტრუმენტით.", - "OptOutCompleteBis": "მიაქციეთ ყურადღება, რომ თუ თქვენ გაასუფთავებთ ქუქიებს, წაიშლება უარის ქუქი, ან თუ შეიცვლით კომპიუტერს ან ვებ ბრაუზერს უარის დაფიქსირების პროცედურა თავიდან უნდა განახორციელოთ.", - "OptOutExplanation": "Matomo გამიზნულია ინტერნეტში კონფიდენციალურობის დაცვისთვის. რათა თქვენს ვიზიტორებს ქონდეთ საშუალება უარი თქვან Matomo Web Analytics მონაწილეობაზე, თქვენ შეგიძლიათ შემდეგი HTML კოდი ჩაამატოთ თქვენი ვებ საიტის ერთ–ერთ გვერდზე, მაგალითად კონფიდენციალურობის გვერდზე.", - "OptOutForYourVisitors": "თქვენი ვიზიტორების უარი Matomo–ზე", - "YouAreOptedOut": "ამჟამად თქვენ ანალიზში არ მონაწილეობთ.", - "YouMayOptOut": "თქვენ შეგიძლიათ შეარჩიოთ პარამეტრი, რომ არ გქონდეთ თქვენს კომპიუტერზე მინიჭებული ვებ ანალიზატორის ქუქის უნიკალური საიდენტიფიკაციო ნომერი, რათა არ მიიღოთ მონაწილეობა აგრეგაციასა და მონაცემთა ანალიზში ამ ვებ საიტზე.", - "YouMayOptOutBis": "ამ არჩევნის გასაკეთებლად გთხოვთ, დააწკაპუნეთ ქვედა ბმულზე, რომ მიიღოთ უარის ქუქი." - } -} diff --git a/plugins/CoreAdminHome/lang/ko.json b/plugins/CoreAdminHome/lang/ko.json deleted file mode 100644 index 77990d369cc3a1fc9ff1179bd0fdc5380575660f..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ko.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "새 신뢰할 수 있는 호스트 추가", - "Administration": "관리", - "ArchivingSettings": "아카이브 설정", - "BrandingSettings": "브랜딩 설정", - "ClickHereToOptIn": "클릭하여 허용합니다.", - "ClickHereToOptOut": "클릭하여 차단합니다.", - "CustomLogoFeedbackInfo": "Matomo 로고를 변경하거나 상단 메뉴의 %1$s 링크도 숨길 수 있습니다. %2$s 플러그인 관리 %3$s 페이지에서 피드백 플러그인을 비활성화세요.", - "CustomLogoHelpText": "Matomo 로고를 사용자정의하여 사용자 인터페이스 화면과 이메일 보고서를 볼 수 있습니다.", - "EmailServerSettings": "메일 서버 설정", - "FaviconUpload": "업로드 할 파비콘 선택", - "ForBetaTestersOnly": "베타 테스터 전용", - "ImageTracking": "이미지 추적", - "ImageTrackingIntro1": "만약 방문자가 자바스크립트를 비활성화하였을 경우이거나 자바스크립트를 사용하지 못하는 경우, 이미지 추적 링크를 이용해서 방문자를 추적할 수 있습니다.", - "ImageTrackingLink": "이미지 추적 링크", - "JSTrackingIntro2": "당신의 웹사이트를 위한 자바스크립트 추적 코드를 가졌다면, Matomo가 추적이 가능하도록 모든 페이지에 해당 코드를 복사 및 붙여넣기 해주세요.", - "JSTrackingIntro4": "만약 방문자 추적을 위해 자바스크립트를 사용하고 싶지 않으시다면, 아래의 %1$s이미지 추적 링크 생성%2$s을 해주세요.", - "JSTrackingIntro5": "만약 페이지 뷰에 대한 것 이상을 원할 경우, %1$sMatomo 자바스크립트 트래킹 문서%2$s 내 여러 가능한 함수 리스트를 참고하세요. 이 함수들을 통해 목표나 맞춤 변수, 상거래 주문 및 담겨져있기만 한 카트 등을 추적할 수 있습니다.", - "JSTracking_CampaignKwdParam": "캠페인 키워드 파라메터", - "JSTracking_CampaignNameParam": "캠페인 이름 파라메터", - "JSTracking_CustomCampaignQueryParamDesc": "중요: %1$s Matomo는 자동으로 구글 분석 파라메터를 감지합니다.%2$s", - "JSTracking_DisableCookies": "모든 추적 쿠키 비활성화", - "JSTracking_EnableDoNotTrack": "클라이언트에서 DoNotTrack 탐지 활성화", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "주의: 서버 쪽 DoNotTrack 지원이 활성화되었기에, 이 옵션은 아무런 영향이 없습니다.", - "JSTracking_VisitorCustomVars": "이 방문자를 위한 추적 맞춤 변수", - "JSTracking_VisitorCustomVarsDesc": "예를 들어, 변수 이름으로 \"Type\"이고 값은 \"Customer\"입니다.", - "JavaScriptTracking": "자바스크립트 추적", - "Login": "로그인", - "LogoUpload": "업로드 할 로고 선택", - "LogoUploadFailed": "업로드된 파일에 문제가 있습니다. 적합한 포멧을 가진 파일인지 확인해주세요.", - "LtsReleases": "LTS (Long Term Support, 오랜 기간동안 지원됨) 버전은 보안 및 버그 해결만 받습니다.", - "MenuDevelopment": "개발", - "MenuDiagnostic": "진단", - "MenuGeneralSettings": "일반 설정", - "MenuMeasurables": "측정가능한 것", - "MenuSystem": "시스템", - "OptOutComplete": "차단 완료; 당신의 방문한 이 웹사이트는 이제 웹 분석 도구에 기록되지 않습니다.", - "OptOutCompleteBis": "Cookie를 삭제하여 차단 Cookie를 삭제하거나 컴퓨터 또는 브라우저를 변경 한 경우는 차단 절차를 다시 수행해야 한다는 점 유의하세요.", - "OptOutExplanation": "Matomo은 인터넷에서 개인 정보 제공에 최선을 다하고 있습니다. 방문자에 Matomo 웹 분석의 차단 옵션을 제공하기 위해 웹 사이트의 1페이지 (개인 정보 보호 정책 페이지 등)에 다음 HTML 코드를 추가 할 수 있습니다.", - "OptOutForYourVisitors": "방문자의 Matomo 차단", - "PersonalPluginSettings": "나만의 플러그인 설정", - "PiwikIsInstalledAt": "Matomo가 설치되어 있습니다", - "PluginSettings": "플러그인 설정", - "PluginSettingsIntro": "다음 나열된 서드 파티 플러그인의 설정을 바꿀 수 있다:", - "PluginSettingsSaveFailed": "플러그인 설정 저장 실패", - "PluginSettingsSaveSuccess": "플러그인 설정이 갱신되었습니다.", - "PluginSettingsValueNotAllowed": "플러그인 \"%2$s\" 내 \"%1$s\" 항목값은 허용되지 않습니다.", - "ReleaseChannel": "릴리즈 채널", - "SendPluginUpdateCommunication": "플러그인 업데이트가 가능할 때 이메일 알림", - "SendPluginUpdateCommunicationHelp": "플러그인의 새로운 버전이 나타날 경우 수퍼 유저에게 메일로 알려집니다.", - "SettingsSaveSuccess": "설정이 갱신되었습니다.", - "StableReleases": "\"만약 Matomo가 당신의 비지니스에 상당히 중요한 요소라면 최근 안정 버전을 사용하시는 것을 추천합니다. 만약 최근 베타 버전을 사용 중 버그를 찾으셨거나 제안하실 사항이 있으시다면, %1$s여기를 봐주세요%2$s.", - "SystemPluginSettings": "시스템 플러그인 설정", - "TrackAGoal": "목표 추적", - "TrackingCode": "추적 코드", - "TrustedHostConfirm": "신뢰할 수 있는 Matomo 호스트네임으로 변경하시겠습니까?", - "TrustedHostSettings": "신뢰할 수 있는 Matomo 호스트네임", - "UpdateSettings": "업데이트 설정", - "UseCustomLogo": "로고 변경하기", - "ValidPiwikHostname": "유효한 Matomo 호스트네임", - "YouAreOptedOut": "차단된 상태입니다.", - "YouMayOptOut": "이 웹사이트에 모은 데이터 수집 및 분석을 피하기 위해, 당신의 컴퓨터에 웹 분석 Cookie 식별 번호를 할당하지 않을 수 있습니다.", - "YouMayOptOutBis": "차단 Cookie를 활성하려면 다음의 확인란에 체크하세요." - } -} diff --git a/plugins/CoreAdminHome/lang/ku.json b/plugins/CoreAdminHome/lang/ku.json deleted file mode 100644 index 746d9bffd1ad2eeb283973d6f27b456ea193fa48..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ku.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "CoreAdminHome": { - "MenuGeneralSettings": "ڕێکختنە گشتییەکان", - "MenuMeasurables": "پێوانەکان" - } -} diff --git a/plugins/CoreAdminHome/lang/lb.json b/plugins/CoreAdminHome/lang/lb.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/lb.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/lt.json b/plugins/CoreAdminHome/lang/lt.json deleted file mode 100644 index 7332e79c188dd4a85cf93c985fce9c5e2eea5bfd..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/lt.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "Administravimas", - "ArchivingSettings": "Archyvavimo nustatymai", - "EmailServerSettings": "El. pašto serverio nustatymai", - "ForBetaTestersOnly": "Tik beta testuotojams", - "HttpTrackingApi": "HTTP sekimo API", - "JSTracking_DisableCookies": "Išjungti visus sekimo slapukus", - "JavaScriptTracking": "JavaScript sekimas", - "LearnMore": "Sužinoti daugiau", - "Login": "prisijungimas", - "MenuGeneralSettings": "Pagrindiniai nustatymai", - "PluginSettings": "Papildinio nustatymai", - "PluginSettingsSaveFailed": "Nepavyko įrašyti papildinio nustatymų", - "PluginSettingsSaveSuccess": "Papildinio nustatymai atnaujinti.", - "SettingsSaveSuccess": "Nustatymai atnaujinti.", - "ShowAdvancedOptions": "Rodyti papildomas parinktis", - "SystemPluginSettings": "Sistemos papildinio nustatymai", - "UpdateSettings": "Atnaujinti nustatymus" - } -} diff --git a/plugins/CoreAdminHome/lang/lv.json b/plugins/CoreAdminHome/lang/lv.json deleted file mode 100644 index ab1e3fd641fb0ee1325ef3cce4b6cf73a0c08d02..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/lv.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Pieņemt ielūgumu", - "AddNewTrustedHost": "Pievienot jaunu uzticamu resursdatoru", - "Administration": "Administrācija", - "ArchivingSettings": "Arhivēšanas iestatījumi", - "BrandingSettings": "Zīmola iestatījumi", - "BruteForce": "Ar spēku (\"Brute Force\")", - "CheckToOptIn": "Atzīmējiet šo lauku, lai piekristu.", - "ClickHereToOptIn": "Lai piedalītos, klikšķiniet šeit.", - "ClickHereToOptOut": "Lai nepiedalītos, klikšķiniet šeit.", - "CloudflareDescription": "Ja Jūsu vietne tiek izvietota Cloudflare, lūdzu skatiet %1$sšo ceļvedi%2$s.", - "ConfirmDeleteAllTrackingFailures": "Vai esat pārliecināts, ka vēlaties dzēst visas izsekošanas kļūmes?", - "ConfirmDeleteThisTrackingFailure": "Vai esat pārliecināts, ka vēlaties dzēst šo izsekošanas kļūdu?", - "Cors": "Cors", - "CorsDomains": "Starpizcelsmes resursu koplietošanas (CORS) domēni", - "CorsDomainsHelp": "Varat definēt domēnus vai apakšdomēnus, piemēram, http://example.com vai http://stats.example.com., vai atļaut starpdomēnu pieprasījumus visiem domēniem, vienkārši pievienojot *", - "CustomLogoFeedbackInfo": "Ja pielāgojat Matomo logotipu, jums varētu interesēt arī paslēpt %1$s saiti augšējā izvēlnē. Lai to izdarītu, atspējojiet atsauksmju spraudni %2$sspraudņu pārvaldības%3$s lapā.", - "CustomLogoHelpText": "Jūs varat pielāgot Matomo logotipu, kas tiks parādīts lietotāja saskarnē un e-pasta ziņojumos.", - "DeclineInvite": "Noraidīt ielūgumu", - "DeleteAllFailures": "Dzēst visas kļūmes", - "DevelopmentProcess": "Lai arī mūsu izstrādes process ietver tūkstošiem automatizētu testu, Beta testētājiem ir būtiska loma \"Bez-kļūdu politikas\" sasniegšanā Matomo.", - "EmailServerSettings": "E-pasta servera iestatījumi", - "ErrorEmailFromAddressNotValid": "SMTP no adreses nav derīgs", - "FaviconUpload": "Izvēlieties Favicon failu, ko augšupielādēt", - "FileUploadDisabled": "Jūsu PHP konfigurācijā failu augšupielāde nav iespējota. Lai augšupielādētu pielāgoto logotipu, lūdzu, iestatiet %s php.ini un restartējiet tīmekļa serveri.", - "ForBetaTestersOnly": "Tikai beta testētājiem", - "GoogleTagManagerDescription": "Ja Jūsu vietne izmanto Google Tag Manager, lūdzu skatiet %1$sšo rokasgrāmatu%2$s.", - "HideAdvancedOptions": "Slēpt paplašinātās opcijas", - "HowToGetHelp": "Ir dažādi veidi, kā saņemt palīdzību. Ir bezmaksas atbalsts ar Matomo kopienas starpniecību un maksas atbalsts, ko sniedz Matomo komanda un Matomo partneri. Bet varbūt jums ir kļūda, par kuru ziņot, vai vēlaties ko ieteikt?", - "HttpTrackingApi": "HTTP izsekošanas API", - "HttpTrackingApiDescription": "%1$sHTTP izsekošanas API%2$s ļauj jums izsekot visu. Tas noderēs, ja izmantojat programmēšanas valodu, kurai vēl nav sava programmatūras izstrādes komplekta (SDK). Tas noderēs arī tad, ja vēlaties izsekot ierīcēm vai lietojumprogrammām īpašā veidā.", - "ImageTracking": "Attēlu izsekošana", - "ImageTrackingIntro1": "Ja apmeklētājs ir atspējojis JavaScript vai ja JavaScript nevar izmantot, varat izmantot attēlu izsekošanas saiti, lai izsekotu apmeklētājus.", - "ImageTrackingIntro2": "Ģenerējiet zemāk esošo saiti un ievietojiet izveidoto HTML kodu savā lapā. Ja to izmantojat gadījumiem, kad netiek pieļauta JavaScript izsekošana, varat to iekļaut %1$s tagos.", - "ImageTrackingIntro3": "Attēla izsekošanas saites pilnu iespēju sarakstu skatiet %1$sizsekošanas API dokumentācijā%2$s.", - "ImageTrackingLink": "Attēla izsekošanas saite", - "ImportFromGoogleAnalytics": "Importēt no Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Ja izmantojat Google Analytics un pārslēdzaties uz Matomo, jūs varat importēt savus datus, izmantojot %1$sGoogleAnalyticsImporter%2$s spraudni.", - "ImportingServerLogsDesc": "Kā alternatīva apmeklētāju izsekošanai caur pārlūku (vai nu izmantojot JavaScript vai attēla saiti) ir iespēja importēt servera žurnālus. Uzziniet vairāk par %1$sservera žurnāla failu analīzi%2$s.", - "InvalidPluginsWarning": "Šie spraudņi nav savietojami ar %1$s un tos nevarēja ielādēt: %2$s.", - "InvalidPluginsYouCanUninstall": "Jūs varat atjaunināt vai atinstalēt šos spraudņus lapā %1$sPārvaldīt spraudņus%2$s.", - "JSTrackingDocumentationHelp": "Lai atvieglotu piekļuvi, tālāk ir pieejamas populārākās papildu opcijas. Lai iegūtu vēl citas opcijas (tostarp to, kā izsekot mērķus, pielāgotos mainīgos, e-komercijas pasūtījumus un pamestos iepirkumu grozus), lūdzu, skatiet %1$sMatomo JavaScript izsekošanas dokumentāciju%2$s.", - "JSTrackingIntro1": "Varat izsekot savas tīmekļa vietnes apmeklētājiem dažādos veidos. Ieteicamais veids, kā to izdarīt, ir ar JavaScript. Lai izmantotu šo metodi, pārliecinieties, vai katrā tīmekļa vietnes tīmekļa lapā ir kāds JavaScript kods, kuru varat ģenerēt šeit.", - "JSTrackingIntro2": "Kad jūsu tīmekļa vietnei ir JavaScript izsekošanas kods, kopējiet un ielīmējiet to visās lapās, kuras vēlaties izsekot, izmantojot Matomo.", - "JSTrackingIntro3a": "Lielākajā daļā vietņu, blogu, satura pārvaldības sistēmu (CMS) utt. varat izmantot gatavu spraudni, lai tas strādā jūsu vietā. (Skatiet mūsu %1$sspraudņu sarakstu Matomo integrācijai%2$s.)", - "JSTrackingIntro3b": "Ja spraudnis nepastāv, varat rediģēt savas tīmekļa vietnes veidnes un pievienot JavaScript izsekošanas kodu </head> tagam, kas bieži tiek definēts \"header.php\", \"header.tpl\" vai līdzīgā veidnes failā.", - "JSTrackingIntro4": "Ja nevēlaties izmantot JavaScript, lai izsekotu apmeklētājus, %1$szemāk ģenerējiet attēla izsekošanas saiti%2$s.", - "JSTrackingIntro5": "Ja vēlaties veikt vairāk nekā tikai izsekot lapas skatījumiem, pieejamo funkciju sarakstu meklējiet %1$sMatomo JavaScript izsekošanas dokumentācijā%2$s . Izmantojot šīs funkcijas, varat izsekot mērķus, pielāgotus mainīgos, e-komercijas pasūtījumus, pamestus iepirkumu grozus un daudz ko citu.", - "JSTracking_CampaignKwdParam": "Kampaņas atslēgvārda parametrs", - "JSTracking_CampaignNameParam": "Kampaņas nosaukuma parametrs", - "JSTracking_CodeNoteBeforeClosingHead": "Klikšķiet uz pogas, lai kopētu koda fragmentu un ielīmētu to tieši pirms aizverošā %1$s taga (ieteicams)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Pārliecinieties, ka šis kods ir iegults skripta elementā katrā tīmekļa vietnes lapā. Ieteicams to ielīmēt tieši pirms galvenes noslēdzošā taga.", - "JSTracking_ConsentManagerConnected": "Šķiet, ka %1$s jau ir konfigurēts darbam ar Matomo.", - "JSTracking_ConsentManagerDetected": "Jūsu vietnē tika konstatēts %1$s piekrišanas pārvaldnieks. Lai uzzinātu, kā konfigurēt Matomo, lai tas strādātu ar %1$s, lūdzu, apmeklējiet %2$s", - "JSTracking_ConsentManagerEmailNote": "Varat arī tieši iegult izsekošanas kodu savā tīmekļa vietnē:", - "JSTracking_CrossDomain": "Pēc noklusējuma apmeklētāja ID, kas identificē unikālu apmeklētāju, tiek saglabāts pārlūkprogrammas pirmās puses sīkfailos, kuriem var piekļūt tikai tā paša domēna lapas. Iespējojot starpdomēnu saišu izveidi, varat izsekot visas konkrēta apmeklētāja darbības un lapas skatus vienā apmeklējumā pat tad, ja viņi skata lapas vairākos domēnos. Ikreiz, kad lietotājs noklikšķina uz saites uz kādu no jūsu tīmekļa vietnes aizstājvārda URL, tas pievieno URL parametru pk_vid, pārsūtot apmeklētāja ID.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Piezīme. Lai izmantotu starpdomēnu saistīšanu, savai tīmekļa vietnei jānorāda vairāki domēna nosaukumi (URL).", - "JSTracking_CustomCampaignQueryParam": "Izmantojiet pielāgotus vaicājuma parametru nosaukumus kampaņas nosaukumam un atslēgvārdam", - "JSTracking_CustomCampaignQueryParamDesc": "Piezīme: %1$sMatomo automātiski noteiks Google Analytics parametrus.%2$s", - "JSTracking_DisableCampaignParameters": "Atslēgt kampaņas parametru izsekošanu", - "JSTracking_DisableCampaignParametersDesc": "Ja šī opcija ir atzīmēta, Matomo neizsekos kampaņas parametrus un tie tiks noņemti no izsekotajiem URL.", - "JSTracking_DisableCookies": "Atslēgt visas izsekošanas sīkdatnes", - "JSTracking_DisableCookiesDesc": "Atspējo visas pirmās puses sīkdatnes. Esošās Matomo sīkdatnes šai vietnei tiks izdzēstas nākamajā lapas skatījumā.", - "JSTracking_EnableCrossDomainLinking": "Iespējot starpdomēnu saistīšanu", - "JSTracking_EnableDoNotTrack": "Iespējot klienta puses neizsekošanas (\"DoNotTrack\") noteikšanu", - "JSTracking_EnableDoNotTrackDesc": "Tātad izsekošanas pieprasījumi netiks nosūtīti, ja apmeklētāji nevēlas tikt izsekoti.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Piezīme: servera pusē ir iespējots neizsekošanas (\"DoNotTrack\") atbalsts, tāpēc šai opcijai nebūs nekādas ietekmes.", - "JSTracking_EndNote": "Piezīme: varat izveidot pielāgotu izsekošanas kodu administrēšanas sadaļā %1$sIzsekošanas kods%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Pievienojiet vietnes domēnu lapas nosaukumam, veicot izsekošanu", - "JSTracking_GroupPageTitlesByDomainDesc1": "Tātad, ja kāds apmeklē bloga lapu 'Par mums'%1$s, tas tiks reģistrēts kā 'blogs / Par' mums. Tas ir vienkāršākais veids, kā iegūt pārskatu par datplūsmu pēc apakšdomēna.", - "JSTracking_MergeAliases": "Paslēpt klikšķus uz zināmām aizstājēja URL adresēm ziņojumā \"Ārējās saites\"", - "JSTracking_MergeAliasesDesc": "Tāpēc klikšķi uz saitēm uz aizstājvārdu URL (piemēram, %s) netiks uzskaitīti pie “ārējām saitēm”.", - "JSTracking_MergeSubdomains": "Izsekot apmeklētājus visos apakšdomēnos", - "JSTracking_MergeSubdomainsDesc": "Tātad, ja viens apmeklētājs apmeklē %1$s un %2$s, viņš tiks uzskaitīts kā unikāls apmeklētājs.", - "JSTracking_PageCustomVars": "Izsekot pielāgotu mainīgo katrai lapas apskatei", - "JSTracking_PageCustomVarsDesc": "Piemēram, ar mainīgā nosaukumu “Kategorija” un vērtību “Balts papīrs”.", - "JSTracking_TrackNoScript": "Izsekot lietotājus ar atspējotu JavaScript", - "JSTracking_VisitorCustomVars": "Izsekot pielāgotos mainīgos šim apmeklētājam", - "JSTracking_VisitorCustomVarsDesc": "Piemēram, ar mainīgā nosaukumu \"Veids\" un vērtību \"Klients\".", - "JavaScriptCode": "JavaScript kods", - "JavaScriptTracking": "JavaScript izsekošana", - "JsTrackingCodeAdvancedOptionsStep": "Pēc izvēles: izmantojiet paplašinātās opcijas, lai pielāgotu savu izsekošanas kodu.", - "JsTrackingCodeMissingEmail1": "Pirms dažām dienām jūs pievienojāt vietni \"%s\" savam Matomo Analytics. Mēs pārbaudījām un šķiet, ka jūsu Matomo nav reģistrējis nekādu datplūsmu šai vietnei.", - "JsTrackingCodeMissingEmail2": "Lai sāktu datu izsekošanu un ieskatu gūšanu par saviem lietotājiem, izsekošana ir jāiestata savā tīmekļa vietnē vai mobilajā lietotnē. Vienkārši iegulstiet izsekošanas kodu tīmekļa vietnē tieši pirms %s taga.", - "JsTrackingCodeMissingEmail3": "Lai atrastu un pielāgotu savu izsekošanas kodu, %1$sklikšķiniet šeit%2$s (vai aplūkojiet %3$sJavaScript izsekošanas rokasgrāmatu%4$s).", - "LearnMore": "Uzzināt vairāk", - "Login": "lietotājvārds", - "LogoNotWriteableInstruction": "Lai noklusējuma Matomo logotipa vietā izmantotu pielāgotu logotipu, piešķiriet rakstīšanas atļauju šim direktorijam: %1$sMatomo ir nepieciešama rakstīšanas piekļuve failos saglabātajiem logotipiem %2$s.", - "LogoUpload": "Izvēlēties logo augšuplādei", - "LogoUploadFailed": "Augšupielādēto failu nevarēja apstrādāt. Lūdzu, pārbaudiet, vai failam ir derīgs formāts.", - "LogoUploadHelp": "Lūdzu, augšupielādējiet failu %1$s formātos ar minimālo augstumu %2$s pikseļi.", - "LtsReleases": "LTS (ilgtermiņa atbalsta) versijas saņem tikai drošības un kļūdu labojumus.", - "MenuDevelopment": "Attīstība", - "MenuDiagnostic": "Diagnostika", - "MenuGeneralSettings": "Vispārīgie iestatījumi", - "MenuMeasurables": "Izpētāmās vietnes", - "MenuSystem": "Sistēma", - "MissingTrackingCodeEmailSubject": "Matomo Analytics %s nav reģistrētu datplūsmu, sāciet tagad", - "NTrackingFailures": "%s izsekošanas kļūmes", - "NeedHelp": "Vajadzīga palīdzība?", - "NoKnownFailures": "Nav zināmu izsekošanas kļūdu.", - "OptOutComplete": "Atteikšanās pabeigta; jūsu apmeklējumi šajā vietnē netiks reģistrēti ar Tīmekļa analīzes rīku.", - "OptOutCompleteBis": "Lūdzu, ņemiet vērā, ka, ja jūs iztīrīsiet savas sīkdatnes, dzēsīsiet atteikšanās sīkdatni vai mainīsiet datorus vai tīmekļa pārlūkprogrammas, jums atkal būs jāveic atteikšanās procedūra.", - "OptOutCustomOptOutLink": "Varat izveidot arī pilnībā pielāgotu atteikšanās formu, izmantojot HTML un JavaScript, kā skaidrots šajā izstrādātāja %1$srokasgrāmatā%2$s.", - "OptOutDntFound": "Jūs netiekat izsekots, jo jūsu pārlūks ziņo, ka to nevēlaties. Tie ir jūsu pārlūka iestatījumi, tāpēc nevarēsiet piekrist, kamēr neatslēgsiet opciju \"Neizsekošana\".", - "OptOutErrorNoCookies": "Izsekošanas atteikšanās līdzekļa darbībai jāiespējo sīkfaili.", - "OptOutErrorNoTracker": "Izsekošanas atteikšanās līdzeklis šajā lapā nevarēja atrast Matomo izsekošanas kodu", - "OptOutErrorNotHttps": "Izsekošanas atteikšanās līdzeklis var nedarboties, jo šī vietne nav ielādēta ar HTTPS. Lūdzu, atkārtoti ielādējiet lapu, lai pārbaudītu, vai jūsu atteikšanās statuss ir mainīts.", - "OptOutErrorWindowOpen": "Izsekošanas atteikšanās līdzeklis var nedarboties, jo izskatās, ka atteikšanās uznirstošais logs tika bloķēts. Lūdzu, atkārtoti ielādējiet lapu, lai pārbaudītu, vai jūsu atteikšanās statuss ir mainījies.", - "OptOutExplanation": "Matomo ir veltīts privātuma nodrošināšanai internetā. Lai apmeklētājiem nodrošinātu iespēju atteikties no Matomo tīmekļa analīzes, vienā no tīmekļa vietnes lapām, piemēram, konfidencialitātes politikas lapā, varat pievienot šādu HTML kodu.", - "OptOutExplanationIntro": "Šis kods parādīs \"div\" tagus, kas satur saiti, lai apmeklētāji varētu atteikties no Matomo, iestatot atteikšanās sīkdatni viņu tīmekļa pārlūkos. Skatiet zemāk (vai %1$sklikšķiniet šeit%2$s), lai apskatītu saturu, ko parādīs \"div\" tagi.", - "OptOutForYourVisitors": "Matomo atteikšanās jūsu apmeklētājiem", - "OptingYouOut": "Veicam atteikšanos, lūdzu, uzgaidiet…", - "PersonalPluginSettings": "Personīgie spraudņu iestatījumi", - "PiwikIsInstalledAt": "Matomo ir instalēts", - "PluginSettingChangeNotAllowed": "Jums nav atļauts mainīt iestatījuma \"%1$s\" vērtību spraudnī \"%2$s\"", - "PluginSettingReadNotAllowed": "Jums nav atļauts lasīt iestatījuma \"%1$s\" vērtību spraudnī \"%2$s\"", - "PluginSettings": "Spraudņa iestatījumi", - "PluginSettingsIntro": "Šeit varat mainīt šādu trešo pušu spraudņu iestatījumus:", - "PluginSettingsSaveFailed": "Nevarēja saglabāt spraudņa iestatījumus", - "PluginSettingsSaveSuccess": "Spraudņa iestatījumi atjaunināti.", - "PluginSettingsValueNotAllowed": "Vērtība \"%1$s\" laukā \"%2$s\" spraudnī nav atļauta", - "Problem": "Problēma", - "ProtocolNotDetectedCorrectly": "Pašlaik jūs skatāt Matomo, izmantojot drošu SSL savienojumu (izmantojot HTTPS), bet Matomo varēja noteikt tikai nedrošu savienojumu serverī.", - "ProtocolNotDetectedCorrectlySolution": "Lai nodrošinātu, ka Matomo droši pieprasa un sūta jūsu saturu, izmantojot HTTPS, varat rediģēt savu %1$s failu un konfigurēt savus starpniekservera iestatījumus vai pievienot rindu %2$s %3$s sadaļā. %4$sUzzināt vairāk%5$s", - "ReactDescription": "Ja Jūsu vietne izmanto React, lūdzu skatiet %1$sšo rokasgrāmatu%2$s.", - "ReleaseChannel": "Versijas kanāls", - "SecurityNotificationAllTokenAuthDeletedBody": "Kāds ir izdzēsis visus autentifikācijas žetonus no jūsu konta.", - "SecurityNotificationAnonymousAccessEnabledBody": "Kāds ir iespējojis anonīmu lietotāju piekļuvi %1$s. Tas nozīmē, ka šīs vietnes dati tagad ir publiski pieejami. Ja tas ir pieņemami, ignorējiet šo e-pastu.", - "SecurityNotificationCheckTwoFactor": "Lūdzu, pārbaudiet savu divfaktoru autentifikācijas lietotni vai ierīci.", - "SecurityNotificationEmailSubject": "Drošības paziņojums", - "SecurityNotificationIfItWasYou": "Ja tas bijāt jūs, turpiniet. Ja jūs neatpazīstat šo aktivitāti, lūdzu, nomainiet savu paroli.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Kāds ir izveidojis jaunus divfaktoru autentifikācijas atkopšanas kodus jūsu kontam.", - "SecurityNotificationRecoveryCodesShowedBody": "Kāds apskatīja jūsu konta divfaktoru autentifikācijas atkopšanas kodus.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Cits galvenais lietotājs (%1$s) ir modificējis sistēmas iestatījumus. Ietekmētie iestatījumi: %2$s. Ja jūs zināt par šo aktivitāti, turpiniet. Ja jūs neatpazīstat šo aktivitāti, lūdzu, sazinieties ar citiem galvenajiem lietotājiem.", - "SecurityNotificationSettingsChangedByUserBody": "Kāds ir modificējis sistēmas iestatījumus. Ietekmētie iestatījumi: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Kāds jūsu kontā izveidojis autentifikācijas žetonu (apraksts: %s). Ja tas nebijāt jūs, dzēsiet žetonu.", - "SecurityNotificationTokenAuthDeletedBody": "Kāds ir izdzēsis autentifikācijas žetonu (apraksts: %s) no jūsu konta.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Kāds jūsu kontā atspējoja divfaktoru autentifikāciju.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Kāds jūsu kontam iespējoja divfaktoru autentifikāciju.", - "SecurityNotificationUserAcceptInviteBody": "Lietotājs (lietotājvārds: %s) pieņēma ielūgumu.", - "SecurityNotificationUserCreatedBody": "Kāds jūsu kontā izveidoja jaunu lietotāju (lietotājvārds: %s).", - "SecurityNotificationUserDeclinedInviteBody": "Lietotājs (lietotājvārds: %s) noraidīja ielūgumu.", - "SecurityNotificationUserDeletedBody": "Kāds jūsu kontā izdzēsa lietotāju (lietotājvārds: %s).", - "SendPluginUpdateCommunication": "Sūtīt e-pastu, kad spraudnim pieejams atjauninājums", - "SendPluginUpdateCommunicationHelp": "Kad spraudnim būs pieejama jauna versija, galvenajiem lietotājiem tiks nosūtīts e-pasta ziņojums.", - "SettingsSaveSuccess": "Iestatījumi atjaunināti.", - "ShowAdvancedOptions": "Rādīt paplašinātās opcijas", - "SinglePageApplicationDescription": "Ja izsekojat vienas lapas lietojumprogrammu (SPA) vai progresīvu tīmekļa lietojumprogrammu (PWA), lūdzu skatiet %1$sšo ceļvedi%2$s.", - "Solution": "Risinājums", - "StableReleases": "Ja Matomo ir būtiska jūsu biznesa daļa, iesakām izmantot jaunāko stabilo versiju. Ja izmantojat jaunāko beta versiju un atrodat kļūdu vai jums ir ieteikums, lūdzu %1$sskatiet šeit%2$s.", - "SystemPluginSettings": "Sistēmas spraudņa iestatījumi", - "TrackAGoal": "Izsekot mērķi", - "TrackingCode": "Izsekošanas kods", - "TrackingCodeIntro": "Matomo piedāvā dažādus veidus, kā iegult izsekošanas kodu jūsu tīmekļa vietnei, mobilajai lietotnei un pat jebkurai ierīcei vai lietojumprogrammai.", - "TrackingFailureAuthenticationProblem": "Pieprasījums netika autentificēts, bet autentifikācija bija nepieciešama.", - "TrackingFailureAuthenticationSolution": "Iestatiet vai labojiet \"token_auth\" savā izsekošanas pieprasījumā.", - "TrackingFailureInvalidSiteProblem": "Vietne nepastāv.", - "TrackingFailureInvalidSiteSolution": "Atjauniniet izsekotājā konfigurēto idSite.", - "TrackingFailures": "Izsekošanas kļūmes", - "TrackingFailuresEmail1": "Tikai gribējām informēt, ka pēdējās dienās ir notikušas %s dažādu veidu izsekošanas kļūmes.", - "TrackingFailuresEmail2": "Lai apskatītu visus neizdevušos izsekošanas pieprasījumus %1$sklikšķiniet šeit%2$s.", - "TrackingFailuresEmailSubject": "Izsekošanas kļūmes jūsu Matomo Analytics", - "TrackingFailuresIntroduction": "Šajā lapā ir uzskaitītas pēdējās %s dienās notikušās izsekošanas kļūmes. Lūdzu, ņemiet vērā, ka tiek reģistrētas tikai visbiežāk sastopamās izsekošanas kļūmes, nevis visas no tām.", - "TrackingURL": "Izsekošanas URL", - "TrustedHostConfirm": "Vai tiešām vēlaties mainīt uzticamo Matomo resursdatora nosaukumu?", - "TrustedHostSettings": "Uzticams Matomo resursdatora nosaukums", - "TwoFactorAuth": "Divfaktoru autentifikācija", - "UiDemo": "UI demonstrācija", - "UncheckToOptOut": "Noņemiet atzīmi no šī lodziņa, lai atteiktos.", - "UpdateSettings": "Atjaunināt iestatījumus", - "UseCustomLogo": "Lietot izvēles logo", - "UserInviteContent": "Šo uzaicinājumu var pieņemt, klikšķinot uz zemāk esošās pogas.", - "UserInviteNotes": "Ja negaidījāt šo ielūgumu, ignorējiet šo e-pastu. Ja %1$s sūta pārāk daudz e-pastu, bloķējiet tos vai ziņojiet par pārkāpumu. Ielūgums automātiski zaudē spēku pēc %2$s dienām.", - "UserInviteSubject": "%1$s nosūtīja jums ielūgumu pievienoties Matomo Analytics %2$s.", - "ValidPiwikHostname": "Derīgs Matomo resursdatora nosaukums", - "ViewAllTrackingFailures": "Apskatīt visas izsekošanas kļūmes", - "VueDescription": "Ja Jūsu vietne izmanto Vue.js, lūdzu skatiet %1$sšo ceļvedi%2$s.", - "WhatIsNew": "Jaunumi", - "WhatIsNewDoNotShowAgain": "Vairs nerādīt", - "WhatIsNewNoChanges": "Šobrīd nekā jauna nav", - "WhatIsNewNoChangesTitle": "Nav nesenu izmaiņu", - "WhatIsNewRemindMeLater": "Atgādiniet man vēlāk", - "WhatIsNewTitle": "Lūk, kas jauns Matomo", - "WhatIsNewTooltip": "Uzziniet, kas jauns Matomo", - "WithOptionalRevenue": "ar iespējamiem ieņēmumiem", - "WordpressDescription": "Ja Jūsu vietne izmanto Wordpress, lūdzu skatiet %1$sšo rokasgrāmatu%2$s.", - "YouAreNotOptedOut": "Jūs neesat atteicies.", - "YouAreOptedOut": "Jūs pašlaik esiet izvēlējušies nepiedalīties.", - "YouMayOptOut": "Lai izvairītos no šajā tīmekļa vietnē apkopoto datu apkopošanas un analīzes, varat izvēlēties datoram nepiešķirt unikālu tīmekļa analīzes sīkfaila identifikācijas numuru.", - "YouMayOptOut2": "Varat izvēlēties neļaut šai tīmekļa vietnei apkopot un analizēt šeit veiktās darbības.", - "YouMayOptOut3": "Šādi rīkojoties, tiks aizsargāta jūsu konfidencialitāte, bet tas arī neļaus īpašniekam mācīties no jūsu darbībām un radīt labāku pieredzi jums un citiem lietotājiem.", - "YouMayOptOutBis": "Lai izdarītu šādu izvēli, lūdzu, noklikšķiniet zemāk, lai saņemtu atteikšanās sīkfailu." - } -} diff --git a/plugins/CoreAdminHome/lang/ms.json b/plugins/CoreAdminHome/lang/ms.json deleted file mode 100644 index e98fda9f4aaf2ee2312c95ca7db6ecb842f169b4..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ms.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Tambahkan hos dipercayai baharu", - "Administration": "Pentadbiran", - "ArchivingSettings": "Tetapan mengarkib", - "BrandingSettings": "Tetapan penjenamaan", - "BruteForce": "Kekerasan", - "CheckToOptIn": "Tandai kotak ini untuk ikut serta.", - "ClickHereToOptIn": "Klik di sini untuk ikut serta.", - "UseCustomLogo": "Gunakan logo terurai" - } -} diff --git a/plugins/CoreAdminHome/lang/nb.json b/plugins/CoreAdminHome/lang/nb.json deleted file mode 100644 index e69daf63b4569b1ee68b60ac15d8dd1d398e887d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/nb.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Godta invitasjon", - "AddNewTrustedHost": "Legg til en ny trygg tjener", - "Administration": "Administrasjon", - "ArchivingSettings": "Arkiveringsinnstillinger", - "BrandingSettings": "Innstillinger for profilering", - "BruteForce": "Råmaktsangrep", - "CheckToOptIn": "Huk av denne boksen for å melde deg på.", - "ClickHereToOptIn": "Trykk her for å delta.", - "ClickHereToOptOut": "Trykk her for å ikke delta.", - "CloudflareDescription": "Sjekk %1$sdenne veiledningen%2$s hvis nettsiden din vertstjenes på Cloudflare.", - "ConfirmDeleteAllTrackingFailures": "Slett alle sporingsfeil?", - "ConfirmDeleteThisTrackingFailure": "Slett denne sporingsfeilen?", - "Cors": "CORS", - "CorsDomains": "Domener for ressursdeling på tvers av opphav (CORS)", - "CorsDomainsHelp": "Du kan definere domener eller underdomener som http://eksempel.no eller http://statistikk.eksempel.no. Eller tillate forespørsler på tvers av alle domener ved å legge til en «*».", - "CustomLogoFeedbackInfo": "Hvis du tilpasser Matomo-logoen vil du kanskje også skjule %1$s-lenken i toppmenyen. For å gjøre det må du deaktivere Feedback-utvidelsen i %2$sAdministrasjon av utvidelser%3$s-siden.", - "CustomLogoHelpText": "Du kan tilpasse Matomo-logoen som vises i brukergrensesnittet og i e-postrapporter.", - "DeclineInvite": "Avslå invitasjon", - "DeleteAllFailures": "Slett alle feil", - "DevelopmentProcess": "Selv utviklingsprosessen har tusenvis av automatiserte tester gjør betatestere en viktig jobb i å oppnå «Ingen feil-praksis» i Matomo.", - "EmailServerSettings": "Innstillinger for e-posttjener", - "ErrorEmailFromAddressNotValid": "SMTP-avsenderadressen er ikke gyldig", - "FaviconUpload": "Velg et favicon å laste opp", - "FileUploadDisabled": "Opplasting avfiler er ikke aktivert i din PHP-konfigurasjon. For å laste opp din egen logo, vennligst sett %s i php.ini og restart din webserver.", - "ForBetaTestersOnly": "Kun for beta-testere", - "GoogleTagManagerDescription": "Sjekk %1$sdenne veiledningen%2$s hvis nettsiden din vertstjenes på Google Tag Manager.", - "HideAdvancedOptions": "Skjul avanserte alternativer", - "HowToGetHelp": "Det er flere måter å få hjelp på. Gratis støtte fra Matomo-gemenskapen og betalt støtte fra Matomo-laget og dets tilknyttede partnere. Eller kanskje du har en feil å rapportere eller ønsker å foreslå en ny funksjon?", - "HttpTrackingApi": "API for HTTP-sporing", - "HttpTrackingApiDescription": "%1$sAPI-et for HTTP-sporing%2$s lar deg spore alt. Det er nyttig hvis du bruker et programmeringsspråk det ikke finnes noe SDK for enda. Det er også nyttig når du vil spore enheter eller et program på en spesiell måte.", - "ImageTracking": "Bildesporing", - "ImageTrackingIntro1": "Når en bruker har deaktivert JavaScript, eller når JavaScript ikke kan brukes, kan du bruke en bildesporingslenke for å spore besøkere.", - "ImageTrackingIntro2": "Generer lenken under og kopier den genererte HTML-koden til ditt nettsted. Hvis du bruker dette som en fallback for JavaScript-sporing, kan du bruke %1$s-tagger rundt koden.", - "ImageTrackingIntro3": "For hele listen med valg du kan bruke med en bildesporingslenke, se %1$sDokumentasjonen for sporings-API%2$s.", - "ImageTrackingLink": "Bildesporingslenke", - "ImportFromGoogleAnalytics": "Importer fra Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Hvis du har en Google Analytics-data og bytter til Matomo, kan du importere den ved bruk av %1$sGoogle Analytics-import%2$s-programtillegget.", - "ImportingServerLogsDesc": "Som alternativ til å spore besøkende gjennom nettleseren (enten via JavaScript eller bildesporingslenke), kan du importere tjenerlogger regelmessig. Lær mer om %1$stjenerlogganalyse%2$s.", - "InvalidPluginsWarning": "De følgende utvidelsene er ikke kompatible med %1$s og kunne ikke lastes inn: %2$s.", - "InvalidPluginsYouCanUninstall": "Du kan oppdatere eller avinstallere disse utvidelsene på %1$sAdministrer utvidelser%2$s-siden.", - "JSTrackingDocumentationHelp": "De mest populære avanserte alternativene som har med enkel tilgang å gjøre er å finne nedenfor. Enda flere alternativer (inkludert hvordan man sporer mål, egendefinerte variabler, netthandelsordrer og forlatte handlekurver) er beskrevet i %1$sMatomos JavaScript-sporingsdokumentasjon%2$s", - "JSTrackingIntro1": "Du kan spore besøkende på nettsiden din på flere forskjellige måte. Den anbefalte måten er å gjøre det gjennom JavaScript. For å bruke denne metoden må hver av de enkelte nettsidene ha litt JavaScript-kode, som du kan generere her.", - "JSTrackingIntro2": "Når du har JavaScript-sporingskoden for ditt nettsted, kopier og lim den inn på alle nettsteder som du vil spore med Matomo.", - "JSTrackingIntro3a": "På de fleste nettsider, blogger, innholdsbehandlingssystemer, osv. kan du bruke et ferdiglagd programtillegg til å gjøre det tekniske arbeidet for deg. (Sjekk %1$slisten over programtillegg brukt til å integrere Matomo%2$s.)", - "JSTrackingIntro3b": "Hvis det ikke finnes noen programtillegg kan du redigere dine nettsidemaler og legge til JavaScript-sproingskoden til i </head>-taggen, som ofte er definert i «header.php», «header.tpl» eller lignende malfil.", - "JSTrackingIntro4": "Hvis du ikke vil bruke JavaScript for å spore besøkere, %1$skan du generere en bildesporingslenke nedenfor%2$s.", - "JSTrackingIntro5": "Hvis du vil gjøre mer enn å spore sidevisninger, vennligst sjekk ut %1$sMatomo JavaScript Tracking documentation%2$s for en liste med tilgjengelige funksjoner. Ved å bruke disse funksjonene kan du spore mål, tilpassede variabler, e-handelsordre, forlatte handlevogner og mer.", - "JSTracking_CampaignKwdParam": "Nøkkelordparameter for kampanje", - "JSTracking_CampaignNameParam": "Navneparameter for kampanje", - "JSTracking_CodeNoteBeforeClosingHead": "Forsikre deg om at denne koden finnes på hver av nettsidene som finnes. Det enbefales å lime den inn umiddelbart før avslutting av %1$s-taggen.", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Forsikre deg om at denne koden er å finne i et skript-element på hver side av nettsiden din. Det anbefales å lime den inn umiddelbart før lukking av «head»-taggen.", - "JSTracking_ConsentManagerConnected": "%1$s ser ut til å allerede ha blitt satt opp for å fungere med Matomo.", - "JSTracking_ConsentManagerDetected": "%1$s-samtykkebehandler ble oppdaget på nettsiden din. Lær mer om oppsett av Matomo slik at det fungerer med %1$s ved å besøke %2$s.", - "JSTracking_ConsentManagerEmailNote": "Eller du kan bygge inn sporingskode på nettsiden din direkte istedenfor:", - "JSTracking_CrossDomain": "Som forvalg er besøks-ID-en som identifiserer hver unike besøker lagret i nettleserens førstepartsinformasjonskapsler, som kun kan nås av sider fra samme domene. Å skru på lenking på tvers av sider lar deg spore alle handlingene og sidevisningene for en gitt besøker under samme besøk når vedkommende surfer på flere sider på flere domener. Når en bruker klikker på en lenke til en av aliasene til din nettside, vil den legge til nettadresse-parameteret «pk_vid» som videresender besøks-ID-en.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Merk at for å bruke domenelenking på tvers av domener må du angi mer enn ett domenenavn (nettadresser) for din nettside.", - "JSTracking_CustomCampaignQueryParam": "Bruk tilpassede spørreparameternavn for kampanjens navn og nøkkelord", - "JSTracking_CustomCampaignQueryParamDesc": "Merk: %1$sMatomo vil automatisk oppdage Google Analytics-parametere.%2$s", - "JSTracking_DisableCookies": "Skru av alle sporings-informasjonskapsler", - "JSTracking_DisableCookiesDesc": "Skru av alle førstepartsinformasjonskapsler. Eksisterende Matomo-datakapsler for dette nettstedet vil bli slettet ved neste sidevisning.", - "JSTracking_EnableCrossDomainLinking": "Skrur på lenking på tvers av domener", - "JSTracking_EnableDoNotTrack": "Aktiver klientside DoNotTrack-gjenkjenning", - "JSTracking_EnableDoNotTrackDesc": "Slik at sporing ikke vil bli sendt hvis besøkere ikke vil bli sporet.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Merk: Server-side DoNotTrack-støtte har blitt aktivert, så dette valget vil ikke ha noen effekt.", - "JSTracking_EndNote": "Merk: Du kan generere en egendefinert sporingskode i administrasjonsdelen under %1$sSporingskode%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Sett inn nettstedsdomenet foran sidetittelen når sporingen skjer", - "JSTracking_GroupPageTitlesByDomainDesc1": "Så hvis noen besøker «Om oss»-siden på blogg.%1$s, vil det bli lagret som «blogg / Om oss». Dette er den enkleste måten å få en oversikt over trafikk etter subdomene.", - "JSTracking_MergeAliases": "I «Utlenker»-rapporten, skjul klikk til kjente alias-URLer for", - "JSTracking_MergeAliasesDesc": "Slik at klikk på lenker til Alias-URLer (f.eks. %s) ikke vil telle som «Utlenker».", - "JSTracking_MergeSubdomains": "Spor besøkere på tvers av alle subdomenene til", - "JSTracking_MergeSubdomainsDesc": "Slik at hvis noen besøker %1$s og %2$s, vil de bli regnet som én unik besøker.", - "JSTracking_PageCustomVars": "Spor en tilpasset variabel for hver sidevisning", - "JSTracking_PageCustomVarsDesc": "For eksempel, med variabelnavnet «Kategori» og verdien «Rapporter».", - "JSTracking_TrackNoScript": "Spor brukere som har JavaScript avslått", - "JSTracking_VisitorCustomVars": "Spor tilpassede variabler for denne besøkeren", - "JSTracking_VisitorCustomVarsDesc": "For eksempel, med variabelnavnet «Type» og verdien «Kunde».", - "JavaScriptTracking": "JavaScript-sporing", - "JsTrackingCodeAdvancedOptionsStep": "Valgfritt: Bruk de avanserte alternativene for å tilpasse sporingskoden din.", - "JsTrackingCodeMissingEmail1": "For noen dager siden la du til nettsiden «%s» i din Matomo-analyse. Matomo har ikke registrert noe trafikk for denne nettsiden.", - "JsTrackingCodeMissingEmail2": "For å begynne datasporing og for å få innsikt i det dine brukere foretar seg må du sette opp sporing i din nettside eller mobilprogram. For Nettsider kan du bygge inn sporingskoden rett før %s-taggen.", - "JsTrackingCodeMissingEmail3": "For å finne og tilpasse sporingskoden, %1$s klikk her %2$s (eller ta en titt på %3$s JavaScript Tracking Client guide %4$s).", - "LearnMore": "Lær mer", - "Login": "Brukernavn", - "LogoNotWriteableInstruction": "Hvis du vil bruke egen logo istedenfor den fra Matomo, gir du skrivetilgang til denne mappen: %1$s Matomo trenger skrivetilgang for dine loger lagret i %2$s-filene.", - "LogoUpload": "Velg en logo å laste opp", - "LogoUploadFailed": "Den opplastede filen kunne ikke prosesseres. Vennligst sjekk at den har et gyldig format.", - "LogoUploadHelp": "Vennligst last opp en fil i %1$s-formatet med en minimumshøyde på %2$s piksler.", - "LtsReleases": "LTS (Long Term Support – langsiktig støtte)-versjoner får kun sikkerhets- og feilrettinger.", - "MenuDevelopment": "Utvikling", - "MenuDiagnostic": "Diagnostikk", - "MenuGeneralSettings": "Generelle innstillinger", - "MenuMeasurables": "Områder", - "MenuSystem": "System", - "MissingTrackingCodeEmailSubject": "Ingen trafikk for %s registrert i Matomo-analyse. Begynn nå.", - "NTrackingFailures": "%s sporingsfeil", - "NeedHelp": "Behov for hjelp?", - "NoKnownFailures": "Ingen kjente sporingsfeil.", - "OptOutComplete": "Samtykke til sporing er avsluttet; dine besøk til dette nettstedet vil ikke spores av vevstatistikkverktøyet.", - "OptOutCompleteBis": "Merk at hvis du sletter dine informasjonskapsler (kaker), sletter kapselen som velger bort samtykke til sporing, eller hvis du endrer datamaskin eller nettleser, er du nødt til å gjennomføre denne prosedyren igjen.", - "OptOutCustomOptOutLink": "Du kan også opprette et helt egendefinert reservasjonsskjema ved bruk av HTML og JavaScript, som forklart av denne %1$sutviklerveiledningen%2$s.", - "OptOutDntFound": "Du spores ikke siden din nettleser rapporterer at du ikke vil det. Dette er en innstilling i din nettleser, så du vil ikke være i stand til å delta før du deaktiverer «Ikke spor meg»-funksjonen.", - "OptOutErrorNoCookies": "For å velge bort samtykke til sporing krever funksjonen at informasjonskapsler er aktivert.", - "OptOutErrorNoTracker": "Sporingsreservasjonsfunksjonen fant ikke noen Matomo-sporingskode på denne siden", - "OptOutErrorNotHttps": "Det er ikke sikkert at funksjonen for å velge bort sporing fungerer fordi dette nettstedet ble ikke lastet inn via HTTPS. Last siden på nytt for å sjekke om valget ditt om å velge bort sporing er endret.", - "OptOutErrorWindowOpen": "Funksjonen for å velge bort sporing fungerer kanskje ikke fordi det ser ut som oppsprettsvinduet for bortvalg ble blokkert. Last inn siden på nytt for å sjekke om valget ditt om å velge bort sporing er endret.", - "OptOutExplanation": "Matomo er dedikert til å gi personvern på Internett. For å gi dine besøkere valget om å ikke bli sporet, kan du legge til følgende HTML-kode på en av nettstedssider, for eksempel på personvernssiden.", - "OptOutExplanationIntro": "Denne koden vil vise en div inneholdende en lenke der de besøkende kan velge bort Matomo ved å sette en informasjonskapsel for å ikke gi samtykke til sporing i deres nettlesere. Se nedenfor (eller %1$sklikk her%2$s) for å se innholdet som skal vises av div-en.", - "OptOutForYourVisitors": "Bortvelging av samtykke til sporing i Matomo for dine besøkende", - "OptingYouOut": "Fjerner samtykke til sporing …", - "PersonalPluginSettings": "Personlige innstillinger for utvidelser", - "PiwikIsInstalledAt": "Matomo er installert på", - "PluginSettingChangeNotAllowed": "Du har ikke tillatelse til å endre verdien på innstillingen «%1$s» i utvidelsen «%2$s»", - "PluginSettingReadNotAllowed": "Du har ikke tillatelse til å lese verdien av innstillingen «%1$s» i utvidelsen «%2$s»", - "PluginSettings": "Innstillinger for utvidelser", - "PluginSettingsIntro": "Her kan du endre innstillinger for følgende tredjepartsutvidelser:", - "PluginSettingsSaveFailed": "Klarte ikke å lagre innstillinger for utvidelser", - "PluginSettingsSaveSuccess": "Utvidelsesinnstillingene ble oppdaterte.", - "PluginSettingsValueNotAllowed": "Verdien for feltet «%1$s» i «%2$s»-utvidelsen er ikke tillatt", - "Problem": "Problem", - "ProtocolNotDetectedCorrectly": "Du ser nå Matomo over en sikret SSL-tilkobling (ved bruk av HTTPS), men Matomo kunne kun oppdage en ikke-sikker tilkobling til tjeneren.", - "ProtocolNotDetectedCorrectlySolution": "For å forsikre deg om at Matomo mottar sikre spørringer og leverer innhold over HTTPS, kan du redigere din %1$s-fil og enten sette opp dine mellomtjener-innstillinger, eller du kan legge inn linjen %2$s under avsnittet %3$s. %4$sLær mer%5$s", - "ReactDescription": "Sjekk %1$sdenne veiledningen%2$s hvis nettsiden din bruker React.", - "ReleaseChannel": "Versjonskanal", - "SecurityNotificationAllTokenAuthDeletedBody": "Noen slettet alle symbolene for identitetbekreftelse på kontoen din.", - "SecurityNotificationCheckTwoFactor": "Sjekk ditt to-faktoridentitetsbekreftelsesprogram eller enhet.", - "SecurityNotificationEmailSubject": "Sikkerhetsmerknad", - "SecurityNotificationIfItWasYou": "Hvis det var du kan du se bort fra dette. Hvis du ikke gjenkjenner denne aktiviteten må du tilbakestille passordet ditt.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Noen genererte nye gjenopprettelseskoder for to-faktoridentitetbekreftelseskoder for kontoen din.", - "SecurityNotificationRecoveryCodesShowedBody": "Noen tok en titt på gjenopprettingskodene for to-faktoridentitetbekrefte tilhørende kontoen din.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "En annen superbruker (%1$s) endret systeminnstillingene for %2$s. Hvis du vet om dette kan du se bort fra advarselen. Hvis ikke bør du kontakte de andre superbrukerne.", - "SecurityNotificationSettingsChangedByUserBody": "Noen endret systeminnstillingene for %s.", - "SecurityNotificationTokenAuthCreatedBody": "Noen opprettet et identitetbekreftelsessymbol (beskrivelse: %s) på kontoen din. Hvis det ikke var deg bør du slette det.", - "SecurityNotificationTokenAuthDeletedBody": "Noen slettet et identitetbekreftelsessymbol (beskrivelse: %s) på kontoen din.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Noen skrudde av to-faktoridentitetsbekreftelse på kontoen din.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Noen skrudde på to-faktoridentitetbekreftelse på kontoen din.", - "SecurityNotificationUserAcceptInviteBody": "Brukeren (innlogging: %s) godtok invitasjonen.", - "SecurityNotificationUserCreatedBody": "Noen opprettet en ny bruker (innlogging: %s) på kontoen din.", - "SecurityNotificationUserDeclinedInviteBody": "Brukeren (innlogging: %s) avslo invitasjonen.", - "SecurityNotificationUserDeletedBody": "Noen slettet en bruker (innlogging: %s) på kontoen din.", - "SendPluginUpdateCommunication": "Send en e-post når en oppdatering for en utvidelse er tilgjengelig", - "SendPluginUpdateCommunicationHelp": "En e-post vil bli sendt til superbrukere når det er en ny versjon tilgjengelig for en utvidelse.", - "SettingsSaveSuccess": "Innstillingene ble oppdaterte.", - "ShowAdvancedOptions": "Vis avanserte alternativer", - "SinglePageApplicationDescription": "Hvis du sporer et enkeltsidig program (SPA) eller et progressivt vev-program (PWA), sjekk %1$sdenne veiledningen%2$s.", - "Solution": "Løsning", - "StableReleases": "Hvis Matomo er en kritisk del av din forretning anbefaler vi at du bruker den nyeste stabile versjonen. Hvis du bruker den nyeste betaen og du finner en feil eller har et forbedringsforslag, vennligst %1$sse her%2$s.", - "SystemPluginSettings": "Systeminnstillinger for utvidelser", - "TrackAGoal": "Spor et mål", - "TrackingCode": "Sporingskode", - "TrackingCodeIntro": "Matomo tilbyr forskjellige måter å bygge inn sporingskoden for nettsiden din, mobilprogrammet ditt, og selv for alle enheter og ethvert program.", - "TrackingFailureAuthenticationProblem": "Påkrevd identitetsbekreftelse av forespørsel ble ikke utført.", - "TrackingFailureAuthenticationSolution": "Sett eller korriger «token_auth» i din sporingsforespørsel.", - "TrackingFailureInvalidSiteProblem": "Denne siden finnes ikke.", - "TrackingFailureInvalidSiteSolution": "Oppdater oppsatt idSite i sporeren.", - "TrackingFailures": "Sporingsfeil", - "TrackingFailuresEmail1": "%s forskjellige sporingsfeil har oppstått de siste dagene.", - "TrackingFailuresEmail2": "%1$sKlikk her%2$s for å vise alle mislykkede sporingsforespørsler.", - "TrackingFailuresEmailSubject": "Sporingsfeil i din Matomo-analyse", - "TrackingFailuresIntroduction": "Denne siden lister opp sporingsfeil som har skjedd de siste %s dagene. Merk deg at kun de vanligste sporingsfeilene registreres, ikke samtlige.", - "TrackingURL": "Sporingsnettadresse", - "TrustedHostConfirm": "Er du sikker på at du vil endre betrodd vertsnavn for Matomo?", - "TrustedHostSettings": "Betrodd Matomo-vertsnavn", - "TwoFactorAuth": "To-faktoridentitetsbekreftelse", - "UiDemo": "Grensesnittsdemo", - "UncheckToOptOut": "Fjern samtykke til sporing ved å fravelge denne boksen.", - "UpdateSettings": "Oppdater innstillinger", - "UseCustomLogo": "Bruk din egen logo", - "UserInviteContent": "Du kan godta denne invitasjonen ved å klikke på «Godta»-knappen nedenfor.", - "UserInviteNotes": "Hvis du ikke forventet denne invitasjonen kan du se bort fra denne e-posten. Hvis %1$s sender deg for mange e-poster kan du blokkere vedkommende eller rapportere det. Invitasjonen utløper automatisk om %2$s dager.", - "UserInviteSubject": "%1$s sendte deg en invitasjon til å ta del i Matomo-analyse for %2$s.", - "ValidPiwikHostname": "Gyldig Matomo-vertsnavn", - "ViewAllTrackingFailures": "Vis alle sporingsfeil", - "VueDescription": "Sjekk %1$sdenne veiledningen%2$s hvis nettsiden din vertstjenes ved bruk av Vue.js.", - "WhatIsNew": "Nyheter", - "WhatIsNewNoChanges": "Ingenting nytt for øyeblikket", - "WhatIsNewNoChangesTitle": "Ingen nylige endringer", - "WhatIsNewRemindMeLater": "Minn meg på dette senere", - "WhatIsNewTitle": "Dette er nytt i Matomo", - "WhatIsNewTooltip": "Lær hva som er nytt i Matomo", - "WithOptionalRevenue": "med valgfri omsetning", - "WordpressDescription": "Sjekk %1$sdenne veiledningen%2$s hvis nettsiden din vertstjenes på WordPress.", - "YouAreNotOptedOut": "Du har ikke fjernet samtykke til sporing.", - "YouAreOptedOut": "Du deltar ikke i analysegrunnlaget.", - "YouMayOptOut": "Du kan velge å ikke få tildelt en unik ID for nettanalyse på din datamaskin, slik at din aktivitet ikke spores på dette nettstedet.", - "YouMayOptOut2": "Du kan velge å forhindre at dette nettstedet samler inn og analyserer handlingene du gjør her.", - "YouMayOptOut3": "Dette vil beskytte personvernet ditt, men vil også forhindre at eieren lærer av handlingene dine og skaper en bedre opplevelse for deg og andre brukere.", - "YouMayOptOutBis": "Hvis du ønsker at din aktivitet ikke lagres, klikk under for å motta en blank informasjonskapsel, så vil du unngå å bli registrert." - } -} diff --git a/plugins/CoreAdminHome/lang/nl.json b/plugins/CoreAdminHome/lang/nl.json deleted file mode 100644 index 77daa11cb18d12065409a0bd8cb4b9b44ae7bf43..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/nl.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Accepteer uitnodiging", - "AddNewTrustedHost": "Nieuwe vertrouwde host toevoegen", - "Administration": "Administratie", - "ArchivingSettings": "Archiveringsinstellingen", - "BrandingSettings": "Merkinstellingen", - "BruteForce": "Brute Force", - "CheckToOptIn": "Schakel dit vakje in om u aan te melden.", - "ClickHereToOptIn": "Klik hier om u aan te melden.", - "ClickHereToOptOut": "Klik hier om u af te melden.", - "CloudflareDescription": "Indien uw website op Cloudflare gehost wordt, raadpleeg dan %1$sdeze handleiding%2$s.", - "ConfirmDeleteAllTrackingFailures": "Weet u zeker dat u alle tracking fouten wilt verwijderen?", - "ConfirmDeleteThisTrackingFailure": "Weet u zeker dat u deze tracking fout wilt verwijderen?", - "Cors": "Cors", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) domeinen", - "CorsDomainsHelp": "U kunt domeinen of subdomeinen definiëren, zoals http://example.com of http://stats.example.com. Of om crossdomeinverzoeken voor alle domeinen toe te staan, kunt u een * toevoegen", - "CustomLogoFeedbackInfo": "Als u het Matomo logo bijwerkt, heeft u wellicht ook interesse om de %1$s link te verbergen in het menu bovenaan. Om dit te doen, kunt u de feedback plugin uitschakelen in de pagina van de %2$sManage Plugins%3$s.", - "CustomLogoHelpText": "U kunt het Matomo logo aanpassen dat wordt weergegeven in de gebruikersinterface en in de e-mail rapportages.", - "DeclineInvite": "Weiger uitnodiging", - "DeleteAllFailures": "Verwijder alle fouten", - "DevelopmentProcess": "Hoewel ons ontwikkelproces duizenden geautomatiseerde tests kent, spelen Beta Testers een sleutelrol in het bereiken van de \"Geen bugs policy\" in Matomo.", - "EmailServerSettings": "E-mailserverinstellingen", - "ErrorEmailFromAddressNotValid": "Het SMTP afzender adres is niet geldig", - "FaviconUpload": "Selecteer een favicon om te uploaden", - "FileUploadDisabled": "Het uploaden van documenten is niet geactiveerd in je PHP configuratie. Om een aangepast logo up te loaden pas %s aan in php.ini en herstart de webserver.", - "ForBetaTestersOnly": "Alleen voor bèta testers", - "GoogleTagManagerDescription": "Indien uw website Google Tag Manager gebruikt, raadpleeg dan %1$sdeze handleiding%2$s.", - "HideAdvancedOptions": "Verberg geavanceerde opties", - "HowToGetHelp": "Er zijn verschillende manieren om hulp te krijgen. Er is gratis ondersteuning via de Matomo Community en betalende ondersteuning door het Matomo team en partners van Matomo. Of misschien wil u een bug melden of wenst u een nieuwe functionaliteit?", - "HttpTrackingApi": "HTTP Tracking API", - "HttpTrackingApiDescription": "De %1$sHTTP Tracking API%2$s stelt je in staat om alles te volgen. Dit kan nuttig zijn als je een programmeertaal gebruikt waarvoor nog geen SDK bestaat. Dit kan ook nuttig zijn als je apparaten of applicaties op een speciale manier wilt volgen.", - "ImageTracking": "Afbeelding tracking", - "ImageTrackingIntro1": "Wanneer een bezoeker JavaScript heeft uitgeschakeld, of wanneer JavaScript niet kan worden gebruikt, kun je een tracking afbeelding gebruiken om bezoekers te volgen.", - "ImageTrackingIntro2": "Genereer de link hieronder en kopieer de gegenereerde HTML in de pagina. Als je dit gebruikt als fallback voor JavaScript tracking, kun je het insluiten in %1$s tags.", - "ImageTrackingIntro3": "Voor de volledige lijst met mogelijkheden bij het gebruik van een afbeelding als tracking, zie de %1$sTracking API documentatie%2$s.", - "ImageTrackingLink": "Afbeelding Tracking Link", - "ImportFromGoogleAnalytics": "Importeer van Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Indien u een Google Analytics eigendomsrecht heeft en overschakelt naar Matomo kan u de bestaande gegevens importeren met de %1$sGoogleAnalyticsImporter%2$s plugin.", - "ImportingServerLogsDesc": "Een alternatief om bezoekers te volgen via de browser (ofwel via JavaScript of via een afbeelding) is continu server logs importeren. Lees meer over %1$sServer Logbestanden Analyses%2$s.", - "InvalidPluginsWarning": "De volgende plugins werken niet met %1$s en konden niet geladen worden: %2$s.", - "InvalidPluginsYouCanUninstall": "U kunt deze plugins updaten of installatie ongedaan maken op de %1$sManage Plugins%2$s pagina.", - "JSTrackingDocumentationHelp": "Om het makkelijk te maken, zijn de meest populaire geavanceerde opties hieronder beschikbaar. Voor nog meer opties (inclusief het volgen van doelen, aangepaste variabelen, e-commerce bestellingen en verlaten winkelwagens) kunt u de %1$sMatomo Javascript Tracking documentatie%2$s raadplegen.", - "JSTrackingIntro1": "Je kunt bezoekers aan je website op meerdere manieren volgen. De geadviseerde manier is om dit via JavaScript te doen. Om deze manier te gebruiken moet je ervoor zorgen dat elke pagina van je website een stukje JavaScript-code bevat die je hier kunt genereren.", - "JSTrackingIntro2": "Wanneer u de Javascript code voor uw website heeft, kopieer en plak die code naar alle pagina's die u wilt volgen met Matomo.", - "JSTrackingIntro3a": "In de meeste websites, blogs, CMS'en etc. kun je een plugin gebruiken om het technische werk voor je uit te voeren. (Kijk op onze %1$slijst met plugins om Matomo%2$s te integreren.)", - "JSTrackingIntro3b": "Als er geen plugin bestaat dan kan u uw website template aanpassen en daar de JavaScript tracking-code aan de </head> tag toevoegen. Dit wordt vaak gedefinieerd in een 'header.php', 'header.tpl' of vergelijkbaar bestand.", - "JSTrackingIntro4": "Indien u geen gebruik wilt maken van Javascript om gebruikers te volgen, %1$skunt u een afbeelding tracking link hieronder genereren%2$s.", - "JSTrackingIntro5": "Indien je meer wilt bijhouden dan paginaweergaves, lees dan de %1$sMatomo Javascript Tracking documentatie%2$s voor de lijst van beschikbare functies. Via deze functies kun je doelen, eigen variabelen, ecommerce bestellingen, afgebroken bestellingen en meer.", - "JSTracking_CampaignKwdParam": "Campagne sleutelwoord parameter", - "JSTracking_CampaignNameParam": "Campagne naam parameter", - "JSTracking_CodeNoteBeforeClosingHead": "Klik op de knop om het codefragment te kopiëren en plak het direct voor de afsluitende %1$s tag (aanbevolen).", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Zorg ervoor dat deze code is ingebed in een scriptelement op elke pagina van je website. We raden je aan om de code voor de sluit head tag in te plakken.", - "JSTracking_ConsentManagerConnected": "%1$s lijkt reeds geconfigureerd te zijn om te werken met Matomo.", - "JSTracking_ConsentManagerDetected": "%1$s consent manager is gedetecteerd op uw site. Om meer te leren over het configureren van Matomo om te werken met %1$s, raadpleeg %2$s", - "JSTracking_ConsentManagerEmailNote": "Of u kan meteen de tracking code embedden in uw website:", - "JSTracking_CrossDomain": "Standaard wordt de bezoeker-ID die een unieke bezoeker identificeert opgeslagen in de browsers first-party cookies die alleen benaderd kunnen worden door pagina's vanuit hetzelfde domein. Door domein cross linking in te schakelen kun je alle acties en pageviews van een specifieke bezoeker volgen, ook al bekijken ze pagina's van verschillende domeinen. Als een bezoeker klikt op een link van een van je website alias URL's dan wordt een URL-parameter pk_vid met de bezoeker-ID toegevoegd.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Let op: Om cross domein linking te gebruiken moet je meer dan een domeinnaam (URL's) voor je website specificeren.", - "JSTracking_CustomCampaignQueryParam": "Gebruik aangepaste query parameter namen voor de campagne naam en sleutelwoorden", - "JSTracking_CustomCampaignQueryParamDesc": "Opmerking: %1$s Matomo detecteert automatisch Google Analytics parameters.%2$s", - "JSTracking_DisableCampaignParameters": "Schakel campagneparameter tracking uit", - "JSTracking_DisableCampaignParametersDesc": "Als deze optie aangevinkt is, zal Matomo de campagneparameters niet volgen en worden deze verwijderd uit de gevolgde URLs.", - "JSTracking_DisableCookies": "Schakel alle tracking cookies uit", - "JSTracking_DisableCookiesDesc": "Schakelt alle first party cookies uit. Bestaande Matomo cookies voor deze website zullen worden verwijderd bij de volgende paginaweergave.", - "JSTracking_EnableCrossDomainLinking": "Activeer cross domain linking", - "JSTracking_EnableDoNotTrack": "Schakel DoNotTrack-detectie aan clientzijde in", - "JSTracking_EnableDoNotTrackDesc": "Tracking verzoeken zullen niet worden verzonden indien de bezoeker niet wenst gevolgd te worden.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Opmerking: Server side DoNotTrack ondersteuning is ingeschakeld, deze optie heeft dus geen effect.", - "JSTracking_EndNote": "Opmerking: Na het installatie proces, kun je custom tracking code genereren in het %1$sTracking Code%2$s admin gedeelte.", - "JSTracking_GroupPageTitlesByDomain": "Plaats het sitedomein voor de paginatitel tijdens het volgen", - "JSTracking_GroupPageTitlesByDomainDesc1": "Als iemand de 'over mij' bezoekt op blog.%1$s wordt het bewaard als 'blog / over mij'. Dit is de gemakkelijkste manier om een overzicht volgens subdomein te krijgen op je verkeer.", - "JSTracking_MergeAliases": "In het \"Uitgaande links\" rapport, verberg kliks naar bekende aliassen van", - "JSTracking_MergeAliasesDesc": "Zo zal het klikken op linken naar alias-URL's (bv. %s) niet geteld worden als \"Uitgaande link\".", - "JSTracking_MergeSubdomains": "Volg bezoekers op elk subdomein van", - "JSTracking_MergeSubdomainsDesc": "Als een bezoeker %1$s en %2$s bezoekt, wordt deze geteld als een unieke bezoeker.", - "JSTracking_PageCustomVars": "Volg een aangepaste variabele voor elke paginaweergave", - "JSTracking_PageCustomVarsDesc": "Bijvoorbeeld met variabele \"Categorie\" en waarde \"White papers\".", - "JSTracking_TrackNoScript": "Volg gebruikers als JavaScript uitgeschakeld is", - "JSTracking_VisitorCustomVars": "Houd aangepaste variabelen bij voor deze bezoeker", - "JSTracking_VisitorCustomVarsDesc": "Bijvoorbeeld met variabele naam \"Type\" en waarde \"Klant\".", - "JavaScriptCode": "JavaScript-code", - "JavaScriptTracking": "JavaScript Tracking", - "JsTrackingCodeAdvancedOptionsStep": "Optioneel: gebruik de geavanceerde opties om je trackingcode aan te passen.", - "JsTrackingCodeMissingEmail1": "Een par dagen geleden heb je de website '%s' aan je Matomo Analyses toegevoegd. We hebben net een controle uitgevoerd en het lijkt alsof Matomo helemaal geen verkeer heeft vastgelegd voor deze website.", - "JsTrackingCodeMissingEmail2": "Om te beginnen met tracking data en daardoor inzicht te krijgen in je bezoekers moet je eerst tracking inrichten op je website of mobiele app. Voor een website voeg je simpelweg de tracking code in vlak voor de %s tag.", - "JsTrackingCodeMissingEmail3": "Om je tracking code te vinden en aan te passen, %1$s klik hier%2$s (of kijk in de %3$sJavaScript Tracking Client handleiding%4$s).", - "LearnMore": "Meer weten", - "Login": "Inloggen", - "LogoNotWriteableInstruction": "Om je eigen logo te gebruiken in plaats van het standaard Matomo-logo moet je schrijfrechten geven op de directory: %1$s. Matomo heeft schrijfrechten nodig voor je logo's die opgeslagen zijn in de bestanden %2$s.", - "LogoUpload": "Selecteer een logo om te uploaden", - "LogoUploadFailed": "Het geüploade bestand kon niet worden verwerkt. Controleer of het bestand een geldig bestandsformaat heeft.", - "LogoUploadHelp": "Upload een bestand in %1$s formaten met een minimum hoogte van %2$s pixels.", - "LtsReleases": "LTS (Lange Termijn Support) versies ontvangen alleen security en bug oplossingen.", - "MenuDevelopment": "Ontwikkeling", - "MenuDiagnostic": "Diagnostisch", - "MenuGeneralSettings": "Algemene instellingen", - "MenuMeasurables": "Meetbaar", - "MenuSystem": "Systeem", - "MissingTrackingCodeEmailSubject": "Geen verkeer voor %s opgenomen in Matomo analyses, ga nu aan de slag", - "NTrackingFailures": "%s tracking fouten", - "NeedHelp": "Hulp nodig?", - "NoKnownFailures": "Er zijn geen tracking-problemen bekend.", - "OptOutComplete": "Opt-out ingesteld; uw bezoeken aan deze website zullen niet worden opgeslagen voor analyse.", - "OptOutCompleteBis": "Als u uw cookies wist, de opt-out cookie verwijdert of wisselt van computer of webbrowser, zult u deze opt-out procedure opnieuw moeten uitvoeren.", - "OptOutCustomOptOutLink": "U kan ook het opt-out formulier volledig aanpassen met HTML en Javascript, zoals uitgelegd in deze %1$sgids%2$s voor ontwikkelaars.", - "OptOutDntFound": "Je bezoek wordt niet gemeten omdat je browser aangeeft dat je dat niet wil. Dit is een instelling van je browser, dus je kunt geen gebruik maken van opt-in totdat je de 'Volg mij Niet'-functie uitschakelt.", - "OptOutErrorNoCookies": "Voor de tracking opt-out functie moeten cookies zijn ingeschakeld.", - "OptOutErrorNoTracker": "De tracking opt-out functie kon de Matomo Tracker code op deze pagina niet vinden", - "OptOutErrorNotHttps": "De tracking opt-out-functie werkt mogelijk niet omdat deze site niet via HTTPS is geladen. Laad de pagina opnieuw om te controleren of uw opt-out status is gewijzigd.", - "OptOutErrorWindowOpen": "De tracking opt-out functie werkt mogelijk niet omdat het lijkt alsof de opt-out pop-up is geblokkeerd. Laad de pagina opnieuw om te controleren of uw opt-out status is gewijzigd.", - "OptOutExplanation": "Matomo is ingericht om privacy op internet te respecteren. U kunt uw bezoekers de opt-out optie van Matomo Web Analytics aanbieden. Daartoe kunt u de volgende HTML-code toevoegen aan uw website, bijvoorbeeld op een pagina met een Privacybeleid.", - "OptOutExplanationIntro": "Deze code toont een div met een link (opt-out) waarmee bezoekers kunnen aangeven dat ze niet gevolgd willen worden door Matomo, dit via het plaatsen van een opt-out cookie in hun webbrowser. Kijk hieronder (of %1$s klik hier%2$s) om de inhoud van het te tonen div te bekijken.", - "OptOutForYourVisitors": "Matomo opt-out voor uw bezoekers", - "OptingYouOut": "Opt-out inschakelen, even geduld a.u.b…", - "PersonalPluginSettings": "Persoonlijke plugin-instellingen", - "PiwikIsInstalledAt": "Matomo is geïnstalleerd in", - "PluginSettingChangeNotAllowed": "U bent niet gemachtigd om de waarde aan te passen van de instelling \"%1$s\" in plugin \"%2$s\"", - "PluginSettingReadNotAllowed": "Je hebt geen toestemming voor het uitlezen van de instelling \"%1$s\" uit de plugin \"%2$s\"", - "PluginSettings": "Plugin-instellingen", - "PluginSettingsIntro": "Hier kunt u instellingen aanpassen voor de volgende plugins van derden:", - "PluginSettingsSaveFailed": "Opslaan van plugin instellingen lukt niet", - "PluginSettingsSaveSuccess": "Plugin-instellingen bijgewerkt.", - "PluginSettingsValueNotAllowed": "De waarde voor veld \"%1$s\" in de \"%2$s\" plugin is niet toegestaan", - "Problem": "Probleem", - "ProtocolNotDetectedCorrectly": "Op dit moment bezoek je Matomo met een SSL-verbinding (HTTPS), maar Matomo kon enkel een niet-beveiligde verbinding op de server detecteren.", - "ProtocolNotDetectedCorrectlySolution": "Om zeker te zijn dat Matomo verzoeken van je content over een beveiligde HTTPS verbinding serveert, kan je in het bestand %1$s de proxy settings aanpassen of je kan de regel %2$s onder sectie %3$s aanpassen. %4$sLeer meer%5$s", - "ReactDescription": "Indien uw website React gebruikt, raadpleeg dan %1$sdeze handleiding%2$s.", - "ReleaseChannel": "Versiekanaal", - "SecurityNotificationAllTokenAuthDeletedBody": "Iemand verwijderde alle auth tokens in uw account.", - "SecurityNotificationAnonymousAccessEnabledBody": "Er heeft iemand anonieme gebruikerstoegang geactiveerd voor %1$s. Dit betekent dat de gegevens voor deze site publiek beschikbaar zijn. Indien dit oké is, dan mag je deze mail negeren.", - "SecurityNotificationCheckTwoFactor": "Controleer uw two-factor authenticatie app of toestel aub.", - "SecurityNotificationEmailSubject": "Beveiligingsnotificatie", - "SecurityNotificationIfItWasYou": "Was u het, ga verder. Indien u deze activiteit niet herkent, reset dan uw wachtwoord aub.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Iemand genereerde nieuwe two-factor authenticatie herstelcodes voor uw account.", - "SecurityNotificationRecoveryCodesShowedBody": "Iemand bekeek de two-factor authenticatie herstelcodes voor uw account.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Een andere super user (%1$s) wijzigde de systeeminstellingen. Het betreft volgende instellingen: %2$s. Indien u weet heeft van deze activiteit, ga verder. Indien u deze activiteit niet herkent, neem dan contact op met de andere super users.", - "SecurityNotificationSettingsChangedByUserBody": "Iemand wijzigde de systeeminstellingen. Het betreft volgende instellingen: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Iemand maakte een auth token (omschrijving: %s) in uw account. Indien u dit niet deed, verwijder dan het token.", - "SecurityNotificationTokenAuthDeletedBody": "Iemand verwijderde een auth token (omschrijving: %s) in uw account.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Iemand schakelde two-factor authenticatie voor uw account uit.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Iemand schakelde two-factor authenticatie voor uw account in.", - "SecurityNotificationUserAcceptInviteBody": "Gebruiker (login: %s) accepteerde de uitnodiging.", - "SecurityNotificationUserCreatedBody": "Iemand maakte een nieuwe gebruiker (login: %s) aan in uw account.", - "SecurityNotificationUserDeclinedInviteBody": "Gebruiker (login: %s) weigerde de uitnodiging.", - "SecurityNotificationUserDeletedBody": "Iemand verwijderde een gebruiker (login: %s) in uw account.", - "SendPluginUpdateCommunication": "Stuur een email wanneer een plugin update beschikbaar is", - "SendPluginUpdateCommunicationHelp": "Een email wordt verstuurd naar de Super User wanneer er een nieuwe versie voor de plugin is.", - "SettingsSaveSuccess": "Instellingen bijgewerkt.", - "ShowAdvancedOptions": "Toon geavanceerde opties", - "SinglePageApplicationDescription": "Indien u een single-page applicatie (SPA) of een progressieve webapplicatie (PWA) wil volgen, raadpleeg %1$sdeze richtlijnen%2$s.", - "Solution": "Oplossing", - "StableReleases": "Indien Matomo een essentieel onderdeel is van uw zaak, dan raaden wij aan om de laatste stabiele versie te draaien. Indien je de laatste beta gebruikt en je ontdekt bugs of hebt een suggestie, %1$skijk dan hier%2$s.", - "SystemPluginSettings": "Systeem Plugin Instellingen", - "TrackAGoal": "Hou een doel bij", - "TrackingCode": "Trackingcode", - "TrackingCodeIntro": "Matomo biedt u meerdere manieren om de tracking code op uw website, mobiele app en zelfs voor elk apparaat of applicatie in te voegen.", - "TrackingFailureAuthenticationProblem": "Aanvraag was niet geautoriseerd maar autorisatie was verplicht.", - "TrackingFailureAuthenticationSolution": "Zet of corrigeer een \"token_auth\" in je tracking aanvraag.", - "TrackingFailureInvalidSiteProblem": "De website bestaat niet.", - "TrackingFailureInvalidSiteSolution": "Update de geconfigureerde idSite in de tracker.", - "TrackingFailures": "Tracking fouten", - "TrackingFailuresEmail1": "Dit is om je te laten weten dat er gedurende de afgelopen dagen %s verschillende tracking fouten zijn opgetreden.", - "TrackingFailuresEmail2": "Om alle foute tracking aanvragen te bekijken %1$sklik hier%2$s.", - "TrackingFailuresEmailSubject": "Tracking fouten in je Matomo Analyses", - "TrackingFailuresIntroduction": "Deze pagina toont de tracking fouten die tijdens de afgelopen %s dagen zijn opgetreden. Bedenk daarbij dat alleen de meest voorkomende tracking fouten zijn gelogd en dus niet alle.", - "TrackingURL": "Tracking URL", - "TrustedHostConfirm": "Weet je zker dat je de vertrouwde Matomo hostnaam wilt aanpassen?", - "TrustedHostSettings": "Toegestane Matomo hostnaam", - "TwoFactorAuth": "Two-factor auth", - "UiDemo": "UI Demo", - "UncheckToOptOut": "Schakel dit vakje uit om u af te melden.", - "UpdateSettings": "Instellingen bijwerken", - "UseCustomLogo": "Aangepast logo gebruiken", - "UserInviteContent": "U kan deze uitnodiging aanvaarden door te klikken op de acceptatieknop hieronder.", - "UserInviteNotes": "Indien u deze uitnodiging niet verwachtte, dan kan u deze e-mail negeren. Als %1$s u te veel e-mails stuurt, dan kan u die blokkeren of het misbruik melden. Deze uitnodiging vervalt automatisch binnen %2$s dagen.", - "UserInviteSubject": "%1$s heeft u een uitnodiging gestuurd om deel te nemen aan Matomo Analytics voor %2$s.", - "ValidPiwikHostname": "Geldige Matomo hostnaam", - "ViewAllTrackingFailures": "Bekijk alle tracking fouten", - "VueDescription": "Maakt uw website gebruik van Vue.js, raadpleeg dan %1$sdeze handleiding%2$s.", - "WhatIsNew": "Wat is er nieuw", - "WhatIsNewDoNotShowAgain": "Niet meer tonen", - "WhatIsNewNoChanges": "Er is niets nieuws op dit ogenblik", - "WhatIsNewNoChangesTitle": "Geen recente wijzigingen", - "WhatIsNewRemindMeLater": "Herinner mij later", - "WhatIsNewTitle": "Dit is er nieuw in Matomo", - "WhatIsNewTooltip": "Leer wat nieuw is in Matomo", - "WithOptionalRevenue": "met optionele inkomsten", - "WordpressDescription": "Maakt uw website gebruik van Wordpress, raadpleeg dan %1$sdeze handleiding%2$s.", - "YouAreNotOptedOut": "U bent momenteel aangemeld.", - "YouAreOptedOut": "U bent momenteel afgemeld.", - "YouMayOptOut": "U kunt ervoor kiezen om geen uniek cookie identificatie nummer van uw computer te hebben, zodat er op deze website van uw apparaat geen data verzameld of geanalyseerd kan worden.", - "YouMayOptOut2": "U kunt ervoor kiezen om te voorkomen dat deze website de acties die u uitvoert kan analyseren.", - "YouMayOptOut3": "Hierdoor wordt uw privacy beschermd, maar wordt ook voorkomen dat de beheerder van de website van uw acties kan leren en een betere ervaring voor u en andere gebruikers kan creëren.", - "YouMayOptOutBis": "Om hiervoor te kiezen kunt u hieronder klikken om een opt-out cookie te ontvangen." - } -} diff --git a/plugins/CoreAdminHome/lang/nn.json b/plugins/CoreAdminHome/lang/nn.json deleted file mode 100644 index d370d731204f585d7492ea6a99c57d2d540f0bd8..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/nn.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "Administrasjon", - "BrandingSettings": "Innstillingar for profilering", - "ClickHereToOptIn": "Klikk her for å melda deg på.", - "ClickHereToOptOut": "Klikk her for å melda deg av.", - "CustomLogoHelpText": "Du kan tilpassa Matomo-logoen som visast i brukargrensesnittet og e-postrapportar.", - "EmailServerSettings": "Innstillingar for e-posttenar", - "Login": "brukarnamn", - "LogoUpload": "Last opp ein logo", - "MenuGeneralSettings": "Generelle innstillingar", - "MenuMeasurables": "Målbare", - "OptOutComplete": "Avmelding fullførd. Vitjingane dine til denne nettsida vil ikkje loggførast av nettstatistikkverktøyet.", - "OptOutCompleteBis": "Dersom du slettar infokapslane dine eller byter datamaskin eller nettlesar, må du avmelda deg på nytt.", - "OptOutExplanation": "Matomo er oppteken av personvern på Internett.For å gje vitjarane dine valet om å slå av Matomo Nettstatistikk, kan du leggja til følgjande HTML-kode på ei av sidene dine, til dømes ei side med retningsliner for personvern.", - "OptOutForYourVisitors": "Avmelding av Matomo for vitjarar", - "UseCustomLogo": "Bruk ein tilpassa logo", - "YouAreOptedOut": "Du er avmeldt.", - "YouMayOptOut": "Dersom du vil unngå innsamling og analyse av data frå vitjinga di på denne nettstaden, kan du velja å ikkje tildelast ein infokapsel med eit unikt identifikasjonsnummer for nettstatistikk.", - "YouMayOptOutBis": "For å gjera dette, klikk nedafor for å få ein avmeldingsinfokapsel." - } -} diff --git a/plugins/CoreAdminHome/lang/pl.json b/plugins/CoreAdminHome/lang/pl.json deleted file mode 100644 index 6793da6813cd359e7c67b02108844aec210f9fd5..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/pl.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Dodaj zaufanego hosta", - "Administration": "Ustawienia", - "ArchivingSettings": "Ustawienia archiwizacji", - "BrandingSettings": "Ustawienia logo", - "BruteForce": "Brute Force", - "CheckToOptIn": "Zaznacz to pole aby włączyć analizę.", - "ClickHereToOptIn": "Kliknij tutaj by włączyć analizę.", - "ClickHereToOptOut": "Kliknij tutaj by wyłączyć analizę.", - "ConfirmDeleteAllTrackingFailures": "Czy jesteś pewny, że chcesz usunąć wszystkie błędy śledzenia?", - "ConfirmDeleteThisTrackingFailure": "Czy jesteś pewny, że chcesz usunąć dany błąd śledzenia?", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) domeny", - "CorsDomainsHelp": "Możesz zdefiniować domeny lub subdomeny jak http://example.com lub http://stats.example.com. Aby zezwolić na żądania domeny między wszystkimi domenami dodaj a *", - "CustomLogoFeedbackInfo": "Jeśli dostosujesz logo Matomo, może będziesz także chciał ukryć %1$s odnośnik w górnym menu. Aby to zrobić możesz wyłączyć plugin Feedback na stronie %2$sZarządzaj wtyczkami%3$s.", - "CustomLogoHelpText": "Można dostosować logo Matomo, które będzie wyświetlane w interfejsie użytkownika i w raportach e-mail.", - "DeleteAllFailures": "Usuń wszystkie błędy", - "DevelopmentProcess": "Nasz proces rozwoju obejmuje tysiące zautomatyzowanych testów, a beta testerzy odgrywają kluczową rolę w osiągnięciu \"zasady braku błędów\" w Matomo.", - "EmailServerSettings": "Konfiguracja serwera poczty", - "ErrorEmailFromAddressNotValid": "Adres SMTP nadawcy nie jest poprawny", - "FaviconUpload": "Wybierz Favikonę do wysłania", - "FileUploadDisabled": "Przesyłanie plików nie jest włączone w konfiguracji PHP. Aby przesłać własne logo należy ustawić %s w pliku php.ini i ponownie uruchomić serwer WWW.", - "ForBetaTestersOnly": "Tylko dla beta testerów", - "HttpTrackingApi": "API Śledzenia HTTP", - "HttpTrackingApiDescription": "%1$sAPI Śledzenia HTTP%2$s pozwala śledzić wszystko. Funkcjonalność ta może sprawdzić się w przypadku pracy z językiem programowania, dla którego jeszcze nie istnieje SDK. Może okazać się również przydatne do śledzenia urządzeń lub aplikacji w specjalny sposób.", - "ImageTracking": "Obrazek Śledziący", - "ImageTrackingIntro1": "Kiedy odwiedzający mają wyłączony język JavaScript lub kiedy JavaScript nie może być używany możesz użyć obrazka śledzącego aby śledzić odwiedzających.", - "ImageTrackingIntro2": "Wygeneruj link poniżej i skopuj-wklej wygenerowany HTML na stronę. Jeśli używasz tego jako fallback dla śledzenia w JavaScript-cie, możesz umieścić go wewnątrz tagów %1$s.", - "ImageTrackingIntro3": "Dla pełnej listy opcji które możesz używać z linkiem obrazka śledzącego zobacz %1$sDokumentację API Śledzenia%2$s.", - "ImageTrackingLink": "Link Obrazka Śledzącego", - "ImportFromGoogleAnalytics": "Importuj z Google Analytics", - "ImportFromGoogleAnalyticsDescription": "W przypadku wcześniejszego korzystania z Google Analytics i przejścia na Matomo, możesz zaimportować istniejące dane za pomocą pluginu %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Alternatywą do śledzenia odwiedzających przez przeglądarkę (przez JavaScript lub przez link do obrazka) jest ciągły import logów serwera. Poznaj więcej informacji o %1$sAnalizie na podstawie Logów Serwera%2$s.", - "InvalidPluginsWarning": "Poniższe wtyczki nie są kompatybilne z %1$s i nie mogą zostać załadowane: %2$s.", - "InvalidPluginsYouCanUninstall": "Możesz zaktualizować lub odinstalować te pluginy na stronie %1$sObsługa Pluginów%2$s", - "JSTrackingIntro1": "Możesz śledzić odwiedzających Twoją witrynę na wiele różnych sposobów, najlepiej przy pomocy JavaScript. Aby użyć tej metody musisz upewnić się, że każda strona Twojej witryny posiada kod JavaScript, który możesz wygenerować tutaj.", - "JSTrackingIntro2": "Kiedy już masz kod śledzenia JavaScript, skopiuj i wklej go na wszystkie strony, które chcesz śledzić w Matomo.", - "JSTrackingIntro3a": "Dla większości stron internetowych, blogów, CMS-ów itp. możesz użyć gotowego pluginu, który wykona za Ciebie pracę techniczną. (Zobacz naszą %1$slistę pluginów używanych do integracji Matomo%2$s.)", - "JSTrackingIntro4": "Jeśli nie chcesz używać JavaScript'u do śledzenia odwiedzających, %1$swygeneruj link śledzenia obrazkiem poniżej%2$s.", - "JSTrackingIntro5": "Jeśli chcesz zrobić więcej niż śledzić odwiedziny stron, sprawdz listę dostępnych funkcji w %1$sdokumentacji Matomo Śledzenie Javascript%2$s. Przy użyciu tych funkcji możesz śledzić cele, własne zmienne, zamówienia biznesowe i inne.", - "JSTracking_CampaignKwdParam": "Parametr Słowo Kluczowe kampanii", - "JSTracking_CampaignNameParam": "Parametr Nazwa kampanii", - "JSTracking_CrossDomain": "Domyślnie, ID użytkownika identyfikujące unikalnego odwiedzającego jest przechowywane w podstawowych ciasteczkach przeglądarki, które dostępne są jedynie w ramach stron w tej samej domenie. Włączenie linkowania między domenami pozwala Ci śledzić działania i otwarcia stron wybranego użytkownika podczas całej wizyty, nawet gdy dotyczy ona kilku domen. Za każdym razem, gdy użytkownik kliknie w link, który został skonfigurowany jako alias URL, do adresu URL zostanie dołączony parametr pk_vid przekazujący ID odwiedzającego.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "NOTKA: Aby korzystać z linkować między domenami, musisz podać co najmniej 2 domeny (URL'e) dla swojego serwisu.", - "JSTracking_CustomCampaignQueryParam": "Użyto niestandardowych nazw parametrów dla nazwy kampanii i słów kluczowych", - "JSTracking_CustomCampaignQueryParamDesc": "Ważne: %1$sMatomo automatycznie wykryje parametry Google Analystics.%2$s", - "JSTracking_DisableCookies": "Wyłącz wszystkie pliki cookie", - "JSTracking_DisableCookiesDesc": "Wyłącza wszystkie pliki cookie. Istniejące pliki cookie Matomo dla tej witryny zostaną usunięte po następnym odświeżeniu strony.", - "JSTracking_EnableCrossDomainLinking": "Włącza powiązania między domenowe", - "JSTracking_EnableDoNotTrack": "Włącz wykrywanie DoNotTrack u klienta", - "JSTracking_EnableDoNotTrackDesc": "Więc żądania śledzenia nie będą wysyłane jeżeli odwiedzający nie życzą sobie śledzenia.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "NOTKA: Serwerowa opcja DoNotTrack została aktywowana, ustawienie które edytujesz nie będzie brane pod uwagę.", - "JSTracking_EndNote": "Ważne: Możesz wygenerować spersonalizowany kod śledzący w sekcji %1$sKod śledzący%2$s w panelu administracyjnym.", - "JSTracking_GroupPageTitlesByDomain": "Dodaj domenę do tytułu strony gdy śledzisz", - "JSTracking_GroupPageTitlesByDomainDesc1": "Więc jeśli ktoś odwiedzi stronę 'O...' na blogu.%1$s zostanie to zapisane jako 'blog / O...'. Jest to najprostszy sposób uzyskania przeglądu ruchu względem sub-domen.", - "JSTracking_MergeAliases": "W raporcie \"Outlinks\", ukryj kliknięcia na znane aliasy adresów URL", - "JSTracking_MergeAliasesDesc": "Kliknięcie na linki do adresów URL (na przykład Alias.%s) nie będzie liczony jako \"Outlink\".", - "JSTracking_MergeSubdomains": "Śledź odwiedzających we wszystkich subdomenach", - "JSTracking_MergeSubdomainsDesc": "A więc jeśli odwiedzający odwiedza %1$s i %2$s, zostanie policzony jako unikalny odwiedzający.", - "JSTracking_PageCustomVars": "Śledź własną zmienną dla widoku każdej ze stron", - "JSTracking_PageCustomVarsDesc": "Dla przykładu, z nazwą zmiennej \"Kategoria\" i wartością \"Biała Księga\".", - "JSTracking_TrackNoScript": "Śledzenie użytkowników przy pomocy JavaScript wyłączone", - "JSTracking_VisitorCustomVars": "Śledź własne zmienne dla tego odwiedzającego", - "JSTracking_VisitorCustomVarsDesc": "Dla przykładu, ze nazwą zmiennej \"Typ\" i wartością \"Klient\".", - "JavaScriptTracking": "Śledzenie JavaScript", - "JsTrackingCodeMissingEmail1": "Kilka dni temu dodałeś stronę '%s' do twojego Matomo Analytics. Sprawdziliśmy i twoje Matomo nie odnotowało żadnego ruchu dla tej strony.", - "JsTrackingCodeMissingEmail3": "Aby znaleźć i dostosować swój kod śledzący, %1$s kliknij tutaj %2$s ( lub zapoznaj się z %3$s instrukcją JavaScript Tracking Client %4$s).", - "LearnMore": "Dowiedz się więcej", - "Login": "Login", - "LogoNotWriteableInstruction": "Aby użyć własnego logo zamiast domyślnego logo Matomo, nadaj temu katalogowi uprawnienia do zapisu: %1$s Matomo potrzebuje prawa do zapisu dla logo przechowywanego w plikach %2$s.", - "LogoUpload": "Wybierz logo", - "LogoUploadFailed": "Wgrany plik nie mógł zostać przetworzony. Proszę sprawdź poprawność formatu tego pliku.", - "LogoUploadHelp": "Prześlij plik w formatach %1$s i o minimalnej wysokości %2$s pikseli.", - "LtsReleases": "Wersje LTS (Wydłużone Wsparcie) otrzymują jedynie łatki bezpieczeństwa i błędów.", - "MenuDevelopment": "Rozwój", - "MenuDiagnostic": "Diagnostyka", - "MenuGeneralSettings": "Konfiguracja ogólna", - "MenuMeasurables": "Wartości mierzalne", - "MenuSystem": "System", - "MissingTrackingCodeEmailSubject": "Brak odnotowanego ruchu dla %s w Matomo Analytics, zacznij teraz", - "NTrackingFailures": "%s błędy śledzenia", - "NoKnownFailures": "Nieznane błędy śledzenia.", - "OptOutComplete": "Pełna dezaktywacja. Nie będziesz odnotowywany przez narzędzie statystyk i analityki.", - "OptOutCompleteBis": "Prosimy zauważyć, że jeśli usuniesz swoje pliki ciasteczek cookies, zostaną skasowane ciasteczka wyłączające śledzenie, lub jeśli zmienisz komputer czy przeglądarkę, będziesz musiał powtórzyć procedurę wyłączenia analizy statystycznej raz jeszcze.", - "OptOutDntFound": "Twoja aktywność nie jest śledzona, ponieważ Twoja przeglądarka zgłasza, że sobie tego nie życzysz. Jest to ustawienie Twojej przeglądarki, więc nie możesz wyrazić zgodny na śledzenie do momentu wyłączenia opcji \"Ochrona przed śledzeniem\".", - "OptOutExplanation": "Statystyki Matomo, możesz dodać następującą informację w kodzie HTML na jednej ze swoich stron, na przykład na stronie Polityka prywatności.", - "OptOutExplanationIntro": "Poniższy kod odpowiada za wyświetlenie iFrame zawierającego link pozwalający Twoim odwiedzającym zakazać śledzenia przez Matomo ich akcji na stronie, poprzez ustawienie ciasteczka opt-out. Zobacz poniżej (lub %1$skliknij tu%2$s) aby zapoznać się z treścią iFrame.", - "OptOutForYourVisitors": "Wyłączenie działania Matomo dla twoich odwiedzających", - "OptingYouOut": "Wypisuję Cię, proszę zaczekaj…", - "PersonalPluginSettings": "Osobiste ustawienia wtyczek", - "PiwikIsInstalledAt": "Matomo jest zainstalowane na", - "PluginSettingChangeNotAllowed": "Nie masz uprawnień do zmiany wartości parametru\"%1$s\" w pluginie \"%2$s\"", - "PluginSettingReadNotAllowed": "Nie masz uprawnień do odczytu wartości ustawienia \"%1$s\" w pluginie \"%2$s\"", - "PluginSettings": "Ustawienia wtyczek", - "PluginSettingsIntro": "Możesz tu zmienić ustawienia dla następujących pluginów innych autorów:", - "PluginSettingsSaveFailed": "Nie udało się zapisać ustawień wtyczki", - "PluginSettingsSaveSuccess": "Ustawienia wtyczki zaktualizowane.", - "PluginSettingsValueNotAllowed": "Wartość dla pola \"%1$s\" w pluginie \"%2$s\" jest niedozwolona", - "Problem": "Problem", - "ProtocolNotDetectedCorrectly": "Przeglądasz Matomo po stronie serwera wykrył jedynie połączenie niezabezpieczone.", - "ProtocolNotDetectedCorrectlySolution": "W celu upewnienia się, że Matomo w bezpieczny sposób pobiera i wysyła zawartość przez HTTPS, możesz edytować plik %1$s i wprowadzić dane dostępowe swojego proxy lub też dodać linię %2$s poniżej sekcji %3$s. %4$sDowiedz się więcej%5$s", - "ReleaseChannel": "Kanał aktualizacji", - "SecurityNotificationCheckTwoFactor": "Sprawdź swoją aplikację lub urządzenie do uwierzytelniania dwuskładnikowego.", - "SecurityNotificationIfItWasYou": "Jeśli to ty, kontynuuj. Jeżeli jednak nie rozpoznajesz tej aktywności, zresetuj swoje hasło.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Ktoś wygenerował nowe kody odzyskiwania dla uwierzytelniania dwuskładnikowego Twojego konta.", - "SecurityNotificationRecoveryCodesShowedBody": "Ktoś przeglądał kody odzyskiwania dla uwierzytelniania dwuskładnikowego Twojego konta.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Inny użytkownik (\"super-user\": %1$s) zmodyfikował ustawienia systemowe. Zmienione ustawienia: %2$s. Jeśli wiesz o tym działaniu, kontynuuj. Jeśli nie rozpoznajesz tego działania, skontaktuj się z innymi super-userami.", - "SecurityNotificationSettingsChangedByUserBody": "Ktoś zmienił ustawienia systemowe. Zmienione ustawienia: %s.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Ktoś dezaktywował uwierzytelnianie dwuskładnikowe na Twoim koncie.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Ktoś aktywował uwierzytelnianie dwuskładnikowe na Twoim koncie.", - "SecurityNotificationUserCreatedBody": "Ktoś dodał nowego użytkownika (login: %s) do Twojego konta.", - "SecurityNotificationUserDeletedBody": "Ktoś usunął użytkownika (login: %s) z Twojego konta.", - "SendPluginUpdateCommunication": "Wyślij e-mail, gdy pojawi się aktualizacja wtyczki", - "SendPluginUpdateCommunicationHelp": "Email zostanie wysłany do Super Użytkowników gdy pojawi się nowa wersja pluginu.", - "SettingsSaveSuccess": "Ustawienia zaktualizowane.", - "Solution": "Rozwiązanie", - "StableReleases": "Jeśli Matomo jest ważną częścią firmy , zalecamy użycie najnowszej stabilnej wersji. Jeśli używasz najnowszej wersji beta i znajdziesz błąd lub masz sugestię , prosimy %1$szobacz tutaj%2$s.", - "SystemPluginSettings": "Systemowe ustawienia wtyczek", - "TrackAGoal": "Śledź cel", - "TrackingCode": "Kod śledzenia", - "TrackingCodeIntro": "Matomo dostarcza szereg sposobów załączania kodu śledzącego dla Twojej strony, aplikacji mobilnej jak i dla dowolnego urządzenia lub aplikacji.", - "TrackingFailureAuthenticationProblem": "Żądanie nie zostało uwierzytelnione ale uwierzytelnianie jet wymagana.", - "TrackingFailureAuthenticationSolution": "Ustaw lub popraw \"token_auth\" w swoim śledzącym żądaniu.", - "TrackingFailureInvalidSiteProblem": "Strona nie istnieje.", - "TrackingFailureInvalidSiteSolution": "Zaktualizuj konfigurtacjię idSite w trackerze.", - "TrackingFailures": "Błędy śledzenia", - "TrackingFailuresEmail1": "To informacja, że w ostatnich dniach wystąpiło %s różnych rodzajów błędów śledzenia.", - "TrackingFailuresEmail2": "Aby wyświetlić wszystkie nieudane żądania śledzenia %1$s, kliknij tutaj %2$s.", - "TrackingFailuresEmailSubject": "Błędy śledzenia w twoim Matomo Analytics", - "TrackingFailuresIntroduction": "Strona zawiera listę błędów śledzenia, które zdarzyły się podczas ostatnich %s dni. Należy pamiętać, że są to najbardziej powszechne zarejestrowane rodzaje błędów śledzenia, a nie wszystkie z nich.", - "TrackingURL": "URL śledzenia", - "TrustedHostConfirm": "Czy na pewno chcesz zmienić zaufaną nazwę hosta Matomo?", - "TrustedHostSettings": "Zaufana nazwa hosta Matomo", - "UiDemo": "UI Demo", - "UncheckToOptOut": "Odznacz to pole aby wyłączyć analizę.", - "UpdateSettings": "Zaktualizuj ustawienia", - "UseCustomLogo": "Użyj niestandardowego logo", - "ValidPiwikHostname": "Prawidłowa nazwa hosta Matomo", - "ViewAllTrackingFailures": "Zobacz wszystkie błędy śledzenia", - "WhatIsNew": "Nowości", - "WhatIsNewNoChanges": "Brak nowych informacji na chwilę obecną", - "WhatIsNewNoChangesTitle": "Brak nowych zmian", - "WhatIsNewRemindMeLater": "Przypomnij mi później", - "WhatIsNewTitle": "Co nowego w Matomo", - "WhatIsNewTooltip": "Dowiedz się, co nowego w Matomo", - "WithOptionalRevenue": "z opcjonalnym zyskiem", - "YouAreNotOptedOut": "Nie wycofano zgody.", - "YouAreOptedOut": "Wykluczono Cię z procesu analityki statystycznej", - "YouMayOptOut": "Możesz wybrać, by nie otrzymywać unikalnego numeru identyfikacyjnego w ciasteczku cookie, przypisanego tylko do Twojego komputera, celem uniknięcia gromadzenia i statystycznej analizy danych na tej stronie.", - "YouMayOptOut2": "Możesz uniemożliwić tej stronie agregowanie i analizowanie działań, które tu podejmujesz.", - "YouMayOptOut3": "Takie postępowanie ochroni twoją prywatność, ale uniemożliwi właścicielowi naukę na podstawie twoich działań i poprawienie jakości dla ciebie i innych użytkowników.", - "YouMayOptOutBis": "Aby dokonać tego wyboru, prosimy kliknąć poniżej by uzyskać ciasteczko cookie wyłączające analitykę statystyczną." - } -} diff --git a/plugins/CoreAdminHome/lang/pt-br.json b/plugins/CoreAdminHome/lang/pt-br.json deleted file mode 100644 index 2d20cec9bff73f7db65373ec0e8a7a745f047d28..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/pt-br.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Aceitar convite", - "AddNewTrustedHost": "Adicionar um novo host confiável", - "Administration": "Administração", - "ArchivingSettings": "Configurações de arquivamento", - "BrandingSettings": "Configurações da identidade visual", - "BruteForce": "Força bruta", - "CheckToOptIn": "Marque esta caixa para ativar.", - "ClickHereToOptIn": "Clique aqui para aceitar.", - "ClickHereToOptOut": "Clique aqui para optar por sair.", - "CloudflareDescription": "Se o seu site estiver hospedado na Cloudflare, consulte %1$seste guia%2$s.", - "ConfirmDeleteAllTrackingFailures": "Você tem certeza que deseja remover todas as falhas de rastreamento?", - "ConfirmDeleteThisTrackingFailure": "Você tem certeza que deseja remover esta falha de rastreamento?", - "Cors": "CORS", - "CorsDomains": "Domínio de Compartilhamento de Recursos de Origens Cruzadas (CORS)", - "CorsDomainsHelp": "Você pode definir domínios ou subdomínios como http://example.com ou http://stats.example.com. Ou para permitir solicitações entre domínios de todos os domínios, basta adicionar um *", - "CustomLogoFeedbackInfo": "Se você personalizar o logotipo Matomo, você também pode estar interessado em esconder a ligação %1$s no menu superior. Para fazer isso, você pode desabilitar o plug-in Comentários na página de Plugins %2$sManage%3$s.", - "CustomLogoHelpText": "Você pode personalizar o logo que o Matomo exibe na interface do sistema e nos relatórios enviados por e-mail.", - "DeclineInvite": "Recusar convite", - "DeleteAllFailures": "Excluir todas as falhas", - "DevelopmentProcess": "Embora nosso processo de desenvolvimento inclua milhares de testes automatizados, os Beta Testers desempenham um papel fundamental na obtenção da \"Política de ausência de bugs\" no Matomo.", - "EmailServerSettings": "Configurações do servidor de e-mail", - "ErrorEmailFromAddressNotValid": "O endereço SMTP`do remetente não é válido", - "FaviconUpload": "Selecione um Favicon para carregar", - "FileUploadDisabled": "O carregamento de arquivos não está habilitado na sua configuração do PHP. Para carregar uma logomarca customizada defina %s no php.ini e reinicie seu servidor web.", - "ForBetaTestersOnly": "Somente para testadores beta", - "GoogleTagManagerDescription": "Se o seu site estiver usando o Gerenciador de tags do Google, consulte %1$seste guia%2$s.", - "HideAdvancedOptions": "Ocultar opções avançadas", - "HowToGetHelp": "Existem diferentes maneiras de obter ajuda. Existe suporte gratuito através da Comunidade Matomo e suporte pago fornecido pela equipe Matomo e parceiros do Matomo. Ou talvez você tenha um bug para relatar ou queira sugerir um novo recurso?", - "HttpTrackingApi": "API de Rastreamento HTTP", - "HttpTrackingApiDescription": "A %1$sAPI de Rastreamento HTTP%2$s permite rastrear qualquer coisa. Isso pode ser útil se você esta usando uma linguagem de programação para a qual ainda não existe SDK. Também pode ser útil quando você deseja rastrear dispositivos ou aplicativos de uma maneira especial.", - "ImageTracking": "Rastreamento por imagem", - "ImageTrackingIntro1": "Quando um visitante tem o JavaScript desactivado, ou quando o JavaScript não pode ser usado, você pode usar um link de rastreamento de imagem para acompanhar os visitantes.", - "ImageTrackingIntro2": "Gerar o link abaixo, copiar e colar o código HTML gerado na página. Se você está usando isso como uma alternativa para controle de JavaScript, você pode inclui-lo na tag %1$s.", - "ImageTrackingIntro3": "Para a lista completa de opções que você pode usar com um link de monitoramento de imagem, consulte a %1$sDocumentação da API%2$s.", - "ImageTrackingLink": "Link de rastreamento por imagem", - "ImportFromGoogleAnalytics": "Importar do Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Se você tem uma propriedade Google Analytics e está trocando para o Matomo, você pode importar seus dados atuais usando o plugin %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Uma alternativa para o monitoramento de visitantes através do browser (via JavaScript ou um link de imagem) é continuamente importar logs do servidor. Saiba mais sobre em %1$sAnalisador de Logs do Servidor%2$s.", - "InvalidPluginsAdminDisabled": "Para atualizar ou desinstalar esses plugins, entre em contato com o administrador do Matomo, que poderá usar a linha de comando ou atualizar a configuração diretamente.", - "InvalidPluginsWarning": "Os seguintes plugins não são compatíveis com %1$s e não pôde ser carregado: %2$s.", - "InvalidPluginsYouCanUninstall": "Você pode atualizar ou desinstalar estes plugins na página %1$sGerenciar plugins%2$s.", - "InvalidSiteUrlError": "Este URL não é válido. O conteúdo pode ter sido movido, excluído ou não está mais disponível (o ID do site foi definido como '%s' no URL).", - "InvalidSiteUrlErrorHelp": "Por favor, volte à página anterior ou retorne ao seu painel de controle para selecionar um site.", - "JSTrackingDocumentationHelp": "Para facilitar o acesso, as opções avançadas mais populares estão disponíveis abaixo. Para ainda mais opções (incluindo como rastrear metas, variáveis personalizadas, pedidos de comércio eletrônico e carrinhos abandonados), confira a documentação %1$sMatomo Javascript Tracking%2$s.", - "JSTrackingIntro1": "Você pode acompanhar os visitantes do seu site de várias maneiras diferentes. A maneira recomendada de fazer isso é através do JavaScript. Para usar este método, você deve certificar-se de que toda página do seu site tenha algum código JavaScript, que você pode gerar aqui.", - "JSTrackingIntro2": "Depois de obter o código de rastreamento JavaScript para o seu site, copie e cole em todas as páginas que você deseja acompanhar com Matomo.", - "JSTrackingIntro3a": "Na maioria dos sites, blogs, CMS, etc, você pode usar um plugin pré-fabricado para fazer o trabalho técnico para vocẽ. (Veja nossa %1$slista de plugins para integrar o Matomo%2$s.)", - "JSTrackingIntro3b": "Se nenhum plugin existir, você pode editar os modelos de seu site e adicionar o código de acompanhamento JavaScript à tag </head> que geralmente é definida em um 'header.php', 'header.tpl' ou arquivo de modelo similar.", - "JSTrackingIntro4": "Se você não quiser usar JavaScript para monitorar visitantes, %1$sgere abaixo, um link para rastreamento por imagem%2$s.", - "JSTrackingIntro5": "Se você quiser fazer mais do que rastrear visualizações de página, verifique a documentação %1$sMatomo Javascript Tracking%2$s para obter a lista de funções disponíveis. Usando essas funções, você pode rastrear metas, variáveis personalizadas, pedidos de comércio eletrônico, carrinhos abandonados e muito mais.", - "JSTracking_CampaignKwdParam": "Parâmetro de Palavra-Chave da campanha", - "JSTracking_CampaignNameParam": "Parâmetro Nome da Campanha", - "JSTracking_CodeNoteBeforeClosingHead": "Clique no botão para copiar o trecho de código e cole-o imediatamente antes da tag %1$s de fechamento (recomendado)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Certifique-se de que este código esteja dentro de um elemento script em todas as páginas do seu site. Recomendamos colá-lo imediatamente antes da tag head de fechamento.", - "JSTracking_ConsentManagerConnected": "%1$s parece já estar configurado para funcionar com o Matomo.", - "JSTracking_ConsentManagerDetected": "O gerenciador de consentimento de %1$s foi detectado no seu site. Para saber como configurar o Matomo para funcionar com %1$s favor visite %2$s", - "JSTracking_ConsentManagerEmailNote": "Ou você pode incorporar diretamente o código de rastreamento em seu site:", - "JSTracking_CrossDomain": "Por padrão, o ID do visitante que identifica um visitante único é armazenado nos cookies primários do navegador, que só podem ser acessados por páginas no mesmo domínio. A ativação da vinculação entre domínios permite acompanhar todas as ações e exibições de páginas de um visitante específico na mesma visita, mesmo quando elas visualizam páginas em vários domínios. Sempre que um usuário clicar em um link para uma das URLs de alias do seu website, ele adicionará um parâmetro de URL pk_id encaminhando o ID do visitante.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Nota: Para usar a vinculação entre domínios, você deve especificar mais de um nome de domínio (URLs) para o seu site.", - "JSTracking_CustomCampaignQueryParam": "Use nomes de parâmetros de consulta personalizados para o nome e a palavra-chave da campanha", - "JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sMatomo irá detectar automaticamente os parâmetros do Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Desativar rastreamento de parâmetros de campanha", - "JSTracking_DisableCampaignParametersDesc": "Quando esta opção estiver marcada, o Matomo não rastreará os parâmetros da campanha e eles serão removidos das URLs rastreadas.", - "JSTracking_DisableCookies": "Desabilitar todos os cookies de rastreamento", - "JSTracking_DisableCookiesDesc": "Desativa todos os cookies primários. Os cookies Matomo existentes para este site serão excluídos na próxima visualização de página.", - "JSTracking_EnableCrossDomainLinking": "Ativa a vinculação entre domínios", - "JSTracking_EnableDoNotTrack": "Ativar o não-monitoramento no lado do cliente", - "JSTracking_EnableDoNotTrackDesc": "Assim, os pedidos de rastreamento não será enviada se os visitantes não deseja ser rastreado.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nota: O não-monitoramento no lado do servidor foi ativado, por isso esta opção não terá nenhum efeito.", - "JSTracking_EndNote": "Nota: Você pode gerar um código de rastreamento personalizado nas configurações de %1$sCódigo de rastreamento %2$s.", - "JSTracking_GroupPageTitlesByDomain": "Prefixar o domínio do site para o título da página ao rastrear", - "JSTracking_GroupPageTitlesByDomainDesc1": "Então, se alguém visita o 'Sobre' na página do blog. %1$s será registrado como 'blog/Sobre'. Esta é a maneira mais fácil de obter uma visão geral do seu tráfego por sub-domínio.", - "JSTracking_MergeAliases": "No relatório \"Outlinks\", esconder clicks para reconhecidos apelidos de URLs de", - "JSTracking_MergeAliasesDesc": "Portanto, cliques em links de Apelidos de URLs (eg. %s) não serão contabilizados como \"Outlink\".", - "JSTracking_MergeSubdomains": "Acompanhar os visitantes em todos os subdomínios de", - "JSTracking_MergeSubdomainsDesc": "Portanto se um visitante acessar %1$s e %2$s, ele será contado como visitante único.", - "JSTracking_PageCustomVars": "Setar uma variável personalizada para cada exibição de página", - "JSTracking_PageCustomVarsDesc": "Por exemplo, com variável de nome \"Categoria\" e valor \"White Papers\".", - "JSTracking_TrackNoScript": "Rastreia usuários com JavaScript desabilitado", - "JSTracking_VisitorCustomVars": "Setar variáveis personalizadas para este visitante", - "JSTracking_VisitorCustomVarsDesc": "Por exemplo, com nome da variável \"Tipo\" e valor \"Cliente\".", - "JavaScriptCode": "Código JavaScript", - "JavaScriptTracking": "Rastreamento JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Opcional: use as opções avançadas para personalizar seu código de rastreamento.", - "JsTrackingCodeMissingEmail1": "Alguns dias atrás você adicionou o website '%s' no seu Matomo Analytics. Nós acabamos de verificar e seu Matomo parece não possuir qualquer tráfego registrado para esse website.", - "JsTrackingCodeMissingEmail2": "Para começar a rastrear dados e obter insights sobre seus usuários, você precisa configurar o acompanhamento em seu site ou aplicativo para dispositivos móveis. Para sites, basta incorporar o código de acompanhamento antes da tag %s.", - "JsTrackingCodeMissingEmail3": "Para encontrar e personalizar seu código de rastreamento, %1$s clicar aqui %2$s (ou dê uma olhada no %3$s guia de Rastreamento JavaScript do Cliente %4$s).", - "LearnMore": "Saber mais", - "Login": "login", - "LogoNotWriteableInstruction": "Para usar seu logotipo personalizado em vez do logotipo padrão do Matomo, conceda permissão de gravação a este diretório: %1$s O Matomo precisa de permissão para gravação dos seus logotipos armazenados %2$s.", - "LogoUpload": "Selecione um logotipo para carregar", - "LogoUploadFailed": "O arquivo enviado não pôde ser processado. Por favor, verifique se o arquivo tem um formato válido.", - "LogoUploadHelp": "Por favor faça o upload de um arquivo nos formatos %1$s com uma altura mínima de %2$s pixels.", - "LtsReleases": "As versões LTS (Long Term Support - Suporte de Longo Prazo) recebe apenas correções de bugs e segurança.", - "MenuDevelopment": "Desenvolvimento", - "MenuDiagnostic": "Diagnostico", - "MenuGeneralSettings": "Configurações Gerais", - "MenuMeasurables": "Mensuráveis", - "MenuSystem": "Sistema", - "MissingTrackingCodeEmailSubject": "Sem tráfego para %s gravado no Matomo Analytics, comece agora", - "NTrackingFailures": "%s falhas de rastreamento", - "NeedHelp": "Preciso de ajuda?", - "NoKnownFailures": "Não há falhas de rastreamento conhecidas.", - "OptOutComplete": "Opt-out completo; suas visitas a este site não vai ser gravado pela ferramenta de Web Analytics.", - "OptOutCompleteBis": "Note que se você limpar os cookies, excluir o cookie de opt-out, ou se mudar de computador ou navegadores da Web, você vai precisar realizar o procedimento opt-out novamente.", - "OptOutCustomOptOutLink": "Você também pode criar um formulário de desativação totalmente personalizado usando HTML e JavaScript, conforme explicado neste %1$sguia%2$s do desenvolvedor.", - "OptOutDntFound": "Você não está sendo monitorado desde que o seu navegador está informando que você não quer isso. Essa é uma configuração do seu navegador portanto você não será capaz de aceitar ser rastreado até que você desative o recurso \"Do Not Track\".", - "OptOutErrorNoCookies": "A funcionalidade de optar por não ser rastreado requer que os cookies estejam habilitados.", - "OptOutErrorNoTracker": "O recurso de desativação de rastreamento não conseguiu encontrar o código Matomo Tracker nesta página", - "OptOutErrorNotHttps": "A funcionalidade de optar por não ser rastreado pode não funcionar pois este site não foi carregado usando HTTPS. Por favor, recarregue a página para verificar se o status na opção de não ser rastreado foi alterado.", - "OptOutErrorWindowOpen": "O recurso de desativação de rastreamento pode não funcionar porque parece que o pop-up de desativação foi bloqueado. Recarregue a página para verificar se o status de desativação foi alterado.", - "OptOutExplanation": "Matomo é dedicado a fornecer a privacidade na Internet. Para fornecer a seus visitantes a escolha de opting-out de Matomo Web Analytics, você pode adicionar o seguinte código HTML em uma página do seu site, por exemplo, em uma página de Política de Privacidade.", - "OptOutExplanationIntro": "Este código exibirá um div contendo um link para que seus visitantes desativem o Matomo definindo um cookie de desativação em seus navegadores da web. Veja abaixo (ou %1$sclique aqui%2$s) para visualizar o conteúdo que será exibido pela div.", - "OptOutForYourVisitors": "Matomo opt-out para os seus visitantes", - "OptingYouOut": "Optando por sair, por favor, aguarde…", - "PersonalPluginSettings": "Configurações pessoais do plugin", - "PiwikIsInstalledAt": "Matomo esta instalado no", - "PluginSettingChangeNotAllowed": "Você não tem permissão para alterar o valor da configuração \"%1$s\" no plug-in \"%2$s\"", - "PluginSettingReadNotAllowed": "Você não tem permissão para ler o valor da configuração \"%1$s\" no plug-in \"%2$s\"", - "PluginSettings": "Configurações do plugin", - "PluginSettingsIntro": "Aqui você pode alterar as configurações dos seguintes plugins de terceiros:", - "PluginSettingsSaveFailed": "Não foi possível salvar as configurações do plugin", - "PluginSettingsSaveSuccess": "Configurações do plugin atualizadas.", - "PluginSettingsValueNotAllowed": "O valor para o campo \"%1$s\" no plugin \"%2$s\" não é permitido", - "Problem": "Problema", - "ProtocolNotDetectedCorrectly": "Você está visualizando o Matomo em uma conexão SSL segura (usando HTTPS), mas o Matomo só pode detectar uma conexão não segura no servidor.", - "ProtocolNotDetectedCorrectlySolution": "Para certificar-se que o Matomo solicita e serve o seu conteúdo de forma segura através de HTTPS, você pode editar o seu %1$s arquivo, assim como configurar o proxy, ou você pode adicionar a linha %2$s abaixo da %3$s seção. %4$sSaiba mais%5$s", - "ReactDescription": "Se o seu site estiver usando React, consulte %1$seste guia%2$s.", - "ReleaseChannel": "Canal de liberação", - "SecurityNotificationAllTokenAuthDeletedBody": "Alguém excluiu todos os tokens de autenticação da sua conta.", - "SecurityNotificationAnonymousAccessEnabledBody": "Alguém ativou o acesso de usuário anônimo para %1$s. Isso significa que os dados deste site agora estão acessíveis ao público. Se estiver tudo bem, sinta-se à vontade para ignorar este e-mail.", - "SecurityNotificationCheckTwoFactor": "Verifique seu aplicativo ou dispositivo de autenticação de dois fatores.", - "SecurityNotificationEmailSubject": "Notificação de segurança", - "SecurityNotificationIfItWasYou": "Se foi você, continue. Se você não reconhece esta atividade, redefina sua senha.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Alguém gerou novos códigos de recuperação de autenticação de dois fatores para sua conta.", - "SecurityNotificationRecoveryCodesShowedBody": "Alguém visualizou os códigos de recuperação de autenticação de dois fatores da sua conta.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Outro superusuário (%1$s) modificou as configurações do sistema. Configurações afetadas: %2$s. Se você conhece esta atividade, continue. Se você não reconhece esta atividade, entre em contato com os outros superusuários.", - "SecurityNotificationSettingsChangedByUserBody": "Alguém modificou as configurações do sistema. Configurações afetadas: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Alguém criou um token de autenticação (descrição: %s) em sua conta. Se não foi você, exclua o token.", - "SecurityNotificationTokenAuthDeletedBody": "Alguém excluiu um token de autenticação (descrição: %s) em sua conta.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Alguém desabilitou a autenticação de dois fatores em sua conta.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Alguém habilitou a autenticação de dois fatores em sua conta.", - "SecurityNotificationUserAcceptInviteBody": "Usuário (login: %s) aceitou o convite.", - "SecurityNotificationUserCreatedBody": "Alguém criou um novo usuário (login: %s) em sua conta.", - "SecurityNotificationUserDeclinedInviteBody": "Usuário (login: %s) recusou o convite.", - "SecurityNotificationUserDeletedBody": "Alguém excluiu um usuário (login: %s) da sua conta.", - "SendPluginUpdateCommunication": "Envie um e-mail quando uma atualização de plugin estiver disponível", - "SendPluginUpdateCommunicationHelp": "Um e-mail será enviado para os Super Usuários quando houver uma nova versão disponível para um plugin.", - "SettingsSaveSuccess": "Configurações atualizadas.", - "ShowAdvancedOptions": "Mostrar opções avançadas", - "SinglePageApplicationDescription": "Se você estiver acompanhando um aplicativo de página única (SPA) ou aplicativo da Web progressivo (PWA), consulte %1$seste guia%2$s.", - "Solution": "Solução", - "StableReleases": "Se o Matomo é uma parte crítica do seu negócio, recomendamos que você use a última versão estável. Se você usar a versão beta mais recente e encontrar uma falha ou tiver alguma sugestão, por favor, %1$sveja aqui%2$s.", - "SystemPluginSettings": "Configurações de Plugin do Sistema", - "TrackAGoal": "Monitorar uma meta", - "TrackingCode": "Código de rastreamento", - "TrackingCodeIntro": "Matomo oferece várias maneiras de incorporar o código de rastreamento ao seu site, aplicativos móveis e até mesmo a qualquer dispositivo ou aplicativo.", - "TrackingFailureAuthenticationProblem": "A solicitação não foi autenticada, mas a autenticação foi necessária.", - "TrackingFailureAuthenticationSolution": "Defina ou corrija um \"token_auth\" na sua solicitação de rastreamento.", - "TrackingFailureInvalidSiteProblem": "Este site não existe.", - "TrackingFailureInvalidSiteSolution": "Atualize o idSite configurado no rastreador.", - "TrackingFailures": "Falha de rastreamento", - "TrackingFailuresEmail1": "Isso é apenas para informá-lo que %s diferentes tipos de falhas de rastreamento ocorreram nos últimos dias.", - "TrackingFailuresEmail2": "Para ver todas as solicitações de rastreamento com falhas %1$sclicar aqui%2$s.", - "TrackingFailuresEmailSubject": "Falhas de rastreamento no seu Matomo Analytics", - "TrackingFailuresIntroduction": "Esta página lista as falhas de rastreamento que ocorreram nos últimos %s dias. Observe que apenas os tipos mais comuns de falhas de rastreamento são registradas e nem todas elas.", - "TrackingURL": "URL de rastreamento", - "TrustedHostConfirm": "Tem certeza de que deseja alterar o hostname confiável Matomo?", - "TrustedHostSettings": "Hostname Matomo confiável", - "TwoFactorAuth": "Autenticação de dois fatores", - "UiDemo": "Demonstração UI", - "UncheckToOptOut": "Desmarque esta caixa para sair.", - "UpdateSettings": "Configurações de atualização", - "UseCustomLogo": "Usar logomarca personalizada", - "UserInviteContent": "Você pode aceitar este convite clicando no botão aceitar abaixo.", - "UserInviteNotes": "Se você não esperava este convite, ignore este e-mail. Se %1$s estiver lhe enviando muitos e-mails, você poderá bloqueá-los ou denunciar abuso. O convite expira automaticamente em %2$s dias.", - "UserInviteSubject": "%1$s enviou-lhe um convite para entrar no Matomo Analytics por %2$s.", - "ValidPiwikHostname": "Hostname Matomo válido", - "ViewAllTrackingFailures": "Ver todas as falhas de rastreamento", - "VueDescription": "Se o seu site estiver usando Vue.js, consulte %1$seste guia%2$s.", - "WhatIsNew": "O que há de novo", - "WhatIsNewDoNotShowAgain": "Não mostre novamente", - "WhatIsNewNoChanges": "Não há nada de novo no momento", - "WhatIsNewNoChangesTitle": "Sem alterações recentes", - "WhatIsNewRemindMeLater": "Lembre-me mais tarde", - "WhatIsNewTitle": "Aqui está o que há de novo em Matomo", - "WhatIsNewTooltip": "Aprenda o que há de novo em Matomo", - "WithOptionalRevenue": "com rendimento opcional", - "WordpressDescription": "Se o seu site estiver usando Wordpress, consulte %1$seste guia%2$s.", - "YouAreNotOptedOut": "Você não optou por sair.", - "YouAreOptedOut": "Você optou por sair.", - "YouMayOptOut": "Você pode optar por não ter um único número de identificação web analytics de cookie atribuído ao seu computador para evitar a agregação e análise dos dados coletados neste site.", - "YouMayOptOut2": "Você pode impedir que este website agregue e analise as ações realizadas aqui.", - "YouMayOptOut3": "Fazer isso protegerá sua privacidade, mas também impedirá que o proprietário aprenda com suas ações e crie uma experiência melhor para você e outros usuários.", - "YouMayOptOutBis": "Para fazer essa escolha, clique abaixo para receber um cookie de opt-out." - } -} diff --git a/plugins/CoreAdminHome/lang/pt.json b/plugins/CoreAdminHome/lang/pt.json deleted file mode 100644 index 9263d8b98bc527d8dfb649445efb78e921aef613..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/pt.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Aceitar convite", - "AddNewTrustedHost": "Adicionar um novo servidor confiável", - "Administration": "Administração", - "ArchivingSettings": "Definições de arquivo", - "BrandingSettings": "Definições de marca", - "BruteForce": "Força bruta", - "CheckToOptIn": "Marque esta caixa para participar.", - "ClickHereToOptIn": "Clique aqui para subscrever.", - "ClickHereToOptOut": "Clique aqui para cancelar subscrição.", - "CloudflareDescription": "Se o seu site estiver hospedado na Cloudflare, consulte %1$seste guia%2$s.", - "ConfirmDeleteAllTrackingFailures": "Tem a certeza que deseja eliminar todas as falhas de acompanhamento?", - "ConfirmDeleteThisTrackingFailure": "Tem a certeza que deseja eliminar esta falha de acompanhamento?", - "Cors": "CORS", - "CorsDomains": "Domínios Cross-Origin Resource Sharing (CORS)", - "CorsDomainsHelp": "Pode definir domínios ou subdomínios como like http://example.com ou http://stats.example.com. Ou para permitir pedidos transversais a domínios para todos os domínios, simplesmente adicione um *", - "CustomLogoFeedbackInfo": "Se personalizar o logótipo do Matomo, pode também ter interesse em ocultar a hiperligação %1$s no menu de topo. Para o fazer, pode desativar a extensão de «Opinião» na página de %2$sGerir Extensões%3$s.", - "CustomLogoHelpText": "Pode personalizar o logótipo do Matomo que será apresentado na interface do utilizador e relatórios de e-mail.", - "DeclineInvite": "Recusar convite", - "DeleteAllFailures": "Eliminar todas as falhas", - "DevelopmentProcess": "Apesar do nosso processo de desenvolvimento incluir milhares de testes automáticos, os utilizadores de versões beta desempenham um papel essencial na \"Política sem erros\" do Matomo.", - "EmailServerSettings": "Definições do servidor de email", - "ErrorEmailFromAddressNotValid": "O endereço a partir do SMTP não é válido", - "FaviconUpload": "Selecione um Favicon para enviar", - "FileUploadDisabled": "O envio de ficheiros não está ativo na sua configuração PHP. Para carregar o seu logótipo personalizado, por favor, defina %s no php.ini e reinicie o seu servidor web.", - "ForBetaTestersOnly": "Apenas para avaliadores de versões beta", - "GoogleTagManagerDescription": "Se o seu site estiver usando o Gerenciador de tags do Google, consulte %1$seste guia%2$s.", - "HideAdvancedOptions": "Ocultar opções avançadas", - "HowToGetHelp": "Existem diferentes maneiras de obter ajuda. Há o suporte gratuito por meio da Comunidade Matomo e o suporte pago fornecido pela equipe do Matomo e parceiros. Ou talvez você tenha um bug para relatar ou queira sugerir um novo recurso?", - "HttpTrackingApi": "API HTTP de acompanhamento", - "HttpTrackingApiDescription": "A %1$sAPI HTTP de rastreametno%2$s permite-lhe monitorar tudo. Isto pode ser útil se você está utilizando uma linguagem de desenvolvimento para a qual ainda não existe SDK. Pode também ser útil quando pretende monitorar dispositivos ou aplicações de uma forma específica.", - "ImageTracking": "Acompanhamento por imagem", - "ImageTrackingIntro1": "Quando um visitante desativou o JavaScript ou quando o JavaScript não possa ser utilizado, pode utilizar uma ligação de imagem de acompanhamento para monitorizar os visitantes.", - "ImageTrackingIntro2": "Construa a ligação abaixo e copie o código HTML gerado para a página. Se estiver a utilizar isto como uma alternativa para o acompanhamento por JavaScript, pode englobá-lo em tags %1$s.", - "ImageTrackingIntro3": "Para a lista completa de opções que pode utilizar com uma hiperligação de monitorização de imagem, consulte a %1$sDocumentação da API de Monitorização%2$s.", - "ImageTrackingLink": "Hiperligação de Monitorização de Imagem", - "ImportFromGoogleAnalytics": "Importar do Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Se está a utilizar uma propriedade do Google Analytics e está a mudar para o Matomo, pode importar os dados existentes utilizando a extensão %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Uma alternativa para monitorizar os visitantes através do navegador (seja via JavaScript ou de uma hiperligação de imagem) é através da importação contínua dos registos do servidor. Saiba mais sobre a %1$sAnalítica de Ficheiros de Registo do Servidor%2$s.", - "InvalidPluginsWarning": "As seguintes extensões não são compatíveis com %1$s e não puderam ser carregadas: %2$s.", - "InvalidPluginsYouCanUninstall": "Pode atualizar ou desinstalar estas extensões na página de %1$sGerir Extensões%2$s.", - "JSTrackingDocumentationHelp": "Para facilitar o acesso, as opções avançadas mais populares estão disponíveis abaixo. Para obter ainda mais opções (incluindo como rastrear metas, variáveis personalizadas, pedidos de comércio eletrônico e carrinhos abandonados), confira a documentação do %1$sMatomo Javascript Tracking %2$s.", - "JSTrackingIntro1": "Pode monitorizar os visitantes do seu site de diversas formas. A forma recomendada é através de JavaScript. Para utilizar este método, deve garantir que todas as páginas web do seu site contêm um código JavaScript, o qual pode ser gerado aqui.", - "JSTrackingIntro2": "Assim que tiver o código de monitorização JavaScript para o seu site, copie-o e cole-o em todas as páginas que pretende monitorizar com o Matomo.", - "JSTrackingIntro3a": "Na maioria dos sites, blogues, sistemas de gestão de conteúdos, etc. pode utilizar uma extensão existente que faça o trabalho técnico por si. (Consulte a nossa %1$slista de extensões utilizadas para integrar o Matomo %2$s.)", - "JSTrackingIntro3b": "Se não existir nenhuma extensão, pode editar os modelos do seu site e adicionar o código JavaScript de acompanhamento à tag </head> habitualmente definida num ficheiro 'header.php', 'header.tpl' ou num ficheiro de modelo semelhante.", - "JSTrackingIntro4": "Se não quiser utilizar o JavaScript para monitorizar os visitantes, %1$sgira em baixo uma hiperligação de monitorização de imagem %2$s.", - "JSTrackingIntro5": "Se quiser fazer mais do que acompanhar as visualizações de páginas, por favor consulte a %1$sdocumentação de JavaScript de acompanhamento do Matomo%2$s para uma lista de funções disponíveis. Pode utilizar estas funções para acompanhar objetivos, variáveis personalizadas, pedidos de comércio eletrónico, carrinhos de compras abandonados, entre outros.", - "JSTracking_CampaignKwdParam": "Parâmetro da Palavra-chave da Campanha", - "JSTracking_CampaignNameParam": "Parâmetro do Nome da campanha", - "JSTracking_CodeNoteBeforeClosingHead": "Clique no botão para copiar o trecho de código e colá-lo imediatamente antes da tag de fechamento %1$s (recomendado)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Certifique-se que este código é incorporado dentro de um elemento script em todas as páginas do seu site. Nós recomendamos que insira imediatamente antes do tag de fecho head.", - "JSTracking_ConsentManagerConnected": "%1$s parece já estar configurado para funcionar com o Matomo.", - "JSTracking_ConsentManagerDetected": "O gerente de consentimento de %1$s foi detectado no seu site. Para saber como configurar o Matomo para funcionar com %1$s favor visite %2$s", - "JSTracking_ConsentManagerEmailNote": "Ou você pode incorporar diretamente o código de rastreamento em seu site:", - "JSTracking_CrossDomain": "Por omissão, o ID do visitante que identifica um visitante único é armazenado nas cookies de primeiro nível do navegador que só podem ser acedidos por páginas do mesmo domínio. A ativação de ligações transversais entre domínios permite-lhe acompanhar as ações e visualizações de páginas de um visitante específico na mesma visita mesmo quando estes visualizam páginas de vários domínios. Sempre que um utilizador clica numa ligação para um dos pseudónimos dos seus sites, será adicionado um parâmetro pk_vid ao endereço encaminhando o ID do visitante.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Nota: Para utilizar ligações transversais entre domínios, deve especificar mais do que um domínio (endereço) para o seu site.", - "JSTracking_CustomCampaignQueryParam": "Use nomes de parâmetros de consulta personalizados para o nome e a palavra-chave da campanha", - "JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sO Matomo irá detetar automaticamente parâmetros do Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Desativar rastreamento de parâmetros de campanha", - "JSTracking_DisableCampaignParametersDesc": "Quando esta opção for habilitada, Matomo não rastreará os parâmetros da campanha e eles serão removidos das URLs rastreadas.", - "JSTracking_DisableCookies": "Desativar todos os cookies de monitorização", - "JSTracking_DisableCookiesDesc": "Desativa todos os cookies de primeiro nível. Os cookies do Matomo existentes para este site serão eliminados na próxima visualização da página.", - "JSTracking_EnableCrossDomainLinking": "Ativa as ligações transversais entre domínios", - "JSTracking_EnableDoNotTrack": "Ativar deteção de «Não Monitorizar» no lado do cliente", - "JSTracking_EnableDoNotTrackDesc": "Assim os pedidos de monitorização não serão enviados se os visitantes não quiserem ser monitorizados.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nota: o suporte de «Não Monitorizar» foi ativado no lado do cliente, e assim esta opção não terá qualquer efeito.", - "JSTracking_EndNote": "Nota: Pode gerar um código de acompanhamento específico na secção administrativa %1$sCódigo de acompanhamento%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Adicionar o domínio do site ao título da página no acompanhamento", - "JSTracking_GroupPageTitlesByDomainDesc1": "Assim se alguém visita a página 'Sobre' no blogue.%1$s isto será guardado como 'blogue / Sobre'. Esta é a forma mais fácil de ter um resumo do seu tráfego por subdomínio.", - "JSTracking_MergeAliases": "No relatório \"Hiperligações de Saída\", ocultar cliques nos URLs alternativos conhecidos para", - "JSTracking_MergeAliasesDesc": "Assim os cliques ans hiperligações para os «URLs Alternativos» (por exemplo, %s) não serão contados como \"Hiperligações de Saída\".", - "JSTracking_MergeSubdomains": "Monitorizar visitantes através de todos os subdomínios de", - "JSTracking_MergeSubdomainsDesc": "Assim se um visitante visita %1$s e %2$s, eles serão contados como um único visitante.", - "JSTracking_PageCustomVars": "Monitorizar uma variável personalizada para cada visualização de página", - "JSTracking_PageCustomVarsDesc": "Por exemplo, com o nome de variável \"Categoria\" e o valor \"Artigos\".", - "JSTracking_TrackNoScript": "Acompanhar utilizadores com o JavaScript desativado", - "JSTracking_VisitorCustomVars": "Monitorizar variáveis personalizadas para este visitante", - "JSTracking_VisitorCustomVarsDesc": "Por exemplo, com o nome de variável \"Tipo\" e o valor \"Cliente\".", - "JavaScriptCode": "Código JavaScript", - "JavaScriptTracking": "Monitorização por JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Opcional: use as opções avançadas para personalizar seu código de rastreamento.", - "JsTrackingCodeMissingEmail1": "Já passaram alguns dias desde que adicionou o site '%s' ao seu Matomo Analytics. Acabámos de confirmar e parece que o seu Matomo não tem qualquer tráfego registado para este site.", - "JsTrackingCodeMissingEmail2": "Para iniciar o acompanhamento de dados e obter conhecimentos sobre os seus utilizadores, é necessário configurar o processo de acompanhamento no seu site ou aplicação móvel. Para sites, basta incorporar o código de acompanhamento imediatamente antes da tag %s.", - "JsTrackingCodeMissingEmail3": "Para encontrar e personalizar o seu código de acompanhamento, %1$sclique aqui%2$s (ou dê uma vista de olhos no %3$sguia do JavaScript de acompanhamento do cliente%4$s).", - "LearnMore": "Saber mais", - "Login": "Entrar", - "LogoNotWriteableInstruction": "Para utilizar o seu logótipo personalizado em vez do logótipo predefinido do Matomo, atribua permissões de escrita a este diretório: %1$s O Matomo necessita de acesso para escrita aos seus logótipos armazenados nos ficheiros %2$s.", - "LogoUpload": "Selecione um logótipo para enviar", - "LogoUploadFailed": "Não foi possível processar o ficheiro enviado. Por favor, confirme se o ficheiro tem um formato válido.", - "LogoUploadHelp": "Por favor, envie um ficheiro nos formatos %1$s com uma altura mínima de %2$s píxeis.", - "LtsReleases": "As versões de suporte de longo prazo (LTS - Long Term Support) recebem apenas correções de segurança e de problemas.", - "MenuDevelopment": "Desenvolvimento", - "MenuDiagnostic": "Diagnóstico", - "MenuGeneralSettings": "Definições gerais", - "MenuMeasurables": "Dimensões", - "MenuSystem": "Sistema", - "MissingTrackingCodeEmailSubject": "Sem tráfego registado no Matomo Analytics para %s. Comece agora", - "NTrackingFailures": "%s falhas de acompanhamento", - "NeedHelp": "Precisa de ajuda?", - "NoKnownFailures": "Não existem falhas de acompanhamento.", - "OptOutComplete": "Exclusão concluída; as suas visitas a este site não serão registadas pela ferramenta Web Analytics.", - "OptOutCompleteBis": "Note que se limpar os seus cookies, eliminar o cookie de exclusão, ou se alterar os computadores ou navegadores da Web, irá precisar de executar novamente o procedimento de cancelamento.", - "OptOutCustomOptOutLink": "Você também pode criar um formulário de exclusão totalmente personalizado usando HTML e JavaScript, conforme explicado neste %1$sguia%2$s do desenvolvedor.", - "OptOutDntFound": "Não está a ser monitorizado porque o seu navegador está a reportar que esta é a sua preferência. Esta é uma definição do seu navegador, pelo que não poderá participar até desativar a funcionalidade 'Não Monitorizar'.", - "OptOutErrorNoCookies": "A funcionalidade de exclusão do acompanhamento requer as cookies estejam ativas.", - "OptOutErrorNoTracker": "O recurso de desativação de rastreamento não conseguiu encontrar o código Matomo Tracker nesta página", - "OptOutErrorNotHttps": "A funcionalidade de exclusão do acompanhamento poderá não funcionar porque este site não foi carregado utilizando HTTPS. Por favor, recarregue a página para verificar se o seu estado de exclusão foi alterado.", - "OptOutErrorWindowOpen": "O recurso de desativação de rastreamento pode não funcionar porque parece que o pop-up de desativação foi bloqueado. Atualize a página para verificar se o seu status de desativação foi alterado.", - "OptOutExplanation": "O Matomo está empenhado em fornecer privacidade na Internet. Para dar a oportunidade aos visitantes de não serem monitorizados pelo Matomo Web Analytics, pode adicionar o seguinte código HTML numa das páginas do seu site, por exemplo, na página da Política de privacidade.", - "OptOutExplanationIntro": "Este código exibirá uma div contendo um link para que seus visitantes desativem o Matomo, definindo um cookie de desativação em seus navegadores da web. Veja abaixo (ou %1$sclique aqui%2$s) para visualizar o conteúdo que será exibido pela div.", - "OptOutForYourVisitors": "Exclusão do Matomo para os seus visitantes", - "OptingYouOut": "Optando por sair, por favor, aguarde…", - "PersonalPluginSettings": "Definições da Extensão Pessoal", - "PiwikIsInstalledAt": "Matomo está instalado em", - "PluginSettingChangeNotAllowed": "Não está autorizado a alterar o valor da definição \"%1$s\" na extensão \"%2$s\"", - "PluginSettingReadNotAllowed": "Não está autorizado a ler o valor da definição \"%1$s\" na extensão \"%2$s\"", - "PluginSettings": "Definições da Extensão", - "PluginSettingsIntro": "Aqui pode alterar as definições das seguintes extensões de terceiros:", - "PluginSettingsSaveFailed": "Não foi possível guardar as definições da extensão", - "PluginSettingsSaveSuccess": "As definições da extensão foram guardadas.", - "PluginSettingsValueNotAllowed": "O valor para o campo \"%1$s\" na extensão \"%2$s\" não é permitido", - "Problem": "Problema", - "ProtocolNotDetectedCorrectly": "Está a aceder ao Matomo sob uma ligação segura SSL (utilizando HTTPS), mas o Matomo apenas consegue detetar uma ligação não segura no servidor.", - "ProtocolNotDetectedCorrectlySolution": "Para garantir que o Matomo recebe e serve os seus conteúdos sob HTTPS, pode editar o seu ficheiro %1$s e ou configurando as definições do seu proxy, ou adicionando a linha %2$s depois da secção %3$s. %4$sSaber mais%5$s", - "ReactDescription": "Se o seu site estiver usando o React, consulte %1$seste guia%2$s.", - "ReleaseChannel": "Canal de lançamento", - "SecurityNotificationAllTokenAuthDeletedBody": "Alguém eliminou todas as chaves de autenticação da sua conta.", - "SecurityNotificationAnonymousAccessEnabledBody": "Alguém permitiu acesso anônimo ao usuário para %1$s. Isso significa que os dados para este site agora são acessíveis publicamente. Se isso for aceitável, sinta-se livre para ignorar este e-mail.", - "SecurityNotificationCheckTwoFactor": "Por favor, consulte a sua aplicação ou dispositivo de autenticação de dois fatores.", - "SecurityNotificationEmailSubject": "Notificação de segurança", - "SecurityNotificationIfItWasYou": "Se foi você, tudo bem. Se não reconhece esta atividade, por favor, reponha a sua palavra-passe.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Alguém gerou novos códigos de recuperação para autenticação de dois fatores para a sua conta.", - "SecurityNotificationRecoveryCodesShowedBody": "Alguém visualizou os códigos de recuperação da autenticação de dois fatores para a sua conta.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Outro super-utilizador (%1$s) modificou as definições de sistema. Definições afetadas: %2$s. Se tem conhecimento desta atividade, prossiga. Se não reconhecer esta atividade, por favor, contacte os outros super-utilizadores.", - "SecurityNotificationSettingsChangedByUserBody": "Alguém modificou as definições de sistema. Definições afetadas: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Alguém criou um código de autenticação (descrição: %s) na sua conta. Se não foi você, elimine o código.", - "SecurityNotificationTokenAuthDeletedBody": "Alguém eliminou um código de autenticação (descrição: %s) na sua conta.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Alguém desativou a autenticação de dois fatores na sua conta.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Alguém ativou a autenticação de dois fatores na sua conta.", - "SecurityNotificationUserAcceptInviteBody": "O usuário (login: %s) aceitou o convite.", - "SecurityNotificationUserCreatedBody": "Alguém criou um novo utilizador (credencial: %s) na sua conta.", - "SecurityNotificationUserDeclinedInviteBody": "O usuário (login: %s) recusou o convite.", - "SecurityNotificationUserDeletedBody": "Alguém eliminou um utilizador (credencial: %s) na sua conta.", - "SendPluginUpdateCommunication": "Enviar uma mensagem quando estiver disponível uma atualização de extensão", - "SendPluginUpdateCommunicationHelp": "Será enviada uma mensagem para os «Super Utilizadores» quando estiver disponível uma nova versão para uma extensão.", - "SettingsSaveSuccess": "Definições atualizadas.", - "ShowAdvancedOptions": "Mostrar opções avançadas", - "SinglePageApplicationDescription": "Se você estiver rastreando um aplicativo de página única (SPA) ou um aplicativo progressivo da web (PWA), favor consultar %1$seste guia%2$s.", - "Solution": "Solução", - "StableReleases": "Se o Matomo é uma parte crítica do seu negócio, recomendamos que utilize a versão estável mais recente. Se utiliza a versão beta mais recente e encontrar um erro ou se tiver uma sugestão, por favor, %1$sveja aqui%2$s.", - "SystemPluginSettings": "Definições da Extensão de Sistema", - "TrackAGoal": "Monitorizar um objetivo", - "TrackingCode": "Código de Monitorização", - "TrackingCodeIntro": "O Matomo fornece várias formas de incluir o código de acompanhamento no seu site, aplicação móvel e, até, para qualquer dispositivo ou aplicação.", - "TrackingFailureAuthenticationProblem": "O pedido não foi autenticado mas é necessária uma autenticação.", - "TrackingFailureAuthenticationSolution": "Definir ou corrigir um \"token_auth\" no seu pedido de acompanhamento.", - "TrackingFailureInvalidSiteProblem": "O site não existe.", - "TrackingFailureInvalidSiteSolution": "Atualizar o idSite configurado no acompanhamento.", - "TrackingFailures": "Falhas de acompanhamento", - "TrackingFailuresEmail1": "Isto serve apenas para informar que ocorreram %s tipos diferentes de falhas de acompanhamento nos últimos dias.", - "TrackingFailuresEmail2": "Para ver todos os pedidos de acompanhamento falhados %1$s clique aqui %2$s.", - "TrackingFailuresEmailSubject": "Falhas de acompanhamento no seu Matomo Analytics", - "TrackingFailuresIntroduction": "Esta página lista as falhas de acompanhamento que ocorreram nos últimos %sdias. Por favor, note que foram apenas registadas as falhas de acompanhamento mais comuns, e não todas as falhas.", - "TrackingURL": "Endereço de acompanhamento", - "TrustedHostConfirm": "Tem a certeza que pretende alterar o nome do servidor de confiança do Matomo?", - "TrustedHostSettings": "Nome do servidor de confiança do Matomo", - "TwoFactorAuth": "Autenticação de dois fatores", - "UiDemo": "Demonstração do interface de utilizador", - "UncheckToOptOut": "Desmarque esta caixa para cancelar participação.", - "UpdateSettings": "Atualizar definições", - "UseCustomLogo": "Utilize um logótipo personalizado", - "UserInviteContent": "Você pode aceitar este convite clicando no botão aceitar abaixo.", - "UserInviteNotes": "Se você não esperava este convite, pode ignorar este e-mail. Se %1$s estiver te enviando muitos e-mails, você pode bloqueá-los ou denunciar abuso. O convite expira automaticamente em %2$s dias.", - "UserInviteSubject": "%1$s enviou a você um convite para participar do Matomo Analytics para %2$s.", - "ValidPiwikHostname": "Nome do Servidor Matomo Válido", - "ViewAllTrackingFailures": "Ver todas as falhas de acompanhamento", - "VueDescription": "Se o seu site estiver usando o Vue.js, consulte %1$seste guia%2$s.", - "WhatIsNew": "O que há de novo", - "WhatIsNewDoNotShowAgain": "Não mostrar novamente", - "WhatIsNewNoChanges": "Não há nada de novo no momento", - "WhatIsNewNoChangesTitle": "Nenhuma alteração recente", - "WhatIsNewRemindMeLater": "Lembre-me mais tarde", - "WhatIsNewTitle": "Aqui está o que há de novo no Matomo", - "WhatIsNewTooltip": "Saiba o que há de novo no Matomo", - "WithOptionalRevenue": "com rendimento opcional", - "WordpressDescription": "Se o seu site estiver usando Wordpress, consulte %1$seste guia%2$s.", - "YouAreNotOptedOut": "Não deixou de participar.", - "YouAreOptedOut": "Atualmente está excluído.", - "YouMayOptOut": "Pode optar por não ter um número único de identificação de cookie de web analytics atribuído ao seu computador para evitar a agregação e análise dos dados recolhidos neste site.", - "YouMayOptOut2": "Pode optar por impedir que este site agregue e analise as ações que fizer aqui.", - "YouMayOptOut3": "Ao fazer isto irá proteger a sua privacidade, mas irá também impedir o proprietário do site de aprender com as suas ações e de criar uma melhor experiência para si e para outros utilizadores.", - "YouMayOptOutBis": "Para fazer esta escolha, por favor, clique em baixo para receber um cookie de exclusão." - } -} diff --git a/plugins/CoreAdminHome/lang/ro.json b/plugins/CoreAdminHome/lang/ro.json deleted file mode 100644 index 1dca67e2d1262cfab82d60e66f9bffafb6dde98a..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ro.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "Administrare", - "ArchivingSettings": "Setările pentru Arhivare", - "BrandingSettings": "Setări branding", - "ClickHereToOptIn": "Apasă aici pentru a te abona.", - "ClickHereToOptOut": "Apasă aici pentru a te dezabona.", - "CustomLogoFeedbackInfo": "Daca customizezi logo-ul Matomo, ai putea fi interesat sa ascunzi linkul %1$s in meniul de sus. Pentru a face asta, poti dezactiva pluginul Feedback pe pagina %2$sManage Plugins%3$s.", - "CustomLogoHelpText": "Poţi personaliza logoul Matomo care va fi afişat în interfaţa de utilizator şi în rapoartele email.", - "EmailServerSettings": "Setările serverului email", - "FaviconUpload": "Alege un favicon pentru a fi încărcat", - "ForBetaTestersOnly": "Numai pentru beta-testeri", - "ImageTracking": "Urmărire prin imagine", - "ImageTrackingIntro1": "Cand un visitator are dezactivat JavaScript sau cand JavaScript nu poate fi folosit, poti folosi un link de tracking de tip imagine pentru a inregistra statisticile despre vizitatori.", - "ImageTrackingIntro2": "Genereaza linkul mai jos si fa copy/paste la codul HTML generat pe pagina. Daca folosesti aceasta ca rezerva/fallback pentru trackingul JavaScript, il poti pune intre taguri %1$s.", - "ImageTrackingIntro3": "Pentru intreaga lista de optiuni poti folosi un link de tracking tip imagine, vezi %1$sTracking API Documentation%2$s.", - "ImageTrackingLink": "Link-ul către imaginea de urmărire", - "ImportingServerLogsDesc": "O alternativa pentru a contoriza vizitatorii prin intermediul browserului (indiferent daca este prin intermediul JavaScript sau link de tip imagine) este de a importa continuu logurile serveului (server logs). Citeste mai multe despre %1$sServer Log File Analytics%2$s.", - "InvalidPluginsWarning": "Urmatoarele pluginuri nu sunt compatibile cu %1$s si nu pot fi rulate: %2$s.", - "InvalidPluginsYouCanUninstall": "Poţi actualiza sau deinstala aceste plugin-uri pe pagina %1$sManage Plugins%2$s.", - "JSTrackingIntro2": "Odata ce ai codul JavaScript de contorizare a vizitelor pentru siteul tau, fa copy si paste in toate paginile pe care vrei sa faci contorizarea vizitatorilor cu Matomo.", - "JSTrackingIntro4": "Daca nu doresti sa folosesti JavaScript pentru a contoriza vizitatorii, %1$sgenereaza un link tip imagine mai jos%2$s.", - "JSTrackingIntro5": "Daca doresti mai mult decat a contoriza vizualizarile de pagini, te rugam sa te uiti la %1$sdocumentatia Matomo Javascript Tracking%2$s pentru lista cu functionalitatile disponibile. Folosind aceste functionalitati poti contoriza obiectivele (goals), variabile custom, comenzile pentru magazinul online, cosul de cumparaturi abandonat si altele.", - "JSTracking_CampaignKwdParam": "Parametru Campanie Cuvânt Cheie", - "JSTracking_CampaignNameParam": "Parametrul Nume Campanie (Campaign Name)", - "JSTracking_CustomCampaignQueryParam": "Foloseste nume customizate pentru parametrii de cautare, pentru numele campaniei & cuvant.", - "JSTracking_CustomCampaignQueryParamDesc": "Notă: %1$sMatomo va detecta automat parametrii Google Analytics.%2$s", - "JSTracking_EnableDoNotTrack": "Activeaza detectia DoNotTrack pentru vizitatori (client side).", - "JSTracking_EnableDoNotTrackDesc": "Deci cererile de tracking nu vor fi trimise daca vizitatorii nu doresc sa fie contorizati.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Nota: Suportul Server side DoNotTrack a fost activat, de aceea aceasta optiune nu va avea nici un efect.", - "JSTracking_GroupPageTitlesByDomain": "Adauga domeniul siteului chiar inaintea titlului paginii cand faci tracking.", - "JSTracking_GroupPageTitlesByDomainDesc1": "Daca cineva viziteaza pagina 'Despre noi' pe blog.%1$s va fi inregistrat ca 'blog / Despre noi'. Acesta este cel mai usor mod de a avea o privire generala referitare la traficul pe subdomeniu.", - "JSTracking_MergeAliases": "In raportul \"Outlinks\", ascunde clickurile pentru cunoscutele aliasuri de URL a", - "JSTracking_MergeAliasesDesc": "Deci clickurile pe linkurile catre Alias URLs (eg. %s) nu vor fi contorizate ca \"Outlink\".", - "JSTracking_MergeSubdomains": "Urmărește vizitatorii din subdomeniile", - "JSTracking_MergeSubdomainsDesc": "Deci daca un vizitator viziteaza %1$s si %2$s, acesta va fi contorizat ca vizitator unic.", - "JSTracking_PageCustomVars": "Urmăreşte o variabilă personalizată pentru fiecare vizualitare a paginii", - "JSTracking_PageCustomVarsDesc": "De exemplu, cu variabila nume \"Categorie\" si valoare \"Pagini Aurii\".", - "JSTracking_VisitorCustomVars": "Urmăreşte variabile personalizate pentru acest vizitator", - "JSTracking_VisitorCustomVarsDesc": "De exemplu, cu variabila nume \"Tip\" si valoare \"Client\".", - "JavaScriptTracking": "Urmărire prin JavaScript", - "Login": "Logare", - "LogoNotWriteableInstruction": "Pentru a folosi logo-ul tau custom in loc de logo-ul default Matomo, trebuie sa pui permisiuni de scriere pe acest director. %1$s Matomo are nevoie de drept de scriere pentru logo-urile tale salvate in fisiere %2$s.", - "LogoUpload": "Alege logo-ul pentru încărcare", - "LogoUploadHelp": "Te rugam sa incarci un fisier cu formaturile %1$s, cu o inaltime minima de %2$s pixeli.", - "MenuDevelopment": "Dezvoltare", - "MenuDiagnostic": "Diagnosticare", - "MenuGeneralSettings": "Setări generale", - "MenuSystem": "Sistem", - "OptOutComplete": "Dezabonare completa; vizitele tale pe acest site nu vor fi contorizate de tool-ul de Web Analytics.", - "OptOutCompleteBis": "Aminteste-ti ca daca dai clear la cookie-uri, stergi cookie-ul de dezabonare sau daca schimbi calculatoarele sau browserele web, tot vei fi nevoit sa te dezabonezi iarasi.", - "OptOutExplanation": "Matomo este dedicat sa furnizeze intimitate/privacy pe Internet. Pentru a lasa vizitatorilor tai optiunea de dezabonare de la Matomo Web Analytics, poti adauga urmatorul cod HTML pe una dintre paginile siteului tau, de exemplu pe pagina de Privacy Policy.", - "OptOutForYourVisitors": "Dezabonare Matomo pentru vizitatorii tai", - "PiwikIsInstalledAt": "Matomo este instalat în", - "PluginSettingChangeNotAllowed": "Nu iti este permis sa schimbi valoarea setarii \"%1$s\" in plugin \"%2$s\"", - "PluginSettingReadNotAllowed": "Nu se poate citi valoare setării \"%1$s\" din modulul \"%2$s\"", - "PluginSettingsIntro": "Aici poti schimba setarile pentru urmatoarele pluginuri terte (3rd party):", - "PluginSettingsValueNotAllowed": "Valoarea pentru campul \"%1$s\" in plugin \"%2$s\" nu este permisa", - "SendPluginUpdateCommunicationHelp": "Va fi trimis un email catre Super Users cand va fi o noua versiune disponibila pentru un plugin.", - "SettingsSaveSuccess": "Setări actualizate.", - "StableReleases": "Daca Matomo este un aspect foarte important al afacerii tale, noi recomandam sa folosesti ultima versiune stabila. Daca folosesti ultima versiune beta si gasesti un bug sau ai o sugestie, te rugam %1$suita-te aici%2$s.", - "TrackAGoal": "Urmăreşte o ţintă", - "TrackingCode": "Codul de urmărire", - "TrustedHostConfirm": "Eşti sigur că doreşti să schimbi numele hostului de încredere Matomo?", - "TrustedHostSettings": "Hostname Matomo de incredere", - "UncheckToOptOut": "Debifați această casetă pentru a renunța.", - "UpdateSettings": "Actualizează setările", - "UseCustomLogo": "Foloseşte un logo personalizat", - "ValidPiwikHostname": "Valid Matomo Hostname", - "WithOptionalRevenue": "cu venit opţional", - "YouAreOptedOut": "Acum esti dezabonat.", - "YouMayOptOut": "Poti alege sa nu ai un cookie unic de web analytics corespunzator computerului tau, pentru a evita cumularea si analiza datelor colectate pe acest site.", - "YouMayOptOut2": "Puteți alege să împiedicați acest site web să acumuleze și să analizeze acțiunile pe care le faceți aici.", - "YouMayOptOut3": "Procedând astfel, vă veți proteja confidențialitatea, dar îl va împiedica și pe proprietar să învețe din acțiunile dvs. și să creeze o experiență mai bună pentru dvs. și pentru alți utilizatori.", - "YouMayOptOutBis": "Pentru a face aceasta alegere, va rugam faceti click mai jos pentru a primi o cookie de dezabonare." - } -} diff --git a/plugins/CoreAdminHome/lang/ru.json b/plugins/CoreAdminHome/lang/ru.json deleted file mode 100644 index fd02ebf8cc360b0290eb0c001b01ef86258d6c57..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ru.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Принять приглашение", - "AddNewTrustedHost": "Добавить новый доверенный хост", - "Administration": "Администрирование", - "ArchivingSettings": "Настройка архивации", - "BrandingSettings": "Настройки логотипа", - "BruteForce": "Брутфорс", - "CheckToOptIn": "Установите этот флажок, чтобы подписаться.", - "ClickHereToOptIn": "Кликните, чтобы вы учитывались в аналитике.", - "ClickHereToOptOut": "Кликните, чтобы вы не учитывались в аналитике.", - "CloudflareDescription": "Если ваш сайт размещен на Cloudflare, пожалуйста смотрите %1$sэторуководство%2$s.", - "ConfirmDeleteAllTrackingFailures": "Вы уверены, что хотите удалить все ошибки отслеживания?", - "ConfirmDeleteThisTrackingFailure": "Вы уверены, что хотите удалить эту ошибку отслеживания?", - "Cors": "Ядро", - "CorsDomains": "Совместное использование ресурсов между разными доменами (CORS)", - "CorsDomainsHelp": "Вы можете определить домены или поддомены, например, http://example.com или http://stats.example.com. Или разрешить кросс-доменные запросы для всех доменов просто добавив *", - "CustomLogoFeedbackInfo": "Если вы используйете свой логотип, вам, возможно, также понадобится скрыть ссылку %1$s в верхнем меню. Для этого просто отключите плагин Feedback (обратная связь) на странице %2$sУправление плагинами%3$s.", - "CustomLogoHelpText": "Вы можете добавить свой логотип, который будет отображаться отчётах.", - "DeclineInvite": "Отклонить приглашение", - "DeleteAllFailures": "Удалить все ошибки", - "DevelopmentProcess": "В то время как наш процесс разработки включает в себя тысячи автоматизированных тестов, бета-тестеры играют ключевую роль в достижении «политики без ошибок» в Matomo.", - "EmailServerSettings": "Настройки сервера электронной почты", - "ErrorEmailFromAddressNotValid": "Адрес SMTP недействителен", - "FaviconUpload": "Выберите Favicon для загрузки", - "FileUploadDisabled": "Загрузка файлов не включена в вашей конфигурации PHP. Для загрузки другого логотипа выставите %s в php.ini и перезапустите веб-сервер.", - "ForBetaTestersOnly": "Только для бета-тестеров", - "GoogleTagManagerDescription": "Если ваш сайт использует Google Tag Manager, пожалуйста, ознакомьтесь с %1$sэтим руководством%2$s.", - "HideAdvancedOptions": "Скрыть дополнительные параметры", - "HowToGetHelp": "Есть разные способы получить помощь. Существует бесплатная поддержка через Matomo Community и платная поддержка предоставляемая командой Matomo и партнёрами Matomo. Или может вы хотите сообщить об ошибке, или хотите предложить новый функционал?", - "HttpTrackingApi": "API отслеживания HTTP", - "HttpTrackingApiDescription": "%1$sHTTP Tracking API%2$s позволяет отслеживать что угодно. Это может быть полезно, если вы используете язык программирования, для которого еще нет SDK. Это также может быть полезно, если вы хотите отслеживать устройства или приложения особым образом.", - "ImageTracking": "Отслеживание через изображение", - "ImageTrackingIntro1": "Когда посетитель отключил JavaScript, или когда JavaScript не может быть использован, вы можете использовать ссылку на изображение для отслеживания посетителей.", - "ImageTrackingIntro2": "Создайте ссылку и разместите сгенерированный HTML на страницах. Если вы используете это в качестве запасного варианта для отслеживания без JavaScript, вы можете его окружить его в тег %1$s.", - "ImageTrackingIntro3": "Весь список опций, которые можно использовать с изображением-ссылкой отслеживания смотрите в %1$sTracking API Documentation%2$s.", - "ImageTrackingLink": "Ссылка на изображение для отслеживания", - "ImportFromGoogleAnalytics": "Импорт из Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Если у вас есть свойство Google Analytics и вы переходите на Matomo, вы можете импортировать существующие данные с помощью плагина %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Альтернативой отслеживания посетителей через браузер (вместо JavaScript или ссылки на изображение) является постоянно импортировать логи сервера. Узнать больше о %1$sServer Log File Analytics%2$s.", - "InvalidPluginsAdminDisabled": "Чтобы обновить или удалить эти плагины, пожалуйста, свяжитесь с вашим администратором Matomo, который сможет использовать командную строку или обновить конфигурацию напрямую.", - "InvalidPluginsWarning": "Следующие плагины не совместимы с %1$s и не могут быть загружены: %2$s.", - "InvalidPluginsYouCanUninstall": "Вы можете обновить или удалить эти плагины на странице %1$sУправления плагинами%2$s.", - "InvalidSiteUrlError": "Этот URL недоступен. Содержимое могло быть перемещено, удалено или оно может быть более недоступно (id сайта был установлен как '%s' в URL).", - "InvalidSiteUrlErrorHelp": "Пожалуйста, вернитесь на предыдущую страницу или к вашей панели управления, чтобы выбрать веб-сайт.", - "JSTrackingDocumentationHelp": "Для легкого доступа наиболее популярные расширенные опции доступны ниже. Для получения еще большего количества опций (в том числе о том, как отслеживать цели, пользовательские переменные, заказы электронной коммерции и брошенные корзины), пожалуйста, ознакомьтесь с документацией отслеживания %1$sMatomo Javascript%2$s.", - "JSTrackingIntro1": "Вы можете отслеживать посетителей на вашем сайте разными способами. Рекомендуемый способ сделать это через JavaScript. Чтобы использовать этот метод, вы должны убедиться, что на каждой веб-странице вашего сайта есть некоторый код JavaScript, который вы можете сгенерировать здесь.", - "JSTrackingIntro2": "Как только вы получили JavaScript-код для вашего сайта, скопируйте и вставьте его на все страницы вашего сайта, на которых вы хотите отслеживать посетителей.", - "JSTrackingIntro3a": "На большинстве веб-сайтов, блогов, CMS вы можете использовать готовый плагин, для установки кода отслеживания. (Смотрите наш %1$s список плагинов, используемых для интеграции Matomo %2$s.)", - "JSTrackingIntro3b": "Если плагина не существует, вы можете отредактировать шаблоны вашего сайта и добавить код отслеживания JavaScript в тег </head>, который часто определяется в файлах «header.php», «header.tpl» или аналогичных.", - "JSTrackingIntro4": "Если вы не хотите или не можете использовать JavaScript, %1$sвоспользуйтесь отслеживанием посетителей через изображение%2$s.", - "JSTrackingIntro5": "Если вы хотите больше, чем простое отслеживание страниц, пожалуйста, ознакомьтесь с %1$sMatomo Javascript Tracking documentation%2$s для просмотра всех функций. С помощью этих функций вы можете отслеживать цели, пользовательские переменные, заказы электронной коммерции, неоформленные заказы и многое другое.", - "JSTracking_CampaignKwdParam": "Параметр Ключевого слова кампании", - "JSTracking_CampaignNameParam": "Параметр Имени кампании", - "JSTracking_CodeNoteBeforeClosingHead": "Нажмите на кнопку, чтобы скопировать фрагмент кода и вставить его непосредственно перед закрывающим %1$sтэгом (рекомендация)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Убедитесь, что этот код встроен в элемент script на каждой странице вашего сайта. Мы рекомендуем вставить его непосредственно перед закрывающим тегом head.", - "JSTracking_ConsentManagerConnected": "%1$s похоже уже настроен для работы с Matomo.", - "JSTracking_ConsentManagerDetected": "%1$s на вашем сайте обнаружен менеджер согласия. Чтобы узнать о настройке Matomo для работы с %1$s пожалуйста посетите %2$s", - "JSTracking_ConsentManagerEmailNote": "Или вы можете встроить код отслеживания напрямую на свой вебсайт:", - "JSTracking_CrossDomain": "По умолчанию, ID посетителя, которое идентифицирует уникального посетителя, хранится в файлах cookies браузера, которые доступны только страницам этого же домена. Включение кросс-доменной связи позволяет вам отслеживать все действия и просмотры страниц определенного пользователя за одно посещение, даже если он просматривал страницы на нескольких доменах. Когда пользователь нажимает на одну из ссылок на вашем веб-сайте , будет добавлен параметр URL pk_vid, возвращающий ID посетителя.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Примечание: чтобы использовать кросс-доменное соединение, вы должны указать более одного домена (URL) для своего сайта.", - "JSTracking_CustomCampaignQueryParam": "Использовать пользовательские имена параметров в запросе для названия кампании и ключевого слова", - "JSTracking_CustomCampaignQueryParamDesc": "Примечание: %1$sMatomo автоматически определит параметры Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Отключить отслеживание параметров кампаний", - "JSTracking_DisableCampaignParametersDesc": "Когда эта опция установлена, Matomo не будет отслеживать параметры кампаний, и они будут удалены из отслеживаемых URL-адресов.", - "JSTracking_DisableCookies": "Отключить все отслеживания cookies", - "JSTracking_DisableCookiesDesc": "Отключает все куки первой стороны. Существующие cookies Matomo для этого сайта будут удалены при следующем просмотре страницы.", - "JSTracking_EnableCrossDomainLinking": "Включает кросс-доменную связь", - "JSTracking_EnableDoNotTrack": "Включить обнаружение DoNotTrack на стороне пользователя", - "JSTracking_EnableDoNotTrackDesc": "Пользователь не будет отслеживаться, если он этого не хочет.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Примечание: на стороне сервера поддержка DoNotTrack была включена, так что эта опция не будет иметь никакого эффекта.", - "JSTracking_EndNote": "Примечание: Вы можете сгенерировать пользовательский код отслеживания в разделе для администратора %1$sКод отслеживания%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Подставлять домен сайта перед названием страницы при отслеживании", - "JSTracking_GroupPageTitlesByDomainDesc1": "Так что, если кто-то посещает страницу «О нас» на поддомене blog.%1$s он будет записан как «blog / О нас». Это самый простой способ получить обзор вашего трафика по поддоменам.", - "JSTracking_MergeAliases": "В отчёте «Внешние ссылки» скрыть клики известных псевдонимов сайта", - "JSTracking_MergeAliasesDesc": "Переходы по ссылкам на псевдонимы домена (например, %s) не будут учитываться как «внешние ссылки».", - "JSTracking_MergeSubdomains": "Отслеживать посетителей через все поддомены сайта", - "JSTracking_MergeSubdomainsDesc": "Если один посетитель заходил на %1$s и %2$s, то посещения будут учитываться как уникальный посетитель.", - "JSTracking_PageCustomVars": "Отслеживать пользовательские переменные для каждого вида страницы", - "JSTracking_PageCustomVarsDesc": "Например, имя переменной «Категория», а значение — «Официальные документы».", - "JSTracking_TrackNoScript": "Отслеживать пользователей при отключенном JavaScript", - "JSTracking_VisitorCustomVars": "Отслеживать пользовательские переменные для посетителя", - "JSTracking_VisitorCustomVarsDesc": "Например, имя переменной «Тип», а значение — «Клиент».", - "JavaScriptCode": "JavaScript код", - "JavaScriptTracking": "JavaScript отслеживание", - "JsTrackingCodeAdvancedOptionsStep": "Необязательно: используйте дополнительные параметры для настройки кода отслеживания.", - "JsTrackingCodeMissingEmail1": "Несколько дней назад вы добавили веб-сайт %s в Matomo Analytics. Мы только что проверили, но Matomo не зарегистрировал трафик на этом сайте.", - "JsTrackingCodeMissingEmail2": "Чтобы начать отслеживать данные и получать информацию о своих пользователях, вам необходимо настроить отслеживание на своем веб-сайте или в мобильном приложении. Для сайтов просто вставьте код отслеживания прямо перед тегом %s.", - "JsTrackingCodeMissingEmail3": "Чтобы найти и настроить свой код отслеживания, %1$sнажмите здесь%2$s (или посмотрите %3$sруководство по клиенту отслеживания JavaScript%4$s).", - "LearnMore": "Узнать больше", - "Login": "Логин", - "LogoNotWriteableInstruction": "Чтобы использовать собственное лого вместо стандартного Matomo, откройте для записи эту папку: %1$s Matomo нужен доступ на запись к вашим лого, хранящимся в файлах %2$s.", - "LogoUpload": "Выберите лого для загрузки", - "LogoUploadFailed": "Загруженный файл не может быть обработан. Пожалуйста, проверьте, что файл имеет нужный формат.", - "LogoUploadHelp": "Пожалуйста, закачивайте файлы в %1$s форматах, минимальное ограничение по высоте — %2$s пикселей.", - "LtsReleases": "Версии LTS (Long Term Support) получают только исправления безопасности и ошибок.", - "MenuDevelopment": "Разработка", - "MenuDiagnostic": "Диагностика", - "MenuGeneralSettings": "Основные настройки", - "MenuMeasurables": "Единицы измерения", - "MenuSystem": "Система", - "MissingTrackingCodeEmailSubject": "Нет трафика для %s записанным Matomo Analytics, начните сейчас", - "NTrackingFailures": "%s ошибок отслеживания", - "NeedHelp": "Нужна помощь?", - "NoKnownFailures": "Нет известных ошибок отслеживания.", - "OptOutComplete": "Исключение из политики конфиденциальности завершено; ваши посещения на данный сайт не будут учитываться системой веб аналитики. Мы уважаем ваш выбор.", - "OptOutCompleteBis": "Заметьте, что если вы очистите cookies браузера, то, скорее всего, удалится и исключительный cookie, или если вы поменяете компьютер или браузер, то необходимо будет пройти процедуру исключения снова.", - "OptOutCustomOptOutLink": "Вы также можете создать полностью пользовательскую форму отказа с помощью HTML и JavaScript, как описано в этой документации %1$sguide%2$s.", - "OptOutDntFound": "Ваши действия не отслеживались, так как ваш браузер сообщает, что вы не хотите этого. Это настройка вашего браузера, поэтому у вас не будет возможности включить ее до тех пор, пока вы не отключите опцию «Не отслеживать».", - "OptOutErrorNoCookies": "Функция отказа от отслеживания требует включения cookies.", - "OptOutErrorNoTracker": "Функция отказа от отслеживания не способна обнаружить Matomo Tracker на этой странице", - "OptOutErrorNotHttps": "Функция отказа от отслеживания может не работать, поскольку этот сайт не был загружен через HTTPS. Пожалуйста, перезагрузите страницу, чтобы проверить, изменился ли статус отказа от отслеживания.", - "OptOutErrorWindowOpen": "Функция отслеживания отказа может не работать, потому что всплывающее окно заблокировано. Пожалуйста, перезагрузите страницу, чтобы проверить изменится ли состояние работы функции отказа.", - "OptOutExplanation": "Matomo — за сохранение личных данных в сети. Поэтому данная система может предложить вашим пользователям выбор исключения из политики конфиденциальности (отказ от дальнейшего сбора статистики о пользователе). Вы можете вставить следующий HTML-код на одну из ваших страниц сайта, например на страницу о гарантиях конфиденциальности.", - "OptOutExplanationIntro": "Этот код отобразит div, содержащий ссылку, по которой ваши посетители могут отказаться от использования Matomo, отказавшись от cookie файлов в браузере. Смотрите ниже (или %1$sнажмите сюда%2$s) для просмотра содержимого div.", - "OptOutForYourVisitors": "Исключение из политики конфиденциальности Matomo для посетителей", - "OptingYouOut": "Отписываем вас, пожалуйста, подождите…", - "PersonalPluginSettings": "Персональные настройки плагинов", - "PiwikIsInstalledAt": "Matomo установлен в", - "PluginSettingChangeNotAllowed": "Вам не разрешено менять значение «%1$s» для плагина «%2$s»", - "PluginSettingReadNotAllowed": "Вам не разрешено читать значение «%1$s» плагина «%2$s»", - "PluginSettings": "Настройки плагинов", - "PluginSettingsIntro": "Здесь вы можете изменить настройки для следующих плагинов:", - "PluginSettingsSaveFailed": "Ошибка при сохранении настроек плагина", - "PluginSettingsSaveSuccess": "Настройки плагинов обновлены.", - "PluginSettingsValueNotAllowed": "Значение для поля «%1$s» в плагине «%2$s» недопустимо", - "Problem": "Проблема", - "ProtocolNotDetectedCorrectly": "В настоящее время вы просматриваете Matomo через защищенное SSL-соединение (используя HTTPS), но Matomo смог обнаружить только незащищенное соединение на сервере.", - "ProtocolNotDetectedCorrectlySolution": "Чтобы удостовериться, что Matomo безопасно запрашивает и обрабатывает ваш контент через HTTPS, вы можете отредактировать свой файл %1$s или изменить ваши настройки прокси, или вы можете добавить строку %2$s под разделом %3$s. %4$sУзнать больше%5$s", - "ReactDescription": "Если ваш сайт использует React, пожалуйста, ознакомьтесь с %1$sэтим руководством%2$s.", - "ReleaseChannel": "Канал выпуска", - "SecurityNotificationAllTokenAuthDeletedBody": "Кто-то удалил все маркеры авторизации в вашей учетной записи.", - "SecurityNotificationAnonymousAccessEnabledBody": "Кто-то включил доступ анонимным пользователям для %1$s. Это означает, что данные для этого сайта теперь общедоступны. Если это нормально, проигнорируйте это электронное письмо.", - "SecurityNotificationCheckTwoFactor": "Пожалуйста, проверьте приложение или устройство двухфакторной аутентификации.", - "SecurityNotificationEmailSubject": "Уведомление о безопасности", - "SecurityNotificationIfItWasYou": "Если это были вы, продолжайте. Если вы не узнаёте эту активность, пожалуйста, сбросьте пароль.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Кто-то сгенерировал новые коды восстановления двухфакторной аутентификации для вашей учетной записи.", - "SecurityNotificationRecoveryCodesShowedBody": "Кто-то просмотрел коды восстановления двухфакторной аутентификации вашей учетной записи.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Другой суперпользователь (%1$s) изменил настройки системы. Затронутые настройки: %2$s. Если вы знаете об этом действии, продолжайте. Если вы не знаете об этой деятельности, обратитесь к другому суперпользователю.", - "SecurityNotificationSettingsChangedByUserBody": "Кто-то изменил системные настройки. Затронутые настройки: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Кто-то создал токен аутентификации (описание: %s) в вашей учетной записи. Если это были не вы, удалите токен.", - "SecurityNotificationTokenAuthDeletedBody": "Кто-то удалил токен аутентификации (описание: %s) в вашей учетной записи.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Кто-то отключил двухфакторную аутентификацию в вашей учетной записи.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Кто-то включил двухфакторную аутентификацию в вашей учетной записи.", - "SecurityNotificationUserAcceptInviteBody": "Пользователь (login: %s) принял приглашение.", - "SecurityNotificationUserCreatedBody": "Кто-то создал нового пользователя (логин: %s) в вашей учетной записи.", - "SecurityNotificationUserDeclinedInviteBody": "Пользователь (login: %s) отклонил приглашение.", - "SecurityNotificationUserDeletedBody": "Кто-то удалил пользователя (логин: %s) в вашем аккаунте.", - "SendPluginUpdateCommunication": "Отправить email с уведомлением, когда для плагина будет доступна новая версия", - "SendPluginUpdateCommunicationHelp": "Письмо будет отправлено суперпользователю когда будет доступна новая версия плагина.", - "SettingsSaveSuccess": "Настройки обновлены.", - "ShowAdvancedOptions": "Показать дополнительные параметры", - "SinglePageApplicationDescription": "Если вы отслеживаете одностраничное приложение (SPA) или прогрессивное веб-приложение (PWA), см. %1$sэто руководство%2$s.", - "Solution": "Решение", - "StableReleases": "Если Matomo является важной частью вашего бизнеса, мы рекомендуем использовать последнюю стабильную версию. Если вы используете последнюю бета версию, и вы нашли ошибку или есть предложение, пожалуйста, %1$sперейдите по ссылке%2$s.", - "SystemPluginSettings": "Системные настройки плагинов", - "TrackAGoal": "Отслеживать цель", - "TrackingCode": "Код отслеживания", - "TrackingCodeIntro": "Matomo предлагает вам различные способы встраивания кода отслеживания для вашего веб-сайта, мобильного приложения и даже для любого устройства или приложения.", - "TrackingFailureAuthenticationProblem": "Запрос не был аутентифицирован, хотя требовалась аутентификация.", - "TrackingFailureAuthenticationSolution": "Установите или исправьте «token_auth» в вашем запросе отслеживания.", - "TrackingFailureInvalidSiteProblem": "Сайт не существует.", - "TrackingFailureInvalidSiteSolution": "Обновите настроенный idSite в трекере.", - "TrackingFailures": "Отслеживание сбоев", - "TrackingFailuresEmail1": "Это просто для того, чтобы вы знали, что в последние дни произошло %s различных типов ошибок отслеживания.", - "TrackingFailuresEmail2": "Чтобы просмотреть все неудавшиеся запросы отслеживания, %1$sнажмите здесь%2$s.", - "TrackingFailuresEmailSubject": "Отслеживание ошибок в Matomo Analytics", - "TrackingFailuresIntroduction": "На этой странице перечислены ошибки отслеживания, которые произошли в последние %s дн. Обратите внимание, что регистрируются только самые распространенные ошибки отслеживания, а не все.", - "TrackingURL": "URL отслеживания", - "TrustedHostConfirm": "Вы уверены, что хотите сменить имя доверенного хоста Matomo?", - "TrustedHostSettings": "Доверенные хосты Matomo", - "TwoFactorAuth": "Двухфакторная авторизация", - "UiDemo": "UI Demo", - "UncheckToOptOut": "Снимите этот флажок, чтобы отказаться.", - "UpdateSettings": "Настройки обновления", - "UseCustomLogo": "Использовать свой логотип", - "UserInviteContent": "Вы можете принять это приглашение, кликнув кнопку принятия ниже.", - "UserInviteNotes": "Если вы не ждали этого приглашения, вы можете игнорировать это письмо. Если %1$s присылает вам слишком много писем, вы можете заблокировать его или сообщить о нарушении. Приглашение автоматически истекает через %2$s дней.", - "UserInviteSubject": "%1$s отправил вам приглашение присоединиться к Matomo Analytics для %2$s.", - "ValidPiwikHostname": "Домен для Matomo", - "ViewAllTrackingFailures": "Посмотреть все ошибки отслеживания", - "VueDescription": "Если ваш сайт использует Vue.js, пожалуйста, ознакомьтесь с %1$sэтим руководством%2$s.", - "WhatIsNew": "Что нового", - "WhatIsNewDoNotShowAgain": "Больше не показывай", - "WhatIsNewNoChanges": "На данный момент нет ничего нового", - "WhatIsNewNoChangesTitle": "Последние изменения отсутствуют", - "WhatIsNewRemindMeLater": "Напомнить позже", - "WhatIsNewTitle": "Вот что нового в Matomo", - "WhatIsNewTooltip": "Узнайте, что нового в Matomo", - "WithOptionalRevenue": "с дополнительным доходом", - "WordpressDescription": "Если ваш сайт использует Wordpress, пожалуйста, ознакомьтесь с %1$sэтим руководством%2$s.", - "YouAreNotOptedOut": "Вы не отказались от сбора статистики.", - "YouAreOptedOut": "Вы отказались от сбора статистики.", - "YouMayOptOut": "Вы можете отказаться от уникального cookie, привязанному к вашему браузеру, и идентифицирующего вас в системе аналитики данного сайта, тем самым отказавшись от любого сбора сведений о вас и их анализа на данном сайте.", - "YouMayOptOut2": "Вы можете запретить сбор и анализ действий на этом сайте.", - "YouMayOptOut3": "Это защитит вашу конфиденциальность, но также не позволит владельцу учиться на ваших действиях и создавать более удобные условия для вас и других пользователей.", - "YouMayOptOutBis": "Снимите галочку и получите исключающий cookie для отказа сбора данных." - } -} diff --git a/plugins/CoreAdminHome/lang/si.json b/plugins/CoreAdminHome/lang/si.json deleted file mode 100644 index a7e27b6a1d3312d05a78b3b8ca4767093ca095de..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/si.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "පරිපාලන" - } -} diff --git a/plugins/CoreAdminHome/lang/sk.json b/plugins/CoreAdminHome/lang/sk.json deleted file mode 100644 index a20654ef1bbdabfae9d54e1ddcf6c78d1f69f6a8..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/sk.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Pridať nového dôveryhodného hostiteľa", - "Administration": "Administrácia", - "ArchivingSettings": "Archivačné nastavenia", - "BrandingSettings": "Nastavenia Brandingu", - "CheckToOptIn": "Pre aktiváciu označte toto zaškrtávacie políčko.", - "ClickHereToOptIn": "Kliknite sem pre prihásenie.", - "ClickHereToOptOut": "Kliknite sem pre odhásenie.", - "CustomLogoHelpText": "Môžete prispôsobiť logo Matomou, ktoré bude zobrazené v užívateľskom rozhraní a emailových reportoch.", - "EmailServerSettings": "Nastavenia e-mailového servera", - "FaviconUpload": "Vyberte Favicon pre nahranie", - "ForBetaTestersOnly": "Len pre beta testerov", - "ImageTracking": "Sledovanie obrázkom", - "ImageTrackingIntro1": "Keď má návštevník vypnutý JavaScript, alebo keď JavaScript nemôže byť použitý, môžete použiť obrázkový sledovací odkaz pre sledovanie návštevníkov.", - "ImageTrackingLink": "Link pre Sledovanie obrázkom", - "InvalidPluginsWarning": "Nasledujúce moduly nie sú kompatibilné s %1$s a nemohli byť načítané: %2$s.", - "InvalidPluginsYouCanUninstall": "Môžete aktualizovať alebo odinštalovať tieto moduly na stránke %1$sSpráva modulov%2$s.", - "JSTrackingIntro2": "Akonáhle máte JavaScriptový sledovací kód pre Vašu webovú stránku, skopírujte a vložte ho na všetky stránky, ktoré chcete sledovať Matomoom.", - "JSTrackingIntro4": "Ak nechcete použiť JavaScript na sledovanie návštevníkov, %1$svygenerujte odkaz na sledovanie obrázkom nižšie%2$s.", - "JSTrackingIntro5": "Ak chcete robiť viac než len sledovať zobrazenia stránok, prosím pozrite sa na %1$sdokumentáciu JavaScriptového sledovania Matomoom%2$s pre zoznam dostupných funkcií. Použitím týchto funkcií môžete sledovať ciele, vlastné premenné, objednávky z elektronického obchodu a ďalšie.", - "JSTracking_DisableCookies": "Deaktivovať všetky sledovacie cookies", - "JSTracking_EnableDoNotTrack": "Aktivovať detekciu DoNotTrack u klienta", - "JSTracking_TrackNoScript": "Sledovať užívateľov s vypnutým JavaScriptom", - "JSTracking_VisitorCustomVars": "Sledovať vlastné premenné pre tohto zákazníka", - "JavaScriptTracking": "Sledovanie JavaScriptom", - "Login": "Prihlásenie", - "LogoUpload": "Vyberte logo pre nahranie", - "MenuDevelopment": "Vývoj", - "MenuDiagnostic": "Diagnostika", - "MenuGeneralSettings": "Všeobecné nastavenie", - "MenuMeasurables": "Metriky", - "MenuSystem": "Systém", - "OptOutComplete": "Odhlásenie nastavené. Vaše návštevy nebudú sledované nástrojom webovej analýzy.", - "OptOutCompleteBis": "Poznámka: ak zmažete cookie, odstránite vylučovací cookie alebo zmeníte počítač alebo prehliadač, budete musieť vykonať procedúru nastavenia odhlásenia znova.", - "OptOutForYourVisitors": "Odhlásenie pre Vašich návštevníkov", - "PersonalPluginSettings": "Osobné nastavenia modulu", - "PiwikIsInstalledAt": "Matomo je nainštalovaný na", - "PluginSettings": "Nastavenia modulov", - "PluginSettingsSaveFailed": "Uloženie nastavení modulu zlyhalo", - "PluginSettingsSaveSuccess": "Nastavenia modulu aktualizované.", - "ReleaseChannel": "Kanál vydania", - "SendPluginUpdateCommunication": "Poslať e-mail keď je dostupná aktualizácia modulu", - "SettingsSaveSuccess": "Nastavenia aktualizované.", - "TrackAGoal": "Sledovať cieľ", - "TrackingCode": "Kód sledovania", - "TrustedHostConfirm": "Ste si istí, že chcete zmeniť dôveryhodné hostname pre Matomo?", - "UncheckToOptOut": "Pre deaktiváciu analyzovania aktivít odstráňte označenie tohto zaškrtávacieho políčka.", - "UpdateSettings": "Aktualizovať nastavenia", - "UseCustomLogo": "Použiť vlastné logo", - "YouAreNotOptedOut": "Aktuálne nie ste odhlásený.", - "YouAreOptedOut": "Aktuálne ste odhlásený.", - "YouMayOptOut": "Zakliknutím v rámčeku nižšie, môžete zakázať uloženie cookie s identifikačným číslom prideleným vášmu počítaču a tým zamedziť prevádzkovateľovi tohto webu zhromažďovať a analyzovať štatistické údaje.", - "YouMayOptOut2": "Máte možnosť zabrániť analyzovaniu a prepájaniu aktivít, ktoré tu vykonáte.", - "YouMayOptOut3": "Vďaka tomu síce ochránite vaše súkromie, no zároveň zabránite prevádzkovateľovi v tom, aby sa poučil z vašich aktivít a aby mohol zlepšovať ovládateľnosť pre vás a ďalších používateľov.", - "YouMayOptOutBis": "Ak ste sa rozhodli pre túto možnosť, kliknite prosím na priložený odkaz pre uloženie deaktivačného cookie vo svojom prehliadači." - } -} diff --git a/plugins/CoreAdminHome/lang/sl.json b/plugins/CoreAdminHome/lang/sl.json deleted file mode 100644 index e5a0754c592e7f1fd5eae4d61ad354c611c4e87e..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/sl.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Dodajte nov zaupanja vreden strežnik", - "Administration": "Administracija", - "ArchivingSettings": "Nastavitve arhiviranja", - "BrandingSettings": "Nastavitve znamke", - "ClickHereToOptIn": "Kliknite tukaj za prijavo", - "ClickHereToOptOut": "Kliknite tukaj, če se želite odjaviti", - "CustomLogoFeedbackInfo": "Če želite prilagoditi Matomo logo, bi morda želeli tudi skriti povezavo %1$s v vrhnjem meniju. To lahko storite tako, da onemogočite vtičnik Feedback na strani %2$sUpravljanje vtičnikov%3$s.", - "CustomLogoHelpText": "Matomo-ov logo lahko prilagodite po vaših željah. Spremembe bodo vidne tako v uporabniškem vmesniku, kot v email poročilih.", - "EmailServerSettings": "Nastavitev strežnika za email", - "FaviconUpload": "Izberite Favicon datoteko za prenos", - "ForBetaTestersOnly": "Samo za Beta testerje", - "ImageTracking": "Sledenje s pomočjo slike", - "ImageTrackingIntro1": "Ko ima uporabnik onemogočen JavaScript ali, ko JavaScript ne more biti uporabljen, lahko za sledenje obiskovalcev uporabite povezavo na sliko.", - "ImageTrackingIntro2": "Spodaj generirajte povezavo in prekopirajte ustvarjeno HTML kodo na stran. Če uporabljate to funkcionalnost kot alternativo za JavaScript sledenje, obdajte kod z oznako %1$s.", - "ImageTrackingIntro3": "Za celoten seznam možnosti, ki so na voljo za povezavo za sledenje s pomočjo slike, poglejte %1$sTracking API documentacijo%2$s.", - "ImageTrackingLink": "Povezava za sledenje s pomočjo slike", - "JavaScriptTracking": "Sledenje s pomočjo Javascripta", - "Login": "vpis", - "LogoUpload": "Izberite Logo za nalaganje", - "MenuDevelopment": "Razvoj", - "MenuDiagnostic": "Diagnostika", - "MenuGeneralSettings": "Splošne nastavitve", - "MenuMeasurables": "Merjenje", - "OptOutComplete": "Odjavljeno; vaši obiski spletne strani ne bodo zabeleženi z orodjem za analitiko.", - "OptOutCompleteBis": "Upoštevajte, da če izbrišete piškotke, izbrišete tudi piškotek za onemogočanje analitike ali če spremenite računalnike ali spletne brskalnike, morate postopek odjave izvesti še enkrat.", - "OptOutDntFound": "Vaš brskalnik sporoča, da ne želite biti sledeni. To je nastavitev brskalnika, zato se ne boste mogli odločiti za sledenje, dokler ne onemogočite funkcije »Ne sledi« v vašem brskalniku.", - "OptOutExplanation": "Matomo želi zagotoviti zasebnost na internetu. Če želite svojim obiskovalcem omogočiti 'opt-out' iz Matomo spletne analitike, potem lahko dodate naslednjo HTML kodo na vašo spletno stran, npr. na stran 'Varovanje zasebnosti'.", - "OptOutForYourVisitors": "'Opt-out' za vaše obiskovalce", - "OptingYouOut": "Odjavljamo vas, prosimo počakajte…", - "PiwikIsInstalledAt": "Matomo je nameščen na", - "UseCustomLogo": "Uporabi poseben logo", - "YouAreOptedOut": "Trenutno niste prijavljeni.", - "YouMayOptOut": "Odločite se lahko, da vašemu računalniku ne dodelimo enolične številčne oznake, ki jo potrebujemo za statistično analizo podatkov na tem spletnem mestu.", - "YouMayOptOutBis": "Za uveljavitev te odločitve prosimo kliknite spodaj, prejeli boste piškotek v katerega se bo odločitev shranila." - } -} diff --git a/plugins/CoreAdminHome/lang/sq.json b/plugins/CoreAdminHome/lang/sq.json deleted file mode 100644 index 10ca8679531fce4e70c220ac1ce08dccaf453677..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/sq.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Pranojeni Ftesën", - "AddNewTrustedHost": "Shtoni një strehë të re të besuar", - "Administration": "Administrim", - "ArchivingSettings": "Rregullime arkivimi", - "BrandingSettings": "Rregullime marke", - "BruteForce": "Me Zor", - "CheckToOptIn": "I vini shenjë kësaj kutize që të zgjidhni përfshirjen.", - "ClickHereToOptIn": "Klikoni këtu për të kryer “opt in”.", - "ClickHereToOptOut": "Klikoni këtu për të kryer “opt out”.", - "CloudflareDescription": "Nëse sajti juaj strehohet në Cloudflare, ju lutemi, shihni %1$skëtë udhërrëfyes%2$s.", - "ConfirmDeleteAllTrackingFailures": "Jeni i sigurt se doni të fshihen krejt dështimet e ndjekjeve?", - "ConfirmDeleteThisTrackingFailure": "Jeni i sigurt se doni të fshihet ky dështim ndjekje?", - "Cors": "CORS", - "CorsDomains": "Përkatësi Cross-Origin Resource Sharing (CORS)", - "CorsDomainsHelp": "Mund të përkufizoni përkatësi ose nënpërkatësi të tilla si http://shembull.com ose http://stats.shembull.com. Ose, që të lejoni kërkesa ndërpërkatësore për krejt përkatësitë, thjesht shtoni *", - "CustomLogoFeedbackInfo": "Nëse e përshtatni logon e Matomo-s, mund t’ju interesonte edhe fshehja lidhjes %1$s te menuja në krye. Për ta bërë këtë, mund të çaktivizoni shtojcën e Përshtypjeve te faqja e %2$sAdministrimit të Shtojcave%3$s.", - "CustomLogoHelpText": "Logon e Matomo-s, që do të shfaqet në ndërfaqen e përdoruesit dhe raportet email, mund ta përshtatni si doni.", - "DeclineInvite": "Hidheni poshtë Ftesën", - "DeleteAllFailures": "Fshiji krejt dështimet", - "DevelopmentProcess": "Teksa procesi ynë i zhvillimit përfshin mijëra teste të automatizuara, Testuesit Beta luajnë një rol kyç në plotësimin e rregullit “Pa të Meta” në Matomo.", - "EmailServerSettings": "Rregullime shërbyesi email", - "ErrorEmailFromAddressNotValid": "Adresa SMTP për fushën Nga s’është e vlefshme", - "FaviconUpload": "Përzgjidhni për ngarkim një Favikonë", - "FileUploadDisabled": "Ngarkimi i kartelave s’është i aktivizuar te formësimi juaj për PHP-në. Që të ngarkoni logon tuaj vetjake, ju lutemi, caktoni %s te php.ini dhe rinisni shërbyesin tuaj web.", - "ForBetaTestersOnly": "Vetëm për testues beta", - "GoogleTagManagerDescription": "Nëse sajti juaj përdor Google Tag Manager, ju lutemi, shihni %1$skëtë udhërrëfyes%2$s.", - "HideAdvancedOptions": "Fshihi mundësitë e thelluara", - "HowToGetHelp": "Ka rrugë të ndryshme për të dhënë ndihmë. Ka asistencë falas përmes Bashkësisë Matomo dhe asistencë me pagesë dhënë nga ekipi Matomo dhe partnerë të Matomo-s. Apo ndoshta keni një të metë për të njoftuar, apo doni të sugjeroni një veçori të re?", - "HttpTrackingApi": "API Ndjekjesh HTTP", - "HttpTrackingApiDescription": "%1$sAPI për Ndjekje HTTP%2$s ju lejon të ndiqni ç’të doni. Kjo mund të jetë e dobishme, nëse po përdorni një gjuhë programimi për të cilën ende s’ka SDK. Mund të jetë e dobishme edhe kur doni të ndiqni pajisje apo aplikacione në një rrugë të veçantë.", - "ImageTracking": "Ndjekje Figurash", - "ImageTrackingIntro1": "Kur një vizitor e ka JavaScript-in të çaktivizuar, ose kur JavaScript-i s’përdoret dot, mund të përdorni një lidhje ndjekjeje figurash për të ndjekur vizitorët.", - "ImageTrackingIntro2": "Prodhojeni lidhjen më poshtë dhe kopjojeni dhe hidheni te faqja HTML-në e prodhuar. Nëse këtë e përdorni për rastet kur s’funksionon ndjekja përmes JavaScript-it, mund ta vendosni brenda etiketash %1$s.", - "ImageTrackingIntro3": "Për krejt listën e mundësive që mund të përdorni me një lidhje ndjekjeje figurash, shihni %1$sDokumentim API Ndjekjesh%2$s.", - "ImageTrackingLink": "Lidhje Ndjekjeje Figure", - "ImportFromGoogleAnalytics": "Importim prej Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Nëse keni një zotërim Google Analytics dhe po kaloni në Matomo, mund të importoni të dhënat tuaja ekzistuese duke përdorur shtojcën %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Një alternativë kundrejt ndjekjes së vizitorëve përmes shfletuesit (ose përmes JavaScript-it, ose përmes një lidhjeje figurash) është importimi i vazhdueshëm i regjistrave të shërbyesit. Mësoni më tepër rreth %1$sAnalizave me bazë Kartelash Regjistër të Shërbyesit%2$s.", - "InvalidPluginsWarning": "Shtojcat vijuese s’janë të përputhshme me %1$s dhe s’u ngarkuan dot: %2$s.", - "InvalidPluginsYouCanUninstall": "Këto shtojca mund t’i përditësoni ose çinstaloni që nga faqja %1$sAdministroni Shtojca%2$s.", - "JSTrackingDocumentationHelp": "Për përdorim të kollajtë, shumica e mundësive të thelluara më popullore janë të përdorshme më poshtë. Për më tepër mundësi (përfshi si të ndiqen synime, ndryshore vetjake, porosi e-tregtie dhe shporta të braktisura), ju lutemi, shihni %1$sdokumentim Ndjekjeje Javascript-i Matomo%2$s.", - "JSTrackingIntro1": "Vizitorët në sajtin tuaj mund t’i ndiqni në mjaft rrugë të ndryshme. Rruga e këshilluar për ta bërë është përmes JavaScript-it. Që të përdoret kjo metodë, duhet të garantoni që çdo faqe e sajtit tuaj të përmbajë një copëz kodi JavaScript, të cilin mund ta prodhoni nga këtu.", - "JSTrackingIntro2": "Pasi të keni kodin JavaScript të ndjekjeve për sajtin tuaj, kopjojeni dhe hidheni te krejt faqet që dëshironi të ndiqet me Matomo.", - "JSTrackingIntro3a": "Në shumicën e sajteve, blogjeve, CMS-ve, etj. mund të përdorni një shtojcë të gatshme, për të bërë punën teknike në vendin tuaj. (Shihni %1$slistën tonë të shtojcave të përdorura për integrim të Matomo-s%2$s).", - "JSTrackingIntro3b": "Nëse s’ka shtojcë të tillë, mund të përpunoni gjedhet e sajtit tuaj dhe të shtoni kodin JavaScript të ndjekjes te etiketa </head>, e cila shpesh përkufizohet brenda një kartele gjedhe 'header.php', 'header.tpl' ose të ngjashme.", - "JSTrackingIntro4": "Nëse s’doni të përdorni JavaScript-in për ndjekje vizitorësh, %1$sprodhoni më poshtë një lidhje ndjekjeje figurash%2$s.", - "JSTrackingIntro5": "Nëse dëshironi të bëni më shumë se sa thjesht ndjekje parjesh të faqeve, ju lutemi, hidhini një sy %1$sdokumentimit të Ndjekjeve Matomo me Javascript%2$s për listën e plotë të funksioneve të mundshëm. Duke përdorur këto funksione mund të ndiqni objektiva, ndryshore vetjake, porosi e-tregtie, shporta të braktisura, etj.", - "JSTracking_CampaignKwdParam": "Parametër Fjalëkyçesh Fushatash", - "JSTracking_CampaignNameParam": "Parametër Emrash Fushatash", - "JSTracking_CodeNoteBeforeClosingHead": "Klikoni mbi butonin që të kopjohet copëza e kodit dhe të ngjitet menjëherë para etiketës mbyllëse %1$s (e rekomanduar)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Bëni të mundur që ky kod të jetë i trupëzuar brenda një elementi programthi në çdo faqe të sajtit tuaj. Këshillojmë ta ngjitni mu para etiketës mbyllëse të kreut.", - "JSTracking_ConsentManagerConnected": "%1$s duket të jetë formësuar tashmë të funksionojë me Matomo-n.", - "JSTracking_ConsentManagerDetected": "Në sajtin tuaj u pikas përgjegjës pranimesh %1$s. Që të mësoni mbi formësimin e Matomo-s për të punuar me %1$s, ju lutemi, vizitoni %2$s", - "JSTracking_ConsentManagerEmailNote": "Ose mund të trupëzonit drejtpërsëdrejti në sajtin tuaj kodin e ndjekjes:", - "JSTracking_CrossDomain": "Si parazgjedhje, ID-ja e vizitorit që identifikon një vizitor unik depozitohet në cookies shfletuesi nga pala e interesuar, të cilat mund të lexohen vetëm nga faqe të së njëjtës përkatësi. Aktivizimi i lidhjes nga përkatësia në përkatësi ju lejon të ndiqni krejt veprimet dhe parjet e faqeve të një vizitori të dhënë për të njëjtën vizitë edhe kur ai sheh faqe në disa përkatësi. Kurdo që një përdorues klikon mbi një lidhje te një nga URL-të alias të sajtit tuaj, do të shtohet një parametër URL-je pk_vid që jep ID-në e Vizitorit.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Që të mund të përdorni lidhje ndërpërkatësore, duhet të përcaktoni më shumë se një emër përkatësie (URL-ra) për sajtin tuaj.", - "JSTracking_CustomCampaignQueryParam": "Përdorni emra vetjakë parametrash kërkese për emra dhe fjalëkyçe të fushatës", - "JSTracking_CustomCampaignQueryParamDesc": "Shënim: %1$sMatomo do të zbulojë vetvetiu parametra Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Çaktivizo Ndjekje Parametrash Fushate", - "JSTracking_DisableCampaignParametersDesc": "Kur kjo mundësi është me shenjë, Matomo s’do të ndjekë parametra fushate dhe këta do të hiqen nga URL-të e ndjekura.", - "JSTracking_DisableCookies": "Çaktivizo krejt cookie-t e ndjekjeve", - "JSTracking_DisableCookiesDesc": "Çaktivizon krejt cookie-t nga palë të para. Cookie-t ekzistuese Matomo për këtë sajt do të fshihen me parjen pasuese të faqeve.", - "JSTracking_EnableCrossDomainLinking": "Aktivizoni lidhje nga përkatësia në përkatësi", - "JSTracking_EnableDoNotTrack": "Aktivizoni zbulim MosMëGjurmo në anën e klientit", - "JSTracking_EnableDoNotTrackDesc": "Pra, s’do të dërgohen kërkesa ndjekjeje, nëse vizitorët dëshirojnë të mos ndiqen.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Shënim: Mbulimi i MosMëGjurmo-së në anën e shërbyesit është i aktivizuar, ndaj kjo mundësi s’do të ketë efekt.", - "JSTracking_EndNote": "Shënim: Te ndarja %1$sKod Ndjekjeje%2$s e përgjegjësit mund të prodhoni kod vetjak ndjekjesh.", - "JSTracking_GroupPageTitlesByDomain": "Paraprije titullin e faqes me përkatësinë e sajtit, kur kryhet ndjekje", - "JSTracking_GroupPageTitlesByDomainDesc1": "Pra, nëse dikush viziton faqen 'Rreth' te blog.%1$s, do të regjistrohet si 'blog / Rreth'. Kjo është rruga më e lehtë për të pasur një përmbledhje të trafikut tuaj sipas nënpërkatësish.", - "JSTracking_MergeAliases": "Te raporti “Lidhje për jashtë”, fshihni klikime mbi URL të njohura si aliase të", - "JSTracking_MergeAliasesDesc": "Pra, klikimet mbi lidhjet për te URL Aliasesh (p.sh., %s) nuk do të numërohen si “Lidhje për jashtë”.", - "JSTracking_MergeSubdomains": "Ndiq vizitorët nëpër krejt nënpërkatësitë e", - "JSTracking_MergeSubdomainsDesc": "Pra, nëse një vizitor viziton %1$s dhe %2$s, ai do të numërohet si një vizitor i vetëm.", - "JSTracking_PageCustomVars": "Ndiqni për çdo parje faqeje një ndryshore vetjake", - "JSTracking_PageCustomVarsDesc": "Për shembull, me emër ndryshoreje “Kategori” dhe vlerë “Artikuj Gazete”.", - "JSTracking_TrackNoScript": "Ndiq përdoruesit me JavaScript të çaktivizuar", - "JSTracking_VisitorCustomVars": "Ndiq ndryshore vetjake për këtë vizitor", - "JSTracking_VisitorCustomVarsDesc": "Për shembull, me emër ndryshoreje “Lloj” dhe vlerë “Klient”.", - "JavaScriptCode": "Kod JavaScript", - "JavaScriptTracking": "Ndjekje me JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Opsionale: përdorni mundësitë e thelluara për të përshtatur kodin tuaj të ndjekjeve.", - "JsTrackingCodeMissingEmail1": "Ca ditë më parë shtuat sajtin '%s' te Matomo Analytics i juaj. Sapo kontrolluam dhe Matomo-ja juaj s’duket të ketë të regjistruar trafik për këtë sajt.", - "JsTrackingCodeMissingEmail2": "Që të fillohet të ndiqen të dhëna dhe të merret ide mbi prirjet e përdoruesve tuaj, lypset të rregulloni ndjekjen në sajtin tuaj ose në aplikacionin për celular. Për sajte, thjesht trupëzoni në ta kodin e ndjekjes mu para etiketës %s.", - "JsTrackingCodeMissingEmail3": "Që të gjeni dhe përshtatni kodin tuaj të ndjekjeve, %1$sklikoni këtu%2$s (ose hidhini një sy %3$sudhërrëfyesit për Klient JavaScript Ndjekjesh%4$s).", - "LearnMore": "Mësoni më tepër", - "Login": "Hyrje", - "LogoNotWriteableInstruction": "Që të përdorni logon tuaj vetjake në vend të asaj parazgjedhje të Matomo-s, jepni të drejta shkrimi mbi këtë drejtori: %1$s Matomo lyp hyrje shkrimi për logot tuaja të depozituara në kartelat %2$s.", - "LogoUpload": "Përzgjidhni një Logo për ta ngarkuar", - "LogoUploadFailed": "Kartela e ngarkuar s’mund të përpunohej dot. Ju lutemi, kontrolloni nëse kartela ka një format të vlefshëm.", - "LogoUploadHelp": "Ju lutemi, ngarkoni një kartelë në formatet %1$s me lartësi minimum prej %2$s piksel.", - "LtsReleases": "Versionet LTS (Long Term Support) përfitojnë vetëm ndreqje sigurie dhe të metash.", - "MenuDevelopment": "Zhvillim", - "MenuDiagnostic": "Diagnostikim", - "MenuGeneralSettings": "Rregullime të përgjithshme", - "MenuMeasurables": "Të matshme", - "MenuSystem": "Sistem", - "MissingTrackingCodeEmailSubject": "S’ka regjistrim trafiku në Matomo Analytics for %s, fillojani tani", - "NTrackingFailures": "%s dështime ndjekjeje", - "NeedHelp": "Ju duhet ndihmë?", - "NoKnownFailures": "S’ka dështime ndjekjeje të njohura.", - "OptOutComplete": "“Opt-out” u plotësua; vizitat tuaja në këtë sajt s’do të regjistrohen nga mjeti Analiza Web.", - "OptOutCompleteBis": "Mbani parasysh që nëse i hiqni cookie-t tuaja, fshini cookie-in për “opt-out”, ose ndërroni kompjuter apo shfletues Web, do t’ju duhet të kryeni sërish procedurën për “opt-out”.", - "OptOutCustomOptOutLink": "Mundeni edhe të krijoni një formular plotësisht vetjak për zgjedhje lënie jashtë, duke përdorur HTML dhe JavaScript, siç shpjegohet në këtë %1$sudhërrëfyes%2$s zhvilluesish.", - "OptOutDntFound": "S’po ndiqeni, ngaqë shfletuesi juaj njofton se nuk doni të ndiqeni. Ky është një rregullim te shfletuesi juaj, ndaj s’do të jeni në gjendje të zgjidhni të kundërtën, para se të çaktivizoni veçorinë 'Mos Më Gjurmo'.", - "OptOutErrorNoCookies": "Mundësia për zgjedhje lënieje jashtë ndjekjes lyp që cookie-t të jenë të aktivizuara.", - "OptOutErrorNoTracker": "Veçoria e lënies jashtë nga ndjekja s’qe në gjendje të gjejë kod Ndjekësi Matomo në këtë faqe", - "OptOutErrorNotHttps": "Veçoria për zgjedhje lënieje jashtë ndjekjes mund të mos funksionojë, ngaqë ky sajt s’u ngarkua përmes HTTPS-je. Ju lutemi, ringarkojeni faqen që të shihni nëse gjendja për lënie jashtë ndryshoi.", - "OptOutErrorWindowOpen": "Veçoria për zgjedhje lënieje jashtë ndjekjes mund të mos funksionojë, ngaqë duket se dritarja flluskë për zgjedhjen qe bllokuar. Ju lutemi, ringarkojeni faqen që të shihni nëse gjendja për lënie jashtë ndryshoi.", - "OptOutExplanation": "Matomo-s është i përkushtuar ndaj mundësimit të privatësisë në Internet. Për t’u dhënë mundësinë e zgjedhjes së “opt-out” te Analizat Web Matomo, mund të shtoni kodin HTML vijues te një nga faqet e sajtit tuaj, për shembull, te faqja e Rregullave të Privatësisë.", - "OptOutExplanationIntro": "Ky kod do të shfaqë një div që përmban një lidhje me të cilën vizitorët të mund të zgjedhin “opt-out” për Matomo-n, duke depozituar një “opt-out cookie” në shfletuesin e tyre. Shihni më poshtë (ose %1$s klikoni këtu%2$s) që të shihni lëndën që do të shfaqet nga div-i.", - "OptOutForYourVisitors": "“Opt-out” i Matomo-s për vizitorët tuaj", - "OptingYouOut": "Po liheni jashtë kësaj, ju lutemi, pritni…", - "PersonalPluginSettings": "Rregullime Personale për Shtojcën", - "PiwikIsInstalledAt": "Matomo është instaluar te", - "PluginSettingChangeNotAllowed": "S’keni leje të ndryshoni vlerën e rregullimit “%1$s” te shtojca “%2$s”", - "PluginSettingReadNotAllowed": "S’keni leje të lexoni vlerën e rregullimit “%1$s” te shtojca “%2$s”", - "PluginSettings": "Rregullime Shtojce", - "PluginSettingsIntro": "Prej këtu mund të ndryshoni rregullimet për shtojcat vijuese nga palë të treta:", - "PluginSettingsSaveFailed": "S’u ruajtën dot rregullimet e shtojcës", - "PluginSettingsSaveSuccess": "Rregullimet e shtojcës u përditësuan.", - "PluginSettingsValueNotAllowed": "Vlera për fushën “%1$s” te shtojca “%2$s” s’është vlerë e lejuar", - "Problem": "Problem", - "ProtocolNotDetectedCorrectly": "Jeni duke e parë Matomo-n përmes një lidhjeje të sigurt SSL (po përdorni HTTPS), por Matomo mund të zbulojë vetëm një lidhje jo të sigurt me shërbyesin.", - "ProtocolNotDetectedCorrectlySolution": "Që ta bëni Matomo-n të kërkojë dhe shërbejë lëndën tuaj përmes HTTPS-je, mund të përpunoni kartelën tuaj %1$s dhe ose të formësoni rregullime ndërmjetësi, ose mund të shtoni rreshtin %2$s nën ndarjen %3$s. %4$sMësoni më tepër%5$s", - "ReactDescription": "Nëse sajti juaj përdor React, ju lutemi, shihni %1$skëtë udhërrëfyes%2$s.", - "ReleaseChannel": "Kanal hedhjesh në qarkullim", - "SecurityNotificationAllTokenAuthDeletedBody": "Dikush fshiu krejt token-ët e mirëfilltësimit në llogarinë tuaj.", - "SecurityNotificationAnonymousAccessEnabledBody": "Dikush aktivizoi hyrje përdoruesi anonim për %1$s. Kjo do të thotë se të dhënat për këtë sajt tani janë të passhme publikisht. Nëse kjo është në rregull, mos ngurroni ta shpërfillni këtë email.", - "SecurityNotificationCheckTwoFactor": "Ju lutemi, kontrolloni aplikacionin tuaj të mirëfilltësimit dyfaktorësh ose pajisjen tuaj.", - "SecurityNotificationEmailSubject": "Njoftim Sigurie", - "SecurityNotificationIfItWasYou": "Nëse qetë ju, vazhdoni. Nëse s’e njihni këtë veprimtari, ju lutemi, ricaktoni fjalëkalimin tuaj.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Dikush prodhoi kode të rinj rimarrjeje me mirëfilltësim dyfaktorësh për llogarinë tuaj.", - "SecurityNotificationRecoveryCodesShowedBody": "Dikush pa kodet e rimarrjes me mirëfilltësim dyfaktorësh të llogarisë tuaj.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Një tjetër superpërdorues (%1$s) ndryshoi rregullimet e sistemit. Rregullime të prekura: %2$s. Nëse dini gjë rreth kësaj veprimtarie, vazhdoni. Nëse s’e njihni këtë veprimtari, ju lutemi, lidhuni me superpërdorues të tjerë.", - "SecurityNotificationSettingsChangedByUserBody": "Dikush ndryshoi rregullimet e sistemit. Rregullime të prekura: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Dikush krijoi një token mirëfilltësimi (përshkrimi: %s) në llogarinë tuaj. Nëse s’qetë ju, fshijeni token-in.", - "SecurityNotificationTokenAuthDeletedBody": "Dikush fshiu një token mirëfilltësimi (përshkrim: %s) në llogarinë tuaj.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Dikush çaktivizoi mirëfilltësim dyfaktorësh në llogarinë tuaj.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Dikush aktivizoi mirëfilltësim dyfaktorësh në llogarinë tuaj.", - "SecurityNotificationUserAcceptInviteBody": "Përdoruesi (hyrje: %s) pranoi ftesën.", - "SecurityNotificationUserCreatedBody": "Dikush krijoi një përdorues të ri (kredenciale hyrjeje: %s) në llogarinë tuaj.", - "SecurityNotificationUserDeclinedInviteBody": "Përdoruesi (hyrja: %s) e hodhi poshtë ftesën.", - "SecurityNotificationUserDeletedBody": "Dikush fshiu një përdorues (kredenciale hyrjeje: %s) në llogarinë tuaj.", - "SendPluginUpdateCommunication": "Dërgo një email kur ka gati një përditësim shtojce", - "SendPluginUpdateCommunicationHelp": "Superpërdoruesve do t’u dërgohet një email kur për këtë shtojcë të ketë gati një version të ri.", - "SettingsSaveSuccess": "Rregullimet u përditësuan.", - "ShowAdvancedOptions": "Shfaq mundësi të thelluara", - "SinglePageApplicationDescription": "Nëse po ndiqni një aplikacion me një faqe të vetme (SPA), ose një aplikacion progresiv web (PWA), ju lutemi, shihni %1$skëtë udhërrëfyes%2$s.", - "Solution": "Zgjidhje", - "StableReleases": "Nëse Matomo është pjesë kritike e biznesit tuaj, ju këshillojmë të përdorni versionin më të ri të qëndrueshëm. Nëse përdorni versionin më të ri beta dhe gjeni një të metë ose keni një sugjerim, ju lutemi, %1$sshihni këtu%2$s.", - "SystemPluginSettings": "Rregullime Shtojce Sistemi", - "TrackAGoal": "Ndiqni një objektiv", - "TrackingCode": "Kod Ndjekjeje", - "TrackingCodeIntro": "Matomo ju ofron rrugë të ndryshme për të trupëzuar kod në sajtin tuaj, aplikacionin për celular, dhe madje për çfarëdo pajisjeje apo aplikacioni.", - "TrackingFailureAuthenticationProblem": "Kërkesa s’u mirëfilltësua, por mirëfilltësimi qe i domosdoshëm.", - "TrackingFailureAuthenticationSolution": "Caktoni ose ndreqni një “token_auth” te kërkesa juaj e ndjekjes.", - "TrackingFailureInvalidSiteProblem": "Sajti s’ekziston.", - "TrackingFailureInvalidSiteSolution": "Përditësoni te ndjekësi idSite-i që keni formësuar.", - "TrackingFailures": "Dështime ndjekjeje", - "TrackingFailuresEmail1": "Kjo bëhet vetëm për t’ju bërë të ditur se ditët e fundit kanë ndodhur %s lloje të ndryshme dështimesh ndjekjeje.", - "TrackingFailuresEmail2": "Që të shihni krejt kërkesat me ndjekje të dështuar %1$sklikoni këtu%2$s.", - "TrackingFailuresEmailSubject": "Dështime ndjekjeje te Matomo Analytics juaj", - "TrackingFailuresIntroduction": "Kjo faqe paraqet dështime ndjekjeje të ndodhura gjatë %s ditëve të fundit. Ju lutemi, kini parasysh që regjistrohen vetëm llojet më të rëndomta të dështimeve në ndjekje, jo krejt ato.", - "TrackingURL": "URL Ndjekjesh", - "TrustedHostConfirm": "Jeni i sigurt se doni të ndryshoni strehëemrin e besuar të Matomo-s?", - "TrustedHostSettings": "Strehëemër i Besuar Matomo", - "TwoFactorAuth": "Mirëfilltësim dyfaktorësh", - "UiDemo": "Demo UI", - "UncheckToOptOut": "Hiqjani shenjën kësaj kutize që të zgjidhni lënien jashtë.", - "UpdateSettings": "Rregullime përditësimesh", - "UseCustomLogo": "Përdorni një logo vetjake", - "UserInviteContent": "Këtë ftesë mund ta pranoni duke klikuar mbi butonin “Pranoje”, më poshtë.", - "UserInviteNotes": "Nëse s’e prisnit këtë ftesë, mund ta shpërfillni këtë email. Nëse %1$s po ju dërgon shumë email-e, mundeni ta bllokoni, ose të njoftoni abuzim. Ftesa skadon vetvetiu pas %2$s ditësh.", - "UserInviteSubject": "%1$s ju dërgoi një ftesë të merrni pjesë te Matomo Analytics për %2$s.", - "ValidPiwikHostname": "Strehëemër i Vlefshëm Matomo", - "ViewAllTrackingFailures": "Shihini krejt dështimet në ndjekje", - "VueDescription": "Nëse sajti juaj përdor Vue.js, ju lutemi, shihni %1$skëtë udhërrëfyes%2$s.", - "WhatIsNew": "Ç’ka të Re", - "WhatIsNewDoNotShowAgain": "Mos e rishfaq", - "WhatIsNewNoChanges": "S’ka gjë të re hëpërhë", - "WhatIsNewNoChangesTitle": "Pa ndryshime së fundi", - "WhatIsNewRemindMeLater": "Kujtoma më vonë", - "WhatIsNewTitle": "Ja ç’ka të re në Matomo", - "WhatIsNewTooltip": "Mësoni ç’ka të re në Matomo", - "WithOptionalRevenue": "me të ardhura opsionale", - "WordpressDescription": "Nëse sajti juaj përdor Wordpress, ju lutemi, shihni %1$skëtë udhërrëfyes%2$s.", - "YouAreNotOptedOut": "Nuk keni zgjedhur lënien jashtë.", - "YouAreOptedOut": "Tani jeni nën “opt-out”.", - "YouMayOptOut": "Mundet edhe të zgjidhni të mos ju përshoqërohet një numër unik identifikimi “cookie” analizash web për kompjuterin tuaj, për të shmangur mbledhjen dhe analizimin e të dhënave të mbledhura në këtë sajt.", - "YouMayOptOut2": "Mund të zgjidhni të pengohet ky sajt të grumbullojë dhe analizojë veprimet që ndërmerrni këtu.", - "YouMayOptOut3": "Duke bërë kështu do të mbrohet privatësia juaj, por do të pengohet i zoti të mësojë nga veprimet tuaja dhe të krijojë funksionim më të mirë për ju dhe përdorues të tjerë.", - "YouMayOptOutBis": "Për ta bërë këtë zgjedhje, ju lutem klikoni më poshtë që të merrni një “cookie” “opt-out”." - } -} diff --git a/plugins/CoreAdminHome/lang/sr.json b/plugins/CoreAdminHome/lang/sr.json deleted file mode 100644 index c43532ea599c85ad52f082463c0b4f00b6388343..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/sr.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Dodavanje novog hosta od poverenja", - "Administration": "Administracija", - "ArchivingSettings": "Podešavanja arhiviranja", - "BrandingSettings": "Podešavanje brendiranja", - "ClickHereToOptIn": "Kliknite za uključenje.", - "ClickHereToOptOut": "Kliknite za izuzeće.", - "CustomLogoFeedbackInfo": "Ako podesite Matomo logo, možda biste bili zainteresovani da sakrijete %1$s link iz glavnog menija. Da to uradite, možete isključiti Feedback plugin iz %2$sOrganizuj Plugin-ove%3$s.", - "CustomLogoHelpText": "Možete podesiti Matomo logo koji će biti prikazan u korisničkom interfejsu i E-Mail izveštajima.", - "EmailServerSettings": "Podešavanje servera za elektronsku poštu", - "FaviconUpload": "Izaberite ikonicu koju želite da postavite", - "FileUploadDisabled": "Otpremanje datoteka nije omogućeno u podešavanjima za vaš PHP. Da biste otpremili sopstveni logotip, molimo vas da postavite %s u php.ini i restartujete veb server.", - "ForBetaTestersOnly": "Samo za beta testere", - "ImageTracking": "Praćenje pomoću slike", - "ImageTrackingIntro1": "Kada korisnik isključi JavaScript ili kada JavaScript nije moguće koristiti, možete da koristite sliku za praćenje posetilaca.", - "ImageTrackingIntro2": "Generišite link i iskopirajte HTML na web stranicu. Ukoliko ovo koristite kao rezervni plan za praćenje putem JavaScript-a, možete ga zaokružiti %1$s tagovima.", - "ImageTrackingIntro3": "Za ceo spisak opcija koje možete koristiti uz link za praćenje preko slike, %1$spogledajte dokumentaciju%2$s.", - "ImageTrackingLink": "Link za praćenje preko slike", - "ImportingServerLogsDesc": "Alternativa praćenju posetilaca kroz čitač (bilo pomoću JavaScripta ili slike sa linkom) je konstantan uvoz serverskih logova. Pročitajte više o tome u %1$sAnalizi serverskih logova%2$s.", - "InvalidPluginsWarning": "Sledeći dodaci nisu kompatibilni sa %1$s te ne mogu biti učitani: %2$s.", - "InvalidPluginsYouCanUninstall": "Možete osvežiti ili deinstalirati ove dodatke na stranici %1$sUpravljanje dodacima%2$s.", - "JSTrackingIntro2": "Kada budete imali spreman JavaScript kod za praćenje, ubacite ga na sve stranice sajta koje želite da pratite sa Matomo-om.", - "JSTrackingIntro4": "Ukoliko ne želite da koristite JavaScript za praćenje posetilaca, %1$sgenerišite link za praćenje preko slike pomoću ovog linka%2$s.", - "JSTrackingIntro5": "Ukoliko želite da pratite više od prikaza stranica, pogledajte %1$sMatomo dokumentaciju za JavaScript praćenje%2$s za sve raspoložive funkcije. Pomoću tih funkcija možete pratiti ciljeve, korisnički definisane promenljive, elektronske porudžbine, napuštene korpe i još puno toga.", - "JSTracking_CampaignKwdParam": "Parametar ključne reči kampanje", - "JSTracking_CampaignNameParam": "Parametar naziva kampanje", - "JSTracking_CrossDomain": "Identifikatori posetilaca se smeštaju u kolačiće kojima mogu da pristupe samo stranice sa istog domena. Ako omogućite povezivanje između domena, možete da pratite akcije i preglede stranica određenog posetioca tokom jedne posete čak iako on gleda strane na različitim domenima. Kadgod posetioc klikne na neki od aliasa URL-ova vaših sajtova, biće dodat parametar pk_vid u kojem će se nalaziti identifikator tog posetioca.", - "JSTracking_CustomCampaignQueryParam": "Korišćenje korisnički definisanih parametara za nazive i ključne reči kampanje", - "JSTracking_CustomCampaignQueryParamDesc": "%1$sMatomo će automatski prepoznati Google Analytics parametre.%2$s", - "JSTracking_DisableCookies": "Isključi sve kolačiće koji služe za praćenje", - "JSTracking_DisableCookiesDesc": "Isključuje sve kolačiće koji se koriste za praćenje. Postojeći Matomo kolačići će biti obrisani pri sledećem prikazu stranice.", - "JSTracking_EnableCrossDomainLinking": "Omogućuje povezivanje između domena", - "JSTracking_EnableDoNotTrack": "Omogući prepoznavanje DoNotTrack sa klijentske strane", - "JSTracking_EnableDoNotTrackDesc": "Zahtevi za praćenjem neće biti slati ako posetilac ne želi da bude praćen.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "DoNotTrack podrška za serverske strane je uključena tako da ova opcija neće imati efekta.", - "JSTracking_EndNote": "Pažnja: možete generisati sopstveni kod za praćenje u odeljku %1$sKod za praćenje%2$s.", - "JSTracking_GroupPageTitlesByDomain": "Dodaj domen sajta ispred naslova stranice prilikom praćenja", - "JSTracking_GroupPageTitlesByDomainDesc1": "Ukoliko neko poseti 'O nama' stranicu na blogu,%1$s to će biti zabeleženo kao 'blog / O nama'. Ovo je najjednostavniji način pregleda saobraćaja po poddomenima.", - "JSTracking_MergeAliases": "U izveštaju \"Izlazni linkovi\", sakrij klikove na poznate aliase", - "JSTracking_MergeAliasesDesc": "Klikovi na aliase poput %s neće biti računati kao \"Izlazni linkovi\".", - "JSTracking_MergeSubdomains": "Prati posetioce kroz sve poddomene domena", - "JSTracking_MergeSubdomainsDesc": "Ukoliko jedan posetilac poseti i %1$s i %2$s, to će biti računato kao jedinstveni posetilac.", - "JSTracking_PageCustomVars": "Praćenje korisnički definisane promenljive za svaki prikaz stranice", - "JSTracking_PageCustomVarsDesc": "Na primer, sa promenljivom pod nazivom \"Kategorija\" i vrednošću \"Dokumenti\".", - "JSTracking_TrackNoScript": "Praćenje korisnika sa isključenim javaskriptom", - "JSTracking_VisitorCustomVars": "Praćenje korisnički definisanih promenljivih za ovog korisnika", - "JSTracking_VisitorCustomVarsDesc": "Na primer, pomoću promenljive sa nazivom \"Tip\" i vrednošću \"Korisnik\".", - "JavaScriptTracking": "Praćenje pomoću JavaScript-a", - "Login": "korisničko ime", - "LogoNotWriteableInstruction": "Ukoliko želite da koristite sopstveni logotip umesto Matomo logotipa, dodelite pravila upisivanja sledećem direktorijumu: %1$s Matomo-u je potrebna dozvola upisivanja za vaše logotipe koji se nalaze u datotekama %2$s.", - "LogoUpload": "Izaberite logo za kačenje", - "LogoUploadFailed": "Datoteku nije moguće obraditi. Molimo vas da proverite da li je format datoteke validan.", - "LogoUploadHelp": "Molimo vas da postavite datoteku u %1$s formatima minimalne visine %2$s piksela.", - "LtsReleases": "LTS (dugoročno podržane) verzije primaju samo sigurnosne i ispravke bagova.", - "MenuDevelopment": "Razvoj", - "MenuDiagnostic": "Dijagnostika", - "MenuGeneralSettings": "Osnovna podešavanja", - "MenuMeasurables": "Može da se meri", - "MenuSystem": "Sistem", - "OptOutComplete": "Opt-out je kompletiran; vaše posete ovom sajtu neće biti zabeležene od strane alata za web analitiku.", - "OptOutCompleteBis": "Imajte na umu da ako obrišete kolačiće ili promenite računar ili brauzer, da ćete morati ponovo da prođete kroz ovu proceduru.", - "OptOutDntFound": "Vaše akcije se ne beleže pošto vaš brauzer kaže da vi to ne želite. U pitanju je podešavanje u vašem brauzeru tako da nećete moći da se prijavite sve dok ne isključite 'Nemoj da me pratiš' opciju.", - "OptOutExplanation": "Matomo poštuje privatnost na Internetu. Kako biste omogućili vašim posetiocima da budu izuzeti iz Matomo analize, dodajte sledeći HTML kod na neku od stranica vaše sajta, na primer u polisu privatnosti", - "OptOutForYourVisitors": "Matomo opt-out za vaše posetioce", - "OptingYouOut": "Prijavljivanje, molimo vas sačekajte…", - "PersonalPluginSettings": "Lična podešavanja dodataka", - "PiwikIsInstalledAt": "Matomo je instaliran", - "PluginSettingChangeNotAllowed": "Nije vam dozvoljeno da promenite vrednost podešavanja \"%1$s\" u dodatku \"%2$s\"", - "PluginSettingReadNotAllowed": "Nije vam dozvoljeno da vidite vrednost podešavanja \"%1$s\" u dodatku \"%2$s\"", - "PluginSettings": "Podešavanja dodataka", - "PluginSettingsIntro": "Ovde možete promeniti podešavanja sledećih dodataka:", - "PluginSettingsSaveFailed": "Greška prilikom snimanja podešavanja dodataka", - "PluginSettingsSaveSuccess": "Podešavanja dodatka su ažurirana.", - "PluginSettingsValueNotAllowed": "Vrednost za polje \"%1$s\" u dodatku \"%2$s\" nije dozvoljena", - "ProtocolNotDetectedCorrectly": "Trenutno pristupate Matomo-u preko bezbedne SSL konekcije (korišćenjem HTTPS-a) ali Matomo detektuje samo nebezbednu konekciju sa serverom.", - "ProtocolNotDetectedCorrectlySolution": "Da biste bili sigurni da Matomo na bezbedan način zahteva i opslužuje sadržaje preko HTTPS-a, možete da izmenite datoteku %1$s i onda u njoj ili da podesite proksi server ili da dodate liniju %2$s u okviru sekcije %3$s. %4$sPročitajte više%5$s", - "ReleaseChannel": "Kanal realizacije", - "SendPluginUpdateCommunication": "Pošalji mejl svaki put kada se pojavi nova verzija dodatka", - "SendPluginUpdateCommunicationHelp": "Mejl će biti poslat superkorisnicima kad god se pojavi nova verzija ovog dodatka.", - "SettingsSaveSuccess": "Podešavanja su ažurirana.", - "StableReleases": "Ukoliko Matomo čini kritičan deo vašeg poslovanja, preporučujemo vam da koristite poslednju stabilnu verziju. Ukoliko koristite poslednju beta verziju i nađete bag ili imate predlog, molimo vas %1$spogledajte ovde%2$s.", - "SystemPluginSettings": "Sistemska podešavanja dodataka", - "TrackAGoal": "Praćenje cilja", - "TrackingCode": "Kod za praćenje", - "TrustedHostConfirm": "Da li ste sigurni da želite da promenite naziv Matomo hosta?", - "TrustedHostSettings": "Naziv Matomo hosta", - "UpdateSettings": "Ažuriraj podešavanja", - "UseCustomLogo": "Koristite svoj logo", - "ValidPiwikHostname": "Validni naziv Matomo hosta", - "WithOptionalRevenue": "sa opcionom zaradom", - "YouAreOptedOut": "Trenutno ste izuzeti iz statistike.", - "YouMayOptOut": "Možete da izaberete da nemate jedinstven identifikacioni broj vezan za vaš računar.", - "YouMayOptOutBis": "Ukoliko želite tako, molimo vas da kliknete ispod kako biste primili opt-out kolačić." - } -} diff --git a/plugins/CoreAdminHome/lang/sv.json b/plugins/CoreAdminHome/lang/sv.json deleted file mode 100644 index 665008a34e1edd83954db11fa6a45e158d20b4e7..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/sv.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Acceptera inbjudan", - "AddNewTrustedHost": "Lägg till en ny betrodd värd", - "Administration": "Administration", - "ArchivingSettings": "Inställningar för arkivering", - "BrandingSettings": "Varumärkesinställningar", - "BruteForce": "Råstyrka", - "CheckToOptIn": "Markera rutan för att vara med.", - "ClickHereToOptIn": "Klicka här för att gå med.", - "ClickHereToOptOut": "Klicka här för att gå ur.", - "CloudflareDescription": "Om din webbplats driftas med Cloudflare, vänligen se %1$sdenna guide%2$s.", - "ConfirmDeleteAllTrackingFailures": "Är du säker på att du vill radera samtliga misslyckade spårningsförsök?", - "ConfirmDeleteThisTrackingFailure": "Är du säker på att du vill radera detta misslyckade spårningsförsöket?", - "Cors": "CORS", - "CorsDomains": "Cross-Origin Resource Sharing (CORS) domäner", - "CorsDomainsHelp": "Du kan definiera domäner eller underdomäner som http://example.com eller http://stats.example.com. Eller för att tillåta att förfrågningar via korsdomän sker från alla domäner så lägger du bara till en *", - "CustomLogoFeedbackInfo": "Om du anpassar Matomo's logotyp, kanske du också är intresserad av att dölja %1$s länken i toppmenyn. För att göra detta kan du inaktivera pluginen Feedback på sidan %2$sHantera Plugins%3$s.", - "CustomLogoHelpText": "Du kan anpassa Matomo's logotyp som kommer att visas i användargränssnittet och i e-postrapporter.", - "DeclineInvite": "Tacka nej till inbjudan", - "DeleteAllFailures": "Radera samtliga misslyckanden", - "DevelopmentProcess": "Även fast vår utvecklingsprocess innefattar tusentals automatiska test, så utgör Beta Testarna en nyckelroll i Matomos \"Inga buggar policy\".", - "EmailServerSettings": "E-postinställningar (server)", - "ErrorEmailFromAddressNotValid": "SMTP-adressen är inte giltig", - "FaviconUpload": "Välj en Favicon att ladda upp", - "FileUploadDisabled": "Uppladdning av filer är inte aktiverat i din PHP-konfiguration. För att ladda upp din egen logo, sätt %s i php.ini och starta om din webbläsare.", - "ForBetaTestersOnly": "Endast för betatestare", - "GoogleTagManagerDescription": "Om din webbplats använder Google Tag Manager, vänligen se %1$sdenna guide%2$s.", - "HideAdvancedOptions": "Dölj avancerade valmöjligheter", - "HowToGetHelp": "Det finns flera sätt att få hjälp. Du kan få gratis support genom Matomos community eller välja att betala för support via Matomo-teamet eller någon partner till Matomo. Eller har du möjligen hittat en bugg att rapportera eller vill föreslå en ny funktion?", - "HttpTrackingApi": "HTTP Spårnings-API", - "HttpTrackingApiDescription": "Med %1$sHTTP Tracking API%2$s kan du spåra det mesta. Det här kan vara användbart om du använder ett programmeringsspråk för vilket ingen SDK finns än. Det kan också vara användbart när du vill spåra enheter eller applikationer på ett speciellt sätt.", - "ImageTracking": "Bildspårning", - "ImageTrackingIntro1": "När en besökare har inaktiverat JavaScript, eller när JavaScript inte kan användas, så kan du använda bildspårning för att spåra besökare.", - "ImageTrackingIntro2": "Generera länken här nedanför och klistra in HTML-koden på din sida. Om du använder det här som reservför språning med JavaScript, så kan du omringa koden med %1$s-taggar.", - "ImageTrackingIntro3": "Titta i %1$sdokumentationen för Spårnings-API%2$s ör att se hela listan med alternativ för bildspårning.", - "ImageTrackingLink": "Bildspårningslänk", - "ImportFromGoogleAnalytics": "Importera från Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Om du har en Google Analytics egendom och byter till Matomo kan du importera dina befintliga data genom att använda insticksprogram %1$s GoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Ett alternativ till att spåra besökare via webbläsaren (antingen via JavaScript eller en bildlänk) är att kontinuerligt importera serverloggar. Läs mer om %1$sServer loggfilanalys%2$s.", - "InvalidPluginsWarning": "Följande plugin är inte kompatibelt med %1$s och kunde inte laddas: %2$s.", - "InvalidPluginsYouCanUninstall": "Du kan uppdatera eller installera plugins på vår %1$shantera plugin sida%2$s.", - "JSTrackingDocumentationHelp": "För snabb åtkomst visas de mer populära avancerade valmöjligheterna nedan. För fler valmöjligheter (inklusive hur spåra mål, anpassade variabler, ordrar i ehandel och övergivna kundvagnar) vänligen kolla på %1$sMatomos Javascript-spårningsdokumentation%2$s.", - "JSTrackingIntro1": "Du kan spåra din webbplats besökare på många olika vis. Det rekommenderade sättet att göra det är med hjälp av JavaScript. För att använda den här metoden behöver du se till att varje sida på din webbplats innehåller lite JavaScript-kod, som du kan skapa här.", - "JSTrackingIntro2": "När du har JavaScripts spårningskod till din webbsida, kopiera och klistra in det på alla sidor du vill spåra med Matomo.", - "JSTrackingIntro3a": "På de flesta webbplatser, bloggar, CMS:er osv kan du använda ett förberett insticksprogram som gör det tekniska arbetet åt dig. (Se vår %1$s lista med insticksprogram som används för att integrera Matomo %2$s.)", - "JSTrackingIntro3b": "Om det inte finns något insticksprogram kan du redigera din webbplats mallar och lägga till JavaScript-spårningskoden till taggen </head> vilken ofta definieras i 'header.php', 'header.tpl' eller liknande fil för mallar.", - "JSTrackingIntro4": "Om du inte vill använda JavaScript för att spåra besökare, %1$sgenerera en bild spårningslänk nedan%2$s.", - "JSTrackingIntro5": "Om du vill göra mer än att spåra antal sedda sidor, titta på %1$sMatomos lista av dokumentation för Javascripts Spårning%2$s, där hittar du en lista med tillgängliga funktioner. Använd dessa funktioner för att spåra mål, skräddarsy variabler, e-handel, övergivna korgar med mera.", - "JSTracking_CampaignKwdParam": "Parameter för nyckelorden i kampanjen", - "JSTracking_CampaignNameParam": "villkor för kampanjnamn", - "JSTracking_CodeNoteBeforeClosingHead": "Klicka på knappen för att kopiera kodsnutten och klistra in den direkt innan den avslutande %1$s taggen (rekommenderas)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Försäkra dig om att denna kod läggs till inom ett skriptelement på varje sida av din webbplats. Vi rekommenderar att klistra in den precis före den avslutande head-taggen.", - "JSTracking_ConsentManagerConnected": "%1$s tycks redan vara konfigurerad för att fungera tillsammans med Matomo.", - "JSTracking_ConsentManagerDetected": "Samtyckeshanteraren %1$s hittades på din webbplats. För att lära dig mer om hur du konfigurerar Matomo för att fungera med %1$s vänligen besök %2$s", - "JSTracking_ConsentManagerEmailNote": "Eller så kan bädda in spårningskoden direkt på din webbplats istället:", - "JSTracking_CrossDomain": "Som standard lagras besökarens ID i webbläsarens förstapartscookies som bara kan nås från samma domän. Genom att möjliggöra cross domain-länkning kan du spåra alla aktiviteter och sidvisningar av en användare även om de besöker flera olika domäner. När en användare klickar på en länk till en alias-URL kommer den lägga till URL-parametern pk_vid för att vidarebefordra besökarens ID.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Notering: Om du vill använda korsdomän måste du ange mer än ett domännamn (webbadresser) för din webbplats.", - "JSTracking_CustomCampaignQueryParam": "Använd egna frågeparametrars namn för kampanjnamn och nyckelord", - "JSTracking_CustomCampaignQueryParamDesc": "Observera: %1$sMatomo kommer automatiskt upptäcka parametrar för Google Analytics. %2$s", - "JSTracking_DisableCampaignParameters": "Inaktivera spårning av kampanjparametrar", - "JSTracking_DisableCampaignParametersDesc": "När det här alternativet är valt kommer Matomo inte att spåra kampanjparametrar och de tas bort från spårade URLar.", - "JSTracking_DisableCookies": "Inaktivera spårnings cookies", - "JSTracking_DisableCookiesDesc": "Inaktiverar alla förstapartskakor. Befintliga Matomo-kakor för denna webbsida kommer att raderas vid nästa sidvisning.", - "JSTracking_EnableCrossDomainLinking": "Möjliggör cross domain-länkning", - "JSTracking_EnableDoNotTrack": "Aktivera klientsidan för sidan \"SpåraInte\" upptäckt", - "JSTracking_EnableDoNotTrackDesc": "Ingen spårningsförfrågan kommer att skickas om inte besökare önskar att bli spårade.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Observera: Rapporten till serversidan DoNotTrack har aktiverats, så det här valet kommer inte att ha någon effekt.", - "JSTracking_EndNote": "OBS: Du kan skapa anpassad spårkningskod under %1$sSpårningskod %2$si administrationsgränssnittet.", - "JSTracking_GroupPageTitlesByDomain": "Lägg till webbplatsens domän till sidans titel vid spårning", - "JSTracking_GroupPageTitlesByDomainDesc1": "Om någon besöker \"om\" sidan på din blogg .%1$s så kommer besökets registreras som \"ditt-blogg-namn/om\". Det här är det enklaste sättet för dig att få en överblick av din sub-domänstrafik.", - "JSTracking_MergeAliases": "I rapporten för \"utlänkar\", dölj klick till kända URL för", - "JSTracking_MergeAliasesDesc": "Klick på länkar till användarnamn och URL:s (till exempel %s) kommer inte räknas som en \"ut-länk\".", - "JSTracking_MergeSubdomains": "Spåra besökare på alla underdomäner av", - "JSTracking_MergeSubdomainsDesc": "Om en besökare besöker %1$s och %2$s, kommer de räknas som en unik besökare.", - "JSTracking_PageCustomVars": "Spåra en anpassad variabel för varje sidvisning", - "JSTracking_PageCustomVarsDesc": "Till exempel med varierande namn \"kategori\" och värde \"vita papper\".", - "JSTracking_TrackNoScript": "Spåra användare utan JavaScript", - "JSTracking_VisitorCustomVars": "Spåra anpassade variabler för denna besökare", - "JSTracking_VisitorCustomVarsDesc": "Till exempel med varierande namn \"sort\" och värde \"kund\".", - "JavaScriptCode": "Javascript-kod", - "JavaScriptTracking": "Spårning med JavaScript", - "JsTrackingCodeAdvancedOptionsStep": "Valfritt: Använd de avancerade inställningarna för att skräddarsy din spårningskod.", - "JsTrackingCodeMissingEmail1": "För några dagar sedan lade du till webbsidan '1%s' till Matomo Analytics. Vi kontrollerade precis och din Matomo ser inte ut att ha någon trafik registrerad för webbsidan.", - "JsTrackingCodeMissingEmail2": "För att börja spåra data och få insikt om dina användare behöver du starta spårningen på din webbsida eller app. För webbsidor är det bara att lägga till spårningskoden precis innan %s-taggen.", - "JsTrackingCodeMissingEmail3": "%1$sKlicka här%2$s för att visa eller anpassa din spårningskod (eller ta en titt på %3$sJavaScript Tracking Client-guiden%4$s).", - "LearnMore": "Läs mer", - "Login": "Inloggning", - "LogoNotWriteableInstruction": "Om du vill använda din egen logotyp istället för Matomos logotyp, se till så att det finns skrivrättigheter till denna katalog: %1$s. Matomo behöver skrivrättighet för dina logotyper som lagras i filerna %2$s.", - "LogoUpload": "Välj en logotyp att ladda upp", - "LogoUploadFailed": "Den uppladdade filen kunde inte behandlats. Var snäll och kontrollera om filen är i giltigt format.", - "LogoUploadHelp": "Ladda upp en fil i %1$s format med en minsta höjd på %2$s pixlar.", - "LtsReleases": "LTS-versioner (långtidstöd) får endast säkerhet- och buggfixar.", - "MenuDevelopment": "Utveckling", - "MenuDiagnostic": "Diagnostik", - "MenuGeneralSettings": "Allmänna inställningar", - "MenuMeasurables": "Mätbara enheter", - "MenuSystem": "System", - "MissingTrackingCodeEmailSubject": "Ingen trafik har registrerats i Matomo Analytics för %s , kom igång nu", - "NTrackingFailures": "%s misslyckade spårningsförsök", - "NeedHelp": "Behöver du hjälp?", - "NoKnownFailures": "Det finns inga kända misslyckade spårningar.", - "OptOutComplete": "Exkludering utförd; dina besök på denna webbplatsen kommer inte att spåras av webbanalys-verktyget.", - "OptOutCompleteBis": "Observera att om du rensar cookies, tar bort cookien för exkludering eller om du byter dator eller webbläsare måste du utföra exkluderingen igen.", - "OptOutCustomOptOutLink": "Du kan också skapa ett anpassat formulär för opt-out med hjälp av HTML och Javascript, vilket beskrivs i %1$sdenna utvecklarguide%2$s.", - "OptOutDntFound": "Du spåras inte eftersom din webbläsare rapporterar att du inte vill det. Detta är en inställning i webbläsaren så du kan inte delta för än du avaktiverat 'Do Not Track'.", - "OptOutErrorNoCookies": "Funktionen för opt-out från spårning kräver att cookies är aktiverade.", - "OptOutErrorNoTracker": "Funktionen för att tacka nej till spårning kunde inte hitta Matomos spårningskod på denna sida", - "OptOutErrorNotHttps": "Funktionen för opt-out från spårning kanske inte fungerar eftersom denna webbplats inte laddades över HTTPS. Ladda om sidan för att kolla om din opt-out status ändrats.", - "OptOutErrorWindowOpen": "Funktionen för opt-out från spårning kanske inte fungerar eftersom det ser ut som att opt-out popupen blockerades. Vänligen ladda om sidan för att kolla om din opt-out status ändrats.", - "OptOutExplanation": "Matomo är dedikerat till att erbjuda personlig integritet på Internet. För att ge dina besökare möjligheten att välja om de ska exkluderas från Matomos webbanalys, kan du lägga till följande HTML-kod på någon av din webbplats sidor, t.ex. på en sida om sekretesspolicy.", - "OptOutExplanationIntro": "Denna kod kommer att visas i en div-tagg som innehåller en länk så att dina besökare kan välja bort Matomo genom att sätta en cookie i sina webbläsare. Se nedan (eller %1$s klicka här%2$s) för att visa innehållet som kommer att visas i div-taggen.", - "OptOutForYourVisitors": "Exkludera spårning för dina besökare", - "OptingYouOut": "Undantar dig, vänligen vänta…", - "PersonalPluginSettings": "Personliga plugininställningar", - "PiwikIsInstalledAt": "Matomo är installerat på", - "PluginSettingChangeNotAllowed": "Det är inte tillåtet att ändra värdet i inställningar för \"%1$s\" i plugin \"\"%2$s\"", - "PluginSettingReadNotAllowed": "Du har inte rättighet att läsa värdet för inställningen \"%1$s\" i tillägget \"%2$s\"", - "PluginSettings": "Inställningar för plugin", - "PluginSettingsIntro": "Här kan du ändra inställningarna för tredjepartsplugin:", - "PluginSettingsSaveFailed": "Kunde inte spara plugin-inställningar", - "PluginSettingsSaveSuccess": "Plugininställningar uppdaterade.", - "PluginSettingsValueNotAllowed": "Värdet för \"%1$s\" i fältet i \"%2$s\"-pluginet är inte tillåtet", - "Problem": "Problem", - "ProtocolNotDetectedCorrectly": "Du använder just nu Matomo över en säker SSL-anslutning (via HTTPS), men Matomo kan bara upptäcka en osäker anslutning på servern.", - "ProtocolNotDetectedCorrectlySolution": "För att säkerställa att Matomo gör förfrågningar och visar ditt innehållet säkert så görs detta över HTTPS, du kan ändra detta i filen %1$s och antingen konfigurera dina proxyinställningar eller lägga till raden %2$s nedanför sektionen %3$s. %4$sLäs mer%5$s", - "ReactDescription": "Om din webbplats använder React, vänligen se %1$sdenna guide%2$s.", - "ReleaseChannel": "Lanseringskanal", - "SecurityNotificationAllTokenAuthDeletedBody": "Någon raderade samtliga auth-tokens för ditt konto.", - "SecurityNotificationAnonymousAccessEnabledBody": "Någon aktiverade anonym användaråtkomst för %1$s. Detta innebär att informationen för denna webbplats nu är allmänt tillgänglig. Om detta är ok, ignorera gärna detta e-postmeddelande.", - "SecurityNotificationCheckTwoFactor": "Vänligen titta i din app (eller utrustning) för tvåfaktorsautentisering.", - "SecurityNotificationEmailSubject": "Säkerhetsnotifiering", - "SecurityNotificationIfItWasYou": "Om det var du är det är bara att jobba på. Om du inte känner igen denna aktivitet bör du återställa ditt lösenord.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Någon skapade nya återställningskoder för tvåfaktorsautentisering för ditt konto.", - "SecurityNotificationRecoveryCodesShowedBody": "Någon tittade på återställningskoderna för tvåfaktorsautentisering för ditt konto.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "En annan superanvändare (%1$s) ändrade systeminställningar. Påverkade inställningar: %2$s. Om du är medveten om denna aktivitet är det bara att jobba på. Om du inte känner till detta bör du kontakta de andra superanvändarna.", - "SecurityNotificationSettingsChangedByUserBody": "Någon ändrade systeminställningar. Påverkade inställningar: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Någon skapade en auth-token (beskrivning: %s) för ditt konto. Om det inte var du bör du radera denna token.", - "SecurityNotificationTokenAuthDeletedBody": "Någon raderade en beskrivning av en auth-token (beskrivning: %s) för ditt konto.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Någon inaktiverade tvåfaktorsautentisering för ditt konto.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Någon aktiverade tvåfaktorsautentisering för ditt konto.", - "SecurityNotificationUserAcceptInviteBody": "Användaren (%s) accepterade inbjudan.", - "SecurityNotificationUserCreatedBody": "Någon skapade en ny användare (användarnamn: %s) för ditt konto.", - "SecurityNotificationUserDeclinedInviteBody": "Användaren (%s) tackade nej till inbjudan.", - "SecurityNotificationUserDeletedBody": "Någon raderade en användare (användarnamn: %s) i ditt konto.", - "SendPluginUpdateCommunication": "Skicka e-post när pluginuppdateringar finns tillgängliga", - "SendPluginUpdateCommunicationHelp": "Ett e-postmeddelande kommer att skickas till superanvändarna när det finns en ny uppdatering för ett plugin.", - "SettingsSaveSuccess": "Inställningar uppdaterade.", - "ShowAdvancedOptions": "Visa avancerade valmöjligheter", - "SinglePageApplicationDescription": "Om du spårar en SPA- eller PWA-webbplats, vänligen läs %1$sdenna guide%2$s.", - "Solution": "Lösning", - "StableReleases": "Om Matomo är en viktig del av dina affärer, rekommenderar vi dig att använda den senaste versionen. Om du använder den senaste beta versionen och hittar en bugg eller har ett förslag, var vänlig att gå in %1$shär%2$s.", - "SystemPluginSettings": "Plugininställningar", - "TrackAGoal": "Monitorera ett mål", - "TrackingCode": "Spårningskod", - "TrackingCodeIntro": "Matomo erbjuder dig flertalet sätt att inkludera spårningskoden för din webbplats, mobilapp och till och med för någon enhet eller applikation.", - "TrackingFailureAuthenticationProblem": "Förfrågan var inte autentiserad men autentisering krävs.", - "TrackingFailureAuthenticationSolution": "Ange eller korrigera en \"token_auth\" i din spårningsbegäran.", - "TrackingFailureInvalidSiteProblem": "Webbplatsen finns inte.", - "TrackingFailureInvalidSiteSolution": "Uppdatera det konfigurerade idSite i spåraren.", - "TrackingFailures": "Misslyckade spårningar", - "TrackingFailuresEmail1": "Bara så du vet, har %s olika sorters misslyckade spårningsförsök inträffat de senaste dagarna.", - "TrackingFailuresEmail2": "%1$sKlicka här%2$s för att visa samtliga misslyckade spårningsförsök.", - "TrackingFailuresEmailSubject": "Misslyckade spårningsförsök i ditt Matomo Analytics", - "TrackingFailuresIntroduction": "Den här sidan visar spårningsförsök som misslyckats de senaste %s dagarna. Observera att inte alla sorters misslyckade spårningar registreras, bara de vanligaste.", - "TrackingURL": "Spårningslänk", - "TrustedHostConfirm": "Är du säker på att du vill ändra Matomo's betrodda värdnamn?", - "TrustedHostSettings": "Betrodd Matomo Värdnamn", - "TwoFactorAuth": "Tvåfaktorsautentisering", - "UiDemo": "UI Demo", - "UncheckToOptOut": "Avmarkera rutan för att inte vara med.", - "UpdateSettings": "Uppdatera inställningar", - "UseCustomLogo": "Använd en anpassad logotyp", - "UserInviteContent": "Du kan acceptera inbjudan genom att klicka på acceptera-knappen nedan.", - "UserInviteNotes": "Om du inte förväntade dig denna inbjudan kan du bortse från detta mejl. Om %1$s skickar dig för många mejl kan du blockera dem eller rapportera dem. Inbjudan kommer automatiskt att löpa ut om %2$s dagar.", - "UserInviteSubject": "%1$s skickade dig en inbjudan att använda Matomo Analytics för %2$s.", - "ValidPiwikHostname": "Giltig Matomo Värdnamn", - "ViewAllTrackingFailures": "Visa samtliga misslyckade spårningsförsök", - "VueDescription": "Om din webbplats använder Vue.js, vänligen se %1$sdenna guide%2$s.", - "WhatIsNew": "Nyheter", - "WhatIsNewDoNotShowAgain": "Visa inte igen", - "WhatIsNewNoChanges": "Det finns inget nytt för närvarande", - "WhatIsNewNoChangesTitle": "Inga förändringar nyligen", - "WhatIsNewRemindMeLater": "Påminn mig senare", - "WhatIsNewTitle": "Det här är nytt i Matomo", - "WhatIsNewTooltip": "Se vad som är nytt i Matomo", - "WithOptionalRevenue": "Med alternativ avkastning", - "WordpressDescription": "Om din webbplats använder Wordpress, vänligen se %1$sdenna guide%2$s.", - "YouAreNotOptedOut": "Du har inte valt bort det.", - "YouAreOptedOut": "Du är just nu exkluderad.", - "YouMayOptOut": "Du kan välja att inte ha ett unikt identifieringsnummer i en cookie tilldelad till din dator för att undvika analys av uppgifter som samlats in på denna webbplats.", - "YouMayOptOut2": "Du kan välja att neka den här webbplatsen tillstånd att samla in och analysera information om dina handlingar här.", - "YouMayOptOut3": "Genom att göra så kommer du skydda din integritet, men kommer även hindra ägaren att lära från dina handlingar och därigenom skapa en bättre upplevelse för dig och andra användare.", - "YouMayOptOutBis": "För att göra det valet, vänligen klicka nedan för att lagra en cookie för exkludering." - } -} diff --git a/plugins/CoreAdminHome/lang/ta.json b/plugins/CoreAdminHome/lang/ta.json deleted file mode 100644 index 90ae92182cad9bb7ecce0d9f79b859cba060e634..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ta.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "அழைப்பை ஏற்றுக்கொள்ளுங்கள்", - "AddNewTrustedHost": "புதிய நம்பகமான ஓச்டைச் சேர்க்கவும்", - "Administration": "ஆட்சி", - "ArchivingSettings": "காப்பக அமைப்புகள்", - "BrandingSettings": "வர்த்தக அமைப்புகள்", - "BruteForce": "முரட்டுத்தனமான படை", - "CheckToOptIn": "இந்த பெட்டியை தேர்வு செய்யவும்.", - "ClickHereToOptIn": "விலக இங்கே சொடுக்குங்கள்.", - "ClickHereToOptOut": "வெளியற இங்கே சொடுக்குங்கள்.", - "CloudflareDescription": "உங்கள் வலைத்தளம் கிளவுட்ஃப்ளேரில் புரவலன் செய்யப்பட்டால், தயவுசெய்து %1$sஇந்த வழிகாட்டி %2$s ஐப் பார்க்கவும்.", - "ConfirmDeleteAllTrackingFailures": "அனைத்து கண்காணிப்பு தோல்விகளையும் நீக்க விரும்புகிறீர்களா?", - "ConfirmDeleteThisTrackingFailure": "இந்த கண்காணிப்பு தோல்வியை நீக்க விரும்புகிறீர்களா?", - "Cors": "கோர்ச்", - "CorsDomains": "குறுக்கு-ஆரிசின் வள பகிர்வு (CORS) களங்கள்", - "CorsDomainsHelp": "நீங்கள் http://example.com அல்லது http://stats.example.com போன்ற களங்கள் அல்லது துணை டொமைன்களை வரையறுக்கலாம். அல்லது அனைத்து களங்களுக்கும் குறுக்கு டொமைன் கோரிக்கைகளை அனுமதிக்க * ஒரு * சேர்க்கவும்", - "CustomLogoFeedbackInfo": "நீங்கள் மாடோமோ லோகோவைத் தனிப்பயனாக்கினால், மேல் பட்டியலில் %1$s இணைப்பை மறைக்க ஆர்வமாக இருக்கலாம். அவ்வாறு செய்ய, நீங்கள் %2$s ச்மனேச் செருகுநிரல்கள் %3$s பக்கத்தில் பின்னூட்ட சொருகி முடக்கலாம்.", - "CustomLogoHelpText": "பாவனையாளர் பக்கத்திலும் மின்னஞ்சல் அறிக்கைகளிலும் காட்சிப்படுத்தப்படும் Matomo இலட்ச்சனையை உங்களால் மாற்ற முடியும்.", - "DeclineInvite": "மறுப்பு அழைப்பை", - "DeleteAllFailures": "எல்லா தோல்விகளையும் நீக்கவும்", - "DevelopmentProcess": "எங்கள் மேம்பாட்டு செயல்முறையில் ஆயிரக்கணக்கான தானியங்கி சோதனைகள் அடங்கும், பீட்டா சோதனையாளர்கள் மாடோமோவில் \"பிழைக் கொள்கை இல்லை\" என்பதை அடைவதில் முக்கிய பங்கு வகிக்கின்றனர்.", - "EmailServerSettings": "மின்னஞ்சல் வழங்கி அமைப்புக்கள்", - "ErrorEmailFromAddressNotValid": "முகவரியிலிருந்து SMTP செல்லுபடியாகாது", - "FaviconUpload": "பதிவேற்ற ஒரு ஃபேவிகானைத் தேர்ந்தெடுக்கவும்", - "FileUploadDisabled": "உங்கள் பிஎச்பி உள்ளமைவில் கோப்புகளைப் பதிவேற்றுவது இயக்கப்படவில்லை. உங்கள் தனிப்பயன் சின்னத்தை பதிவேற்ற தயவுசெய்து php.ini இல் %s ஐ அமைத்து உங்கள் வெப்சர்வரை மறுதொடக்கம் செய்யுங்கள்.", - "ForBetaTestersOnly": "பீட்டா நிலை பரிசோதனையாளர்களுக்கு மட்டும்", - "GoogleTagManagerDescription": "உங்கள் வலைத்தளம் கூகிள் குறிச்சொல் மேலாளரைப் பயன்படுத்துகிறது என்றால், தயவுசெய்து %1$sஇந்த வழிகாட்டி %2$s ஐப் பார்க்கவும்.", - "HideAdvancedOptions": "மேம்பட்ட விருப்பங்களை மறைக்கவும்", - "HowToGetHelp": "நீங்கள் உதவி பெற பல்வேறு வழிகள் உள்ளன. மாடோமோ சமூகம் வழியாக இலவச உதவி மற்றும் மாடோமோ குழு மற்றும் மாடோமோவின் கூட்டாளர்கள் வழங்கிய கட்டண உதவி உள்ளது. அல்லது புகாரளிக்க உங்களிடம் பிழை இருக்கலாம் அல்லது புதிய அம்சத்தை பரிந்துரைக்க விரும்புகிறீர்களா?", - "HttpTrackingApi": "HTTP கண்காணிப்பு பநிஇ", - "HttpTrackingApiDescription": "%1$shttp கண்காணிப்பு பநிஇ %2$s எதையும் கண்காணிக்க உங்களை அனுமதிக்கிறது. நீங்கள் இன்னும் SDK இல்லாத நிரலாக்க மொழியைப் பயன்படுத்துகிறீர்கள் என்றால் இது பயனுள்ளதாக இருக்கும். சாதனங்கள் அல்லது பயன்பாடுகளை நீங்கள் ஒரு சிறப்பு வழியில் கண்காணிக்க விரும்பும் போது இது பயனுள்ளதாக இருக்கும்.", - "ImageTracking": "சிறு படம் மூலம் கண்காணிப்பு செய்ய", - "ImageTrackingIntro1": "ஒரு பார்வையாளர் சாவாச்கிரிப்டை முடக்கியிருக்கும்போது, அல்லது சாவாச்கிரிப்டைப் பயன்படுத்த முடியாதபோது, பார்வையாளர்களைக் கண்காணிக்க பட கண்காணிப்பு இணைப்பைப் பயன்படுத்தலாம்.", - "ImageTrackingIntro2": "கீழே உள்ள இணைப்பை உருவாக்கி, உருவாக்கப்பட்ட உஉகுமொ ஐ பக்கத்தில் நகலெடுக்கவும். சாவாச்கிரிப்ட் கண்காணிப்புக்கான குறைவடைப்பாக நீங்கள் இதைப் பயன்படுத்துகிறீர்கள் என்றால், நீங்கள் அதை %1$s குறிச்சொற்களில் சூழ்ந்து கொள்ளலாம்.", - "ImageTrackingIntro3": "படக் கண்காணிப்பு இணைப்புடன் நீங்கள் பயன்படுத்தக்கூடிய விருப்பங்களின் முழு பட்டியலுக்கும், %1$s ச்ட்ராக்கிங் பநிஇ ஆவணங்கள் %2$s ஐப் பார்க்கவும்.", - "ImageTrackingLink": "பட கண்காணிப்பு இணைப்பு", - "ImportFromGoogleAnalytics": "Google Analytics இலிருந்து இறக்குமதி செய்யுங்கள்", - "ImportFromGoogleAnalyticsDescription": "உங்களிடம் கூகிள் அனலிட்டிக்ச் சொத்து இருந்தால், மாடோமோவுக்கு மாறினால், %1$sgoogleanalyticsimporter %2$s சொருகி பயன்படுத்தி உங்கள் இருக்கும் தரவை இறக்குமதி செய்யலாம்.", - "ImportingServerLogsDesc": "உலாவி மூலம் பார்வையாளர்களைக் கண்காணிப்பதற்கான மாற்று (சாவாச்கிரிப்ட் அல்லது பட இணைப்பு வழியாக) சேவையக பதிவுகளை தொடர்ந்து இறக்குமதி செய்வதாகும். %1$sserver பதிவு கோப்பு பகுப்பாய்வு %2$s பற்றி மேலும் அறிக.", - "InvalidPluginsWarning": "இந்த சொருகிகள் %1$s உடன் பொருந்தவில்லை.அத்துடன் இவை இயங்கவும் இல்லை: %2$s.", - "InvalidPluginsYouCanUninstall": "இந்தச் செருகுநிரல்களை %1$s ச்மனேச் செருகுநிரல்கள் %2$s பக்கத்தில் புதுப்பிக்கலாம் அல்லது நிறுவல் நீக்கலாம்.", - "JSTrackingDocumentationHelp": "எளிதான அணுகலுக்கு, மிகவும் பிரபலமான மேம்பட்ட விருப்பங்கள் கீழே கிடைக்கின்றன. இன்னும் கூடுதல் விருப்பங்களுக்கு (இலக்குகள், தனிப்பயன் மாறிகள், இணையவழி ஆர்டர்கள் மற்றும் கைவிடப்பட்ட வண்டிகள் எவ்வாறு கண்காணிப்பது உட்பட) தயவுசெய்து %1$sச்மாடோமோ சாவாச்கிரிப்ட் கண்காணிப்பு ஆவணங்கள் %2$s ஐப் பாருங்கள்.", - "JSTrackingIntro1": "உங்கள் வலைத்தளத்திற்கு பார்வையாளர்களை பல வழிகளில் கண்காணிக்கலாம். அதைச் செய்ய பரிந்துரைக்கப்பட்ட வழி சாவாச்கிரிப்ட் மூலம். இந்த முறையைப் பயன்படுத்த, உங்கள் வலைத்தளத்தின் ஒவ்வொரு வலைப்பக்கத்திலும் சில சாவாச்கிரிப்ட் குறியீடு இருப்பதை உறுதி செய்ய வேண்டும், அவற்றை நீங்கள் இங்கே உருவாக்க முடியும்.", - "JSTrackingIntro2": "உங்கள் வலைத்தளத்திற்கான சாவாச்கிரிப்ட் கண்காணிப்புக் குறியீட்டை நீங்கள் பெற்றவுடன், மாடோமோவுடன் நீங்கள் கண்காணிக்க விரும்பும் அனைத்து பக்கங்களுக்கும் நகலெடுத்து ஒட்டவும்.", - "JSTrackingIntro3a": "பெரும்பாலான வலைத்தளங்கள், வலைப்பதிவுகள், சி.எம்.எச் போன்றவற்றில். உங்களுக்காகத் தொழில்நுட்ப வேலைகளைச் செய்ய முன்பே தயாரிக்கப்பட்ட சொருகி பயன்படுத்தலாம். (Matomoவை ஒருங்கிணைக்கப் பயன்படுத்தப்பட்ட செருகுநிரல்களின் %1$sபட்டியலை பார்க்கவும்%2$s.)", - "JSTrackingIntro3b": "சொருகி எதுவும் இல்லை என்றால், நீங்கள் உங்கள் வலைத்தள வார்ப்புருக்களைத் திருத்தலாம் மற்றும் சாவாச்கிரிப்ட் கண்காணிப்பு குறியீட்டை & lt;/head & gt; குறிச்சொல் பெரும்பாலும் 'header.php', 'header.tpl' அல்லது ஒத்த வார்ப்புரு கோப்பில் வரையறுக்கப்படுகிறது.", - "JSTrackingIntro4": "பார்வையாளர்களைக் கண்காணிக்க நீங்கள் சாவாச்கிரிப்டைப் பயன்படுத்த விரும்பவில்லை என்றால், %1$s ஒரு படக் கண்காணிப்பு இணைப்பை %2$s க்குக் கீழே வைக்கவும்.", - "JSTrackingIntro5": "டிராக் பக்கக் காட்சிகளைவிட அதிகமாக நீங்கள் செய்ய விரும்பினால், கிடைக்கக்கூடிய செயல்பாடுகளின் பட்டியலுக்கு %1$s ச்மாடோமோ சாவாச்கிரிப்ட் கண்காணிப்பு ஆவணங்கள் %2$s ஐப் பாருங்கள். இந்தச் செயல்பாடுகளைப் பயன்படுத்தி நீங்கள் இலக்குகள், தனிப்பயன் மாறிகள், இணையவழி ஆர்டர்கள், கைவிடப்பட்ட வண்டிகள் மற்றும் பலவற்றைக் கண்காணிக்கலாம்.", - "JSTracking_CampaignKwdParam": "பிரச்சாரத்தின் திறவுச்சொல் காரணி", - "JSTracking_CampaignNameParam": "பிரச்சாரப் பெயர் அளவுரு", - "JSTracking_CodeNoteBeforeClosingHead": "குறியீடு துணுக்கை நகலெடுக்க பொத்தானைக் சொடுக்கு செய்து, %1$s குறிச்சொல்லுக்கு முன் உடனடியாக ஒட்டவும் (பரிந்துரைக்கப்படுகிறது)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "இந்த குறியீடு உங்கள் வலைத்தளத்தின் ஒவ்வொரு பக்கத்திலும் ஒரு ச்கிரிப்ட் உறுப்புக்குள் உட்பொதிக்கப்பட்டுள்ளதா என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள். நிறைவு தலை குறிச்சொல்லுக்கு முன்பே அதை ஒட்ட பரிந்துரைக்கிறோம்.", - "JSTracking_ConsentManagerConnected": "%1$s ஏற்கனவே மாடோமோவுடன் வேலை செய்ய கட்டமைக்கப்பட்டதாகத் தெரிகிறது.", - "JSTracking_ConsentManagerDetected": "உங்கள் தளத்தில் %1$s ஒப்புதல் மேலாளர் கண்டறியப்பட்டது. %1$s உடன் வேலை செய்ய மாடோமோவை உள்ளமைப்பது பற்றி அறிய தயவுசெய்து %2$s ஐப் பார்வையிடவும்", - "JSTracking_ConsentManagerEmailNote": "அல்லது அதற்கு பதிலாக உங்கள் வலைத்தளத்தில் கண்காணிப்பு குறியீட்டை நேரடியாக உட்பொதிக்கலாம்:", - "JSTracking_CrossDomain": "இயல்பாக, ஒரு தனித்துவமான பார்வையாளரை அடையாளம் காணும் பார்வையாளர் ஐடி உலாவியின் முதல் கட்சி குக்கீகளில் சேமிக்கப்படுகிறது, இது ஒரே களத்தில் உள்ள பக்கங்களால் மட்டுமே அணுக முடியும். குறுக்கு டொமைனை இணைப்பதை இயக்குவது ஒரு குறிப்பிட்ட பார்வையாளரின் அனைத்து செயல்களையும் பக்கக் காட்சிகளையும் பல களங்களில் பக்கங்களைக் காணும்போது கூட ஒரே வருகைக்கு கண்காணிக்க உங்களை அனுமதிக்கிறது. உங்கள் வலைத்தளத்தின் மாற்றுப்பெயர் முகவரி களில் ஒன்றிற்கான இணைப்பை ஒரு பயனர் சொடுக்கு செய்யும் போதெல்லாம், அது பார்வையாளர் ஐடியை அனுப்பும் முகவரி அளவுருவை PK_VID சேர்க்கும்.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "குறிப்பு: குறுக்கு டொமைன் இணைப்பைப் பயன்படுத்த, உங்கள் வலைத்தளத்திற்கு ஒன்றுக்கு மேற்பட்ட டொமைன் பெயர் (URL கள்) குறிப்பிட வேண்டும்.", - "JSTracking_CustomCampaignQueryParam": "பிரச்சார பெயர் மற்றும் முக்கிய சொல்லுக்கு தனிப்பயன் வினவல் அளவுரு பெயர்களைப் பயன்படுத்தவும்", - "JSTracking_CustomCampaignQueryParamDesc": "குறிப்பு: %1$sMatomo தன்னியக்கமாக Google Analytics அளவுருக்களை கண்டுகொள்ளும்.%2$s", - "JSTracking_DisableCampaignParameters": "பிரச்சார அளவுருக்கள் கண்காணிப்பை முடக்கு", - "JSTracking_DisableCampaignParametersDesc": "இந்த விருப்பம் சரிபார்க்கப்படும்போது, மாடோமோ பிரச்சார அளவுருக்களைக் கண்காணிக்காது, அவை கண்காணிக்கப்பட்ட முகவரி களில் இருந்து அகற்றப்படும்.", - "JSTracking_DisableCookies": "அனைத்து கண்காணிப்பு குக்கீகளையும் முடக்கு", - "JSTracking_DisableCookiesDesc": "அனைத்து முதல் கட்சி குக்கீகளையும் முடக்குகிறது. இந்த வலைத்தளத்திற்கு இருக்கும் மாடோமோ குக்கீகள் அடுத்த பக்கக் காட்சியில் நீக்கப்படும்.", - "JSTracking_EnableCrossDomainLinking": "குறுக்கு டொமைன் இணைப்பை இயக்கவும்", - "JSTracking_EnableDoNotTrack": "வாடிக்கையாளர் பக்க DoNotTrack கண்டறிதலை செயல்படுத்த", - "JSTracking_EnableDoNotTrackDesc": "பார்வையாளர்கள் கண்காணிக்க வேண்டும் வேண்டாம் எனில் அதனால் கண்காணிப்பு கோரிக்கைகளை அனுப்பி முடியாது.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "குறிப்பு: சேவையக பக்க டோனோட்ராக் உதவி இயக்கப்பட்டது, எனவே இந்த விருப்பம் எந்த விளைவையும் ஏற்படுத்தாது.", - "JSTracking_EndNote": "குறிப்பு: %1$s ச்ட்ராக்கிங் குறியீடு %2$s நிர்வாகப் பிரிவில் தனிப்பயனாக்கப்பட்ட கண்காணிப்பு குறியீட்டை உருவாக்கலாம்.", - "JSTracking_GroupPageTitlesByDomain": "கண்காணிக்கும் போது தள டொமைன் பக்க பேருக்கு முன்னால் வர", - "JSTracking_GroupPageTitlesByDomainDesc1": "எனவே வலைப்பதிவில் 'பற்றி' பக்கத்தை யாராவது பார்வையிட்டால்.%1$s இது 'வலைப்பதிவு / பற்றி' என பதிவு செய்யப்படும். துணை டொமைன் மூலம் உங்கள் போக்குவரத்தின் கண்ணோட்டத்தைப் பெற இது எளிதான வழியாகும்.", - "JSTracking_MergeAliases": "\"வெளிச்செல்லும் இணைப்பு\" அறிக்கையில் தெரியாத மாற்றுபெயர் கொண்ட இந்த URL களை மறைக்க", - "JSTracking_MergeAliasesDesc": "எனவே மாற்று முகவரி களுக்கான இணைப்புகள் (எ.கா. %s) \"அவுட்லிங்க்\" என்று கணக்கிடப்படாது.", - "JSTracking_MergeSubdomains": "இந்த உப டொமைன்களில் இருந்து வரும் வருகையாலர்களை கண்காணிக்க", - "JSTracking_MergeSubdomainsDesc": "எனவே ஒரு பார்வையாளர் %1$s மற்றும் %2$s ஐப் பார்வையிட்டால், அவை ஒரு தனித்துவமான பார்வையாளராகக் கருதப்படும்.", - "JSTracking_PageCustomVars": "ஒவ்வொரு பக்கம் பார்வையிலும் ஒரு தனிபயன் மாறியை கண்காணிக்க", - "JSTracking_PageCustomVarsDesc": "எடுத்துக்காட்டாக, மாறி பெயர் \"வகை\" மற்றும் மதிப்பு \"வெள்ளை ஆவணங்கள்\".", - "JSTracking_TrackNoScript": "சாவாச்கிரிப்ட் முடக்கப்பட்ட பயனர்களைக் கண்காணிக்கவும்", - "JSTracking_VisitorCustomVars": "இந்த வருகையாளருக்கு ஒரு தனிபயன் மாறியை கண்காணிக்க", - "JSTracking_VisitorCustomVarsDesc": "எடுத்துக்காட்டாக, மாறி பெயர் \"வகை\" மற்றும் மதிப்பு \"வாடிக்கையாளர்\".", - "JavaScriptCode": "சாவாச்கிரிப்ட் குறியீடு", - "JavaScriptTracking": "ஜாவா ஸ்கிரிப்ட் கண்காணிப்பு", - "JsTrackingCodeAdvancedOptionsStep": "விரும்பினால்: உங்கள் கண்காணிப்பு குறியீட்டைத் தனிப்பயனாக்க மேம்பட்ட விருப்பங்களைப் பயன்படுத்தவும்.", - "JsTrackingCodeMissingEmail1": "சில நாட்களுக்கு முன்பு உங்கள் மாடோமோ பகுப்பாய்வுகளில் '%s' என்ற வலைத்தளத்தைச் சேர்த்துள்ளீர்கள். நாங்கள் இப்போது சோதித்தோம், உங்கள் மாடோமோவில் இந்த வலைத்தளத்திற்கு பதிவு செய்யப்பட்ட போக்குவரத்து எதுவும் இருப்பதாகத் தெரியவில்லை.", - "JsTrackingCodeMissingEmail2": "தரவைக் கண்காணிக்கவும், உங்கள் பயனர்களைப் பற்றிய நுண்ணறிவுகளைப் பெறவும், உங்கள் வலைத்தளம் அல்லது மொபைல் பயன்பாட்டில் கண்காணிப்பை அமைக்க வேண்டும். வலைத்தளங்களுக்கு %s குறிச்சொல்லுக்கு முன்பே கண்காணிப்பு குறியீட்டை உட்பொதிக்கிறது.", - "JsTrackingCodeMissingEmail3": "உங்கள் கண்காணிப்பு குறியீட்டைக் கண்டுபிடித்துத் தனிப்பயனாக்க, %1$s இங்கே %2$s ஐக் சொடுக்கு செய்க (அல்லது %3$s சாவாச்கிரிப்ட் கண்காணிப்பு கிளையன்ட் கையேடு %4$s ஐப் பாருங்கள்).", - "LearnMore": "மேலும் அறிக", - "Login": "புகுபதிகை", - "LogoNotWriteableInstruction": "இயல்புநிலை மாடோமோ லோகோவுக்கு பதிலாக உங்கள் தனிப்பயன் லோகோவைப் பயன்படுத்த, இந்தக் கோப்பகத்திற்கு எழுதும் இசைவு கொடுங்கள்: %1$s மடோமோ தேவைகள் %2$s கோப்புகளில் சேமிக்கப்பட்ட உங்கள் லோகோக்களுக்கான எழுதும் அணுகல் தேவை.", - "LogoUpload": "முத்திரையை தேர்வு செய்க", - "LogoUploadFailed": "பதிவேற்றிய கோப்பை செயலாக்க முடியவில்லை. கோப்பில் சரியான வடிவம் இருக்கிறதா என்று சரிபார்க்கவும்.", - "LogoUploadHelp": "ஒரு கோப்பை %1$s வடிவங்களில் குறைந்தபட்சம் %2$s பிக்சல்களுடன் பதிவேற்றவும்.", - "LtsReleases": "எல்.டி.எச் (நீண்ட கால ஆதரவு) பதிப்புகள் பாதுகாப்பு மற்றும் பிழை-சரிசெய்தல்களை மட்டுமே பெறுகின்றன.", - "MenuDevelopment": "வளர்ச்சி", - "MenuDiagnostic": "ஆய்ந்தறிதல்", - "MenuGeneralSettings": "பொது அமைப்புகள்", - "MenuMeasurables": "அளவிடக்கூடியவை", - "MenuSystem": "மண்டலம்", - "MissingTrackingCodeEmailSubject": "மாடோமோ அனலிட்டிக்சில் %s பதிவு செய்யப்படவில்லை, இப்போது தொடங்கவும்", - "NTrackingFailures": "%s கண்காணிப்பு தோல்விகள்", - "NeedHelp": "உதவி தேவையா?", - "NoKnownFailures": "அறியப்பட்ட கண்காணிப்பு தோல்விகள் எதுவும் இல்லை.", - "OptOutComplete": "விலகுதல் முழுமையடைந்தது; இந்த வலைத்தளத்தில் உங்களது வருகைகள் இணைய பகுப்பாய்வு கருவி மூலம் பதிவு செய்யப்பட மாட்டாது.", - "OptOutCompleteBis": "உங்கள் குக்கீகளை அழித்தால், விலகல் குக்கீயை நீக்கினால், அல்லது கணினிகள் அல்லது வலை உலாவிகளை மாற்றினால், நீங்கள் மீண்டும் விலகல் நடைமுறையைச் செய்ய வேண்டும்.", - "OptOutCustomOptOutLink": "இந்த உருவாக்குபவர் %1$sguide %2$s இல் விளக்கப்பட்டுள்ளபடி, உஉகுமொ மற்றும் சாவாச்கிரிப்ட் ஆகியவற்றைப் பயன்படுத்தி முற்றிலும் தனிப்பயன் விலகல் படிவத்தையும் உருவாக்கலாம்.", - "OptOutDntFound": "உங்கள் உலாவி நீங்கள் விரும்பவில்லை என்று புகாரளிப்பதால் நீங்கள் கண்காணிக்கப்படவில்லை. இது உங்கள் உலாவியின் அமைப்பாகும், எனவே நீங்கள் 'கண்காணிக்க வேண்டாம்' அம்சத்தை முடக்கும் வரை நீங்கள் தேர்வு செய்ய முடியாது.", - "OptOutErrorNoCookies": "கண்காணிப்பு விலகல் அம்சத்திற்கு குக்கீகளை இயக்க வேண்டும்.", - "OptOutErrorNoTracker": "கண்காணிப்பு விலகல் அம்சத்தால் இந்த பக்கத்தில் மாடோமோ டிராக்கர் குறியீட்டைக் கண்டுபிடிக்க முடியவில்லை", - "OptOutErrorNotHttps": "கண்காணிப்பு விலகல் நற்பொருத்தம் வேலை செய்யாது, ஏனெனில் இந்த தளம் HTTPS இல் ஏற்றப்படவில்லை. உங்கள் விலகல் நிலை மாற்றப்பட்டதா என்பதை சரிபார்க்க பக்கத்தை மீண்டும் ஏற்றவும்.", - "OptOutErrorWindowOpen": "டிராக்கிங் விலகல் நற்பொருத்தம் வேலை செய்யாது, ஏனெனில் இது ஓப்டவுட் பாப்அப் தடுக்கப்பட்டதாகத் தெரிகிறது. உங்கள் விலகல் நிலை மாற்றப்பட்டதா என்பதை சரிபார்க்க பக்கத்தை மீண்டும் ஏற்றவும்.", - "OptOutExplanation": "மாடோமோ இணையத்தில் தனியுரிமையை வழங்க அர்ப்பணிக்கப்பட்டுள்ளது. உங்கள் பார்வையாளர்களுக்கு மாடோமோ வலை பகுப்பாய்வுகளைத் தவிர்ப்பதற்கான தேர்வை வழங்க, பின்வரும் உஉகுமொ குறியீட்டை உங்கள் வலைத்தள பக்கத்தில் ஒன்றில் சேர்க்கலாம், எடுத்துக்காட்டாக தனியுரிமைக் கொள்கை பக்கத்தில்.", - "OptOutExplanationIntro": "இந்தக் குறியீடு உங்கள் பார்வையாளர்கள் தங்கள் வலை உலாவிகளில் விலகல் குக்கீயை அமைப்பதன் மூலம் மேட்டோமோவைத் தவிர்ப்பதற்கான இணைப்பைக் கொண்ட ஒரு டிவியைக் காண்பிக்கும். பிரிப்பு ஆல் காண்பிக்கப்படும் உள்ளடக்கத்தைக் காண கீழே (அல்லது %1$sசொடுக்கு இங்கே %2$s) காண்க.", - "OptOutForYourVisitors": "பிவிக் உங்கள் வருகையாளர்களை தவிர்க்க", - "OptingYouOut": "உங்களைத் தவிர்த்து, தயவுசெய்து காத்திருங்கள்…", - "PersonalPluginSettings": "தனிப்பட்ட சொருகி அமைப்புகள்", - "PiwikIsInstalledAt": "பிவிக் நிறுவப்பட்ட இடம்", - "PluginSettingChangeNotAllowed": "சொருகி \"%2$s\" இல் \"%1$s\" அமைப்பின் மதிப்பை மாற்ற உங்களுக்கு இசைவு இல்லை", - "PluginSettingReadNotAllowed": "சொருகி \"%2$s\" இல் \"%1$s\" அமைப்பின் மதிப்பைப் படிக்க உங்களுக்கு இசைவு இல்லை", - "PluginSettings": "சொருகி அமைப்புகள்", - "PluginSettingsIntro": "பின்வரும் மூன்றாம் தரப்பு செருகுநிரல்களுக்கான அமைப்புகளை இங்கே மாற்றலாம்:", - "PluginSettingsSaveFailed": "சொருகி அமைப்புகளை சேமிக்க முடியவில்லை", - "PluginSettingsSaveSuccess": "சொருகி அமைப்புகள் புதுப்பிக்கப்பட்டன.", - "PluginSettingsValueNotAllowed": "\"%2$s\" சொருகி \"%1$s\" புலத்திற்கான மதிப்பு அனுமதிக்கப்படவில்லை", - "Problem": "சிக்கல்", - "ProtocolNotDetectedCorrectly": "நீங்கள் தற்போது ஒரு பாதுகாப்பான எச்எச்எல் இணைப்பில் (HTTPS ஐப் பயன்படுத்தி) மாடோமோவைப் பார்க்கிறீர்கள், ஆனால் மேட்டோமோ சேவையகத்தில் பாதுகாப்பான இணைப்பை மட்டுமே கண்டறிய முடியும்.", - "ProtocolNotDetectedCorrectlySolution": "HTTPS ஐ விட உங்கள் உள்ளடக்கத்தை மேடோமோ பாதுகாப்பாகக் கோரிக்கை மற்றும் பணி செய்கிறார் என்பதை உறுதிப்படுத்த, நீங்கள் உங்கள் %1$s கோப்பைத் திருத்தலாம் மற்றும் உங்கள் பதிலாள் அமைப்புகளை உள்ளமைக்கலாம், அல்லது %3$s பிரிவுக்குக் கீழே %2$s வரியைச் சேர்க்கலாம். %4$s moarnor more%5$s", - "ReactDescription": "உங்கள் வலைத்தளம் எதிர்வினையைப் பயன்படுத்துகிறது என்றால், தயவுசெய்து %1$sஇந்த வழிகாட்டி %2$s ஐப் பார்க்கவும்.", - "ReleaseChannel": "வெளியீட்டு சேனல்", - "SecurityNotificationAllTokenAuthDeletedBody": "உங்கள் கணக்கில் உள்ள அனைத்து அங்கீகார டோக்கன்களையும் யாரோ நீக்கிவிட்டனர்.", - "SecurityNotificationAnonymousAccessEnabledBody": "யாரோ ஒருவர் அநாமதேய பயனர் அணுகலை %1$s க்கு இயக்கினார். இதன் பொருள் இந்த தளத்திற்கான தரவு இப்போது பகிரங்கமாக அணுகக்கூடியது. இது சரியாக இருந்தால், இந்த மின்னஞ்சலை புறக்கணிக்க தயங்க.", - "SecurityNotificationCheckTwoFactor": "உங்கள் இரண்டு காரணி அங்கீகார பயன்பாடு அல்லது சாதனத்தை சரிபார்க்கவும்.", - "SecurityNotificationEmailSubject": "பாதுகாப்பு அறிவிப்பு", - "SecurityNotificationIfItWasYou": "அது நீங்கள் என்றால், தொடருங்கள். இந்தச் செயல்பாட்டை நீங்கள் அடையாளம் காணவில்லை என்றால், தயவுசெய்து உங்கள் கடவுச்சொல்லை மீட்டமைக்கவும்.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "உங்கள் கணக்கிற்கான புதிய இரண்டு காரணி அங்கீகார மீட்புக் குறியீடுகளை யாரோ உருவாக்கினர்.", - "SecurityNotificationRecoveryCodesShowedBody": "உங்கள் கணக்கின் இரண்டு காரணி அங்கீகார மீட்புக் குறியீடுகளை ஒருவர் பார்த்தார்.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "மற்றொரு சூப்பர் பயனர் (%1$s) கணினி அமைப்புகளை மாற்றியமைத்தார். பாதிக்கப்பட்ட அமைப்புகள்: %2$s. இந்தச் செயல்பாட்டைப் பற்றி உங்களுக்குத் தெரிந்தால், தொடருங்கள். இந்தச் செயல்பாட்டை நீங்கள் அடையாளம் காணவில்லை என்றால், தயவுசெய்து மற்ற சூப்பர் பயனர்களை தொடர்பு கொள்ளவும்.", - "SecurityNotificationSettingsChangedByUserBody": "யாரோ கணினி அமைப்புகளை மாற்றியமைத்தனர். பாதிக்கப்பட்ட அமைப்புகள்: %s.", - "SecurityNotificationTokenAuthCreatedBody": "உங்கள் கணக்கில் யாரோ ஒரு அங்கீகார கிள்ளாக்கை (விளக்கம்: %s) உருவாக்கினர். அது நீங்கள் இல்லையென்றால், கிள்ளாக்கை நீக்கு.", - "SecurityNotificationTokenAuthDeletedBody": "உங்கள் கணக்கில் யாரோ ஒரு அங்கீகார கிள்ளாக்கை (விளக்கம்: %s) நீக்கிவிட்டனர்.", - "SecurityNotificationTwoFactorAuthDisabledBody": "உங்கள் கணக்கில் யாரோ இரண்டு காரணி அங்கீகாரத்தை முடக்கியுள்ளனர்.", - "SecurityNotificationTwoFactorAuthEnabledBody": "உங்கள் கணக்கில் யாரோ இரண்டு காரணி அங்கீகாரத்தை இயக்கியுள்ளனர்.", - "SecurityNotificationUserAcceptInviteBody": "பயனர் (உள்நுழைவு: %s) அழைப்பை ஏற்றுக்கொண்டார்.", - "SecurityNotificationUserCreatedBody": "உங்கள் கணக்கில் யாரோ ஒரு புதிய பயனரை (உள்நுழைவு: %s) உருவாக்கினர்.", - "SecurityNotificationUserDeclinedInviteBody": "பயனர் (உள்நுழைவு: %s) அழைப்பை மறுத்துவிட்டது.", - "SecurityNotificationUserDeletedBody": "உங்கள் கணக்கில் யாரோ ஒரு பயனரை (உள்நுழைவு: %s) நீக்கிவிட்டனர்.", - "SendPluginUpdateCommunication": "சொருகி புதுப்பிப்பு கிடைக்கும்போது மின்னஞ்சலை அனுப்பவும்", - "SendPluginUpdateCommunicationHelp": "சொருகி புதிய பதிப்பு கிடைக்கும்போது சூப்பர் பயனர்களுக்கு மின்னஞ்சல் அனுப்பப்படும்.", - "SettingsSaveSuccess": "அமைப்புகள் புதுப்பிக்கப்பட்டன.", - "ShowAdvancedOptions": "மேம்பட்ட விருப்பங்களைக் காட்டு", - "SinglePageApplicationDescription": "நீங்கள் ஒரு ஒற்றை பக்க பயன்பாடு (SPA) அல்லது முற்போக்கான வலை பயன்பாடு (PWA) கண்காணிக்கிறீர்கள் என்றால், தயவுசெய்து %1$sTHIS வழிகாட்டி %2$s ஐப் பார்க்கவும்.", - "Solution": "நீர்மக்கூழ்", - "StableReleases": "மாடோமோ உங்கள் வணிகத்தின் முக்கியமான பகுதியாக இருந்தால், அண்மைக் கால நிலையான வெளியீட்டைப் பயன்படுத்த பரிந்துரைக்கிறோம். நீங்கள் அண்மைக் கால பீட்டாவைப் பயன்படுத்தினால், நீங்கள் ஒரு பிழையைக் கண்டால் அல்லது ஒரு ஆலோசனையைக் கொண்டிருந்தால், தயவுசெய்து %1$ssee இங்கே %2$s.", - "SystemPluginSettings": "கணினி சொருகி அமைப்புகள்", - "TrackAGoal": "ஒரு குறிக்கோளைக் கண்காணி", - "TrackingCode": "கண்காணிக்கும் குறியீடுகள்", - "TrackingCodeIntro": "உங்கள் வலைத்தளம், மொபைல் பயன்பாடு மற்றும் எந்தவொரு சாதனம் அல்லது பயன்பாட்டிற்கும் கூடக் கண்காணிப்பு குறியீட்டை உட்பொதிக்க மடோமோ உங்களுக்குப் பல்வேறு வழிகளை வழங்குகிறது.", - "TrackingFailureAuthenticationProblem": "கோரிக்கை அங்கீகரிக்கப்படவில்லை, ஆனால் ஏற்பு தேவை.", - "TrackingFailureAuthenticationSolution": "உங்கள் கண்காணிப்பு கோரிக்கையில் \"டோக்கன்_ஆத்\" ஐ அமைக்கவும் அல்லது சரிசெய்யவும்.", - "TrackingFailureInvalidSiteProblem": "தளம் இல்லை.", - "TrackingFailureInvalidSiteSolution": "டிராக்கரில் உள்ளமைக்கப்பட்ட ஐடிசைட்டைப் புதுப்பிக்கவும்.", - "TrackingFailures": "கண்காணிப்பு தோல்விகள்", - "TrackingFailuresEmail1": "கடைசி நாட்களில் %s பல்வேறு வகையான கண்காணிப்பு தோல்விகள் நிகழ்ந்தன என்பதை உங்களுக்குத் தெரிவிப்பதற்காக இது தான்.", - "TrackingFailuresEmail2": "தோல்வியுற்ற அனைத்து கண்காணிப்பு கோரிக்கைகளையும் காண %1$sஇங்கே சொடுக்கு செய்க %2$s.", - "TrackingFailuresEmailSubject": "உங்கள் மாடோமோ பகுப்பாய்வுகளில் தோல்விகளைக் கண்காணித்தல்", - "TrackingFailuresIntroduction": "கடைசி %s நாட்களில் நிகழ்ந்த கண்காணிப்பு தோல்விகளை இந்த பக்கம் பட்டியலிடுகிறது. மிகவும் பொதுவான வகையான கண்காணிப்பு தோல்விகள் மட்டுமே பதிவு செய்யப்பட்டுள்ளன, அவை அனைத்தும் இல்லை என்பதை நினைவில் கொள்க.", - "TrackingURL": "முகவரி ஐ கண்காணித்தல்", - "TrustedHostConfirm": "நிச்சயம் நீங்கள் நம்பிக்கையான புரவலன் பெயரை மாற்ற விரும்புகிறீரா?", - "TrustedHostSettings": "நம்பிக்கையான பிவிக் புரவலன்பெயர்", - "TwoFactorAuth": "இரண்டு காரணி ஏற்பு", - "UiDemo": "ஆனால்", - "UncheckToOptOut": "விலக இந்த பெட்டியைத் தேர்வுசெய்யவும்.", - "UpdateSettings": "அமைப்புகளை புதுப்பிக்கவும்", - "UseCustomLogo": "சொந்த முத்திரையை பயன்படுத்த", - "UserInviteContent": "கீழே உள்ள ஏற்றுக்கொள்ளும் பொத்தானைக் சொடுக்கு செய்வதன் மூலம் இந்த அழைப்பை நீங்கள் ஏற்கலாம்.", - "UserInviteNotes": "இந்த அழைப்பை நீங்கள் எதிர்பார்க்கவில்லை என்றால், இந்த மின்னஞ்சலை நீங்கள் புறக்கணிக்கலாம். %1$s உங்களுக்கு பல மின்னஞ்சல்களை அனுப்பினால், நீங்கள் அவற்றைத் தடுக்கலாம் அல்லது துச்பிரயோகத்தைப் புகாரளிக்கலாம். அழைப்பு தானாகவே %2$s நாட்களில் காலாவதியாகிறது.", - "UserInviteSubject": "%2$s க்கு மாடோமோ அனலிட்டிக்சில் சேர ஒரு அழைப்பை %1$s உங்களுக்கு அனுப்பியது.", - "ValidPiwikHostname": "சரியான பிவிக் புரவலன் பெயர்", - "ViewAllTrackingFailures": "அனைத்து கண்காணிப்பு தோல்விகளையும் காண்க", - "VueDescription": "உங்கள் வலைத்தளம் Vue.js ஐப் பயன்படுத்தினால், தயவுசெய்து %1$sஇந்த வழிகாட்டி %2$s ஐப் பார்க்கவும்.", - "WhatIsNew": "புதியது என்ன", - "WhatIsNewDoNotShowAgain": "மீண்டும் காட்ட வேண்டாம்", - "WhatIsNewNoChanges": "இந்த நேரத்தில் புதிதாக எதுவும் இல்லை", - "WhatIsNewNoChangesTitle": "அண்மைக் கால மாற்றங்கள் இல்லை", - "WhatIsNewRemindMeLater": "பின்னர் எனக்கு நினைவூட்டுங்கள்", - "WhatIsNewTitle": "மாடோமோவில் புதியது இங்கே", - "WhatIsNewTooltip": "மாடோமோவில் புதியதை அறிக", - "WithOptionalRevenue": "விருப்ப வருமானத்துடன்", - "WordpressDescription": "உங்கள் வலைத்தளம் வேர்ட்பிரச் பயன்படுத்துகிறது என்றால், தயவுசெய்து %1$sஇந்த வழிகாட்டி %2$s ஐப் பார்க்கவும்.", - "YouAreNotOptedOut": "நீங்கள் விலகவில்லை.", - "YouAreOptedOut": "நீங்கள் தற்போது விலக்கிக் கொள்ளப்பட்டுள்ளீர்கள்.", - "YouMayOptOut": "இந்த இணையதளத்தில் சேகரிக்கப்பட்ட தரவுகளின் திரட்டல் மற்றும் பகுப்பாய்வைத் தவிர்க்க உங்கள் கணினிக்கு ஒதுக்கப்பட்ட ஒரு தனித்துவமான வலை பகுப்பாய்வு குக்கீ அடையாள எண் இல்லை என்பதை நீங்கள் தேர்வு செய்யலாம்.", - "YouMayOptOut2": "இந்த வலைத்தளத்தை நீங்கள் இங்கு எடுக்கும் செயல்களை ஒருங்கிணைப்பதிலிருந்தும் பகுப்பாய்வு செய்வதையும் தடுக்க நீங்கள் தேர்வு செய்யலாம்.", - "YouMayOptOut3": "அவ்வாறு செய்வது உங்கள் தனியுரிமையைப் பாதுகாக்கும், ஆனால் உரிமையாளர் உங்கள் செயல்களிலிருந்து கற்றுக்கொள்வதிலிருந்தும், உங்களுக்கும் பிற பயனர்களுக்கும் சிறந்த அனுபவத்தை உருவாக்குவதையும் தடுக்கும்.", - "YouMayOptOutBis": "அந்த தேர்வு செய்ய, விலகல் குக்கீயைப் பெற கீழே சொடுக்கு செய்க." - } -} diff --git a/plugins/CoreAdminHome/lang/te.json b/plugins/CoreAdminHome/lang/te.json deleted file mode 100644 index 9c5a650d3eb919acad11eeaec36612ab731d9338..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/te.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "నిర్వహణ", - "Login": "వాడుకరి పేరు", - "MenuGeneralSettings": "సాధారణ అమరికలు" - } -} diff --git a/plugins/CoreAdminHome/lang/th.json b/plugins/CoreAdminHome/lang/th.json deleted file mode 100644 index 989ae3f6d15fe8ae030d2937875f8317ae5f6a6b..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/th.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "การจัดการระบบ", - "EmailServerSettings": "การตั้งค่าเซิร์ฟเวอร์อีเมล์", - "Login": "ชื่อผู้ใช้ฐานข้อมูล", - "LogoUpload": "เลือกรูปโลโก้ที่ต้องการอัพโหลด", - "MenuGeneralSettings": "ตั้งค่าทั่วไป", - "OptOutComplete": "เลือกที่จะไม่ครบถ้วนเมื่อคุณเยี่ยมชมเว็บไซต์นี้จะไม่ถูกบันทึกโดยเครื่องมือวิเคราะห์เว็บ", - "OptOutCompleteBis": "โปรดทราบว่า หากคุณลบคุกกี้ของคุณให้ลบคุกกี้ไม่เข้าร่วมหรือถ้าคุณเปลี่ยนเครื่องคอมพิวเตอร์หรือเว็บเบราเซอร์คุณ จะต้องดำเนินการขั้นตอนการยกเลิกการเลือกอีกครั้ง", - "OptOutExplanation": "Matomo มีความมุ่งมั่นที่จะให้ความเป็นส่วนตัวบนอินเทอร์เน็ต เพื่อให้ผู้เข้าชมให้กับทางเลือกของการเลือกออกของ Matomo วิเคราะห์เว็บคุณสามารถเพิ่มรหัส HTML ต่อไปนี้บนหน้าหนึ่งของเว็บไซต์ของคุณ ตัวอย่างเช่น ในหน้านโยบายความเป็นส่วนตัว", - "OptOutForYourVisitors": "Matomo ยกเลิกการเลือกสำหรับผู้เข้าชมของคุณ", - "TrustedHostSettings": "ชื่อโฮสต์ Matomo ที่เชื่อถือได้", - "UseCustomLogo": "ใช้รูปโลโก้ที่กำหนดเอง", - "YouAreOptedOut": "ขณะนี้คุณได้ออฟไลน์", - "YouMayOptOut": "คุณอาจเลือกที่จะไม่ให้มีการวิเคราะห์เว็บที่ไม่ซ้ำกันหมายเลขประจำตัวของคุกกี้ ที่กำหนดให้กับเครื่องคอมพิวเตอร์ของคุณเพื่อหลีกเลี่ยงการรวมและการวิเคราะห์ข้อมูลที่เก็บรวบรวมในเว็บไซต์นี้", - "YouMayOptOutBis": "เพื่อให้ทางเลือกที่โปรดคลิกด้านล่างเพื่อรับคุกกี้การยกเลิกการเลือก" - } -} diff --git a/plugins/CoreAdminHome/lang/tl.json b/plugins/CoreAdminHome/lang/tl.json deleted file mode 100644 index 24d271b0a0e3b25d8f4efedd5cec510fc01a36a2..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/tl.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Magdagdag ng bagong pinagkakatiwalaang host", - "Administration": "Administrasyon", - "ArchivingSettings": "Mga setting ng pag-archive", - "BrandingSettings": "Mga setting ng branding", - "ClickHereToOptIn": "I-click ito upang mag-opt in.", - "ClickHereToOptOut": "I-click ito upang mag-opt out.", - "CustomLogoFeedbackInfo": "Kung pinasadya mo ang logo ng Matomo, maaaring interesado ka rin upang itago ang %1$s na link sa itaas ng menu. Upang gawin ito, maaari mong i-disable ang Feedback plugin sa %2$s Manage Plugin %3$s na pahina.", - "CustomLogoHelpText": "Maaari mong i-customize ang Matomo logo na ipapakita sa user interface at mga report sa email.", - "EmailServerSettings": "Mga setting sa email server", - "FaviconUpload": "Pumili ng Favicon upang i-upload", - "ForBetaTestersOnly": "Pagsusubaybay ng Imahe", - "ImageTracking": "Pagsubaybay ng Imahe", - "ImageTrackingIntro1": "Kapag ang bisita ay dinisable ang JavaScript, o kapag hindi magamit ang JavaScript, maaari mong gamitin ang link sa pagsubaybay ng imahe, para masundan ang mga bisita", - "ImageTrackingIntro2": "Buuhin ang link sa ibaba at kopyahin at i-paste ang nabuong HTML sa pahina. Kung ginagamit mo ito bilang isang fallback para sa pagsubaybay ng JavaScript, maaari mo itong palibutan ng %1$s na tag.", - "ImageTrackingLink": "Pag-import ng mga Tala sa Server", - "ImportingServerLogsDesc": "Ang isang alternatibo sa pagsusubaybay sa mga bisita sa pamamagitan ng browser (alinman sa pamamagitan ng JavaScript o link ng isang imahe) ay ang patuloy na pag-import ng mga tala sa server. Matuto nang higit pa tungkol sa %1$sServer na Tala File Analytic%2$s.", - "InvalidPluginsWarning": "Ang sumusunod na mga plugin ay hindi tugma sa %1$s at hindi kayang i-load: %2$s", - "InvalidPluginsYouCanUninstall": "Maaaring i-update o i-uninstall ang mga plugin sa %1$sPamahalaan ang mga Plugin%2$s na pahina.", - "JSTrackingIntro2": "Sa oras na mayroon ka nang JavaScript tracking code para sa iyong website, kopyahin at i-paste ito sa lahat ng pahina na gusto mong subaybayan gamit ang Matomo.", - "JSTrackingIntro4": "Kung ayaw mong gamitin ang JavaScript upang masubaybayan ang mga bisita,%1$s gumawa ng link upang sumubaybay sa image sa ibaba %2$s.", - "JSTrackingIntro5": "Kung gusto mong gawin nang higit pa kaysa sa pagsubaybay ng page view, mangyaring tingnan ang %1$s Tracking Matomo Javascript na dokumentasyon %2$s para sa listahan ng mga available na function. Sa paggamit ng mga function na ito maaari mong subaybayan ang mga layunin, mga custom variable, mga ecommerce order, mga inabandunang cart at marami pa.", - "JSTracking_CampaignKwdParam": "Keyword na Parametero ng Kampanya", - "JSTracking_CampaignNameParam": "Pangalang Parametero ng Kampanya", - "JSTracking_CustomCampaignQueryParam": "Gamitin ang custom query na parametro ng mga pangalan para sa pangalan ng kampanya at keyword", - "JSTracking_CustomCampaignQueryParamDesc": "Tandaan: Awtomatikong makikita ng %1$sMatomo ang mga parametro ng Google Analytics. %2$s", - "JSTracking_DisableCookies": "I-disable ang lahat ng mga cookies na sumusubaybay.", - "JSTracking_DisableCookiesDesc": "I-disable lahat ng unang party cookies. Lahat ng Matomo cookies para sa website na ito ay mabubura sa susunod na pagtingin sa pahina", - "JSTracking_EnableDoNotTrack": "Paganahin ang client side DoNotTrack detection", - "JSTracking_EnableDoNotTrackDesc": "Kung kaya't ang mga kahilingan sa pagsubaybay ay hindi ipapadala kung hindi nais ng bisita na masubaybayan.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Tandaan: Ang side ng server na DoNotTrack support ay naka-enable, kaya ang pagpipiliang ito ay hindi magkakaroon ng epekto.", - "JSTracking_GroupPageTitlesByDomain": "I-prepend ang site domain sa pamagat ng pahina kapag nagsusubaybay.", - "JSTracking_GroupPageTitlesByDomainDesc1": "Kung kaya't kapag may bumisita sa pahina na 'About' ng blog.%1$s ito ay itatala bilang 'blog / About'. Ito ay ang pinakamadaling paraan upang makakuha ng isang pangkalahatang ideya ng iyong trapiko sa bawat sub-domain.", - "JSTracking_MergeAliases": "Sa \"Outlinks\" na ulat, itago ang mga pag-click sa mga kilalang alias URL ng", - "JSTracking_MergeAliasesDesc": "Kung kaya't ang mga click sa mga link sa Alias na mga URL (hal.%s) ay hindi mabibilang bilang \"Outlink\".", - "JSTracking_MergeSubdomains": "Subaybayan ang mga bisita sa lahat ng mga subdomain ng", - "JSTracking_MergeSubdomainsDesc": "Kaya kung ang bisita ay bumisita sa %1$s at %2$s, ang mga ito ay mabibilang bilang isang unique na bisita.", - "JSTracking_PageCustomVars": "Subaybayan ang isang custom na variable para sa bawat pagtingin sa isang pahina", - "JSTracking_PageCustomVarsDesc": "Halimbawa, mayroong pangalan ng variable na \"Category\" at value na White Papers\"\".\"", - "JSTracking_VisitorCustomVars": "Subaybayan ang mga custom na variable para sa bisitang ito", - "JSTracking_VisitorCustomVarsDesc": "Halimbawa, mayroong pangalan ng variable na \"Type\" at value na \"Customer\"", - "JavaScriptTracking": "Pagsubaybay ng JavaScript", - "Login": "Login", - "LogoNotWriteableInstruction": "Upang gamitin ang iyong pasadyang logo sa halip na ang default na Matomo logo, bigyan ng pahintulot na magsulat sa direktoryong ito: %1$s kailangan ng Matomo ng write access para sa iyong mga logo na naka-imbak sa mga file ng %2$s.", - "LogoUpload": "Piliin ang Logo na i-upload", - "LogoUploadHelp": "Mangyaring mag-upload ng isang file sa format na %1$s na may pinakamababang taas na %2$s na pixel.", - "MenuDevelopment": "Pag-unlad", - "MenuDiagnostic": "Dyagnostiko", - "MenuGeneralSettings": "Pangkalahatang mga setting", - "OptOutComplete": "Ang pag-opt-out ay kumpleto na; ang iyong mga pagbisita sa website na ito ay hindi maitatala sa Web Analytics na tool.", - "OptOutCompleteBis": "Tandaan na kung tinanggal mo ang iyong cookies, burahin ang opt-out cookie, o kapag nagbago ka ng computer o Web browser, kailangan mong isagawang muli ang opt-out cookie", - "OptOutExplanation": "Ang Matomo ay nakatuon sa pagbibigay ng privacy sa Internet. Upang bigyan ang iyong bisita ng pagpipilian na pag-opt-out ng Matomo Web Analytics, maaari mong idagdag ang sumusunod na HTML code sa isa sa iyong mga pahina ng website, halimbawa sa isang pahina ng Privacy Policy.", - "OptOutForYourVisitors": "Matomo opt-out para sa iyong mga bisita", - "PiwikIsInstalledAt": "Ang Matomo ay naka-install sa", - "PluginSettingChangeNotAllowed": "Hindi ka pinapahintulutang baguhin ang halaga ng setting \"%1$s\" sa plugin \"%2$s\"", - "PluginSettingReadNotAllowed": "Hindi ka pinapahintulutang basahin ang halaga ng setting \"%1$s\" sa plugin \"%2$s\"", - "PluginSettingsIntro": "Dito maaaring baguhin ang mga setting para sa mga sumusunod na 3rd party na mga plugin:", - "PluginSettingsValueNotAllowed": "Ang halaga para sa field \"%1$s\" sa plugin na \"%2$s\" ay hindi pinapahintulutan.", - "SendPluginUpdateCommunicationHelp": "Isang email ang ipapadala sa mga Super User kapag may bagong bersyon na maaaring magamit para sa isang plugin.", - "StableReleases": "Kung ang Matomo ay isang kritikal na bahagi ng iyong negosyo, inirerekomenda namin na gamitin mo ang pinakabagong matatag na release. Kung gagamitin mo ang pinakabagong beta at nakakita ka ng bug o mayroong suhestiyon, mangyaring %1$s tingnan dito %2$s.", - "TrackAGoal": "Subaybayan ang isang gol", - "TrackingCode": "Tracking Code", - "TrustedHostConfirm": "Sigurado ka ba na gusto mong baguhin ang pinagkakatiwalaang Matomo na hostname?", - "TrustedHostSettings": "Pinagkakatiwalaang Matomo na Hostname", - "UpdateSettings": "I-Update ang mga setting", - "UseCustomLogo": "Gamitin ang isang custom na logo", - "ValidPiwikHostname": "Wastong Matomo na Hostname", - "WithOptionalRevenue": "may opsyonal na kita", - "YouAreOptedOut": "Kasalukuyan kang naka-opt-out", - "YouMayOptOut": "Maaari mong piliin na huwag magkaroon ng isang natatanging web analytic na 'cookie identification number' na itatalaga sa iyong computer upang maiwasan ang pagsasama-sama at pag-aaral ng data na nakolekta sa website na ito.", - "YouMayOptOutBis": "Upang magawa ang napili mo, paki-click sa ibaba upang matanggap ang opt-out cookie." - } -} diff --git a/plugins/CoreAdminHome/lang/tr.json b/plugins/CoreAdminHome/lang/tr.json deleted file mode 100644 index 65c5d9e1fe3e92fbd5d2add8c3a5d248da150fcf..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/tr.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Çağrıyı kabul et", - "AddNewTrustedHost": "Güvenilir sunucu ekle", - "Administration": "Yönetim", - "ArchivingSettings": "Arşivleme ayarları", - "BrandingSettings": "Markalama ayarları", - "BruteForce": "Kaba kuvvet", - "CheckToOptIn": "İzlemeyi açmak için bu kutuyu işaretleyin.", - "ClickHereToOptIn": "İzin vermek için tıklayın.", - "ClickHereToOptOut": "İzni iptal etmek için tıklayın.", - "CloudflareDescription": "Siteniz Cloudflare üzerinde barındırılıyorsa, lütfen %1$sbu rehbere bakın%2$s.", - "ConfirmDeleteAllTrackingFailures": "Tüm izleme sorunlarını silmek istediğinize emin misiniz?", - "ConfirmDeleteThisTrackingFailure": "Bu izleme sorununu silmek istediğinize emin misiniz?", - "Cors": "Cors", - "CorsDomains": "Çapraz kaynak paylaşma (CORS) etki alanları", - "CorsDomainsHelp": "http://site.com or http://stats.site.com gibi etki alanları tanımlayabilirsiniz ya da * ekleyerek tüm etki alanları arası isteklere izin verebilirsiniz", - "CustomLogoFeedbackInfo": "Matomo logosunu değiştirdiyseniz, üst menüden %1$s bağlantısını da kaldırmak isteyebilirsiniz. Bunun için, %2$sEklenti yönetimi%3$s bölümünden Geribildirim ( Feedback ) eklentisini etkisizleştirebilirsiniz.", - "CustomLogoHelpText": "E-posta raporlarında ve kullanıcı arayüzünde kullanılacak olan Matomo logosunu değiştirebilirsiniz.", - "DeclineInvite": "Çağrıyı reddet", - "DeleteAllFailures": "Tüm sorunları sil", - "DevelopmentProcess": "Geliştirme işlemi sırasında binlerce otomatik sınama yapılır. Bununla birlikte Matomo \"Hatasızlık ilkesi\" hedefine ulaşmak için Beta Testi yapan kullanıcılar önemli bir rol üstlenir.", - "EmailServerSettings": "E-posta sunucusu ayarları", - "ErrorEmailFromAddressNotValid": "SMTP kimden adresi geçersiz", - "FaviconUpload": "Yüklenecek Favicon dosyasını seçin", - "FileUploadDisabled": "PHP yapılandırmanızda dosya yükleme özelliği açılmamış. Özel logo görselini yükleyebilmek için php.ini yapılandırma dosyasında %s ayarını yapın ve sunucunuzu yeniden başlatın.", - "ForBetaTestersOnly": "Yalnızca beta testi yapan kullanıcılar için", - "GoogleTagManagerDescription": "Siteniz Google etiket yöneticisini kullanıyorsa, lütfen %1$sbu rehbere%2$s bakın.", - "HideAdvancedOptions": "Gelişmiş ayarları gizle", - "HowToGetHelp": "Çeşitli şekillerde yardım alabilirsiniz. Matomo topluluğu aracılığıyla ücretsiz desteğin yanında Matomo ekibi ve Matomo ortakları tarafından sağlanan ücretli destek hizmetleri bulunur. Yoksa bir hata bildirmek ya da yeni bir özellik önermek mi istiyorsunuz?", - "HttpTrackingApi": "HTTP izleme API", - "HttpTrackingApiDescription": "%1$sHTTP izleme API%2$s istenilen verinin izlenebilmesini sağlar. Henüz bir SDK uygulaması olmayan bir programlama dili kullanıyorsanız API yararlı olabilir. Ayrıca aygıt ya da uygulamaları özel bir yöntem ile izlemek istiyorsanız işe yarar.", - "ImageTracking": "Görsel ile izleme", - "ImageTrackingIntro1": "JavaScript desteği kapatılmış ya da kullanılamıyor ise, ziyaretçiler görsel izleme bağlantısı ile izlenebilir.", - "ImageTrackingIntro2": "Aşağıdan bağlantıyı oluşturun ve oluşturulan HTML kodunu kopyalayıp sayfanıza yapıştırın. Bu bağlantıyı yalnızca JavaScript kullanılamadığında kullanmak istiyorsanız%1$s kod imleri arasına alın.", - "ImageTrackingIntro3": "Kullanabileceğiniz tüm seçenekleri listelemek için bir görsel ile izleme bağlantısı kullanın. Ayrıntılı bilgi almak için %1$sİzleme API belgelerine%2$s bakabilirsiniz.", - "ImageTrackingLink": "Görsel ile izleme bağlantısı", - "ImportFromGoogleAnalytics": "Google Analytics üzerinden içe aktar", - "ImportFromGoogleAnalyticsDescription": "Bir Google Analytics mülkünüz varsa ve Matomo uygulamasına geçiyorsanız, %1$sGoogleAnalyticsImporter%2$s eklentisini kullanarak var olan verilerinizi içe aktarabilirsiniz.", - "ImportingServerLogsDesc": "Ziyaretçileri tarayıcı ile izlemenin (JavaScript ya da görsel bağlantısı ile) bir alternatifi sürekli olarak sunucu günlüklerini içe aktarmaktır. Ayrıntılı bilgi almak için %1$ssunucu günlüğü dosya istatistikleri%2$s bölümüne bakabilirsiniz.", - "InvalidPluginsAdminDisabled": "Bu eklentileri güncellemek veya kaldırmak için lütfen komut satırını kullanabilen veya yapılandırmayı doğrudan güncelleyebilen Matomo yöneticiniz ile görüşün.", - "InvalidPluginsWarning": "Şu eklentiler %1$s ile uyumlu olmadığından yüklenemedi: %2$s.", - "InvalidPluginsYouCanUninstall": "Bu eklentileri %1$sEklenti yönetimi%2$s sayfasından güncelleyebilir ya da kaldırabilirsiniz.", - "InvalidSiteUrlError": "Bu adres geçerli değil. İçerik taşınmış, silinmiş ya da artık kullanılamıyor (adresteki site kimliği '%s' olarak ayarlanmıştı).", - "InvalidSiteUrlErrorHelp": "Lütfen önceki sayfaya dönün ya da bir site seçmek için panoya dönün.", - "JSTrackingDocumentationHelp": "Kolay erişim için, sık kullanılan gelişmiş ayaları aşağıda bulabilirsiniz. Diğer ayarlar için (hedeflerin, özel değişkenlerin, e-ticaret siparişlerinin ve terk edilmiş alışveriş sepetlerinin nasıl izleneceği gibi) %1$sMatomo Javascript izleme belgelerine%2$s bakabilirsiniz.", - "JSTrackingIntro1": "Siteye gelen ziyaretçileri birkaç farklı yolla izleyebilirsiniz. JavaScript yönteminin kullanılması önerilir. Bu yöntemi kullanabilmek için, buradan üretebileceğiniz JavaScript kodunun sitenin tüm sayfalarına ekleneceğinden emin olmalısınız.", - "JSTrackingIntro2": "JavaScript izleme kodunu Matomo ile izlemek istediğiniz sitenin tüm sayfalarına ya da içerik yönetimi sistemindeki uygun bölüme yapıştırın.", - "JSTrackingIntro3a": "Blog, CMS gibi çoğu sitede teknik işleri sizin için yapacak bir eklenti bulunur (%1$sMatomo ile birlikte çalışan eklentiler%2$s listesine bakın)", - "JSTrackingIntro3b": "Size uygun bir eklenti yoksa sitenin sayfa kalıplarını düzenleyerek JavaScript izleme kodunu, genellikle 'header.php', 'header.tpl' gibi bir adı olan dosyada bulunan </head> kod imi içine ekleyebilirsiniz.", - "JSTrackingIntro4": "Ziyaretçileri izlemek için JavaScript kodunu kullanmak istemiyorsanız %1$saşağıdaki bağlantıya tıklayarak bir izleme görseli oluşturabilirsiniz%2$s.", - "JSTrackingIntro5": "Sayfa görüntülenme sayısından fazlasını izlemek istiyorsanız, lütfen %1$sMatomo JavaScript izleme belgesi%2$s içinden kullanabileceğiniz işlevlere bakın. Bu işlevleri kullanarak hedefleri, özel değişkenleri, e-ticaret siparişlerini, terk edilen sepetleri ve başka bilgileri izleyebilirsiniz.", - "JSTracking_CampaignKwdParam": "Kampanya anahtar sözcüğü parametresi", - "JSTracking_CampaignNameParam": "Kampanya adı parametresi", - "JSTracking_CodeNoteBeforeClosingHead": "Düğmeye tıklayarak kodu kopyalayın ve %1$s kapanış kod iminin hemen öncesine yapıştırın (önerilir)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Bu kodun sitenin her sayfasında bulunduğundan emin olun. Kodu head kapanış kod iminin hemen öncesine yapıştırmanız önerilir.", - "JSTracking_ConsentManagerConnected": "%1$s zaten Matomo ile birlikte çalışacak şekilde yapılandırılmış gibi görünüyor.", - "JSTracking_ConsentManagerDetected": "Sitenizde %1$s rıza yöneticisi algılandı. Matomo uygulamasını %1$s ile çalışacak şekilde yapılandırmak hakkında ayrıntılı bilgi almak için lütfen %2$s adresine bakın", - "JSTracking_ConsentManagerEmailNote": "Ya da bunun yerine izleme kodunu doğrudan sitenize ekleyebilirsiniz:", - "JSTracking_CrossDomain": "Varsayılan olarak, yalnızca aynı etki alanındaki sayfalar tarafından erişilen ve tarayıcının birinci elden tanımlama bilgilerinde bulunarak tekil ziyaretçiyi tanımlayan ziyaretçi kimliği. Etki alanları arası bağlantılar açıldığında aynı ziyarette farklı etki alanlarındaki sayfaları ziyaret ediyor olsa bile belirli bir kullanıcının tüm işlemleri ve kendisine gösterilen sayfalar izlenebilir. Bir kullanıcı sitelerinizden birinin kısaltma adresinin bağlantısına tıkladığında, adrese ziyaretçi kimliğini ileten bir pk_vid parametresi eklenir.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Not: Etki alanları arası bağlantıları kullanırken site için birden fazla etki alanı (adres) belirtmelisiniz.", - "JSTracking_CustomCampaignQueryParam": "Kampanya adı ve anahtar sözcük için özel sorgu parametresi adları kullanılsın", - "JSTracking_CustomCampaignQueryParamDesc": "Not: %1$sMatomo Google Analytics parametrelerini otomatik olarak algılar. %2$s", - "JSTracking_DisableCampaignParameters": "Kampanya parametreleri izlemesini kapat", - "JSTracking_DisableCampaignParametersDesc": "Bu seçenek etkinleştirildiğinde, Matomo kampanya parametrelerini izlemez ve bunları izlenen adreslerden kaldırır.", - "JSTracking_DisableCookies": "Tüm izleme tanımlama bilgilerini kapat", - "JSTracking_DisableCookiesDesc": "Bu seçenek açıldığında, birinci elden tüm tanımlama bilgileri kapatılır. Bu site için var olan Matomo tanımlama bilgileri sayfanın sonraki görüntülenmesinde silinir.", - "JSTracking_EnableCrossDomainLinking": "Etki alanları arası bağlantı kurulabilsin", - "JSTracking_EnableDoNotTrack": "İstemci tarafında izlenmek istemiyorum algılaması kullanılsın", - "JSTracking_EnableDoNotTrackDesc": "Böylece izlenmek istemeyen ziyaretçilere, izleme istekleri gönderilmez.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Not: Sunucu tarafında izlenmek istemiyorum özelliği açılmış olduğundan bu seçeneğin herhangi bir etkisi olmaz.", - "JSTracking_EndNote": "Not: Yönetim bölümündeki %1$sizleme kodu%2$s ile özel bir izleme kodu oluşturabilirsiniz.", - "JSTracking_GroupPageTitlesByDomain": "İzleme sırasında sayfa başlığının önüne site etki alanı eklensin", - "JSTracking_GroupPageTitlesByDomainDesc1": "Böylece biri blog 'Hakkında' sayfasını ziyaret ettiğinde %1$s 'blog / Hakkında' olarak kaydedilir. Bir alt etki alanının özetini almak için en kolay yöntem budur.", - "JSTracking_MergeAliases": "\"Dış bağlantılar\" raporunda şu bilinen adres kısaltmalarının tıklanmaları gizlensin", - "JSTracking_MergeAliasesDesc": "Böylece kısaltma adreslerine tıklamalar (%s gibi) \"Dış bağlantı\" olarak sayılmaz.", - "JSTracking_MergeSubdomains": "Şunun tüm alt etki alanlarındaki ziyaretçiler izlensin", - "JSTracking_MergeSubdomainsDesc": "Böylece bir ziyaretçi %1$s ve %2$s ziyaretlerini yaparsa tekil bir ziyaretçi olarak sayılır.", - "JSTracking_PageCustomVars": "Her sayfa görünümü için özel bir değişken izlensin", - "JSTracking_PageCustomVarsDesc": "Örneğin \"Kategori\" değişken adı ve \"Beyaz sayfalar\" değeriyle.", - "JSTracking_TrackNoScript": "Kullanıcılar JavaScript kapatılarak izlensin", - "JSTracking_VisitorCustomVars": "Bu ziyaretçi için özel değişkenler izlensin", - "JSTracking_VisitorCustomVarsDesc": "Örneğin \"Tür\" değişken adı ve \"Müşteri\" değeriyle.", - "JavaScriptCode": "JavaScript kodu", - "JavaScriptTracking": "JavaScript ile izleme", - "JsTrackingCodeAdvancedOptionsStep": "İsteğe bağlı: İzleme kodunu özelleştirmek için gelişmiş seçenekleri kullanın.", - "JsTrackingCodeMissingEmail1": "Bir kaç gün önce Matomo istatistiklerine '%s' sitesini eklemişsiniz. Matomo kayıtlarına bakıldığında bu site için herhangi bir trafik kaydı olmadığı görüldü.", - "JsTrackingCodeMissingEmail2": "Verileri toplamaya başlamak ve kullanıcılarınız hakkında içgörü elde etmek için site ya da mobil uygulama için izleme kurulumunu yapmanız gerekir. Siteler için bu işlem, izleme kodunun %s kod iminden önce eklenmesi ile kolayca yapılabilir.", - "JsTrackingCodeMissingEmail3": "İzleme kodunuzu bulmak ve özelleştirmek için %1$sburaya tıklayın%2$s (ya da %3$sJavaScript izleme istemcisi rehberi%4$s bölümüne bakın).", - "LearnMore": "Ayrıntılı bilgi alın", - "Login": "Oturum aç", - "LogoNotWriteableInstruction": "Varsayılan Matomo logosu yerine özel bir logo görseli kullanmak için şu klasöre yazma izni vermelisiniz: %1$s Matomo uygulamasının %2$s dosyalarındaki logolara yazma izni olmalıdır.", - "LogoUpload": "Yüklenecek logo dosyasını seçin", - "LogoUploadFailed": "Yüklenen dosya işlenemedi. Lütfen dosyanın doğru biçimde olduğundan emin olun.", - "LogoUploadHelp": "Lütfen %1$s biçiminde ve en az %2$s piksel yüksekliğinde bir dosya yükleyin.", - "LtsReleases": "LTS (uzun dönem desteği) sürümlerinde yalnızca güvenlik ve hata ayıklama güncellemeleri yapılır.", - "MenuDevelopment": "Geliştirme", - "MenuDiagnostic": "Tanılama", - "MenuGeneralSettings": "Genel ayarlar", - "MenuMeasurables": "Ölçülebilirler", - "MenuSystem": "Sistem", - "MissingTrackingCodeEmailSubject": "Matomo istatistiklerinde %s için bir trafik kaydı yok, şimdi başlayabilirsiniz", - "NTrackingFailures": "%s izleme sorunu", - "NeedHelp": "Yardım almanız mı gerekiyor?", - "NoKnownFailures": "Herhangi bir izleme sorunu yok.", - "OptOutComplete": "İzleme kapatıldı. Bu sitedeki ziyaretleriniz site istatistikleri aracı tarafından izlenmeyecek.", - "OptOutCompleteBis": "Tanımama bilgilerini temizlerseniz, izlemeyi kapatma tanımlama bilgisini silerseniz ya da farklı bir bilgisayar ya da tarayıcı kullanırsanız izlemeyi kapatma işlemini yeniden yapmanız gerekeceğini unutmayın.", - "OptOutCustomOptOutLink": "Ayrıca, bu geliştirici %1$srehberinde%2$s açıklandığı gibi, HTML ve JavaScript kullanarak tümüyle özel bir etkisizleştirme formu da oluşturabilirsiniz.", - "OptOutDntFound": "Tarayıcınız tarafından izlemeyi kapattığınız bildirildiğinden ziyaretiniz izlenmeyecek. Bu seçenek tarayıcınız ile ilgili olduğundan 'İzlenmek istemiyorum' özelliği kapatılmadıkça yeniden izleme yapılamaz.", - "OptOutErrorNoCookies": "İzlemeyi kapatma özelliğinin kullanabilmesi için tanımlama bilgileri açılmış olmalıdır.", - "OptOutErrorNoTracker": "İzlemeyi kapatma özelliği bu sayfada bir Matomo izleme kodu bulamadı", - "OptOutErrorNotHttps": "Site HTTPS üzerinden yüklenmediğinden, izlemeyi kapatma özelliği çalışamayabilir. Lütfen izlemeyi kapatma durumunuzun değişip değişmediğini görmek için sayfayı yeniden yükleyin.", - "OptOutErrorWindowOpen": "İzlemeyi kapatma açılan penceresi engellendiğinden, izlemeyi kapatma özelliği çalışamayabilir. Lütfen izlemeyi kapatma durumunuzun değişip değişmediğini görmek için sayfayı yeniden yükleyin.", - "OptOutExplanation": "Matomo uygulaması İnternette gizlilik sağlamaya adanmıştır. Ekteki HTML kodunu sitedeki bir sayfaya ekleyerek ziyaretçilerinize Matomo site istatistikleri izlemesini kapatma (isteğe bağlı) seçeneği sunabilirsiniz. Örneğin gizlilik ilkesi sayfasında bu seçeneği sunabilirsiniz.", - "OptOutExplanationIntro": "Bu kod bir div içinde, ziyaretçilerin tarayıcılarına bir izlemeyi kapatma tanımlama bilgisi ekleyerek Matomo izlemesini kapatabileceği bir bağlantı görüntüler. Div içinde görüntülenecek içeriği aşağıda görebilirsiniz (ya da %1$sburaya tıklayın%2$s).", - "OptOutForYourVisitors": "Ziyaretçileriniz için Matomo izlemesini kapatmak", - "OptingYouOut": "İzlenmeme ayarlanıyor, lütfen bekleyin…", - "PersonalPluginSettings": "Kişisel eklenti ayarları", - "PiwikIsInstalledAt": "Matomo şuraya kurulmuş", - "PluginSettingChangeNotAllowed": "\"%2$s\" eklentide \"%1$s\" ayarının değerini değiştirme izniniz yok", - "PluginSettingReadNotAllowed": "\"%2$s\" eklentisinde \"%1$s\" ayarının değerini okuma izniniz yok", - "PluginSettings": "Eklenti ayarları", - "PluginSettingsIntro": "Şu üçüncü taraf eklentilerinin ayarları bu bölümden değiştirilebilir:", - "PluginSettingsSaveFailed": "Eklenti ayarları kaydedilemedi", - "PluginSettingsSaveSuccess": "Eklenti ayarları güncellendi.", - "PluginSettingsValueNotAllowed": "Değer \"%2$s\" eklentisindeki \"%1$s\" alanı için kabul edilmiyor", - "Problem": "Sorun", - "ProtocolNotDetectedCorrectly": "Şu anda Matomo uygulamasına güvenli bir SSL bağlantısı (HTTPS ile) erişiyorsunuz ancak Matomo sunucu üzerinde yalnızca güvenli olmayan bağlantıları algılayabiliyor.", - "ProtocolNotDetectedCorrectlySolution": "Matomo uygulamasının içeriğinizi HTTPS üzerinden güvenli olarak alması ve göndermesi için %1$s dosyasını düzenleyerek vekil sunucu ayarlarını yapılandırabilir ya da %3$s bölümünün altına %2$s satırını ekleyebilirsiniz. %4$sAyrıntılı bilgi almak için buraya bakabilirsiniz%5$s", - "ReactDescription": "Siteniz React kullanıyorsa, lütfen %1$sbu rehbere%2$s bakın.", - "ReleaseChannel": "Dağıtım kanalı", - "SecurityNotificationAllTokenAuthDeletedBody": "Birisi hesabınızın tüm kimlik doğrulama kodlarını sildi.", - "SecurityNotificationAnonymousAccessEnabledBody": "Birisi %1$s için anonim kullanıcı erişimini açtı. Bu durum, bu sitenin verilerine artık herkese açık olarak erişilebileceği anlamına gelir. Sorun yoksa, bu e-postayı yok sayabilirsiniz.", - "SecurityNotificationCheckTwoFactor": "Lütfen iki adımlı doğrulama uygulamanızı ya da aygıtınızı denetleyin.", - "SecurityNotificationEmailSubject": "Güvenlik bildirimi", - "SecurityNotificationIfItWasYou": "Bu işlem hakkında bilginiz varsa bu uyarıyı yok sayabilirsiniz. Bilginiz yoksa, lütfen parolanızı sıfırlayın.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Birisi hesabınız için yeni iki adımlı doğrulama kurtarma kodları oluşturdu.", - "SecurityNotificationRecoveryCodesShowedBody": "Birisi hesabınızın iki adımlı doğrulama kurtarma kodlarına baktı.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Başka bir süper kullanıcı (%1$s) sistem ayarlarını değiştirdi. Etkilenen ayarlar: %2$s. Bu işlem hakkında bilginiz varsa bu uyarıyı yok sayabilirsiniz. Bilginiz yoksa, diğer süper kullanıcılar ile görüşün.", - "SecurityNotificationSettingsChangedByUserBody": "Birisi sistem ayarlarını değiştirdi. Etkilenen ayarlar: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Birisi hesabınız için bir kimlik doğrulama kodu oluşturdu (açıklama: %s). Bu işlemi siz yapmadıysanız bu kodu silin.", - "SecurityNotificationTokenAuthDeletedBody": "Birisi hesabınızın bir kimlik doğrulama kodunu sildi (açıklama: %s).", - "SecurityNotificationTwoFactorAuthDisabledBody": "Birisi hesabınız için iki adımlı doğrulamayı kapattı.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Birisi hesabınız için iki adımlı doğrulamayı açtı.", - "SecurityNotificationUserAcceptInviteBody": "Kullanıcı (kullanıcı adı: %s) çağrıyı kabul etti.", - "SecurityNotificationUserCreatedBody": "Birisi hesabınız için yeni bir kullanıcı oluşturdu (kullanıcı adı: %s).", - "SecurityNotificationUserDeclinedInviteBody": "Kullanıcı (kullanıcı adı: %s) çağrıyı reddetti.", - "SecurityNotificationUserDeletedBody": "Birisi hesabınızdan bir kullanıcı sildi (kullanıcı adı: %s).", - "SendPluginUpdateCommunication": "Eklenti güncellemeleri e-posta ile bildirilsin", - "SendPluginUpdateCommunicationHelp": "Bu seçenek açıldığında, yayınlanan eklenti güncellemeleri e-posta ile süper kullanıcılara bildirilir.", - "SettingsSaveSuccess": "Ayarlar güncellendi.", - "ShowAdvancedOptions": "Gelişmiş ayarları görüntüle", - "SinglePageApplicationDescription": "Tek sayfalık bir uygulamayı (SPA) veya aşamalı internet uygulamasını (PWA) izliyorsanız, lütfen %1$sbu rehbere%2$s bakın.", - "Solution": "Çözüm", - "StableReleases": "Matomo işinizin önemli bir parçasıysa, son kararlı sürümü kullanmanız önerilir. Son beta sürümünü kullanıyorsanız ve bir hata ya da öneri bildirmek isterseniz, %1$sburaya bakabilirsiniz%2$s.", - "SystemPluginSettings": "Sistem eklentisi ayarları", - "TrackAGoal": "Bir hedef izleme", - "TrackingCode": "İzleme kodu", - "TrackingCodeIntro": "Matomo sitenize, mobil uygulamanıza ve değişik aygıt ve uygulamalara izleme kodunu gömmek için çeşitli yöntemler sunar.", - "TrackingFailureAuthenticationProblem": "İstekte kimlik doğrulaması yapılmamış ancak kimlik doğrulaması isteniyor.", - "TrackingFailureAuthenticationSolution": "İzleme isteği için \"kimlik doğrulama kodu (token_auth)\" değerini ayarlayın ya da düzeltin.", - "TrackingFailureInvalidSiteProblem": "Site bulunamadı.", - "TrackingFailureInvalidSiteSolution": "İzleyicide yapılandırılmış idSite değerini güncelle.", - "TrackingFailures": "İzleme sorunları", - "TrackingFailuresEmail1": "Bu ileti, son günlerde %s farklı izleme sorunu oluştuğunu bildirir.", - "TrackingFailuresEmail2": "Tüm izleme sorunlarını görüntülemek için %1$sburaya tıklayın%2$s.", - "TrackingFailuresEmailSubject": "Matomo istatistiklerindeki izleme sorunları", - "TrackingFailuresIntroduction": "Bu sayfada son %s gündeki izleme sorunlarını görebilirsiniz. Tüm sorunların değil yalnızca sık rastlanan izleme sorunlarının kaydedildiğini unutmayın.", - "TrackingURL": "İzleme adresi", - "TrustedHostConfirm": "Güvenilir Matomo sunucu adınızı değiştirmek istediğinize emin misiniz?", - "TrustedHostSettings": "Güvenilir Matomo sunucu adı", - "TwoFactorAuth": "İki adımlı doğrulama", - "UiDemo": "Kullanıcı arayüzü tanıtımı", - "UncheckToOptOut": "İzlemeyi kapatmak için bu kutudaki işareti kaldırın.", - "UpdateSettings": "Ayarları güncelle", - "UseCustomLogo": "Özel logo kullanılsın", - "UserInviteContent": "Bu çağrıyı aşağıdaki düğmeye tıklayarak kabul edebilirsiniz.", - "UserInviteNotes": "Böyle bir çağrı beklemiyorsanız, bu e-postayı yok sayabilirsiniz. %1$s size çok sayıda e-posta gönderiyorsa, engelleyebilir ya da şikayet edebilirsiniz. Çağrının %2$s gün sonra otomatik olarak geçersiz olur.", - "UserInviteSubject": "%1$s, sizi %2$s için Matomo Analytics platformuna katılmaya çağırdı.", - "ValidPiwikHostname": "Geçerli Matomo sunucu adı", - "ViewAllTrackingFailures": "Tüm izleme sorunlarını görüntüle", - "VueDescription": "Siteniz Vue.js kullanıyorsa, lütfen %1$sbu rehbere%2$s bakın.", - "WhatIsNew": "Yenilikler", - "WhatIsNewDoNotShowAgain": "Bir daha gösterme", - "WhatIsNewNoChanges": "Şu anda herhangi bir yenilik yok", - "WhatIsNewNoChangesTitle": "Son zamanlarda bir değişiklik yapılmamış", - "WhatIsNewRemindMeLater": "Daha sonra anımsat", - "WhatIsNewTitle": "Matomo uygulamasındaki yenilikleri burada görebilirsiniz", - "WhatIsNewTooltip": "Matomo uygulamasındaki yenilikleri öğrenin", - "WithOptionalRevenue": "isteğe bağlı olarak gelir ile", - "WordpressDescription": "Siteniz Wordpress kullanıyorsa, lütfen %1$sbu rehbere bakın%2$s.", - "YouAreNotOptedOut": "İzni iptal etmemişsiniz.", - "YouAreOptedOut": "Şu anda izlenmiyorsunuz.", - "YouMayOptOut": "Bu siteye yaptığınız ziyaretlerle ilgili istatistik verilerinin, bilgisayarınıza özel bir kod içeren eşsiz bir site istatistiği tanımlama bilgisi ile toplanmasının engellenmesini seçebilirsiniz.", - "YouMayOptOut2": "Bu sitenin burada belirtilen veri toplama ve istatistik işlemlerini yapmasını engelleyebilirsiniz.", - "YouMayOptOut3": "Bu işlemi yaparak gizliliğinizi korumuş olursunuz ancak site sahibinin size ve diğer konuklara daha iyi bir deneyim sağlaması için yararlı bilgileri almasını engellemiş olursunuz.", - "YouMayOptOutBis": "Bu seçeneği uygulamak aşağıya tıklayarak izlemeyi kapatma tanımlama bilgisini alın." - } -} diff --git a/plugins/CoreAdminHome/lang/tzm.json b/plugins/CoreAdminHome/lang/tzm.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/tzm.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/CoreAdminHome/lang/uk.json b/plugins/CoreAdminHome/lang/uk.json deleted file mode 100644 index 2655b33ca7ca3cde91048903c61745c6c7b35b05..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/uk.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "Прийняти запрошення", - "AddNewTrustedHost": "Додати новий довірений хост", - "Administration": "Адміністрування", - "ArchivingSettings": "Налаштування архівації", - "BrandingSettings": "Налаштування логотипу", - "BruteForce": "Повний Перебір", - "CheckToOptIn": "Позначте цей пункт, щоб підписатися.", - "ClickHereToOptIn": "Натисніть, щоб ви враховувалися в аналітиці.", - "ClickHereToOptOut": "Натисніть, щоб відмовитися від обліку вас в аналітиці.", - "CloudflareDescription": "Якщо ваш вебсайт розміщено на Cloudflare, ознайомтеся з %1$sцим посібником%2$s.", - "ConfirmDeleteAllTrackingFailures": "Ви впевнені, що бажаєте видалити всі помилки відстежування?", - "ConfirmDeleteThisTrackingFailure": "Ви впевнені, що бажаєте видалити цю помилку відстежування?", - "Cors": "Cors", - "CorsDomains": "Домени спільного використання ресурсів (CORS)", - "CorsDomainsHelp": "Ви можете визначити домени або субдомени, наприклад http://example.com або http://stats.example.com. Або, щоб дозволити міждоменні запити для всіх доменів, просто додайте *", - "CustomLogoFeedbackInfo": "Якщо ви персоналізуєте логотип Matomo, вам, можливо, також знадобиться приховати посилання %1$s у верхньому меню. Для цього просто вимкніть плагін Feedback (зворотний зв'язок) на сторінці %2$sКерування плагінами%3$s.", - "CustomLogoHelpText": "Ви можете додати свій логотип, який буде показано у звітах.", - "DeclineInvite": "Відхилити запрошення", - "DeleteAllFailures": "Видалити всі помилки", - "DevelopmentProcess": "Хоча наш процес розробки включає в себе тисячі автоматизованих тестів, бета-тестери відіграють ключову роль у досягненні політики \"No bug policy\" в Matomo.", - "EmailServerSettings": "Налаштування серверу електронної пошти", - "ErrorEmailFromAddressNotValid": "SMTP адреса «від» неприйнятна", - "FaviconUpload": "вибрати Favicon для завантаження", - "FileUploadDisabled": "Завантаження файлів не ввімкнене у вашій конфігурації PHP. Для завантаження іншого логотипу вставте %s в php.ini та перезапустіть вебсервер.", - "ForBetaTestersOnly": "Тільки для бета-тестерів", - "GoogleTagManagerDescription": "Якщо ваш вебсайт використовує Google Tag Manager, читайте %1$sцей посібник%2$s.", - "HideAdvancedOptions": "Сховати додаткові параметри", - "HowToGetHelp": "Є різні способи отримати допомогу. Існує безкоштовна підтримка через спільноту Matomo і платна підтримка, яку надає команда Matomo та партнери. Або, можливо, ви маєте повідомити про помилку чи бажаєте запропонувати нову функцію?", - "HttpTrackingApi": "API відстеження HTTP", - "HttpTrackingApiDescription": "%1$s API відстеження HTTP%2$s дозволяє відстежувати будь-що. Це може бути корисним, якщо ви використовуєте мову програмування, для якої ще не існує SDK. Це також може бути корисно, коли потрібно відстежувати пристрої або застосунки спеціальним способом.", - "ImageTracking": "Відстеження через зображення", - "ImageTrackingIntro1": "Коли відвідувач відключив JavaScript, або коли JavaScript не може бути використано, ви можете використовувати посилання на зображення для відстеження відвідувачів.", - "ImageTrackingIntro2": "Створіть посилання нижче і розмістіть згенерований на сторінках HTML. Якщо ви використовуєте це в якості запасного варіанту для відстеження без JavaScript, ви можете його оточити його в тег %1$s.", - "ImageTrackingIntro3": "Весь список опцій, які можна використовувати з зображенням-посиланням відстеження дивіться в %1$sTracking API Documentation%2$s.", - "ImageTrackingLink": "Посилання на зображення для відстеження", - "ImportFromGoogleAnalytics": "Імпорт із Google Analytics", - "ImportFromGoogleAnalyticsDescription": "Якщо у вас є власність у Google Analytics і ви переходите на Matomo, то ви можете імпортувати наявні дані за допомогою розширення %1$sGoogleAnalyticsImporter%2$s.", - "ImportingServerLogsDesc": "Альтернативою відстеження відвідувачів через браузер (замість JavaScript або посилання на зображення) є постійне імпортування логів сервера. дізнатися більше про %1$sServer Log File Analytics%2$s.", - "InvalidPluginsWarning": "Такий модуль не сумісні з %1$s і не можуть бути завантажені: %2$s.", - "InvalidPluginsYouCanUninstall": "Ви можете оновити або видалити ці плагіни на сторінці %1$sКерування плагінами%2$s.", - "JSTrackingDocumentationHelp": "Для зручності далі наведені найпопулярніші додаткові параметри. Додаткову інформацію (в тому числі про те, як відстежувати цілі, власні змінні, замовлення електронної комерції та покинуті кошики) читайте в %1$sдокументації Matomo Javascript Tracking%2$s.", - "JSTrackingIntro1": "Ви можете відстежувати відвідувачів вашого вебсайту різними способами. Радимо робити це за допомогою JavaScript. Щоб скористатися цим методом, ви повинні переконатися, що кожна вебсторінка вашого вебсайту матиме певний код JavaScript, який ви можете тут створити.", - "JSTrackingIntro2": "Як тільки ви отримали Javascript код для вашого сайту, скопіюйте і вставте його на всі сторінки вашого сайту, на яких ви хочете відслідковувати відвідувачів.", - "JSTrackingIntro3a": "На більшості вебсайтів, блогів, CMS і т.д. ви можете використати готове розширення, яке встановить код за вас. (Дивіться наш %1$sсписок розширень для інтеграції з Matomo%2$s.)", - "JSTrackingIntro3b": "Якщо жодного розширення не існує, ви можете відредагувати шаблони свого вебсайту і додати код JavaScript для відстеження до тегу </head> що часто зустрічається у «header.php», «header.tpl» або схожому файлі шаблону.", - "JSTrackingIntro4": "Якщо ви не хочете або не можете використовувати JavaScript, %1$sскористайтеся відстеженням відвідувачів через зображення%2$s.", - "JSTrackingIntro5": "Якщо ви хочете більше, ніж просте відстеження сторінок, будь ласка, ознайомтеся з %1$sMatomo Javascript Tracking documentation%2$s для перегляду всіх функцій. За допомогою цих функцій ви можете відстежувати цілі, призначені для користувача змінні, замовлення електронної комерції, неоформлені замовлення і багато іншого.", - "JSTracking_CampaignKwdParam": "Параметр Ключового слова кампанії", - "JSTracking_CampaignNameParam": "Параметр Імені кампанії", - "JSTracking_CodeNoteBeforeClosingHead": "Натисніть на кнопку, щоб скопіювати фрагмент коду і вставити його безпосередньо перед закривним тегом %1$s (рекомендовано)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "Переконайтеся, що цей код вбудований в елемент «script» на кожній сторінці вашого вебсайту. Ми рекомендуємо вбудувати його безпосередньо перед закриттям тегу «head».", - "JSTracking_ConsentManagerConnected": "Схоже, %1$s вже налаштовано на роботу з Matomo.", - "JSTracking_ConsentManagerDetected": "На вашому сайті виявлено менеджер згоди %1$s. Щоб дізнатися про налаштування Matomo для роботи з %1$s, відвідайте %2$s", - "JSTracking_ConsentManagerEmailNote": "Або ви можете вбудувати код відстеження безпосередньо на свій вебсайт:", - "JSTracking_CrossDomain": "За замовчуванням, ідентифікатор відвідувача, який генерує унікальний відвідувач зберігається в першій партії куків браузера, які можуть бути доступні тільки на сторінках на тому ж домені. Активація зв'язування перехресного домену, дозволяє відстежувати всі дії і перегляди сторінок конкретного відвідувача в одному відвідування, навіть коли він розглядає сторінки на декількох доменах. Всякий раз, коли користувач натискає на посилання на один із псевдонімів URL-адреси вашого сайту, буде додаватися параметр URL-адреси pk_vid пересилаючи ідентифікатор відвідувача.", - "JSTracking_CrossDomain_NeedsMultipleDomains": "Примітка. Для використання міждоменного посилання потрібно вказати більше одного доменного імені (URL-адреси) для вашого вебсайту.", - "JSTracking_CustomCampaignQueryParam": "Використовувати користувацькі назви параметрів у запиті для назви кампанії та ключового слова", - "JSTracking_CustomCampaignQueryParamDesc": "Примітка: %1$sMatomo автоматично визначить параметри Google Analytics.%2$s", - "JSTracking_DisableCampaignParameters": "Вимкнути відстеження параметрів кампанії", - "JSTracking_DisableCampaignParametersDesc": "Коли цей параметр увімкнено, Matomo не буде відстежувати параметри кампанії, і вони будуть видалені з відстежуваних URL-адрес.", - "JSTracking_DisableCookies": "Відключити всі відстеження cookies", - "JSTracking_DisableCookiesDesc": "Вимикає всі куки першої сторони. Наявні куки Matomo для цього вебсайту будуть видалені за наступного перегляду сторінки.", - "JSTracking_EnableCrossDomainLinking": "Frnbdedfnb міждоменні зв'язки", - "JSTracking_EnableDoNotTrack": "Задіяти виявлення DoNotTrack на стороні користувача", - "JSTracking_EnableDoNotTrackDesc": "Користувач не буде відслідковуватися, якщо він цього не хоче.", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Примітка: на стороні сервера підтримка DoNotTrack була увімкнена, так що ця опція не матиме ніякого ефекту.", - "JSTracking_EndNote": "Примітка. Ви можете створити індивідуальний код відстеження в %1$s Коді відстеження%2$sадміністратору розділ.", - "JSTracking_GroupPageTitlesByDomain": "Підставляти домен сайту перед назвою сторінки при відстеженні", - "JSTracking_GroupPageTitlesByDomainDesc1": "Так що, якщо хтось відвідує сторінку 'Про нас' на піддомені blog.%1$s він буде записаний як 'blog / Про нас'. Це найпростіший спосіб отримати огляд вашого трафіку по піддоменах.", - "JSTracking_MergeAliases": "У звіті «Зовнішні посилання» приховати кліки відомих псевдонімів сайту", - "JSTracking_MergeAliasesDesc": "Переходи по посиланнях на псевдоніми домену (наприклад, %s) не враховуватимуться як «Зовнішні посилання».", - "JSTracking_MergeSubdomains": "Відстежувати відвідувачів через все піддомени сайту", - "JSTracking_MergeSubdomainsDesc": "Якщо один відвідувач заходив на %1$s і %2$s, то відвідування будуть враховуватися як унікальний відвідувач.", - "JSTracking_PageCustomVars": "Відстежувати змінні для кожного виду сторінки", - "JSTracking_PageCustomVarsDesc": "Наприклад, ім'я змінної «Категорія», а значення – «Офіційні документи».", - "JSTracking_TrackNoScript": "Користувачів з відслідковуванням JavaScript вимкнено", - "JSTracking_VisitorCustomVars": "Відстежувати змінні для відвідувача", - "JSTracking_VisitorCustomVarsDesc": "Наприклад, ім'я змінної «Тип», а значення – «Клієнт».", - "JavaScriptCode": "Код JavaScript", - "JavaScriptTracking": "JavaScript-відстеження", - "JsTrackingCodeAdvancedOptionsStep": "Додатково: скористайтеся розширеними опціями, щоб налаштувати свій код відстеження.", - "JsTrackingCodeMissingEmail1": "Кілька днів тому ви додали вебсайт '%s' для вашої Matomo Analytics. Ми просто перевірили, і ваш Matomo не має ніякого зареєстрованого трафіку для цього вебсайту.", - "JsTrackingCodeMissingEmail2": "Щоб розпочати відстеження даних і отримання статистики ваших користувачів, потрібно налаштувати відстеження на вашому вебсайті або в мобільному застосунку. Для вебсайтів просто вбудуйте код відстеження безпосередньо перед тегом %s.", - "JsTrackingCodeMissingEmail3": "Щоб знайти та налаштувати код відстеження, %1$sнатисніть тут%2$s (або подивіться на %3$sJavaScript керівництво з відстеження%4$s).", - "LearnMore": "Читати більше", - "Login": "логін", - "LogoNotWriteableInstruction": "Щоб використовувати власне лого замість стандартного Matomo, відкрийте для запису цю теку: %1$s Matomo потрібен доступ на запис вашого лого, що зберігається в файлах %2$s.", - "LogoUpload": "Виберіть лого для завантаження", - "LogoUploadFailed": "Завантажений файл не може бути оброблений. Будь ласка, перевірте, що файл має потрібний формат.", - "LogoUploadHelp": "Будь ласка, закачуйте файли в %1$s форматах, мінімальне обмеження по висоті – %2$s пікселів.", - "LtsReleases": "Версії LTS (довгострокова підтримка) отримують тільки виправлення, що стосуються безпеки і помилок.", - "MenuDevelopment": "Розробка", - "MenuDiagnostic": "Діагностика", - "MenuGeneralSettings": "Основні налаштування", - "MenuMeasurables": "Одиниці виміру", - "MenuSystem": "Система", - "MissingTrackingCodeEmailSubject": "Немає трафіку для %s записів в Matomo Analytics, розпочніть зараз", - "NTrackingFailures": "%s помилок відстеження", - "NeedHelp": "Потрібна допомога?", - "NoKnownFailures": "Немає відомих помилок відстеження.", - "OptOutComplete": "Виняток з політики конфіденційності завершено; ваші відвідування на даний сайт не враховуватимуться системою веб аналітики. Ми поважаємо ваш вибір.", - "OptOutCompleteBis": "Зауважте, що якщо ви очистите cookies браузера, то, швидше за все, видалитсья і винятковий cookie, або якщо ви поміняєте комп'ютер або браузер, то необхідно буде пройти процедуру виключення знову.", - "OptOutCustomOptOutLink": "Ви також можете створити повністю індивідуальну форму відмови за допомогою HTML та JavaScript, як пояснюється в цьому %1$sпосібнику%2$s для розробників.", - "OptOutDntFound": "Ваші дії не відстежувалися, так як ваш браузер повідомляє, що ви не хочете цього. Це настройка вашого браузера, тому у вас не буде можливості ввімкнути її до тих пір, поки ви не вимкнете опцію \"Не відстежувати\".", - "OptOutErrorNoCookies": "Функція відмови від відстеження вимагає ввімкнення файлів cookie.", - "OptOutErrorNoTracker": "Функція відмови від стеження не змогла знайти код Matomo Tracker на цій сторінці", - "OptOutErrorNotHttps": "Функція відмови від відстеження може не працювати, оскільки цей сайт завантажено не через HTTPS. Будь ласка, перезавантажте сторінку, щоб перевірити, чи змінився стан відмови від відстеження.", - "OptOutErrorWindowOpen": "Функція відмови від стеження може не працювати, оскільки спливне вікно відмови заблоковане. Будь ласка, перезавантажте сторінку, щоб перевірити, чи змінився стан відмови від стеження.", - "OptOutExplanation": "Matomo – за збереження особистих даних в мережі. Тому дана система може запропонувати вашим користувачам вибір виключення з політики конфіденційності (відмова від подальшого збору статистики про користувача). Ви можете вставити наступний HTML-код на одну з ваших сторінок сайту, наприклад на сторінку про гарантії конфіденційності.", - "OptOutExplanationIntro": "Цей код покаже div, що містить посилання для ваших відвідувачів, щоб відмовитися від Matomo, установивши відмову від файлів cookie у своїх браузерах. Читайте нижче (або %1$sклацніть тут%2$s), щоб переглянути вміст, який показується в div.", - "OptOutForYourVisitors": "Виняток з політики конфіденційності Matomo для відвідувачів", - "OptingYouOut": "Відписуємо вас, будь ласка, зачекайте…", - "PersonalPluginSettings": "Персональні налаштування плагінів", - "PiwikIsInstalledAt": "Matomo встановлений в", - "PluginSettingChangeNotAllowed": "Вам не дозволено змінювати значення \"%1$s\" для плагіну \"%2$s\"", - "PluginSettingReadNotAllowed": "Ви не дозволено читати значення \"%1$s\" плагіну \"%2$s\"", - "PluginSettings": "Налаштування плагінів", - "PluginSettingsIntro": "Тут ви можете змінити налаштування для наступних сторонніх плагінів:", - "PluginSettingsSaveFailed": "Не вдалося зберегти налаштування плагіна", - "PluginSettingsSaveSuccess": "Налаштування плагіну оновлені.", - "PluginSettingsValueNotAllowed": "Значення для поля \"%1$s\" в плагіні \"%2$s\" не дозволено", - "Problem": "Проблеми", - "ProtocolNotDetectedCorrectly": "В даний момент ви переглядаєте Matomo через безпечне з'єднання SSL (використовуючи HTTPS), але Matomo зміг виявити тільки небезпечне з'єднання на сервері.", - "ProtocolNotDetectedCorrectlySolution": "Щоб упевнитися, что Matomo безпечно запитує і обробляє ваш контент через HTTPS, ви можете відредагувати свій файл %1$s або налаштувати ваші настройки проксі, або ви можете додати лінію %2$s під розділом %3$s. %4$sДізнатися більше%5$s", - "ReactDescription": "Якщо ваш сайт використовує React, перегляньте %1$sцей посібник%2$s.", - "ReleaseChannel": "Канал випуску", - "SecurityNotificationAllTokenAuthDeletedBody": "Хтось видалив усі маркери автентифікації у вашому обліковому записі.", - "SecurityNotificationAnonymousAccessEnabledBody": "Хтось ввімкнув анонімний доступ для %1$s. Це означає, що дані для цього сайту тепер загальнодоступні. Якщо ви не проти, можете проігнорувати цей лист.", - "SecurityNotificationCheckTwoFactor": "Будь ласка, перевірте ваш застосунок або пристрій для двофакторної автентифікації.", - "SecurityNotificationEmailSubject": "Сповіщення про безпеку", - "SecurityNotificationIfItWasYou": "Якщо це були ви, продовжуйте. Якщо ви не впізнаєте цю діяльність, будь ласка, змініть ваш пароль.", - "SecurityNotificationRecoveryCodesRegeneratedBody": "Хтось створив нові коди відновлення двофакторної автентифікації для вашого облікового запису.", - "SecurityNotificationRecoveryCodesShowedBody": "Хтось переглянув коди відновлення двофакторної автентифікації вашого облікового запису.", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Інший суперкористувач (%1$s) змінив налаштування системи. Порушені параметри: %2$s. Якщо ви знаєте про цю діяльність, продовжуйте. Якщо ви не впізнаєте її, будь ласка, зв'яжіться з іншими суперкористувачами.", - "SecurityNotificationSettingsChangedByUserBody": "Хтось змінив налаштування системи. Порушені параметри: %s.", - "SecurityNotificationTokenAuthCreatedBody": "Хтось створив маркер автентифікації (опис: %s) у вашому обліковому записі. Якщо це були не ви, видаліть маркер.", - "SecurityNotificationTokenAuthDeletedBody": "Хтось видалив маркер автентифікації (опис: %s) у вашому обліковому записі.", - "SecurityNotificationTwoFactorAuthDisabledBody": "Хтось вимкнув двофакторну автентифікацію у вашому обліковому записі.", - "SecurityNotificationTwoFactorAuthEnabledBody": "Хтось увімкнув двофакторну автентифікацію у вашому обліковому записі.", - "SecurityNotificationUserAcceptInviteBody": "Користувач (прізвисько: %s) прийняв запрошення.", - "SecurityNotificationUserCreatedBody": "Хтось створив нового користувача (прізвисько: %s) у вашому обліковому записі.", - "SecurityNotificationUserDeclinedInviteBody": "Користувач (прізвисько: %s) відхилив запрошення.", - "SecurityNotificationUserDeletedBody": "Хтось видалив користувача (прізвисько: %s) у вашому обліковому записі.", - "SendPluginUpdateCommunication": "Відправити email з повідомленням, коли для плагіна буде доступна нова версія", - "SendPluginUpdateCommunicationHelp": "Лист буде відправлено суперкористувачеві коли буде доступна нова версія плагіна.", - "SettingsSaveSuccess": "Налаштування оновлені.", - "ShowAdvancedOptions": "Показати додаткові параметри", - "SinglePageApplicationDescription": "Якщо ви відстежуєте односторінковий застосунок (SPA) або прогресивний вебзастосунок (PWA), будь ласка, перегляньте %1$sцей посібник%2$s.", - "Solution": "Рішення", - "StableReleases": "Якщо Matomo є важливою частиною вашого бізнесу, ми рекомендуємо використовувати останню стабільну версію. Якщо ви використовуєте останню бета версію, і ви знайшли помилку або є пропозиція, будь ласка, %1$sперейдіть за посиланням%2$s.", - "SystemPluginSettings": "Системні налаштування плагінів", - "TrackAGoal": "Відстежувати ціль", - "TrackingCode": "Код відстеження", - "TrackingCodeIntro": "Matomo пропонує вам різні способи вставити код відстеження для вашого вебсайту, мобільного застосунку та навіть для будь-якого пристрою чи застосунку.", - "TrackingFailureAuthenticationProblem": "Запит не було автентифіковано, проте це обов'язково.", - "TrackingFailureAuthenticationSolution": "Встановіть або виправте «token_auth» у вашому запиті на відстеження.", - "TrackingFailureInvalidSiteProblem": "Сайт не знайдено.", - "TrackingFailureInvalidSiteSolution": "Оновіть налаштований idSite у трекері.", - "TrackingFailures": "Відстеження несправностей", - "TrackingFailuresEmail1": "Це лише для того, щоб повідомити вас про %s різні види несправностей відстеження, що сталися за останні дні.", - "TrackingFailuresEmail2": "Щоб переглянути всі невдалі запити на відстеження, %1$sнатисніть тут%2$s.", - "TrackingFailuresEmailSubject": "Відстеження несправностей у вашій Matomo Analytics", - "TrackingFailuresIntroduction": "На цій сторінці перелічено несправності відстеження, які сталися протягом останніх %s днів. Будь ласка, зауважте, що реєструються лише найпоширеніші несправності, а не всі з них.", - "TrackingURL": "Відслідковування URL", - "TrustedHostConfirm": "Ви впевнені, що хочете змінити ім'я довіреного хоста Matomo?", - "TrustedHostSettings": "Довірені хости Matomo", - "TwoFactorAuth": "Двофакторна автентифікація", - "UiDemo": "UI Приклад", - "UncheckToOptOut": "Зніміть прапорець, щоб відмовитися.", - "UpdateSettings": "Налаштування оновлення", - "UseCustomLogo": "Використовувати свій логотип", - "UserInviteContent": "Ви можете прийняти це запрошення, натиснувши кнопку прийняття нижче.", - "UserInviteNotes": "Якщо ви не очікували запрошення, можете проігнорувати цей електронний лист. Якщо %1$s надсилає вам занадто багато електронних листів, ви можете заблокувати ці листи або повідомити про зловживання. Термін дії запрошення через %2$s днів автоматично завершиться.", - "UserInviteSubject": "Користувач %1$s надіслав вам запрошення приєднатися до Matomo Analytics для %2$s.", - "ValidPiwikHostname": "Домен для Matomo", - "ViewAllTrackingFailures": "Переглянути всі помилки відстеження", - "VueDescription": "Якщо ваш вебсайт використовує Vue.js, перегляньте %1$sцей посібник%2$s.", - "WhatIsNew": "Що нового", - "WhatIsNewDoNotShowAgain": "Не показувати знову", - "WhatIsNewNoChanges": "На даний момент немає нічого нового", - "WhatIsNewNoChangesTitle": "Немає нещодавніх змін", - "WhatIsNewRemindMeLater": "Нагадати мені пізніше", - "WhatIsNewTitle": "Ось що нового в Matomo", - "WhatIsNewTooltip": "Дізнайтеся, що нового в Matomo", - "WithOptionalRevenue": "з додатковим доходом", - "WordpressDescription": "Якщо ваш вебсайт використовує Wordpress, перегляньте %1$sцей посібник%2$s.", - "YouAreNotOptedOut": "Ви не вилучені.", - "YouAreOptedOut": "Ви відмовилися від збору статистичних даних.", - "YouMayOptOut": "Ви можете відмовитися від унікального cookie, прив'язаному до вашого браузеру, що ідентифікує вас в системі аналітики даного сайту, тим самим відмовившись від будь-якого збору відомостей про вас і їх аналізу на даному сайті.", - "YouMayOptOut2": "Ви можете заборонити цьому вебсайту об’єднувати та аналізувати дії, які ви тут виконуєте.", - "YouMayOptOut3": "Це захистить вашу конфіденційність, але також не дасть власнику вчитися на ваших діях і створювати кращий користувацький досвід для вас та інших.", - "YouMayOptOutBis": "Зніміть галочку і отримаєте виключення cookie для відмови збору даних." - } -} diff --git a/plugins/CoreAdminHome/lang/ur.json b/plugins/CoreAdminHome/lang/ur.json deleted file mode 100644 index 20b3aec38d1f2ace6a6ea4d131d988e0ff53cee0..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/ur.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "CoreAdminHome": { - "Administration": "انتظامیہ", - "ArchivingSettings": "آرکیویٹنگ سیٹنگیں", - "ClickHereToOptIn": "اشتراک کیلئے یہاں کلک کریں۔", - "EmailServerSettings": "ای میل سرور کی سیٹنگز", - "ForBetaTestersOnly": "صرف beta جانچ پڑتال کرنے والوں کیلئے", - "ImageTracking": "تصویر کی ٹریکنگ", - "ImageTrackingLink": "تصویر کی ٹریکنگ کا لنک", - "JSTracking_CampaignKwdParam": "مطلوبہ الفاظ کی مہم کے پیرامیٹر", - "JavaScriptTracking": "جاوا سکرپٹ ٹریکنگ" - } -} diff --git a/plugins/CoreAdminHome/lang/vi.json b/plugins/CoreAdminHome/lang/vi.json deleted file mode 100644 index 5446ecc66739f4ac081d2c98e9cbc1d9f940d1f2..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/vi.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "CoreAdminHome": { - "AddNewTrustedHost": "Thêm host tin tưởng mới", - "Administration": "Quản trị", - "ArchivingSettings": "Cấu hình archiving", - "BrandingSettings": "Thiết lập Branding", - "ClickHereToOptIn": "Click vào đây để lựa chọn vào", - "ClickHereToOptOut": "Click vào đây để lựa chọn thoát ra", - "CustomLogoFeedbackInfo": "Nếu bạn tuỳ chỉnh các biểu tượng Matomo, bạn cũng có thể quan tâm đến việc ẩn liên kết %1$s trong top menu. Để làm như vậy, bạn có thể vô hiệu hóa các plugin Thông tin phản hồi trong trang %2$s Plugins Quản lý %3$s.", - "CustomLogoHelpText": "Bạn có thể tùy chỉnh các biểu tượng Matomo sẽ được hiển thị trong giao diện người dùng và thư điện tử báo cáo.", - "EmailServerSettings": "Cấu hình email server", - "FaviconUpload": "Chọn một biểu tượng để tải lên", - "FileUploadDisabled": "Tải lên các tệp không được kích hoạt trong cấu hình PHP của bạn. Để tải lên logo tùy chỉnh của bạn, vui lòng đặt %s trong php.ini và khởi động lại máy chủ web của bạn.", - "ForBetaTestersOnly": "Chỉ áp dụng cho thử nghiệm bản beta", - "ImageTracking": "Theo dõi bằng hình ảnh", - "ImageTrackingIntro1": "Khi một người truy cập đã bị vô hiệu hóa JavaScript, hoặc khi JavaScript không thể được sử dụng, bạn có thể sử dụng một liên kết theo dõi hình ảnh để theo dõi khách.", - "ImageTrackingIntro2": "Sinh đường dẫn dưới đây và sao chép-dán mã HTML đã được sinh vào trang. Nếu bạn muốn rút đoạn mã khỏi JavaScript tracking, bạn có thể bao nó lại bằng thẻ %1$s.", - "ImageTrackingIntro3": "Cho toàn bộ danh sách các tùy chọn, bạn có thể sử dụng với một liên kết theo dõi hình ảnh, xem %1$s Tài liệu theo dõi API %2$s.", - "ImageTrackingLink": "Liên kết theo dõi bằng hình ảnh", - "ImportingServerLogsDesc": "Một cách khác để theo dõi người truy nhập thông qua trình duyệt (kể cả thông qua Java Script hoặc một link hình ảnh) là phép ghi liên tục vào log nằm trên server. Xem thêm về %1$sServer Log File Analytics%2$s", - "InvalidPluginsWarning": "Các plugin sau đây không tương thích với %1$s và không thể nạp: %2$s.", - "InvalidPluginsYouCanUninstall": "Bạn có thể cập nhật hoặc gỡ bỏ cài đặt các plug-in trên trang %1$s Plugins Quản lý %2$s.", - "JSTrackingIntro2": "Một khi bạn có mã theo dõi JavaScript cho trang web của bạn, sao chép và dán nó vào tất cả các trang bạn muốn theo dõi với Matomo.", - "JSTrackingIntro4": "Nếu bạn không muốn sử dụng JavaScript để theo dõi khách truy cập, %1$s tạo ra một liên kết theo dõi hình ảnh dưới đây %2$s.", - "JSTrackingIntro5": "Nếu bạn muốn thực hiện các tác vụ khác theo dõi page view, vui lòng tham khảo %1$sTài liệu Matomo Javascript Tracking%2$s để xem danh sách những chức năng được cung cấp. Sử dụng những chức năng này, bạn có thể theo dõi goals, thông số thiết lập, đơn hàng thương mại điện tử, giỏ hàng bị từ chối và nhiều hơn thế nữa.", - "JSTracking_CampaignKwdParam": "Chiến dịch từ khóa", - "JSTracking_CampaignNameParam": "tên chiến dịch", - "JSTracking_CustomCampaignQueryParam": "Sử dụng tên truy vấn tùy chỉnh cho các tên và từ khóa chiến dịch", - "JSTracking_CustomCampaignQueryParamDesc": "Lưu ý:.%1$s Matomo sẽ tự động phát hiện các thông số Google Analytics. %2$s", - "JSTracking_DisableCookies": "Vô hiệu hóa tất cả cookie theo dõi", - "JSTracking_EnableDoNotTrack": "Cho phép máy khách phát hiện DoNotTrack", - "JSTracking_EnableDoNotTrackDesc": "Vì vậy, yêu cầu theo dõi sẽ không được gửi nếu người truy cập không muốn bị theo dõi", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Lưu ý: máy chủ hỗ trợ DoNotTrack đã được kích hoạt, tùy chọn này sẽ không có hiệu lực", - "JSTracking_GroupPageTitlesByDomain": "Thêm vào tên miền trang web ở đầu tiêu đề trang khi theo dõi", - "JSTracking_GroupPageTitlesByDomainDesc1": "Nếu một người nào đó duyệt trang 'About' trên blog,%1$s nó sẽ được ghi lại là 'blog/About'. Đó là cách dễ nhất để xem tổng quan tình hình trên trang web của bạn.", - "JSTracking_MergeAliases": "Trong báo cáo \"Outlinks\", ẩn các Click chuột để biết bí danh của URL", - "JSTracking_MergeAliasesDesc": "Vì vậy, nhấp chuột vào những liên kết trong Alias URL (ví dụ: %s) sẽ không được tính là \"Outlink\".", - "JSTracking_MergeSubdomains": "Theo dõi khách truy cập trên tất cả các tên miền phụ của", - "JSTracking_MergeSubdomainsDesc": "Vì vậy, nếu số lần truy cập là một %1$s và %2$s, chúng sẽ được tính như một khách truy cập duy nhất", - "JSTracking_PageCustomVars": "Theo dõi một biến tùy chỉnh cho mỗi lần xem trang", - "JSTracking_PageCustomVarsDesc": "Ví dụ, với biến tên \"Category\" và giá trị \"Sách trắng\"", - "JSTracking_VisitorCustomVars": "Theo dõi biến tuỳ chỉnh cho khách truy cập này", - "JSTracking_VisitorCustomVarsDesc": "Ví dụ, với tên biến \"Type\" và giá trị \"khách hàng\".", - "JavaScriptTracking": "Theo dõi JavaScript", - "Login": "Đăng nhập", - "LogoUpload": "Chọn một logo để tải lên", - "LogoUploadHelp": "Xin vui lòng tải lên file dưới định dạng %1$s với chiều cao tối thiểu là %2$s pixels", - "MenuDevelopment": "Phát triển", - "MenuDiagnostic": "chẩn đoán", - "MenuGeneralSettings": "cài đặt chung", - "MenuMeasurables": "Đo lường", - "OptOutComplete": "Việc không tham gia hoàn tất; Việc thăm trang web này của bạn sẽ không được ghi lại bởi các công cụ Web Analytics.", - "OptOutCompleteBis": "Ghi nhớ rằng nếu bạn xóa cookies hoặc xóa cookie opt-out (quảng cáo, spam), hay nếu bạn tùy chỉnh máy tính hoặc trình duyệt của bạn, bạn sẽ phải tiến hành các thao tác opt-out (chặn spam, quảng cáo) lại một lần nữa.", - "OptOutExplanation": "Matomo được sử dụng để cung cấp quyền riêng tư trên Internet. Để cung cấp cho những khách ghé thăm trang web của bạn các lựa chọn chặn Matomo Web Analytics, bạn có thể thêm vào mã HTML sau trên trang web của bạn, ví dụ tùy chỉnh trong trang Quyền Riêng tư.", - "OptOutForYourVisitors": "Matomo không tham gia truy cập của bạn", - "PiwikIsInstalledAt": "Matomo được cài đặt tại", - "PluginSettingChangeNotAllowed": "Bạn không được phép thay đổi giá trị của các thiết lập \"%1$s\" trong plugin \"%2$s\"", - "PluginSettingsIntro": "Ở đây bạn có thể thay đổi các thiết lập cho các plugin của bên thứ 3 như sau:", - "PluginSettingsValueNotAllowed": "Giá trị của trường \"%1$s\" trong plugin \"%2$s\" không được chấp nhận", - "SendPluginUpdateCommunication": "Gửi email khi có bản cập nhật plugin", - "SendPluginUpdateCommunicationHelp": "Một email sẽ được gửi tới quản trị viên cao nhất trong hệ thống khi có sẵn phiên bản mới cho plugin.", - "StableReleases": "Nếu Matomo là một phần quan trọng của công việc của bạn, chúng tôi khuyên bạn nên sử dụng phiên bản ổn định mới nhất. Nếu bạn sử dụng phiên bản beta mới nhất và bạn tìm thấy một lỗi hoặc có một đề nghị, xin vui lòng %1$s xem tại đây %2$s.", - "SystemPluginSettings": "Cài đặt Plugin hệ thống", - "TrackAGoal": "Theo dõi một mục tiêu", - "TrackingCode": "Mã theo dõi", - "TrustedHostConfirm": "Bạn có chắc rằng bạn muốn thay đổi tên máy chủ Matomo đáng tin cậy không?", - "TrustedHostSettings": "Tên máy chủ Matomo đáng tin cậy", - "UseCustomLogo": "Sử dụng một biểu tượng tùy chỉnh", - "ValidPiwikHostname": "Tên máy chủ Matomo hợp lệ", - "WithOptionalRevenue": "với doanh thu tùy chọn", - "YouAreOptedOut": "Bạn đang chọn thoát ra", - "YouMayOptOut": "Bạn có thể lựa chọn không sở hữu một số định danh riêng cho cookie phân tích trang web duy nhất gắn với máy tính của bạn để không bị thu thập số liệu trên website này.", - "YouMayOptOutBis": "Để lựa chọn nó, xin vui lòng bấm vào dưới đây để chấp nhận một cookie từ chối." - } -} diff --git a/plugins/CoreAdminHome/lang/zh-cn.json b/plugins/CoreAdminHome/lang/zh-cn.json deleted file mode 100644 index ee2d08b31c62f143a6e7d272cfd25f653f0c3014..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/zh-cn.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "接受邀请", - "AddNewTrustedHost": "添加一个新的受信任主机", - "Administration": "管理", - "ArchivingSettings": "归档设置", - "BrandingSettings": "图标设置", - "BruteForce": "暴力破解", - "CheckToOptIn": "勾选此复选框以接受网站行为分析。", - "ClickHereToOptIn": "点这里主动加入。", - "ClickHereToOptOut": "点这里主动退出。", - "CloudflareDescription": "如果您的网站托管于Cloudflare,请查看此%1$s帮助%2$s。", - "ConfirmDeleteAllTrackingFailures": "您确定要删除所有错误追踪记录吗?", - "ConfirmDeleteThisTrackingFailure": "您确定要删除这条错误追踪记录吗?", - "Cors": "跨源资源共享", - "CorsDomains": "跨域资源共享(CROS)白名单域名", - "CorsDomainsHelp": "你可以定义域名或子域名,例如 http://example.com 或 http://stats.example.com。或是使用 * 允许所有域名的跨域请求", - "CustomLogoFeedbackInfo": "如果您定制了 Matomo 图标,那您可能也想在顶部菜单隐藏 %1$s 链接。在 %2$s管理插件%3$s 页面禁用反馈(Feedback)插件就可以了。", - "CustomLogoHelpText": "您可以定制 Matomo 的 logo,它将被显示在用户界面和报表邮件中。", - "DeclineInvite": "拒绝邀请", - "DeleteAllFailures": "删除所有记录", - "DevelopmentProcess": "虽然我们的开发过程包括数千个自动化测试,但Beta测试人员在实现Matomo中的“无错误策略”方面发挥着关键作用。", - "EmailServerSettings": "邮件服务器设置", - "ErrorEmailFromAddressNotValid": "SMTP 发件人地址无效", - "FaviconUpload": "选择图示(Favicon)上传", - "FileUploadDisabled": "您的 PHP 配置中关闭了文件上传功能。如果要上传您的自定义图标,请在 php.ini 文件中设置 %s ,并重启您的 WEB 服务器。", - "ForBetaTestersOnly": "仅限 Beta 测试者", - "GoogleTagManagerDescription": "如果您的网站正在使用Google 跟踪代码管理器,请阅读%1$s此指南%2$s。", - "HideAdvancedOptions": "隐藏高级设置", - "HowToGetHelp": "你可以通过不同的方式获得帮助。有通过Matomo社区提供的免费支持,以及由Matomo团队和Matomo的合作伙伴提供的付费支持。或者你有一个错误要报告或者想建议一个新的功能?", - "HttpTrackingApi": "HTTP跟踪API", - "HttpTrackingApiDescription": "%1$s跟踪API%2$s允许您跟踪任何内容。 如果您使用的是尚未存在SDK的编程语言,这可能很有用。 当您想要以特殊方式跟踪设备或应用程序时,它也可能很有用。", - "ImageTracking": "使用img标签追踪", - "ImageTrackingIntro1": "当访客禁用 JavaScript 或者无法使用 JavaScript 时,img标签追踪功能(Image Tracking)允许您使用img标签中的链接来进行访客统计。", - "ImageTrackingIntro2": "在下方产生链接,并将生成的 HTML 粘贴到网页中。如果要把它用作 JavaScript 的追踪功能失败时的备用方式,您可以把它放在 %1$s 标签中。", - "ImageTrackingIntro3": "查看 %1$s追踪 API 说明文档%2$s阅读可用于img标签追踪链接的全部参数列表。", - "ImageTrackingLink": "img标签追踪链接", - "ImportFromGoogleAnalytics": "从 Google Analytics(谷歌网站分析)导入", - "ImportFromGoogleAnalyticsDescription": "如果您拥有 Google Analytics(谷歌网站分析)资源,并且要切换到Matomo,则可以使用%1$s GoogleAnalyticsImporter%2$s插件导入现有数据。", - "ImportingServerLogsDesc": "除了通过浏览器(用 JavaScript 或图片链接)追踪访客,另外一种方法是持续导入服务器日志。更多详情请参见 %1$s服务器日志分析%2$s。", - "InvalidPluginsWarning": "以下插件不兼容 %1$s,无法加载:%2$s。", - "InvalidPluginsYouCanUninstall": "您可以在%1$s插件管理%2$s页面更新或者卸载这些插件。", - "JSTrackingDocumentationHelp": "为了方便访问,下方提供了最受欢迎的高级选项。有关更多选项(包括如何跟踪目标、自定义变量、电子商务订单和废弃购物车),请查看%1$s Matomo Javascript跟踪文档%2$s。", - "JSTrackingIntro1": "您可以通过多种不同方式跟踪您网站的访问者。 推荐通过 JavaScript 实现。要使用此方法必须确保您网站的每个网页都含有追踪 JavaScript 代码,您可以在此处生成这些代码。", - "JSTrackingIntro2": "有了网站的 JavaScript 追踪代码后,您就可以复制并粘贴到所有需要 Matomo 追踪的页面代码中。", - "JSTrackingIntro3a": "在大多数网站,博客,CMS等中,您可以使用预制插件为您完成技术工作。 (参见用于集成Matomo%1$s的%2$s插件。)", - "JSTrackingIntro3b": "如果不存在插件,则可以编辑网站模板,并将JavaScript跟踪代码添加到标记中,该标记通常在“header.php”、“header.tpl”或类似的模板文件中定义。", - "JSTrackingIntro4": "如果您不想用 JavaScript 来追踪访客,%1$s在下面生成img标签追踪链接%2$s。", - "JSTrackingIntro5": "如果您不只是想追踪页面访问,请查看 %1$sMatomo Javascript 追踪文档%2$s 中的更多功能列表。通过这些功能,您可以追踪目标、自定义变量、电子商务订单、被放弃的购物车等等。", - "JSTracking_CampaignKwdParam": "广告活动关键词参数", - "JSTracking_CampaignNameParam": "广告活动名称参数", - "JSTracking_CodeNoteBeforeClosingHead": "单击按钮复制代码片段并将其粘贴到紧邻 %1$s 结束标记之前(推荐)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "确保此代码嵌入在您网站的每个页面上的脚本元素中。 我们建议在关闭头标签之前立即粘贴它。", - "JSTracking_ConsentManagerConnected": "%1$s看起来已经做过配置和Matomo兼容。", - "JSTracking_ConsentManagerDetected": "网站内发现%1$s同意管理器。要了解如何配置Matomo以使它和%1$s保持兼容请访问%2$s", - "JSTracking_ConsentManagerEmailNote": "或者你可以直接在您的网站中嵌入跟踪代码:", - "JSTracking_CrossDomain": "用来辨识独立访客的访问者 ID 默认被储存在浏览器的第一方 Cookies 中,并且只能被相同域名的网页访问。启用跨域链接将能辨识出某位用户在不同域名下的活动和页面访问是同一位用户所为。每当用户点击任何一个您网站的别名地址,都会在网址后方添加参数 pk_vid 来传递访问者 ID。", - "JSTracking_CrossDomain_NeedsMultipleDomains": "注意:如果使用跨越链接,请为你的网站指定一个以上的域名(URL)。", - "JSTracking_CustomCampaignQueryParam": "在活动名称和关键词中使用自定义搜索参数", - "JSTracking_CustomCampaignQueryParamDesc": "提示:%1$sMatomo 会自动检测谷歌分析(Google Analytics)的参数。%2$s", - "JSTracking_DisableCampaignParameters": "禁用营销活动参数跟踪", - "JSTracking_DisableCampaignParametersDesc": "选中此选项后,Matomo 将不会跟踪营销活动参数,并且它们将从跟踪的 URL 中删除。", - "JSTracking_DisableCookies": "禁用所有追踪 Cookies", - "JSTracking_DisableCookiesDesc": "禁用所有第一方 Cookies。这个网站现有的 Matomo cookies 将会在下次页面访问时全部删除。", - "JSTracking_EnableCrossDomainLinking": "启用跨域链接", - "JSTracking_EnableDoNotTrack": "启用客户端禁止追踪(DoNotTrack)检测", - "JSTracking_EnableDoNotTrackDesc": "如果访客不愿意被追踪,将不会发送追踪记录。", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "注意:服务器端禁止追踪(DoNotTrack)支持已启用,所以这个选项不会有效果。", - "JSTracking_EndNote": "提示:您可以在管理模块的%1$s跟踪代码%2$s页面中生成自定义的追踪代码。", - "JSTracking_GroupPageTitlesByDomain": "追踪时在页面标题前加上网站域名", - "JSTracking_GroupPageTitlesByDomainDesc1": "如果有人访问博客的“关于”页面,%1$s 将记录为“博客 / 关于”,这是获得子域名流量概览的最简易方式。", - "JSTracking_MergeAliases": "在“离站链接”报表中,隐藏已知URL的点击", - "JSTracking_MergeAliasesDesc": "所以如果点击网站别名的链接(例如 %s),不会被统计为“离站链接”。", - "JSTracking_MergeSubdomains": "追踪所有子域名的访客", - "JSTracking_MergeSubdomainsDesc": "如果一个访客访问 %1$s 和 %2$s,将被算作同一访客。", - "JSTracking_PageCustomVars": "为每个页面访问追踪自定义变量", - "JSTracking_PageCustomVarsDesc": "例如,使用变量名“分类”,值“白皮书”。", - "JSTracking_TrackNoScript": "已停用 JavaScript 追踪用户功能", - "JSTracking_VisitorCustomVars": "为此访客追踪自定义变量", - "JSTracking_VisitorCustomVarsDesc": "例如,使用变量名“类型”,值“顾客”。", - "JavaScriptCode": "JavaSrcipt代码", - "JavaScriptTracking": "JavaScript 追踪", - "JsTrackingCodeAdvancedOptionsStep": "可选:利用高级设置来定制您的追踪代码。", - "JsTrackingCodeMissingEmail1": "几天前,您将网站“%s”添加到您的Matomo Analytics。 我们刚检查过,您的Matomo似乎没有任何此网站的流量记录。", - "JsTrackingCodeMissingEmail2": "要开始跟踪数据并深入了解用户,您需要在自己的网站或移动应用中设置跟踪功能。 对于网站,只需在%s标记之前嵌入跟踪代码。", - "JsTrackingCodeMissingEmail3": "要查找和自定义跟踪代码,%1$s点击此处%2$s(或查看%3$s JavaScript跟踪客户端指南%4$s)。", - "LearnMore": "学到更多", - "Login": "登录", - "LogoNotWriteableInstruction": "要使用您的自定义图标替代 Matomo 默认的,请给予此文件夹写入权限:%1$s。Matomo 需要%2$s的写入权限以便将您的图标存储下来。", - "LogoUpload": "选择一个图标上传", - "LogoUploadFailed": "无法处理上传的文件。请检查该文件是否为有效格式。", - "LogoUploadHelp": "请上传 %1$s 格式的文件,高度至少 %2$s 像素。", - "LtsReleases": "LTS(长期支持)版本只接收安全性和缺陷修复更新。", - "MenuDevelopment": "开发", - "MenuDiagnostic": "诊断", - "MenuGeneralSettings": "一般设置", - "MenuMeasurables": "衡量标准", - "MenuSystem": "系统", - "MissingTrackingCodeEmailSubject": "Matomo Analytics中没有记录%s的流量,现在开始使用", - "NTrackingFailures": "%s跟踪失败", - "NeedHelp": "需要帮助?", - "NoKnownFailures": "没有已知的追踪错误。", - "OptOutComplete": "已选择退出追踪;您在此网站的访问将不会被记录、追踪。", - "OptOutCompleteBis": "注意:如果您清空了浏览器的 Cookies、删除了退出追踪的 Cookie 或是您更换了电脑或浏览器,您需要重新执行选择退出追踪的操作。", - "OptOutCustomOptOutLink": "您还可以使用 HTML 和 JavaScript 创建完全自定义的选择退出表单,如本开发人员 %1$sguide%2$s 中所述。", - "OptOutDntFound": "您的访问没有被记录,因为您的浏览器禁止追踪(Do Not Track)。这是您的浏览器的设置,所以除非您关闭禁止追踪,否则无法记录、追踪您的访问。", - "OptOutErrorNoCookies": "退出跟踪需要启用 Cookie。", - "OptOutErrorNoTracker": "跟踪退出追踪功能未在当前页面内找到Matomo跟踪代码", - "OptOutErrorNotHttps": "跟踪退出功能可能无法使用,因为此站点不是 HTTPS 。 请重新加载页面以检查您的退出状态是否已更改。", - "OptOutErrorWindowOpen": "退出跟踪功能可能无法正常运行,可能因为退出窗口被阻止弹出了。 请刷新页面以检查您的退出状态是否已更改。", - "OptOutExplanation": "Matomo 致力于互联网隐私保护。要让您的访客可以选择退出 Matomo 网页分析追踪,您可以在类似隐私保护的某个网页上添加以下 HTML 代码。", - "OptOutExplanationIntro": "此代码将显示一个标签,其中包含一个链接供访问者在浏览器中设置退出Moatomo的Cookie。 请参阅下文(或%1$s点击此处%2$s)查看标签内将显示的内容。", - "OptOutForYourVisitors": "访客选择退出 Matomo 追踪", - "OptingYouOut": "正在帮您设置选择退出追踪,请稍候…", - "PersonalPluginSettings": "个人插件设置", - "PiwikIsInstalledAt": "Matomo 安装在", - "PluginSettingChangeNotAllowed": "您无权修改插件“%1$s”中的“%2$s”设置", - "PluginSettingReadNotAllowed": "您无权查看插件“%1$s”中的“%2$s”设置", - "PluginSettings": "插件设置", - "PluginSettingsIntro": "您可以在这里修改下列第三方插件的配置:", - "PluginSettingsSaveFailed": "无法保存插件设置", - "PluginSettingsSaveSuccess": "插件设置已更新。", - "PluginSettingsValueNotAllowed": "不允许使用“%2$s”插件中“%1$s”字段的值", - "Problem": "问题", - "ProtocolNotDetectedCorrectly": "您目前正在以安全 SSL 连接(HTTPS)查看 Matomo,但 Matomo 服务器上只检测到非安全连接。", - "ProtocolNotDetectedCorrectlySolution": "为了确保 Matomo 通过 HTTPS 来安全地请求和响应您的内容,您可以编辑%1$s 文件,要么配置代理设置,要么在%3$s下添加代码%2$s。 %4$s了解详情%5$s", - "ReactDescription": "如果您的网站正在使用React,请阅读%1$s此指南%2$s。", - "ReleaseChannel": "发布通道", - "SecurityNotificationAllTokenAuthDeletedBody": "有人删除了您帐户中的所有身份验证令牌。", - "SecurityNotificationAnonymousAccessEnabledBody": "有人启用了%1$s的匿名用户访问。这意味着该网站的数据现在可以公开访问。如果这是正确的,请忽略此电子邮件。", - "SecurityNotificationCheckTwoFactor": "请检查您的双因素身份验证应用程序或设备。", - "SecurityNotificationEmailSubject": "安全通知", - "SecurityNotificationIfItWasYou": "如果是你,请继续。如果你不认识这个活动,请重新设置你的密码。", - "SecurityNotificationRecoveryCodesRegeneratedBody": "有人为您的帐户生成了新的双重身份验证恢复代码。", - "SecurityNotificationRecoveryCodesShowedBody": "有人查看了您帐户的双重身份验证恢复代码。", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "另一个超级用户(%1$s)修改了系统设置。受影响的设置:%2$s 。如果你知道这个活动,请继续。如果你不认识这个活动,请联系其他超级用户。", - "SecurityNotificationSettingsChangedByUserBody": "有人修改了系统设置。受影响的设置:%s 。", - "SecurityNotificationTokenAuthCreatedBody": "有人在你的账户中创建了一个授权令牌(描述:%s )。如果不是你,请删除该令牌。", - "SecurityNotificationTokenAuthDeletedBody": "有人删除了你账户中的一个授权令牌(描述:%s )。", - "SecurityNotificationTwoFactorAuthDisabledBody": "有人禁用了您帐户的双重身份验证。", - "SecurityNotificationTwoFactorAuthEnabledBody": "有人启用了您帐户的双重身份验证。", - "SecurityNotificationUserAcceptInviteBody": "用户(登录名:%s )接受了邀请。", - "SecurityNotificationUserCreatedBody": "有人在你的账户中创建了一个新用户(登录名:%s )。", - "SecurityNotificationUserDeclinedInviteBody": "用户(登录名:%s )拒绝了邀请。", - "SecurityNotificationUserDeletedBody": "有人删除了你账户中的一个用户(登录名:%s )。", - "SendPluginUpdateCommunication": "当插件有更新时发送邮件", - "SendPluginUpdateCommunicationHelp": "当插件有新版本可用时,将会给超级用户发送邮件。", - "SettingsSaveSuccess": "设置已更新。", - "ShowAdvancedOptions": "显示高级设置", - "SinglePageApplicationDescription": "如果你正在跟踪一个单页应用程序(SPA)或渐进式网络应用程序(PWA),请参见%1$s本指南%2$s 。", - "Solution": "解决方案", - "StableReleases": "如果 Matomo 对您的业务非常关键,我们建议您使用最新稳定版本。如果您使用最新测试版并发现了问题,或是有建议,请%1$s参见这里的说明%2$s。", - "SystemPluginSettings": "系统插件设置", - "TrackAGoal": "追踪目标", - "TrackingCode": "追踪代码", - "TrackingCodeIntro": "Matomo 为您提供各种方法来嵌入您的网站、移动应用程序、甚至任何设备或应用程序的跟踪代码。", - "TrackingFailureAuthenticationProblem": "请求未经过身份验证,但需要身份验证。", - "TrackingFailureAuthenticationSolution": "在跟踪请求中设置或更正“token_auth”。", - "TrackingFailureInvalidSiteProblem": "该网站不存在。", - "TrackingFailureInvalidSiteSolution": "更新跟踪器中已配置的idSite。", - "TrackingFailures": "错误信息分析", - "TrackingFailuresEmail1": "这只是为了让您知道%s在过去几天发生了不同类型的跟踪失败。", - "TrackingFailuresEmail2": "要查看所有失败的跟踪请求%1$s,请点击此处%2$s。", - "TrackingFailuresEmailSubject": "在您的 Matomo Analytics 中跟踪故障", - "TrackingFailuresIntroduction": "此页面列出了在过去的%s天内发生的跟踪失败。 请注意,只记录最常见的追踪故障,而不是全部记录。", - "TrackingURL": "追踪网址", - "TrustedHostConfirm": "您确定要变更 Matomo 信任的域名?", - "TrustedHostSettings": "受 Matomo 信任的域名", - "TwoFactorAuth": "双因素身份验证", - "UiDemo": "UI 演示", - "UncheckToOptOut": "取消勾选此复选框以退出网站行为分析。", - "UpdateSettings": "更新设置", - "UseCustomLogo": "使用自定义图标", - "UserInviteContent": "你可以通过点击下面的接受按钮来接受这个邀请。", - "UserInviteNotes": "如果你没有预料到这个邀请,你可以忽略这封邮件。如果%1$s 向你发送了太多的电子邮件,你可以阻止他们或报告滥用。该邀请在%2$s 天后自动过期。", - "UserInviteSubject": "%1$s 向您发送了加入Matomo Analytics的邀请 %2$s。", - "ValidPiwikHostname": "有效的 Matomo 域名", - "ViewAllTrackingFailures": "查看所有跟踪失败", - "VueDescription": "如果您的网站正在使用Vue.js,请阅读%1$s此指南%2$s。", - "WhatIsNew": "最新消息", - "WhatIsNewDoNotShowAgain": "不再显示", - "WhatIsNewNoChanges": "目前没有什么新鲜事", - "WhatIsNewNoChangesTitle": "最近没有变化", - "WhatIsNewRemindMeLater": "稍后提醒", - "WhatIsNewTitle": "以下是Matomo的新内容", - "WhatIsNewTooltip": "了解Matomo的新内容", - "WithOptionalRevenue": "选填的收入", - "WordpressDescription": "如果您的网站正在使用Wordpress,请阅读%1$s此指南%2$s。", - "YouAreNotOptedOut": "您没有选择退出。", - "YouAreOptedOut": "您目前选择退出追踪。", - "YouMayOptOut": "您可以选择不让您的电脑分配唯一的网站分析 Cookie 标识编码,以避免被此网站搜集和分析访问数据。", - "YouMayOptOut2": "您可以选择阻止此网站汇总和分析您在此处执行的操作。", - "YouMayOptOut3": "这样做可以保护您的隐私,但也会阻止网站所有者了解您的行为,然后为您和其他用户创造更好的体验。", - "YouMayOptOutBis": "想要如此的话,请点击下方以设置一个选择退出追踪的 Cookie 记录。" - } -} diff --git a/plugins/CoreAdminHome/lang/zh-tw.json b/plugins/CoreAdminHome/lang/zh-tw.json deleted file mode 100644 index 0652f3a4de17a3d812f4043da865773ed2797d42..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/lang/zh-tw.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "CoreAdminHome": { - "AcceptInvite": "接受邀請", - "AddNewTrustedHost": "增加新的信任域名", - "Administration": "管理中心", - "ArchivingSettings": "彙整設定", - "BrandingSettings": "標誌設定", - "BruteForce": "暴力破解", - "CheckToOptIn": "勾選來選擇加入追蹤。", - "ClickHereToOptIn": "點擊這裡加入。", - "ClickHereToOptOut": "點擊這裡退出。", - "CloudflareDescription": "若你的網站架設在 Cloudflare,請參閱 %1$s此說明%2$s。", - "ConfirmDeleteAllTrackingFailures": "你確定要刪除全部追蹤失敗紀錄?", - "ConfirmDeleteThisTrackingFailure": "你確定要刪除這項追蹤失敗紀錄?", - "Cors": "跨來源資源共用(CORS)", - "CorsDomains": "跨來源資源共用(CORS)域名", - "CorsDomainsHelp": "你可以定義像是 http://example.com 或是 http://stats.example.com 的主域名或子域名。也可以直接增加 * 來允許所有域名的跨來源請求", - "CustomLogoFeedbackInfo": "如果你自訂 Matomo 標誌,你應該也對隱藏上方選單中的 %1$s 連結有興趣。要那麼做的話可以在%2$s外掛管理%3$s中停用回饋外掛(Feedback)。", - "CustomLogoHelpText": "你可以自訂要顯示於使用者介面或報表信件中的 Matomo 標誌。", - "DeclineInvite": "拒絕邀請", - "DeleteAllFailures": "刪除全部記錄", - "DevelopmentProcess": "雖然我們的開發過程包含了上千種自動化測試,但 Beta 測試員在實現 Matomo「無 Bug 政策」中扮演了關鍵角色。", - "EmailServerSettings": "設定信件伺服器", - "ErrorEmailFromAddressNotValid": "此 SMTP 寄件人位址無效", - "FaviconUpload": "選擇圖示上傳", - "FileUploadDisabled": "PHP 配置中並未啟用上傳檔案。要上傳你的自訂標誌前請先設定 php.ini 中的 %s 後重新啟動伺服器。", - "ForBetaTestersOnly": "僅限 Beta 測試員", - "GoogleTagManagerDescription": "若你的網站使用 Google 標籤管理器,請參閱 %1$s此說明%2$s。", - "HideAdvancedOptions": "隱藏進階選項", - "HowToGetHelp": "獲得協助的方式有很多種。Matomo 社群提供免費的協助,Matomo 團隊與合作者提供付費技術支援。或者,你想回報問題、或是建議新功能?", - "HttpTrackingApi": "HTTP 追蹤 API", - "HttpTrackingApiDescription": "%1$sHTTP 追蹤 API%2$s 允許你追蹤任何事物。當你在使用尚無 SDK 可用的程式語言時這將會很實用。或是你想要以特別方式來追蹤裝置或應用程式時也很實用。", - "ImageTracking": "圖片追蹤", - "ImageTrackingIntro1": "當訪客禁用或無法使用 JavaScript 時,你可以使用圖片追蹤連結來追蹤訪客。", - "ImageTrackingIntro2": "在下方產生連結並將 HTML 代碼黏貼至網頁中。如果你要做為 JavaScript 追蹤失敗的備用方式,你可將它放置在 %1$s 標籤中。", - "ImageTrackingIntro3": "所有可以使用於圖片追蹤連結的參數列表,請查看%1$s追蹤 API 說明文件%2$s。", - "ImageTrackingLink": "圖片追蹤連結", - "ImportFromGoogleAnalytics": "從 Google 分析匯入", - "ImportFromGoogleAnalyticsDescription": "如果你有現成的 Google Analytics 設定檔且想要切換至 Matomo,你可以使用 %1$s GoogleAnalyticsImporter %2$s 外掛匯入你現有的資料。", - "ImportingServerLogsDesc": "從瀏覽器(JavaScript 或圖片連結)追蹤訪客的替代方案是連續性的匯入伺服器紀錄檔。了解更多關於%1$s伺服器紀錄檔分析%2$s。", - "InvalidPluginsWarning": "以下外掛不相容於 %1$s 並且無法載入:%2$s。", - "InvalidPluginsYouCanUninstall": "你可以在%1$s外掛管理%2$s頁面更新或移除這些外掛。", - "JSTrackingDocumentationHelp": "為了方便使用,以下列出最常使用的進階選項。如需更多選項 (包含如何追蹤目標、自訂變數、電商訂單、棄置的購物車等),請參閱%1$sMatomo Javascript 追蹤說明文件%2$s。", - "JSTrackingIntro1": "你可以透過多種不同的方式追蹤你的網站訪客。推薦使用 JavaScript 的追蹤方式。要使用此方法,你必須先確定你的網站中的每一頁都有一樣的 JavaScript 程式碼,你可以在這裡產生。", - "JSTrackingIntro2": "當你有了網站的 JavaScript 追蹤程式碼,請複製並貼上到所有你想透過 Matomo 追蹤的頁面上。", - "JSTrackingIntro3a": "在大多數的網站、部落格、後台管理系統...等內,你可以使用預置的外掛來幫你做技術性的工作。(查看%1$s用來整合 Matomo 的外掛列表%2$s。)", - "JSTrackingIntro3b": "如果沒有可用的外掛,你可以直接編輯你的網站範本,將 JavaScript 追蹤程式碼加入到 </head> 標籤前,一般在 header.php、header.tpl 等類似的範本檔案中。", - "JSTrackingIntro4": "如果你不想透過 JavaScript 來追蹤訪客,%1$s在下方產生圖片追蹤連結%2$s。", - "JSTrackingIntro5": "如果你不只是想追蹤網頁訪問,可以查看%1$sMatomo Javascript 追蹤說明文件%2$s中的功能列表。可以透過這功能來追蹤目標、自訂變數、電子商務訂單、遺棄的購物車等等。", - "JSTracking_CampaignKwdParam": "活動關鍵字參數", - "JSTracking_CampaignNameParam": "活動名稱參數", - "JSTracking_CodeNoteBeforeClosingHead": "點這個按鈕複製這段程式碼,然後將它貼在 %1$s 結束標籤前 (推薦)", - "JSTracking_CodeNoteBeforeClosingHeadEmail": "確定這段程式碼放在你的網站上的每一個網頁。我們推薦將它貼在 head 標籤結束前。", - "JSTracking_ConsentManagerConnected": "%1$s 看起來已配置好與 Matomo 同時運作。", - "JSTracking_ConsentManagerDetected": "在您的網站上偵測到 %1$s 同意管理平台。請至 %2$s 了解如何配置以同時使用 Matomo 與 %1$s", - "JSTracking_ConsentManagerEmailNote": "您也可以將追蹤程式碼直接嵌入您的網站以替代:", - "JSTracking_CrossDomain": "用來辨識獨立訪客的訪客 ID 預設被儲存在瀏覽器的第一方 Cookies 中,只能被相同域名的網頁存取。啟用跨域名連結讓你可以追蹤特定訪客的在同次訪問,甚至是在瀏覽不同域名的網頁中的活動及頁面訪問。當使用者點擊了你網站的任一別名網址,將會在網址後方加上 pk_vid 參數傳遞訪客 ID。", - "JSTracking_CrossDomain_NeedsMultipleDomains": "注意:要使用跨域名連結,你必須先為你的網站指定一個以上的域名(網址)。", - "JSTracking_CustomCampaignQueryParam": "活動名稱及關鍵字使用自訂參數", - "JSTracking_CustomCampaignQueryParamDesc": "注意:%1$sMatomo 將自動偵測 Google 分析參數。%2$s", - "JSTracking_DisableCampaignParameters": "禁用活動參數追蹤", - "JSTracking_DisableCampaignParametersDesc": "啟用此設定後,Matomo 將不會追蹤活動參數,且將會把它們從追蹤 URL 內移除。", - "JSTracking_DisableCookies": "禁用所有追蹤 cookies", - "JSTracking_DisableCookiesDesc": "停用所有第一方 cookies。這個網站現有的 Matomo cookies 將會在下一次網頁瀏覽時被刪除。", - "JSTracking_EnableCrossDomainLinking": "啟用跨域名連結", - "JSTracking_EnableDoNotTrack": "啟用客戶端不追蹤(Do Not Track)偵測", - "JSTracking_EnableDoNotTrackDesc": "訪客若開啟了不追蹤功能,追蹤請求將不會送出。", - "JSTracking_EnableDoNotTrack_AlreadyEnabled": "注意:伺服器端不追蹤(Do Not Track)支援已啟用,所以此選項不會有效果。", - "JSTracking_EndNote": "注意:你可以在管理中心的%1$s追蹤程式碼%2$s頁面中產生自訂的追蹤程式碼。", - "JSTracking_GroupPageTitlesByDomain": "追蹤時將網站域名放置到網頁標題開頭", - "JSTracking_GroupPageTitlesByDomainDesc1": "如果有人在 blog.%1$s 訪問了「關於」網頁,將會紀錄為「blog / 關於」。這是追蹤子域名流量總覽最簡單的方式。", - "JSTracking_MergeAliases": "在「離開連結」報表中隱藏已知的網站別名網頁點擊", - "JSTracking_MergeAliasesDesc": "如果點擊了網站別名的連結(如 %s)將不會計算到離開連結中。", - "JSTracking_MergeSubdomains": "追蹤所有子域名的訪客", - "JSTracking_MergeSubdomainsDesc": "如果一個訪客訪問了 %1$s 和 %2$s,他會被計算為不重複訪客。", - "JSTracking_PageCustomVars": "為每個頁面訪問追蹤自定變數", - "JSTracking_PageCustomVarsDesc": "例如變數名稱為「分類」,值為「白皮書」。", - "JSTracking_TrackNoScript": "追蹤已禁用 JavaScript 的訪客", - "JSTracking_VisitorCustomVars": "為此訪客追蹤自訂變數", - "JSTracking_VisitorCustomVarsDesc": "例如變數名稱為「類型」,值為「顧客」。", - "JavaScriptCode": "JavaScript 程式碼", - "JavaScriptTracking": "JavaScript 追蹤程式碼", - "JsTrackingCodeAdvancedOptionsStep": "可選:利用進階設定來客製化您的追蹤程式碼。", - "JsTrackingCodeMissingEmail1": "幾天前你在你的 Matomo 分析中新增了網站「%s」。我們剛剛檢查了你的 Matomo 似乎沒有記錄到這個網站的任何流量。", - "JsTrackingCodeMissingEmail2": "你必須在你的網站上或行動應用程式中設定追蹤程式碼以開始追蹤資料和深入了解你的使用者。以網站來說,只要將追蹤程式碼嵌入 %s 標籤之前即可。", - "JsTrackingCodeMissingEmail3": "要尋找和自訂你的追蹤程式碼,%1$s點擊這裡%2$s(或看看%3$sJavaScript 追蹤客戶端指南%4$s)。", - "LearnMore": "了解更多", - "Login": "資料庫帳號", - "LogoNotWriteableInstruction": "要使用你的自訂標誌取代 Matomo 預設標誌,請給予此資料夾寫入權限:%1$s Matomo 需要寫入權限才能將你的標誌儲存為檔案 %2$s。", - "LogoUpload": "選擇標誌上傳", - "LogoUploadFailed": "無法處理上傳的檔案。請檢查該檔案是否為有效格式。", - "LogoUploadHelp": "請選擇 %1$s 格式並且高度最小為 %2$s 像素的檔案。", - "LtsReleases": "LTS(長期支援)版本只會收到安全性和 Bug 修正更新。", - "MenuDevelopment": "開發", - "MenuDiagnostic": "診斷", - "MenuGeneralSettings": "一般設定", - "MenuMeasurables": "監測對象", - "MenuSystem": "系統", - "MissingTrackingCodeEmailSubject": "Matomo 分析沒有記錄到 %s 的流量,開始行動", - "NTrackingFailures": "%s 項追蹤失敗紀錄", - "NeedHelp": "需要協助嗎?", - "NoKnownFailures": "還沒有已知的追蹤失敗紀錄。", - "OptOutComplete": "已選擇退出追蹤。你在此網站的的訪問紀錄將不會被追蹤。", - "OptOutCompleteBis": "注意:若你清除了瀏覽器的 cookies、刪除了退出追蹤的 cookie 或是你更換電腦或瀏覽器,你將需要重新執行選擇推出的動作。", - "OptOutCustomOptOutLink": "您也可以以 HTML 和 JavaScript 建立一個完全自定義的拒絕宣告表單,如本開發人員%1$s指南%2$s中所述。", - "OptOutDntFound": "你的瀏覽器已回報你不想被追蹤,因此你已經不會被追蹤。這是瀏覽器中的設定,所以你會一直不被追蹤直到你關閉了不追蹤(Do Not Track)功能。", - "OptOutErrorNoCookies": "選擇退出追蹤的功能必須要開啟 cookie 才能運作。", - "OptOutErrorNoTracker": "拒絕追蹤宣告功能在此頁面上未有找到 Matomo 追蹤器的程式碼", - "OptOutErrorNotHttps": "因為此網站沒有透過 HTTPS 載入,選擇退出追蹤的功能可能無法使用。請重新載入此網頁,檢查你的選擇退出狀態是否改變。", - "OptOutErrorWindowOpen": "選擇退出追蹤的彈出視窗似乎被阻擋了,因此選擇退出功能可能無法使用。請重新載入此網頁,檢查你的選擇退出狀態是否改變。", - "OptOutExplanation": "Matomo 致力於在提供網路中的隱私權。要讓你的訪客選擇推出 Matomo 追蹤,你可以在你的網頁中加入以下的 HTML 代碼,例如在隱私權政策網頁。", - "OptOutExplanationIntro": "這個程式碼將以區塊顯示一個連結以讓訪客設定 cookie 來選擇退出 Matomo 的追蹤。在下方(或%1$s點擊這裡%2$s)檢視將會顯示的內容。", - "OptOutForYourVisitors": "讓你的訪客選擇退出 Matomo 追蹤", - "OptingYouOut": "正在設定退出追蹤,請稍後…", - "PersonalPluginSettings": "個人外掛設定", - "PiwikIsInstalledAt": "Matomo 安裝於", - "PluginSettingChangeNotAllowed": "你無法修改外掛「%2$s」中的設定「%1$s」", - "PluginSettingReadNotAllowed": "你無法讀取外掛「%2$s」中的設定「%1$s」", - "PluginSettings": "外掛設定", - "PluginSettingsIntro": "你可以在這裡修改下列第三方外掛的設定:", - "PluginSettingsSaveFailed": "無法保存外掛設定", - "PluginSettingsSaveSuccess": "外掛設定已更新。", - "PluginSettingsValueNotAllowed": "外掛 %2$s 中欄位 %1$s 的值不被允許", - "Problem": "問題", - "ProtocolNotDetectedCorrectly": "你目前正以 SSL 安全連線(使用 HTTPS)查看 Matomo,但 Matomo 只從伺服器中偵測到不安全的連線。", - "ProtocolNotDetectedCorrectlySolution": "要確保 Matomo 透過 HTTPS 安全請求並供應你內容,你可以編輯 %1$s 檔案中的 Proxy 設定或是在 %3$s 區塊下方增加 %2$s。%4$s了解更多%5$s", - "ReactDescription": "若你的網站使用 React,請參閱%1$s此指南%2$s。", - "ReleaseChannel": "發行通道", - "SecurityNotificationAllTokenAuthDeletedBody": "有人刪除了你帳號中所有授權令牌。", - "SecurityNotificationAnonymousAccessEnabledBody": "有人開啟了 %1$s 的匿名使用者存取功能。這代表此網站的資料已經公開。若這是預期的行為,請忽略此電子郵件。", - "SecurityNotificationCheckTwoFactor": "請檢查你的雙因素認證應用程式或裝置。", - "SecurityNotificationEmailSubject": "安全通知", - "SecurityNotificationIfItWasYou": "如果這是你,請忽略。如果你不記得你曾進行此動作,請重設你的密碼。", - "SecurityNotificationRecoveryCodesRegeneratedBody": "有人為你的帳號生成了新的雙因素認證復原代碼。", - "SecurityNotificationRecoveryCodesShowedBody": "有人查看了你帳號的雙因素認證復原代碼。", - "SecurityNotificationSettingsChangedByOtherSuperUserBody": "另一個超級使用者(%1$s)修改了系統設定。被修改的設定:%2$s。如果你知道這個操作,請忽略。如果你不清楚此操作,請聯絡其他超級使用者。", - "SecurityNotificationSettingsChangedByUserBody": "有人修改了系統設定。被修改的設定:%s。", - "SecurityNotificationTokenAuthCreatedBody": "有人為你的帳號創建了一個授權令牌(說明:%s)。如果這並不是你創建的,請刪除該令牌。", - "SecurityNotificationTokenAuthDeletedBody": "有人刪除了你帳號中的一個授權令牌(說明:%s)。", - "SecurityNotificationTwoFactorAuthDisabledBody": "有人停用了你帳號的雙因素認證。", - "SecurityNotificationTwoFactorAuthEnabledBody": "有人啟用了你帳號的雙因素認證。", - "SecurityNotificationUserAcceptInviteBody": "使用者 (登入名稱:%s) 接受了邀請。", - "SecurityNotificationUserCreatedBody": "有人在你的帳號中建立了一個新使用者(登入名稱:%s)。", - "SecurityNotificationUserDeclinedInviteBody": "使用者 (登入名稱:%s)拒絕了此邀請。", - "SecurityNotificationUserDeletedBody": "有人刪除了你帳號中的一個使用者(登入名稱:%s)。", - "SendPluginUpdateCommunication": "當外掛有更新可用時寄送信件", - "SendPluginUpdateCommunicationHelp": "如果外掛有新版本可以用時,會發送信件給超級使用者。", - "SettingsSaveSuccess": "設定已更新。", - "ShowAdvancedOptions": "顯示進階選項", - "SinglePageApplicationDescription": "如果你正在追蹤單頁式應用程式(SPA)或漸進式 Web 應用程式(PWA),請參閱%1$s此指南%2$s。", - "Solution": "解決方案", - "StableReleases": "如果 Matomo 在你的業務中是不可或缺的一環,我們推薦你使用最新穩定版本。如果你使用最新 Beta 版本並且發現了 Bug 或是有建議想提出,請%1$s見此網頁說明%2$s。", - "SystemPluginSettings": "系統外掛設定", - "TrackAGoal": "追蹤目標", - "TrackingCode": "追蹤程式碼", - "TrackingCodeIntro": "Matomo 提供你多種方法讓你在網站、行動應用程式甚至任何裝置或應用程式中嵌入追蹤程式碼。", - "TrackingFailureAuthenticationProblem": "請求未被授權但必須授權。", - "TrackingFailureAuthenticationSolution": "設定或修正追蹤請求中的「token_auth」。", - "TrackingFailureInvalidSiteProblem": "這個網站不存在。", - "TrackingFailureInvalidSiteSolution": "更新追蹤程式碼內的 idSite 設置。", - "TrackingFailures": "追蹤失敗", - "TrackingFailuresEmail1": "這只是讓你知道過去幾天中發生了 %s 種不同的追蹤失敗紀錄。", - "TrackingFailuresEmail2": "%1$s點擊這裡%2$s查看全部追蹤失敗請求。", - "TrackingFailuresEmailSubject": "你的 Matomo 分析追蹤失敗紀錄", - "TrackingFailuresIntroduction": "這個頁面列出發生在過去 %s 天追蹤失敗的紀錄。請注意只有最常見的追蹤失敗種類才會被記錄。", - "TrackingURL": "追蹤網址", - "TrustedHostConfirm": "你確定要變更受 Matomo 信任的域名?", - "TrustedHostSettings": "受 Matomo 信任的域名", - "TwoFactorAuth": "雙因素認證", - "UiDemo": "UI 範例", - "UncheckToOptOut": "取消勾選來選擇退出追蹤。", - "UpdateSettings": "更新設定", - "UseCustomLogo": "使用自訂標誌", - "UserInviteContent": "你可以點下面這個按鈕來接接受此邀請。", - "UserInviteNotes": "若你並未預期收到此邀請,可以忽略此 email。若 %1$s 傳送給你太多 email 了,你可以直接封鎖或回報濫用。此邀請會在 %2$s 日內自動過期。", - "UserInviteSubject": "%1$s 向你送出了加入基於 %2$s 的 Matomo 分析的邀請。", - "ValidPiwikHostname": "有效的 Matomo 域名", - "ViewAllTrackingFailures": "查看全部追蹤失敗紀錄", - "VueDescription": "如果您的網站正在使用 Vue.js,請參閱%1$s此指南%2$s。", - "WhatIsNew": "新功能", - "WhatIsNewDoNotShowAgain": "不再顯示", - "WhatIsNewNoChanges": "暫時沒有新東西", - "WhatIsNewNoChangesTitle": "最近無變化", - "WhatIsNewRemindMeLater": "稍後提醒", - "WhatIsNewTitle": "以下是 Matomo 的新功能", - "WhatIsNewTooltip": "看看 Matomo 裡有甚麼新功能", - "WithOptionalRevenue": "選填的收益", - "WordpressDescription": "如果您的網站使用的是 Wordpress,請參閱%1$s此指南%2$s。", - "YouAreNotOptedOut": "你還沒有選擇退出追蹤。", - "YouAreOptedOut": "你已經選擇退出追蹤。", - "YouMayOptOut": "你可以選擇不要有以電腦來設定的獨特追蹤 cookie 識別號碼來避免被此網站所收集的資料聚合和分析。", - "YouMayOptOut2": "你可以選擇不讓這個網站統整和分析你在這個網站上執行的活動。", - "YouMayOptOut3": "這樣做可以保護你的隱私,但也將讓擁有者無法從你的活動中學習,為你和其他使用者創造更佳的體驗。", - "YouMayOptOutBis": "要做出選擇,請取消勾選以下選項來接收一個選擇退出追蹤的 cookie。" - } -} diff --git a/plugins/CoreAdminHome/stylesheets/generalSettings.less b/plugins/CoreAdminHome/stylesheets/generalSettings.less deleted file mode 100644 index 3e69f3c08935e41def626a4b2e6dfb49c49728d2..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/stylesheets/generalSettings.less +++ /dev/null @@ -1,67 +0,0 @@ -.admin img { - vertical-align: middle;; -} - -.admin h2 + .top_bar_sites_selector { - margin-top: -62px; - margin-right: 0 !important; -} - -// hide PHP is deprecated notification in UI test -.uiTest [notification-id="DeprecatedPHPVersionCheck"], -.uiTest [notification-id="PHPVersionTooOldForNewestPiwikCheck"]{ - display: none !important; -} - -#generalSettingsTOC a { - text-transform: none !important; -} - -#content.admin { - font-size: 13px; - margin-top: 0; - - // Fix the
     blocks because of the display: table
    -    pre {
    -        max-width: 995px;
    -    }
    -
    -    .copyToClipboardWrapper {
    -        max-width: 995px;
    -    }
    -}
    -
    -.admin #header_message {
    -    margin-top: 8px;
    -    margin-right: 8px;
    -}
    -
    -.access_error {
    -    font-size: .7em;
    -    padding: 15px;
    -}
    -
    -.admin p, .admin section {
    -    margin-top: 10px;
    -    line-height: 140%;
    -    padding-bottom: 10px;
    -}
    -
    -#CoreAdminHomePluginSettings {
    -    h2 {
    -        display: none;
    -    }
    -    h3 {
    -        margin: 0;
    -        font-size: 24px;
    -        padding: 0;
    -    }
    -
    -    .fieldArray {
    -        margin-top: 0!important;
    -    }
    -}
    -
    -#currentLogo {
    -  background: @theme-color-header-background;
    -}
    diff --git a/plugins/CoreAdminHome/stylesheets/jsTrackingGenerator.css b/plugins/CoreAdminHome/stylesheets/jsTrackingGenerator.css
    deleted file mode 100644
    index 749984ccf09bf0a4da8481d464eed75cdbac3a23..0000000000000000000000000000000000000000
    --- a/plugins/CoreAdminHome/stylesheets/jsTrackingGenerator.css
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -#image-link-output-section .codeblock {
    -    height: 92px;
    -}
    -
    -.jsTrackingCodeWebsite .input-field,
    -#image-tracking-code-options .input-field {
    -    margin-top: 0;
    -}
    -
    -#image-tracking-goal-sub .row,
    -#javascript-tracking-visitor-cv .row,
    -#js-campaign-query-param-extra .row {
    -    margin-bottom: 0;
    -}
    -
    -#javascript-tracking-visitor-cv > .row {
    -    margin-left: 37px;
    -}
    -
    -#image-tracking-goal-sub > .row,
    -#js-campaign-query-param-extra > .row {
    -    margin-left: 24px;
    -}
    -
    -#image-tracking-goal-sub .input-field,
    -#js-campaign-query-param-extra .input-field {
    -    margin-top: 0;
    -}
    -
    -#javascript-email-button {
    -    min-width: 250px;
    -}
    diff --git a/plugins/CoreAdminHome/stylesheets/trackingCodeGenerator.less b/plugins/CoreAdminHome/stylesheets/trackingCodeGenerator.less
    deleted file mode 100644
    index 6bef87c9f3f01eef5029d07763ba8cddd7df3be9..0000000000000000000000000000000000000000
    --- a/plugins/CoreAdminHome/stylesheets/trackingCodeGenerator.less
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -.trackingCodeAdvancedOptions {
    -  .advance-option {
    -    font-style: normal;
    -    font-weight: 600;
    -    font-size: 14px;
    -    line-height: 21px;
    -    margin-top: 2rem;
    -    margin-bottom: 1.5rem;
    -
    -    #start-tracking-details[data-method="Matomo"] & {
    -      margin-top: 1rem;
    -    }
    -
    -    a {
    -      text-decoration: none !important;
    -      color: @color-green-matomo;
    -
    -      &:focus {
    -        outline: unset !important;
    -      }
    -    }
    -  }
    -}
    diff --git a/plugins/CoreAdminHome/stylesheets/whatIsNew.less b/plugins/CoreAdminHome/stylesheets/whatIsNew.less
    deleted file mode 100644
    index 3d77b34d4f9cb5f9d08177b90d2ce22238aec119..0000000000000000000000000000000000000000
    --- a/plugins/CoreAdminHome/stylesheets/whatIsNew.less
    +++ /dev/null
    @@ -1,31 +0,0 @@
    -.change-link {
    -    color: #1976d2 !important;
    -}
    -
    -.ui-dialog.ui-widget-content.what-is-new-popup {
    -  width: 80%;
    -  background: @theme-color-background-tinyContrast;
    -
    -  @media (max-width: 992px) {
    -    width: auto;
    -  }
    -}
    -
    -.whatisnew .card {
    -  .inDarkMode({
    -    background: @theme-color-background-tinyContrast;
    -  });
    -}
    -
    -.whatisnew-changelist {
    -  overflow-y: scroll;
    -  max-height: 500px;
    -  margin-bottom: 10px;
    -  padding-right: 5px;
    -  padding-left: 5px;
    -}
    -
    -.whatisnew-btn {
    -  float:right;
    -  margin-left: 10px;
    -}
    diff --git a/plugins/CoreAdminHome/templates/_jsTrackingCodeMissingEmail.twig b/plugins/CoreAdminHome/templates/_jsTrackingCodeMissingEmail.twig
    deleted file mode 100644
    index a2c4c3d7ee9307e05feb26c5fa6cecdf90e4ed47..0000000000000000000000000000000000000000
    --- a/plugins/CoreAdminHome/templates/_jsTrackingCodeMissingEmail.twig
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -{% set closingHeadTag %}{{ ''|e('html') }}{% endset %}
    -

    {{ 'General_HelloUser'|translate(login) }}

    -

    {{ 'CoreAdminHome_JsTrackingCodeMissingEmail1'|translate(siteName) }}

    -

    {{ 'CoreAdminHome_JsTrackingCodeMissingEmail2'|translate(closingHeadTag)|raw }}

    -

    {{ 'CoreAdminHome_JsTrackingCodeMissingEmail3'|translate('', '', externallink('https://developer.matomo.org/guides/tracking-javascript-guide'), '')|raw }}

    -

    {{ 'SitesManager_InstallationGuides'|translate }} : - WordPress | - Squarespace | - Wix | - SharePoint - Joomla | - Shopify | - Google Tag Manager -

    \ No newline at end of file diff --git a/plugins/CoreAdminHome/templates/_securityNotificationEmail.twig b/plugins/CoreAdminHome/templates/_securityNotificationEmail.twig deleted file mode 100644 index de4dda16f6e33c3b28e3b727259d87992ad43543..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/_securityNotificationEmail.twig +++ /dev/null @@ -1,2 +0,0 @@ -

    {{ 'General_HelloUser'|translate(login) }}

    -

    {{ body }}

    diff --git a/plugins/CoreAdminHome/templates/_trackingFailuresEmail.twig b/plugins/CoreAdminHome/templates/_trackingFailuresEmail.twig deleted file mode 100644 index 8be51c0e0de37a14de65927b9f9053e4777dbc87..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/_trackingFailuresEmail.twig +++ /dev/null @@ -1,3 +0,0 @@ -

    {{ 'General_HelloUser'|translate(login) }}

    -

    {{ 'CoreAdminHome_TrackingFailuresEmail1'|translate(''~numFailures~'')|raw }}

    -

    {{ 'CoreAdminHome_TrackingFailuresEmail2'|translate('', '')|raw }}

    diff --git a/plugins/CoreAdminHome/templates/generalSettings.twig b/plugins/CoreAdminHome/templates/generalSettings.twig deleted file mode 100644 index 55a2357e590d34262132da5ef12e86f3de1f8baa..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/generalSettings.twig +++ /dev/null @@ -1,84 +0,0 @@ -{% extends 'admin.twig' %} - -{% set title %}{{ 'CoreAdminHome_MenuGeneralSettings'|translate }}{% endset %} - -{% block content %} - - {% import 'macros.twig' as piwik %} - {% import 'ajaxMacros.twig' as ajax %} - - {{ ajax.errorDiv() }} - {{ ajax.loadingDiv() }} - -
    -
    - {{ 'General_GoTo2'|translate }}: - {% if isGeneralSettingsAdminEnabled %} - {{ 'CoreAdminHome_ArchivingSettings'|translate }} - {% if not isMultiServerEnvironment %} - {{ 'CoreAdminHome_EmailServerSettings'|translate }} - {% endif %} - {% endif %} - {% if customLogoEnabled %} - {{ 'CoreAdminHome_BrandingSettings'|translate }} - {% endif %} - {% if isDataPurgeSettingsEnabled %} - {{ 'PrivacyManager_DeleteDataSettings'|translate }} - {% endif %} - {{ postEvent('Template.endGeneralSettingsPageTableOfContents') }} -
    -
    - -{% if isGeneralSettingsAdminEnabled %} -
    - - {% if not isMultiServerEnvironment %} -
    - {% endif %} -{% endif %} - -{% if customLogoEnabled %} -
    -{% endif %} - -{% if isDataPurgeSettingsEnabled %} - -{% endif %} - -
    - -{% endblock %} diff --git a/plugins/CoreAdminHome/templates/getTrackingFailures.twig b/plugins/CoreAdminHome/templates/getTrackingFailures.twig deleted file mode 100644 index 3096e65c2fb6fdc980e5ae671e670fd835418299..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/getTrackingFailures.twig +++ /dev/null @@ -1,13 +0,0 @@ -
    - {% if numFailures == 0 %} -

    {{ 'CoreAdminHome_NoKnownFailures'|translate }}

    - {% else %} -

    - {{ 'CoreAdminHome_NTrackingFailures'|translate(numFailures) }} -

    -

    - {{ 'CoreAdminHome_ViewAllTrackingFailures'|translate }} -

    - {% endif %} -
    \ No newline at end of file diff --git a/plugins/CoreAdminHome/templates/home.twig b/plugins/CoreAdminHome/templates/home.twig deleted file mode 100644 index ddd33570e9a1de644f855c280eb161e0c0ddb054..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/home.twig +++ /dev/null @@ -1,80 +0,0 @@ -{% extends 'admin.twig' %} - -{% set title %}{{ 'CoreAdminHome_MenuGeneralSettings'|translate }}{% endset %} - -{% block content %} - {% set feedbackHelp %} -
    -
    - {{ 'CoreAdminHome_HowToGetHelp'|translate }} -
    -
    - {{ 'CoreAdminHome_LearnMore'|translate }} -
    -
    - {% endset %} - - {% if isSuperUser %} -
    - {% if hasQuickLinks or hasSystemSummary %} -
    - {% if hasQuickLinks %}
    {% endif %} - {% if hasSystemSummary %}
    {% endif %} -
    - {% endif %} - {% if hasDiagnostics or hasTrackingFailures %} -
    - {% if hasDiagnostics %} -
    - {% endif %} - {% if hasTrackingFailures %} -
    - {% endif %} -
    - {% endif %} -
    - {% if isFeedbackEnabled %} - {{ feedbackHelp|raw }} - {% endif %} -
    -
    - {% elseif isFeedbackEnabled %} - {{ feedbackHelp|raw }} - {% endif %} - - {% if hasPremiumFeatures and isMarketplaceEnabled and isInternetEnabled %} -
    - {% endif %} - {% if hasNewPlugins and isMarketplaceEnabled and isInternetEnabled %} -
    - {% endif %} - - {{ postEvent('Template.adminHome') }} - - - - {% if hasDonateForm or hasPiwikBlog %} -
    - {% if hasDonateForm %} -
    -
    -
    - {% endif %} - {% if hasPiwikBlog and isInternetEnabled %} -
    -
    -
    - {% endif %} -
    - {% endif %} - -{% endblock %} diff --git a/plugins/CoreAdminHome/templates/optOut.twig b/plugins/CoreAdminHome/templates/optOut.twig deleted file mode 100644 index ae4423e8e8732fc022f9e1e020980a8a0936f11b..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/optOut.twig +++ /dev/null @@ -1,105 +0,0 @@ - - - - - {% if title %} - {{ title }} - {% endif %} - {% if reloadUrl %} - - {% endif %} - - - {% if stylesheets.external|length > 0 %} - {% for style in stylesheets.external %} - - {% endfor %} - {% endif %} - {% if stylesheets.inline|length > 0 %} - - {% endif %} - - -{% if dntFound %} - {{ 'CoreAdminHome_OptOutDntFound'|translate }} -{% elseif reloadUrl %} - {# empty #} -{% else %} - {# if only showing confirmation (because we're in a new window), we only display the success message if JS is disabled. - # otherwise we try to close the window immediately. - #} - {% if showConfirmOnly %} -

    {{ 'CoreAdminHome_OptingYouOut'|translate }}

    - - {% endif %} - - {% if not showConfirmOnly %} -
    - - - - - -
    - {% endif %} -{% endif %} - -{% if javascripts.external|length > 0 %} - {% for script in javascripts.external %} - - {% endfor %} -{% endif %} -{% if javascripts.inline|length > 0 %} - -{% endif %} - - diff --git a/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig b/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig deleted file mode 100644 index 6b5b2cef614d37b2d25c6d7bd7a1331b30208110..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig +++ /dev/null @@ -1,96 +0,0 @@ -{% extends 'admin.twig' %} - -{% block head %} - {{ parent() }} - -{% endblock %} - -{% set title %}{{ 'CoreAdminHome_TrackingCode'|translate }}{% endset %} - -{% block content %} - -
    -
    -

    {{ 'CoreAdminHome_TrackingCode'|translate }}

    -

    {{ 'CoreAdminHome_TrackingCodeIntro'|translate }}

    -
    - -
    - - - -
    - -{{ postEvent('Template.afterJsTracker') }} - -
    - -
    -

    - {{ 'CoreAdminHome_ImportingServerLogsDesc'|translate(externallink('https://matomo.org/log-analytics/'),'')|raw }} -

    -
    - -
    -

    {{ 'SitesManager_MobileAppsAndSDKsDescription'|translate(externallink('https://matomo.org/integrate/#programming-language-platforms-and-frameworks'), '')|raw }}

    -
    - -
    -

    {{ 'CoreAdminHome_HttpTrackingApiDescription'|translate(externallink('https://developer.matomo.org/api-reference/tracking-api'),'')|raw }}

    -
    - -
    -

    {{ 'CoreAdminHome_SinglePageApplicationDescription'|translate(externallink('https://developer.matomo.org/guides/spa-tracking'),'')|raw }}

    -
    - -
    -

    {{ 'CoreAdminHome_GoogleTagManagerDescription'|translate(externallink('https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-within-gtm-google-tag-manager/'),'')|raw }}

    -
    - -
    -

    {{ 'CoreAdminHome_WordpressDescription'|translate(externallink('https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-tracking-code-on-wordpress/'),'')|raw }}

    -
    - -
    -

    {{ 'CoreAdminHome_CloudflareDescription'|translate(externallink('https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-tracking-code-on-my-cloudflare-setup/'),'')|raw }}

    -
    - -
    -

    {{ 'CoreAdminHome_VueDescription'|translate(externallink('https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-tracking-code-on-websites-that-use-vue-js/'),'')|raw }}

    -
    - -
    -

    {{ 'CoreAdminHome_ReactDescription'|translate(externallink('https://matomo.org/faq/new-to-piwik/how-do-i-start-tracking-data-with-matomo-on-websites-that-use-react/'),'')|raw }}

    -
    - - -{{ postEvent('Template.endTrackingCodePage') }} - -{% endblock %} diff --git a/plugins/CoreAdminHome/templates/trackingFailures.twig b/plugins/CoreAdminHome/templates/trackingFailures.twig deleted file mode 100644 index ce5ba8dfb385b6aecea8e9dd3c42a17c33aff768..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/trackingFailures.twig +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'admin.twig' %} - -{% set title %}{{ 'CoreAdminHome_TrackingFailures'|translate }}{% endset %} - -{% block content %} -
    -{% endblock %} diff --git a/plugins/CoreAdminHome/templates/whatIsNew.twig b/plugins/CoreAdminHome/templates/whatIsNew.twig deleted file mode 100644 index 1203a98e130b937d5abec0d41b0d94962f538921..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/whatIsNew.twig +++ /dev/null @@ -1,67 +0,0 @@ -
    -

    {{ 'CoreAdminHome_WhatIsNewTitle'|translate }}

    -
    -
    - -
    - - {% for change in changes %} - -
    -
    - - {% if change.showPluginPrefix %} -

    {{ change.plugin_name }} - {{ change.title }}

    - {% else %} -

    {{ change.title }}

    - {% endif %} - {{ change.description | raw }} - {% if not change.link is empty and not change.link_name is empty %} -

    -
    - {{ change.link_name }} -

    - {% endif %} -
    -
    - - {% endfor %} - -
    - - - - - -
    - - diff --git a/plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php b/plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php deleted file mode 100644 index bc75c235f5824b4a2e6440abcb75bb41fbb7c179..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php +++ /dev/null @@ -1,175 +0,0 @@ - array( - array('name' => 'action1', 'type' => 1), - array('name' => 'action1', 'type' => 1), - array('name' => 'action1', 'type' => 1), - - array('name' => 'action2', 'type' => 2), - array('name' => 'ACTION2', 'type' => 1), - array('name' => 'action4', 'type' => 3), - array('name' => 'ACTION2', 'type' => 1), - array('name' => 'action5', 'type' => 2), - - array('name' => 'action2', 'type' => 2), - array('name' => 'action4', 'type' => 3), - array('name' => 'ACTION2', 'type' => 1), - array('name' => 'action4', 'type' => 3), - ), - 'log_link_visit_action' => array( - array( - 'idsite' => 1, - 'idvisitor' => self::DUMMY_IDVISITOR, - 'idvisit' => 1, - 'server_time' => '2012-01-01 00:00:00', - 'time_spent_ref_action' => 100, - 'idaction_url_ref' => 1, - 'idaction_name_ref' => 2, - 'idaction_name' => 3, - 'idaction_url' => 4, - 'idaction_event_action' => 5, - 'idaction_event_category' => 6, - 'idaction_content_interaction' => 7, - 'idaction_content_name' => 8, - 'idaction_content_piece' => 9, - 'idaction_content_target' => 10, - ), - array( - 'idsite' => 2, - 'idvisitor' => self::DUMMY_IDVISITOR, - 'idvisit' => 2, - 'server_time' => '2013-01-01 00:00:00', - 'time_spent_ref_action' => 120, - 'idaction_url_ref' => 2, - 'idaction_name_ref' => 3, - 'idaction_name' => 5, - 'idaction_url' => 7, - 'idaction_event_action' => 9, - 'idaction_event_category' => 10, - 'idaction_content_interaction' => 11, - 'idaction_content_name' => 11, - 'idaction_content_piece' => 12, - 'idaction_content_target' => 12, - ), - ), - 'log_conversion' => array( - array( - 'idvisit' => 1, - 'idsite' => 1, - 'idvisitor' => self::DUMMY_IDVISITOR, - 'server_time' => '2012-02-01 00:00:00', - 'idgoal' => 1, - 'buster' => 1, - 'url' => 'http://example.com/', - 'location_country' => 'nz', - 'visitor_count_visits' => 1, - 'visitor_returning' => 1, - 'visitor_seconds_since_order' => 1, - 'visitor_seconds_since_first' => 1, - 'idaction_url' => 4, - ), - - array( - 'idvisit' => 2, - 'idsite' => 2, - 'idvisitor' => self::DUMMY_IDVISITOR, - 'server_time' => '2012-03-01 00:00:00', - 'idgoal' => 2, - 'buster' => 2, - 'url' => 'http://example.com/', - 'location_country' => 'nz', - 'visitor_count_visits' => 1, - 'visitor_returning' => 1, - 'visitor_seconds_since_order' => 1, - 'visitor_seconds_since_first' => 1, - 'idaction_url' => 7, - ), - ), - 'log_conversion_item' => array( - array( - 'idsite' => 1, - 'idvisitor' => self::DUMMY_IDVISITOR, - 'server_time' => '2012-02-01 00:00:00', - 'idvisit' => 1, - 'idorder' => 1, - 'price' => 10, - 'quantity' => 2, - 'deleted' => 0, - 'idaction_sku' => 1, - 'idaction_name' => 2, - 'idaction_category' => 3, - 'idaction_category2' => 4, - 'idaction_category3' => 5, - 'idaction_category4' => 6, - 'idaction_category5' => 7, - ), - array( - 'idsite' => 2, - 'idvisitor' => self::DUMMY_IDVISITOR, - 'server_time' => '2012-01-09 00:00:00', - 'idvisit' => 2, - 'idorder' => 2, - 'price' => 10, - 'quantity' => 1, - 'deleted' => 1, - 'idaction_sku' => 2, - 'idaction_name' => 3, - 'idaction_category' => 5, - 'idaction_category2' => 7, - 'idaction_category3' => 8, - 'idaction_category4' => 9, - 'idaction_category5' => 10, - ), - ), - ); - - public function setUp(): void - { - parent::setUp(); - - foreach (self::$dataToInsert as $table => $rows) { - self::insertRowData($table, $rows); - } - } - - private static function insertRowData($unprefixedTable, $rows) - { - $table = Common::prefixTable($unprefixedTable); - foreach ($rows as $row) { - if ($unprefixedTable == 'log_action') { - $row['hash'] = crc32($row['name']); - } - - if (isset($row['idvisitor'])) { - $row['idvisitor'] = pack("H*", $row['idvisitor']); - } - - $placeholders = array_map(function () { - return "?"; - }, $row); - $sql = "INSERT INTO $table (" . implode(',', array_keys($row)) . ") VALUES (" . implode(',', $placeholders) . ")"; - Db::query($sql, array_values($row)); - } - } -} diff --git a/plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php b/plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php deleted file mode 100644 index cc5137e7759118aac2762c420da6acda0d909636..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php +++ /dev/null @@ -1,48 +0,0 @@ -idSite)) { - Fixture::createWebsite('2014-01-02 03:04:05'); - } - $this->trackData(); - } - - private function trackData() - { - $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true); - self::checkResponse($t->doTrackPageView('Valid Site')); - - $t = self::getTracker(99999, Date::now()->getDatetime(), $defaultInit = true); - - for ($i = 0; $i < 2; $i++) { - // we trigger it multiple times to test it will be inserted only once - $t->doTrackPageView('Invalid Site'); - } - - $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true); - $t->setIp('10.11.12.13'); - $t->setTokenAuth('123456789012345678901234567890ab'); // wrong token - $t->doTrackPageView('Invalid Token'); - } -} diff --git a/plugins/CoreAdminHome/tests/Fixtures/CoreArchiverProcessSignal.php b/plugins/CoreAdminHome/tests/Fixtures/CoreArchiverProcessSignal.php deleted file mode 100644 index c9119892eee7db7700367a58de8c15b9be7457ab..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Fixtures/CoreArchiverProcessSignal.php +++ /dev/null @@ -1,168 +0,0 @@ -inTestEnv = (bool) getenv(self::ENV_TRIGGER); - $this->inTestRequest = Request::fromRequest()->getBoolParameter(self::ENV_TRIGGER, false); - $this->today = '2024-05-03'; - - $this->stepControl = new StepControl(); - } - - public function setUp(): void - { - Rules::setBrowserTriggerArchiving(false); - Config::getInstance()->General['process_new_segments_from'] = 'segment_creation_time'; - Fixture::createSuperUser(); - - $this->setUpWebsites(); - $this->setUpSegments(); - $this->trackVisits(); - } - - public function tearDown(): void - { - // empty - } - - public function provideContainerConfig(): array - { - Date::$now = strtotime('2024-05-03 10:00:00'); - - if (!$this->inTestEnv && !$this->inTestRequest) { - return []; - } - - if ($this->inTestRequest) { - return [ - 'observers.global' => DI::add([ - [ - 'API.CoreAdminHome.archiveReports', - DI::value(Closure::fromCallable([$this->stepControl, 'handleAPIArchiveReports'])), - ], - ]), - ]; - } - - return [ - 'ini.tests.enable_logging' => 1, - 'log.handlers' => static function (Container $c) { - return [$c->get(EchoHandler::class)]; - }, - 'observers.global' => DI::add([ - [ - 'CronArchive.alterArchivingRequestUrl', - DI::value(static function (&$url) { - $url .= '&' . self::ENV_TRIGGER . '=1'; - }), - ], - [ - 'CronArchive.init.finish', - DI::value(Closure::fromCallable([$this->stepControl, 'handleCronArchiveStart'])), - ], - [ - 'ScheduledTasks.execute', - DI::value(Closure::fromCallable([$this->stepControl, 'handleScheduledTasksExecute'])), - ], - [ - 'ScheduledTasks.shouldExecuteTask', - DI::value(Closure::fromCallable([$this->stepControl, 'handleScheduledTasksShouldExecute'])), - ], - ]), - ]; - } - - private function setUpSegments(): void - { - APISegmentEditor::getInstance()->add( - self::TEST_SEGMENT_CH, - self::TEST_SEGMENT_CH, - $this->idSite, - $autoArchive = true, - $enabledAllUsers = true - ); - - APISegmentEditor::getInstance()->add( - self::TEST_SEGMENT_FF, - self::TEST_SEGMENT_FF, - $this->idSite, - $autoArchive = true, - $enabledAllUsers = true - ); - } - - private function setUpWebsites(): void - { - if (!self::siteCreated($this->idSite)) { - self::createWebsite('2021-01-01'); - } - } - - private function trackVisits(): void - { - $t = self::getTracker($this->idSite, $this->today, $defaultInit = true); - $t->setUrl('http://example.org/index.htm'); - - self::checkResponse($t->doTrackPageView('0')); - } -} diff --git a/plugins/CoreAdminHome/tests/Fixtures/CoreArchiverProcessSignal/StepControl.php b/plugins/CoreAdminHome/tests/Fixtures/CoreArchiverProcessSignal/StepControl.php deleted file mode 100644 index 57c2871b3a749f56fb8f565fc90bc83ea686f383..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Fixtures/CoreArchiverProcessSignal/StepControl.php +++ /dev/null @@ -1,184 +0,0 @@ -waitForSuccess(static function () use ($parameters): bool { - // force reading from database - Option::clearCachedOption(self::OPTION_ARCHIVE_REPORTS_BLOCKED); - - $option = Option::get(self::OPTION_ARCHIVE_REPORTS_BLOCKED) ?: ''; - $block = json_decode($option, true); - - if (!is_array($block)) { - return true; - } - - return ( - $block['segment'] !== urldecode($parameters['segment'] ?: '') - || $block['period'] !== $parameters['period'] - || $block['date'] !== $parameters['date'] - ); - }); - - if (!$continue) { - throw new RuntimeException('Waiting for ArchiveReports option took too long!'); - } - } - - /** - * DI hook intercepting the "CronArchive.init.finish" event. - */ - public function handleCronArchiveStart(): void - { - $continue = $this->waitForSuccess(static function (): bool { - // force reading from database - Option::clearCachedOption(self::OPTION_CRON_ARCHIVE_BLOCKED); - - return false === Option::get(self::OPTION_CRON_ARCHIVE_BLOCKED); - }); - - if (!$continue) { - throw new RuntimeException('Waiting for CronArchive option took too long!'); - } - } - - /** - * DI hook intercepting the "ScheduledTasks.execute" event. - */ - public function handleScheduledTasksExecute(): void - { - $continue = $this->waitForSuccess(static function (): bool { - // force reading from database - Option::clearCachedOption(self::OPTION_SCHEDULED_TASKS_BLOCKED); - - return false === Option::get(self::OPTION_SCHEDULED_TASKS_BLOCKED); - }); - - if (!$continue) { - throw new RuntimeException('Waiting for ScheduledTask option took too long!'); - } - } - - /** - * DI hook intercepting the "ScheduledTasks.shouldExecuteTask" event. - */ - public function handleScheduledTasksShouldExecute(bool &$shouldExecuteTask): void - { - if (Option::get(self::OPTION_SCHEDULED_TASKS_EXECUTE)) { - $shouldExecuteTask = true; - } - } - - /** - * Remove all internal blocks. - */ - public function reset(): void - { - Option::deleteLike(self::OPTION_PREFIX . '%'); - } - - /** - * Allow proceeding past the "API.CoreAdminHome.archiveReports" event. - */ - public function unblockAPIArchiveReports(): void - { - Option::delete(self::OPTION_ARCHIVE_REPORTS_BLOCKED); - } - - /** - * Allow proceeding past the "CronArchive.init.start" event. - */ - public function unblockCronArchiveStart(): void - { - Option::delete(self::OPTION_CRON_ARCHIVE_BLOCKED); - } - - /** - * Allow proceeding past the "ScheduledTasks.execute" event. - */ - public function unblockScheduledTasks(): void - { - Option::delete(self::OPTION_SCHEDULED_TASKS_BLOCKED); - } - - /** - * Wait until a callable returns true or a timeout is reached. - */ - public function waitForSuccess(callable $check, int $timeoutInSeconds = 10): bool - { - $start = time(); - - do { - $now = time(); - - if ($check()) { - return true; - } - - // 250 millisecond sleep - usleep(250 * 1000); - } while ($timeoutInSeconds > $now - $start); - - return false; - } -} diff --git a/plugins/CoreAdminHome/tests/Fixtures/RunScheduledTasksProcessSignal.php b/plugins/CoreAdminHome/tests/Fixtures/RunScheduledTasksProcessSignal.php deleted file mode 100644 index 06f1c3134873013ee2168d522dd740f7248ee321..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Fixtures/RunScheduledTasksProcessSignal.php +++ /dev/null @@ -1,83 +0,0 @@ -inTestEnv = (bool) getenv(self::ENV_TRIGGER); - - $this->stepControl = new StepControl(); - } - - public function setUp(): void - { - Fixture::createSuperUser(); - - if (!self::siteCreated($this->idSite)) { - self::createWebsite('2021-01-01'); - } - } - - public function tearDown(): void - { - // empty - } - - public function provideContainerConfig(): array - { - if (!$this->inTestEnv) { - return []; - } - - return [ - 'ini.tests.enable_logging' => 1, - 'log.handlers' => static function (Container $c) { - return [$c->get(EchoHandler::class)]; - }, - 'observers.global' => DI::add([ - [ - 'ScheduledTasks.execute', - DI::value(Closure::fromCallable([$this->stepControl, 'handleScheduledTasksExecute'])), - ], - ]), - ]; - } -} diff --git a/plugins/CoreAdminHome/tests/Fixtures/RunScheduledTasksProcessSignal/StepControl.php b/plugins/CoreAdminHome/tests/Fixtures/RunScheduledTasksProcessSignal/StepControl.php deleted file mode 100644 index 41df6653560c3a862846dc476d2dddfa6c9204dc..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Fixtures/RunScheduledTasksProcessSignal/StepControl.php +++ /dev/null @@ -1,84 +0,0 @@ -waitForSuccess(static function (): bool { - // force reading from database - Option::clearCachedOption(self::OPTION_SCHEDULED_TASKS_BLOCKED); - - return false === Option::get(self::OPTION_SCHEDULED_TASKS_BLOCKED); - }); - - if (!$continue) { - throw new RuntimeException('Waiting for ScheduledTask option took too long!'); - } - } - - /** - * Remove all internal blocks. - */ - public function reset(): void - { - Option::deleteLike(self::OPTION_PREFIX . '%'); - } - - /** - * Allow proceeding past the "ScheduledTasks.execute" event. - */ - public function unblockScheduledTasks(): void - { - Option::delete(self::OPTION_SCHEDULED_TASKS_BLOCKED); - } - - /** - * Wait until a callable returns true or a timeout is reached. - */ - public function waitForSuccess(callable $check, int $timeoutInSeconds = 10): bool - { - $start = time(); - - do { - $now = time(); - - if ($check()) { - return true; - } - - // 250 millisecond sleep - usleep(250 * 1000); - } while ($timeoutInSeconds > $now - $start); - - return false; - } -} diff --git a/plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php deleted file mode 100644 index 5359b69fa7fa1edb2871b5da940d8d6b5fc71156..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php +++ /dev/null @@ -1,79 +0,0 @@ -setUpWebsite(); - $this->trackFirstVisit(); - $this->trackSecondVisit(); - } - - public function tearDown(): void - { - // empty - } - - private function setUpWebsite() - { - if (!self::siteCreated($this->idSite)) { - $idSite = self::createWebsite($this->dateTime, $ecommerce = 1); - $this->assertSame($this->idSite, $idSite); - } - } - - protected function trackFirstVisit() - { - $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.1)->getDatetime()); - $t->setUrl('http://example.com/'); - self::checkResponse($t->doTrackPageView('Viewing homepage')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.2)->getDatetime()); - $t->setUrl('http://example.com/sub/page'); - self::checkResponse($t->doTrackPageView('Second page view')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.25)->getDatetime()); - $t->addEcommerceItem($sku = 'SKU_ID', $name = 'Test item!', $category = 'Test & Category', $price = 777, $quantity = 33); - self::checkResponse($t->doTrackEcommerceOrder('TestingOrder', $grandTotal = 33 * 77)); - } - - protected function trackSecondVisit() - { - $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true); - $t->setIp('56.11.55.73'); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.1)->getDatetime()); - $t->setUrl('http://example.com/sub/page'); - self::checkResponse($t->doTrackPageView('Viewing homepage')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.2)->getDatetime()); - $t->setUrl('http://example.com/?search=this is a site search query'); - self::checkResponse($t->doTrackPageView('Site search query')); - - $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.3)->getDatetime()); - $t->addEcommerceItem($sku = 'SKU_ID2', $name = 'A durable item', $category = 'Best seller', $price = 321); - self::checkResponse($t->doTrackEcommerceCartUpdate($grandTotal = 33 * 77)); - } -} diff --git a/plugins/CoreAdminHome/tests/Framework/Mock/API.php b/plugins/CoreAdminHome/tests/Framework/Mock/API.php deleted file mode 100644 index 8945b1d8fe1df09db9384a6014d5dbb3ac8b164b..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Framework/Mock/API.php +++ /dev/null @@ -1,33 +0,0 @@ -invalidatedReports[] = func_get_args(); - - return []; - } - - public function getInvalidatedReports() - { - return $this->invalidatedReports; - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/APITest.php b/plugins/CoreAdminHome/tests/Integration/APITest.php deleted file mode 100644 index 0f515cb4a3811fe987eafa09c9af18a4b10c8d4f..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/APITest.php +++ /dev/null @@ -1,133 +0,0 @@ -api = API::getInstance(); - for ($i = 0; $i < 5; $i++) { - Fixture::createWebsite('2014-01-02 03:04:05'); - } - } - - public function testGetTrackingFailuresFailsForViewUser() - { - $this->expectException(\Piwik\NoAccessException::class); - $this->expectExceptionMessage('checkUserHasSomeAdminAccess'); - - $this->setUser(); - $this->api->getTrackingFailures(); - } - - public function testGetTrackingFailuresWorksForAdminAndSuperuser() - { - $this->setAdminUser(); - $this->assertSame(array(), $this->api->getTrackingFailures()); - $this->setSuperUser(); - $this->api->getTrackingFailures(); - $this->assertSame(array(), $this->api->getTrackingFailures()); - } - - public function testDeleteAllTrackingFailuresFailsForViewUser() - { - $this->expectException(\Piwik\NoAccessException::class); - $this->expectExceptionMessage('checkUserHasSomeAdminAccess'); - - $this->setUser(); - $this->api->deleteAllTrackingFailures(); - } - - public function testDeleteAllTrackingFailuresWorksForAdminAndSuperuser() - { - $this->expectNotToPerformAssertions(); - $this->setAdminUser(); - $this->api->deleteAllTrackingFailures(); - $this->setSuperUser(); - $this->api->deleteAllTrackingFailures(); - } - - public function testDeleteTrackingFailureFailsForViewUser() - { - $this->expectException(\Piwik\NoAccessException::class); - $this->expectExceptionMessage('checkUserHasAdminAccess'); - - $this->setUser(); - $this->api->deleteTrackingFailure(1, 2); - } - - public function testDeleteTrackingFailureFailsForAdminUserIfNotAdminAccessToThatSite() - { - $this->expectException(\Piwik\NoAccessException::class); - $this->expectExceptionMessage('checkUserHasAdminAccess'); - - $this->setAdminUser(); - $this->api->deleteTrackingFailure(2, 2); - } - - public function testDeleteTrackingFailureWorksForAdminAndSuperuser() - { - $this->expectNotToPerformAssertions(); - $this->setAdminUser(); - $this->api->deleteTrackingFailure(1, 2); - $this->setSuperUser(); - $this->api->deleteTrackingFailure(1, 2); - } - - protected function setSuperUser() - { - FakeAccess::clearAccess(true); - } - - protected function setUser() - { - FakeAccess::clearAccess(false); - FakeAccess::$identity = 'testUser'; - FakeAccess::$idSitesView = array(1,3, $this->idSite); - FakeAccess::$idSitesAdmin = array(); - } - - protected function setAdminUser() - { - FakeAccess::clearAccess(false); - FakeAccess::$identity = 'testUser'; - FakeAccess::$idSitesView = array(); - FakeAccess::$idSitesAdmin = array(1,3, $this->idSite); - } - - public function provideContainerConfig() - { - return array( - 'Piwik\Access' => new FakeAccess(), - ); - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/ArchiveReportsMetricsTimerTest.php b/plugins/CoreAdminHome/tests/Integration/ArchiveReportsMetricsTimerTest.php deleted file mode 100644 index b01ecb0d1264f509c96469c832225a6d8b2a6302..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/ArchiveReportsMetricsTimerTest.php +++ /dev/null @@ -1,64 +0,0 @@ -extraPluginsToLoad[] = 'ArchivingMetrics'; - - parent::setUpBeforeClass(); - } - - public function setUp(): void - { - parent::setUp(); - - Timer::resetInstanceForTests(); - } - - public function testArchiveReportsWritesMetricsOnceAndDoesNotWriteAgainWhenReusingDbArchive(): void - { - Fixture::createSuperUser(true); - $_GET['trigger'] = 'archivephp'; - - $idSite = Fixture::createWebsite('2024-01-01 00:00:00'); - - $t = Fixture::getTracker($idSite, '2024-01-01 12:00:00'); - $t->setUrl('http://example.com/'); - Fixture::checkResponse($t->doTrackPageView('test')); - - CoreAdminHomeAPI::getInstance()->archiveReports($idSite, 'day', '2024-01-01'); - $this->assertSame(1, $this->getMetricsCount(), 'Expected archiving_metrics to have 1 row after first archiveReports call.'); - - CoreAdminHomeAPI::getInstance()->archiveReports($idSite, 'day', '2024-01-01'); - $this->assertSame(1, $this->getMetricsCount(), 'Expected archiving_metrics to still have 1 row after reusing the same DB archive.'); - } - - private function getMetricsCount(): int - { - return (int) Db::fetchOne('SELECT COUNT(*) FROM ' . Common::prefixTable('archiving_metrics')); - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/ArchivesToPurgeDistributedListTest.php b/plugins/CoreAdminHome/tests/Integration/ArchivesToPurgeDistributedListTest.php deleted file mode 100644 index 98a908abdc0637c79ff95fa53e0660935f57bea8..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/ArchivesToPurgeDistributedListTest.php +++ /dev/null @@ -1,38 +0,0 @@ - array(1,2,3), - '2013_02' => array(3), - 3 => '2015_03', - '2014_01' => array(), - 4 => '2015_06', - ); - Option::set(ArchivesToPurgeDistributedList::OPTION_INVALIDATED_DATES_SITES_TO_PURGE, serialize($oldItems)); - - $list = new ArchivesToPurgeDistributedList(); - $items = $list->getAll(); - - $expected = array('2015_03', '2015_06', '2015_01', '2013_02', '2014_01'); - $this->assertEquals($expected, array_values($items)); - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/ConfigDeleteTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/ConfigDeleteTest.php deleted file mode 100644 index d8ce8b375dcebd190f9a3a63e5cf84126a352b20..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/ConfigDeleteTest.php +++ /dev/null @@ -1,561 +0,0 @@ - function (Container $container) { - /** @var GlobalSettingsProvider $actualGlobalSettingsProvider */ - $actualGlobalSettingsProvider = $container->get('Piwik\Application\Kernel\GlobalSettingsProvider'); - - $config = self::makeTestConfig(); - - // copy over sections required for tests - $config->tests = $actualGlobalSettingsProvider->getSection('tests'); - $config->database = $actualGlobalSettingsProvider->getSection('database_tests'); - - return $config; - }, - ); - } - - private static function makeTestConfig() - { - $settingsProvider = new GlobalSettingsProvider(null, self::getTestConfigFilePath()); - $config = new Config($settingsProvider); - - // Add the first section. - $sectionName = self::TEST_SECTION_1_NAME; - $config->$sectionName[self::TEST_SETTING_1_1_NAME] = self::TEST_SETTING_1_1_VALUE; - $config->$sectionName[self::TEST_SETTING_1_2_NAME] = self::TEST_SETTING_1_2_VALUE; - $config->$sectionName[self::TEST_SETTING_1_3_NAME] = self::TEST_SETTING_1_3_VALUE; - $config->$sectionName[self::TEST_SETTING_1_4_NAME] = self::TEST_SETTING_1_4_VALUE; - $config->$sectionName[self::TEST_SETTING_1_5_NAME] = self::TEST_SETTING_1_5_VALUE; - $config->$sectionName[self::TEST_SETTING_1_6_NAME] = self::TEST_SETTING_1_6_VALUE; - $config->$sectionName[self::TEST_SETTING_1_7_NAME] = self::TEST_SETTING_1_7_VALUE; - $config->$sectionName[self::TEST_SETTING_1_8_NAME] = self::TEST_SETTING_1_8_VALUE; - - // Add a second section so we are testing that we do not accidentally return it. - $sectionName = self::TEST_SECTION_1_NAME . '_second_section'; - // Add a setting with the same name as in section #1 but with a random int value. - $config->$sectionName[self::TEST_SETTING_1_1_NAME] = random_int(PHP_INT_MIN, PHP_INT_MAX); - // Add another setting to the same section with some bogus content. - $config->$sectionName[self::TEST_SETTING_1_2_NAME . '_another'] = '127.0.0.1'; - - - // Add the second section. - // Add an array value like section=PluginsInstalled; setting=PluginsInstalled[]. - $sectionName = self::TEST_SECTION_2_NAME; - // Add some values to the setting array. - $config->$sectionName[self::TEST_SETTING_2_1_NAME] = self::TEST_SETTING_2_1_VALUES; - $config->$sectionName[self::TEST_SETTING_2_2_NAME] = self::TEST_SETTING_2_2_VALUES; - $config->$sectionName[self::TEST_SETTING_2_3_NAME] = self::TEST_SETTING_2_3_VALUES; - $config->$sectionName[self::TEST_SETTING_2_4_NAME] = self::TEST_SETTING_2_4_VALUES; - $config->$sectionName[self::TEST_SETTING_2_5_NAME] = self::TEST_SETTING_2_5_VALUES; - $config->$sectionName[self::TEST_SETTING_2_6_NAME] = self::TEST_SETTING_2_6_VALUES; - $config->$sectionName[self::TEST_SETTING_2_7_NAME] = self::TEST_SETTING_2_7_VALUES; - - $config->forceSave(); - return $config; - } - - private static function removeTestConfigFile() - { - $configPath = self::getTestConfigFilePath(); - if (file_exists($configPath)) { - unlink($configPath); - } - } - - private static function makeNewConfig() - { - $settings = new GlobalSettingsProvider(null, self::getTestConfigFilePath()); - return new Config($settings); - } - - private function runCommandWithOptions(string $sectionName, string $settingName, string $value = ''): object - { - - $inputArr = [ - 'command' => self::COMMAND, - '--section' => $sectionName, - '--key' => $settingName, - '-vvv' => false, - ]; - if (!empty($value)) { - $inputArr['--value'] = $value; - } - $exitCode = $this->applicationTester->run($inputArr); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - // Put the results in an easy-to-handle object format. - return (object) ['exitCode' => $exitCode, 'output' => $output]; - } - - private function runCommandWithArguments(string $sectionName, string $settingName = '', string $value = ''): object - { - - $inputArr = [ - 'command' => self::COMMAND, - '-vvv' => false, - 'argument' => $sectionName . '.' . $settingName . (empty($value) ? '' : ".$value"), - ]; - - $exitCode = $this->applicationTester->run($inputArr); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - // Put the results in an easy-to-handle object format. - return (object) ['exitCode' => $exitCode, 'output' => $output]; - } - - //************************************************************************* - // Tests that should yield errors. - //************************************************************************* - public function testNoArgsShouldYieldError() - { - - $inputArr = [ - 'command' => 'config:get', - '-vvv' => false, - ]; - $exitCode = $this->applicationTester->run($inputArr); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $exitCode); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - $this->assertStringContainsString('InvalidArgumentException', $output); - } - - public function testEmptyArgsShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(''); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - public function testEmptyOptionsShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions('', ''); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - public function testSetArgsAndOptionsShouldYieldError() - { - $inputArr = [ - 'command' => 'config:get', - 'argument' => self::TEST_SECTION_1_NAME . '.' . self::TEST_SETTING_1_1_NAME, - '--section' => self::TEST_SECTION_1_NAME, - '--key' => self::TEST_SETTING_1_1_NAME, - '-vvv' => false, - ]; - $exitCode = $this->applicationTester->run($inputArr); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $exitCode); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - $this->assertStringContainsString('InvalidArgumentException', $output); - } - - public function testEmptySectionShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions('', self::TEST_SETTING_1_1_NAME); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - public function testScalarSettingWithArrayValShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, self::CLASS_NAME_SHORT . '_Array_key_does_not_exist'); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - public function testArrayWithNoValShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - //************************************************************************* - // Tests for nonexistent data. - //************************************************************************* - public function testUsingOptsNonExistentSectionShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::CLASS_NAME_SHORT . '_Section_does_not_exist', self::TEST_SETTING_1_1_NAME); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsNonExistentSectionShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(self::CLASS_NAME_SHORT . '_Section_does_not_exist', self::TEST_SETTING_1_1_NAME); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsNonExistentSectionAndSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::CLASS_NAME_SHORT . '_Section_does_not_exist', self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsNonExistentSectionAndSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(self::CLASS_NAME_SHORT . '_Section_does_not_exist', self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsNonExistentSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsNonExistentSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsArrayWithInvalidValShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME, self::CLASS_NAME_SHORT . '_Array_key_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsArrayWithInvalidValShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME, self::CLASS_NAME_SHORT . '_Array_key_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - //************************************************************************* - // Tests for existing data. - //************************************************************************* - /** - * @dataProvider getSingleSettingDataProvider1 - */ - public function testUsingOptsDeleteSingleSetting($sectionName, $settingName, $settingValue) - { - - $resultObj = $this->runCommandWithOptions($sectionName, $settingName); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $this->assertStringContainsString('Success:', $resultObj->output); - - $config = $this->makeNewConfig(); - $configDump = $config->dumpConfig(); - $needle = $settingName . ' = ' . $settingValue; - $this->assertStringNotContainsString($needle, $configDump); - } - - /** - * @dataProvider getSingleSettingDataProvider2 - */ - public function testUsingArgsDeleteSingleSetting($sectionName, $settingName, $settingValue) - { - - $resultObj = $this->runCommandWithArguments($sectionName, $settingName); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $this->assertStringContainsString('Success:', $resultObj->output); - - $config = $this->makeNewConfig(); - $configDump = $config->dumpConfig(); - $needle = $settingName . ' = ' . $settingValue; - $this->assertStringNotContainsString($needle, $configDump); - } - - /** - * @dataProvider getArraySettingDataProvider1 - */ - public function testUsingOptsDeleteArraySetting($sectionName, $settingName, $settingValue) - { - - $resultObj = $this->runCommandWithOptions($sectionName, $settingName, $settingValue); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $this->assertStringContainsString('Success:', $resultObj->output); - - $config = $this->makeNewConfig(); - $configDump = $config->dumpConfig(); - $needle = $settingName . ' = ' . $settingValue; - $this->assertStringNotContainsString($needle, $configDump); - } - - /** - * @dataProvider getArraySettingDataProvider2 - */ - public function testUsingArgsDeleteArraySetting($sectionName, $settingName, $settingValue) - { - - $resultObj = $this->runCommandWithArguments($sectionName, $settingName, $settingValue); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $this->assertStringContainsString('Success:', $resultObj->output); - - $config = $this->makeNewConfig(); - $configDump = $config->dumpConfig(); - $needle = $settingName . ' = ' . $settingValue; - $this->assertStringNotContainsString($needle, $configDump); - } - - public function getSingleSettingDataProvider1() - { - yield 'Section 1, Setting 1.1' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, self::TEST_SETTING_1_1_VALUE]; - yield 'Section 1, Setting 1.2' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_2_NAME, self::TEST_SETTING_1_2_VALUE]; - yield 'Section 1, Setting 1.3 - IPv4 address with port' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_3_NAME, self::TEST_SETTING_1_3_VALUE]; - yield 'Section 1, Setting 1.4 - IPv6 address with port' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_4_NAME, self::TEST_SETTING_1_4_VALUE]; - } - - public function getSingleSettingDataProvider2() - { - yield 'Section 1, Setting 1.5 - IPv4 subnet' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_5_NAME, self::TEST_SETTING_1_5_VALUE]; - yield 'Section 1, Setting 1.6 - IPv6 subnet' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_6_NAME, self::TEST_SETTING_1_6_VALUE]; - yield 'Section 1, Setting 1.7 - mail address with extension' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_7_NAME, self::TEST_SETTING_1_7_VALUE]; - yield 'Section 1, Setting 1.8 - comma separated list' => [self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_8_NAME, self::TEST_SETTING_1_8_VALUE]; - } - - public function getArraySettingDataProvider1() - { - yield 'Section 2, Setting 2.1' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME, self::TEST_SETTING_2_1_VALUE_0]; - yield 'Section 2, Setting 2.2 - IPv4 address with port' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_2_NAME, self::TEST_SETTING_2_2_VALUE_0]; - yield 'Section 2, Setting 2.3 - IPv6 address with port' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_3_NAME, self::TEST_SETTING_2_3_VALUE_0]; - yield 'Section 2, Setting 2.4 - IPv4 subnet' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_4_NAME, self::TEST_SETTING_2_4_VALUE_0]; - yield 'Section 2, Setting 2.5 - IPv6 subnet' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_5_NAME, self::TEST_SETTING_2_5_VALUE_0]; - yield 'Section 2, Setting 2.6 - mail address with extension' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_6_NAME, self::TEST_SETTING_2_6_VALUE_0]; - yield 'Section 2, Setting 2.7 - comma separated list' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_7_NAME, self::TEST_SETTING_2_7_VALUE_0]; - } - - public function getArraySettingDataProvider2() - { - yield 'Section 2, Setting 2.1' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME, self::TEST_SETTING_2_1_VALUE_1]; - yield 'Section 2, Setting 2.2 - IPv4 address with port' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_2_NAME, self::TEST_SETTING_2_2_VALUE_1]; - yield 'Section 2, Setting 2.3 - IPv6 address with port' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_3_NAME, self::TEST_SETTING_2_3_VALUE_1]; - yield 'Section 2, Setting 2.4 - IPv4 subnet' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_4_NAME, self::TEST_SETTING_2_4_VALUE_1]; - yield 'Section 2, Setting 2.5 - IPv6 subnet' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_5_NAME, self::TEST_SETTING_2_5_VALUE_1]; - yield 'Section 2, Setting 2.6 - mail address with extension' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_6_NAME, self::TEST_SETTING_2_6_VALUE_1]; - yield 'Section 2, Setting 2.7 - comma separated list' => [self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_7_NAME, self::TEST_SETTING_2_7_VALUE_1]; - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/ConfigGetTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/ConfigGetTest.php deleted file mode 100644 index 68657e80f98f1cc6ff3da8d42421539ae31c86a1..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/ConfigGetTest.php +++ /dev/null @@ -1,653 +0,0 @@ - self::TEST_SETTING_1_1_VALUE, - self::TEST_SETTING_1_2_NAME => self::TEST_SETTING_1_2_VALUE, - ]; - // Section 2. - private const TEST_SECTION_2_NAME = self::CLASS_NAME_SHORT . '_test_section_2'; - private const TEST_SETTING_2_1_NAME = self::CLASS_NAME_SHORT . '_array_setting'; - private const TEST_SETTING_2_1_VALUE_0 = self::CLASS_NAME_SHORT . '_arr_val_1'; - private const TEST_SETTING_2_1_VALUE_1 = self::CLASS_NAME_SHORT . '_arr_val_2'; - private const TEST_SETTING_2_1_VALUE_2 = self::CLASS_NAME_SHORT . '_arr_val_3'; - private const TEST_SETTING_2_1_VALUES = [self::TEST_SETTING_2_1_VALUE_0, self::TEST_SETTING_2_1_VALUE_1, self::TEST_SETTING_2_1_VALUE_2]; - - public static function setUpBeforeClass(): void - { - self::removeTestConfigFile(); - parent::setUpBeforeClass(); - } - - public function setUp(): void - { - self::removeTestConfigFile(); - parent::setUp(); - } - - public function tearDown(): void - { - parent::tearDown(); - } - - private static function getTestConfigFilePath() - { - return PIWIK_INCLUDE_PATH . self::TEST_CONFIG_PATH; - } - - public static function provideContainerConfigBeforeClass() - { - return array( - // use a config instance that will save to a test INI file - 'Piwik\Config' => function (Container $container) { - /** @var GlobalSettingsProvider $actualGlobalSettingsProvider */ - $actualGlobalSettingsProvider = $container->get('Piwik\Application\Kernel\GlobalSettingsProvider'); - - $config = self::makeTestConfig(); - - // copy over sections required for tests - $config->tests = $actualGlobalSettingsProvider->getSection('tests'); - $config->database = $actualGlobalSettingsProvider->getSection('database_tests'); - - return $config; - }, - ); - } - - private static function makeTestConfig() - { - $settingsProvider = new GlobalSettingsProvider(null, self::getTestConfigFilePath()); - $config = new Config($settingsProvider); - - // Add the first section. - $sectionName = self::TEST_SECTION_1_NAME; - $config->$sectionName[self::TEST_SETTING_1_1_NAME] = self::TEST_SETTING_1_1_VALUE; - $config->$sectionName[self::TEST_SETTING_1_2_NAME] = self::TEST_SETTING_1_2_VALUE; - - // Add a second section so we are testing that we do not accidentally return it. - $sectionName = self::TEST_SECTION_1_NAME . '_second_section'; - // Add a setting with the same name as in section #1 but with a random int value. - $config->$sectionName[self::TEST_SETTING_1_1_NAME] = random_int(PHP_INT_MIN, PHP_INT_MAX); - // Add another setting to the same section with some bogus content. - $config->$sectionName[self::TEST_SETTING_1_2_NAME . '_another'] = '127.0.0.1'; - - // Add an array value like section=PluginsInstalled; setting=PluginsInstalled[]. - $sectionName = self::TEST_SECTION_2_NAME; - // Add some values to the setting array. - $config->$sectionName[self::TEST_SETTING_2_1_NAME] = self::TEST_SETTING_2_1_VALUES; - - $config->forceSave(); - return $config; - } - - private static function removeTestConfigFile() - { - $configPath = self::getTestConfigFilePath(); - if (file_exists($configPath)) { - unlink($configPath); - } - } - - private function runCommandWithOptions(string $sectionName, string $settingName = '', $format = 'json'): object - { - - $inputArr = [ - 'command' => self::COMMAND, - '--section' => $sectionName, - '--key' => $settingName, - '-vvv' => false, - ]; - // To allow using default format, only add the format option if specified. - if (!empty($format)) { - $inputArr['--format'] = $format; - } - $exitCode = $this->applicationTester->run($inputArr); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - // Put the results in an easy-to-handle object format. - return (object) ['exitCode' => $exitCode, 'output' => $output]; - } - - private function runCommandWithArguments(string $sectionName, string $settingName = '', $format = 'json'): object - { - - $inputArr = [ - 'command' => self::COMMAND, - '-vvv' => false, - 'argument' => $sectionName . (empty($settingName) ? '' : ".$settingName"), - ]; - // To allow using default format, only add the format option if specified. - if (!empty($format)) { - $inputArr['--format'] = $format; - } - $exitCode = $this->applicationTester->run($inputArr); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - // Put the results in an easy-to-handle object format. - return (object) ['exitCode' => $exitCode, 'output' => $output]; - } - - //************************************************************************* - // Tests that should yield errors. - //************************************************************************* - public function testNoArgsShouldYieldError() - { - - $inputArr = [ - 'command' => self::COMMAND, - '-vvv' => false, - ]; - $exitCode = $this->applicationTester->run($inputArr); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $exitCode); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - $this->assertStringContainsString('InvalidArgumentException', $output); - } - - public function testEmptyArgsShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(''); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - public function testEmptyOptionsShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(''); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - public function testSetArgsAndOptionsShouldYieldError() - { - $inputArr = [ - 'command' => self::COMMAND, - 'argument' => self::TEST_SECTION_1_NAME . '.' . self::TEST_SETTING_1_1_NAME, - '--section' => self::TEST_SECTION_1_NAME, - '--key' => self::TEST_SETTING_1_1_NAME, - '-vvv' => false, - ]; - $exitCode = $this->applicationTester->run($inputArr); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $exitCode); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - $this->assertStringContainsString('InvalidArgumentException', $output); - } - - public function testEmptySectionShouldYieldError() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions('', self::TEST_SETTING_1_1_NAME); - - // The CLI error code should be >0 indicating failure. - $this->assertGreaterThan(0, $resultObj->exitCode); - - $this->assertStringContainsString('InvalidArgumentException', $resultObj->output); - } - - //************************************************************************* - // Tests for nonexistent data. - //************************************************************************* - public function testUsingOptsNonExistentSectionShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::CLASS_NAME_SHORT . '_Section_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsNonExistentSectionShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(self::CLASS_NAME_SHORT . '_Section_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsNonExistentSectionAndSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::CLASS_NAME_SHORT . '_Section_does_not_exist', self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsNonExistentSectionAndSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(self::CLASS_NAME_SHORT . '_Section_does_not_exist', self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsNonExistentSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsNonExistentSettingShouldYieldEmpty() - { - - // Pass empty section name. - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, self::CLASS_NAME_SHORT . '_Setting_does_not_exist'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = self::MSG_NOTHING_FOUND; - $this->assertEquals($expectedValue, $resultObj->output); - } - //************************************************************************* - // Tests for existing data. - //************************************************************************* - /** - * Assumes default --format=json. - */ - public function testUsingOptsGetSingleSettingFormatDefault() - { - - // Specifically set format='' (empty string) so we use the CLI default --format=json. - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, ''); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - // With the default --format=json, the result should be JSON-encoded, meaning value=MyString gets wrapped in quotes like this: "MyString". - $expectedValue = json_encode(self::TEST_SETTING_1_1_VALUE); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsGetSingleSettingFormatDefault() - { - - // Specifically set format='' (empty string) so we use the CLI default --format=json. - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, ''); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - // With the default --format=json, the result should be JSON-encoded, meaning value=MyString gets wrapped in quotes like this: "MyString". - $expectedValue = json_encode(self::TEST_SETTING_1_1_VALUE); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsGetSingleSettingFormatYaml() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, 'yaml'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - // With --format=yaml, a single value=MyString comes back with no quoting or brackets, e.g.: MyString. - $expectedValue = self::TEST_SETTING_1_1_VALUE; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsGetSingleSettingFormatYaml() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, 'yaml'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - // With --format=yaml, a single value=MyString comes back with no quoting or brackets, e.g.: MyString. - $expectedValue = self::TEST_SETTING_1_1_VALUE; - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsGetSingleSettingFormatText() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, 'text'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $resultArr = explode(PHP_EOL, $resultObj->output); - $resultArrLineCounter = 0; - - $expectedValue = self::TEST_SECTION_1_NAME . '.' . self::TEST_SETTING_1_1_NAME . ' = ' . self::TEST_SETTING_1_1_VALUE; - $this->assertEquals($expectedValue, $resultArr[$resultArrLineCounter++]); - } - - public function testUsingArgsGetSingleSettingFormatText() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, self::TEST_SETTING_1_1_NAME, 'text'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $resultArr = explode(PHP_EOL, $resultObj->output); - $resultArrLineCounter = 0; - - $expectedValue = self::TEST_SECTION_1_NAME . '.' . self::TEST_SETTING_1_1_NAME . ' = ' . self::TEST_SETTING_1_1_VALUE; - $this->assertEquals($expectedValue, $resultArr[$resultArrLineCounter++]); - } - - /** - * Assumes default --format=json. - */ - public function testUsingOptsGetSectionFormatDefault() - { - - // Specifically set format='' (empty string) so we use the CLI default --format=json. - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, false, ''); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = json_encode((object) self::TEST_SETTING_1_SUMMARIZED); - $this->assertEquals($expectedValue, $resultObj->output); - } - - /** - * Assumes default --format=json. - */ - public function testUsingArgsGetSectionFormatDefault() - { - - // Specifically set format='' (empty string) so we use the CLI default --format=json. - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, false, ''); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = json_encode((object) self::TEST_SETTING_1_SUMMARIZED); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsGetSectionFormatYaml() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, false, 'yaml'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = trim(Yaml::dump(self::TEST_SETTING_1_SUMMARIZED, 2, 2, true)); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsGetSectionFormatYaml() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, false, 'yaml'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = trim(Yaml::dump(self::TEST_SETTING_1_SUMMARIZED, 2, 2, true)); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsGetSectionNoArrayFormatText() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, false, 'text'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $resultArr = explode(PHP_EOL, $resultObj->output); - $resultArrLineCounter = 0; - $this->assertStringContainsString('[' . self::TEST_SECTION_1_NAME . ']', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString('--', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_1_NAME . ' = ' . self::TEST_SETTING_1_1_VALUE, $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_2_NAME . ' = ' . self::TEST_SETTING_1_2_VALUE, $resultArr[$resultArrLineCounter++]); - } - - public function testUsingArgsGetSectionNoArrayFormatText() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, false, 'text'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $resultArr = explode(PHP_EOL, $resultObj->output); - $resultArrLineCounter = 0; - $this->assertStringContainsString('[' . self::TEST_SECTION_1_NAME . ']', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString('--', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_1_NAME . ' = ' . self::TEST_SETTING_1_1_VALUE, $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_2_NAME . ' = ' . self::TEST_SETTING_1_2_VALUE, $resultArr[$resultArrLineCounter++]); - } - - public function testUsingOptsGetSectionWithArrayFormatText() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_1_NAME, false, 'text'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $resultArr = explode(PHP_EOL, $resultObj->output); - $resultArrLineCounter = 0; - $this->assertStringContainsString('[' . self::TEST_SECTION_1_NAME . ']', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString('--', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_1_NAME . ' = ' . self::TEST_SETTING_1_1_VALUE, $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_2_NAME . ' = ' . self::TEST_SETTING_1_2_VALUE, $resultArr[$resultArrLineCounter++]); - } - - public function testUsingArgsGetSectionWithArrayFormatText() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_1_NAME, false, 'text'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $resultArr = explode(PHP_EOL, $resultObj->output); - $resultArrLineCounter = 0; - $this->assertStringContainsString('[' . self::TEST_SECTION_1_NAME . ']', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString('--', $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_1_NAME . ' = ' . self::TEST_SETTING_1_1_VALUE, $resultArr[$resultArrLineCounter++]); - $this->assertStringContainsString(self::TEST_SETTING_1_2_NAME . ' = ' . self::TEST_SETTING_1_2_VALUE, $resultArr[$resultArrLineCounter++]); - } - - public function testUsingOptsGetSectionWithArray() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_2_NAME); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $settingName = self::TEST_SETTING_2_1_NAME; - $expectedValue = json_encode((object) [$settingName => self::TEST_SETTING_2_1_VALUES]); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsGetSectionWithArray() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_2_NAME); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $settingName = self::TEST_SETTING_2_1_NAME; - $expectedValue = json_encode((object) [$settingName => self::TEST_SETTING_2_1_VALUES]); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsGetArraySettingFromSection() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = json_encode(self::TEST_SETTING_2_1_VALUES); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsGetArraySettingFromSection() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = json_encode(self::TEST_SETTING_2_1_VALUES); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsGetArraySettingWithBrackets() - { - - $resultObj = $this->runCommandWithOptions(self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME . '[]'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = json_encode(self::TEST_SETTING_2_1_VALUES); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingArgsGetArraySettingWithBrackets() - { - - $resultObj = $this->runCommandWithArguments(self::TEST_SECTION_2_NAME, self::TEST_SETTING_2_1_NAME . '[]'); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $resultObj->exitCode, $this->getCommandDisplayOutputErrorMessage()); - - $expectedValue = json_encode(self::TEST_SETTING_2_1_VALUES); - $this->assertEquals($expectedValue, $resultObj->output); - } - - public function testUsingOptsCallWithMultipleSectionsReturnsLastSectionOnly() - { - - $inputArr = [ - 'command' => self::COMMAND, - '-vvv' => false, - 'argument' => '--section ' . self::TEST_SECTION_2_NAME . ' --section ' . self::TEST_SECTION_1_NAME, - ]; - $exitCode = $this->applicationTester->run($inputArr); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $exitCode); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - $expectedValue = json_encode((object) self::TEST_SETTING_1_SUMMARIZED); - $this->assertEquals($expectedValue, $output); - } - - public function testUsingArgsCallWithMultipleSectionsReturnsLastSectionOnly() - { - - $inputArr = [ - 'command' => self::COMMAND, - '-vvv' => false, - 'argument' => self::TEST_SECTION_2_NAME . ' ' . self::TEST_SECTION_1_NAME, - ]; - $exitCode = $this->applicationTester->run($inputArr); - - // The CLI error code should be 0 indicating success. - $this->assertEquals(0, $exitCode); - - // Pass true to getDisplay(true) to normalize line endings, then trim() bc CLI adds an \ automatically. - $output = trim($this->applicationTester->getDisplay(true)); - - $expectedValue = json_encode((object) self::TEST_SETTING_1_SUMMARIZED); - $this->assertEquals($expectedValue, $output); - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/CoreArchiverProcessSignalTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/CoreArchiverProcessSignalTest.php deleted file mode 100644 index 25b24c49d75179665a3c0aaf53f183c2f8cf2972..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/CoreArchiverProcessSignalTest.php +++ /dev/null @@ -1,536 +0,0 @@ -markTestSkipped('signal test cannot run without ext-pcntl'); - } - - parent::setUp(); - - self::$fixture->stepControl->reset(); - - $this->dataAccessModel = new Model(); - } - - /** - * @dataProvider getArchivingWithoutSignalData - */ - public function testArchivingWithoutSignalWorks(string $method): void - { - $this->setUpArchivingMethod($method); - - // let archiving run completely - $process = $this->startCoreArchiver($method); - $process->setTimeout(60); - $process->wait(); - - self::assertFalse($process->isRunning()); - - $this->assertArchiveInvalidationCount(['inProgress' => 0, 'total' => 0]); - - $processOutput = $process->getOutput(); - - self::assertStringContainsString('Starting archiving for', $processOutput); - self::assertStringContainsString('Archived website id 1, period = day', $processOutput); - self::assertStringContainsString('Archived website id 1, period = week', $processOutput); - self::assertStringContainsString('Archived website id 1, period = month', $processOutput); - self::assertStringContainsString('Archived website id 1, period = year', $processOutput); - self::assertStringContainsString('Done archiving!', $processOutput); - self::assertStringContainsString('Starting Scheduled tasks...', $processOutput); - - if (self::METHOD_CURL === $method) { - self::assertStringContainsString('Execute HTTP API request:', $processOutput); - } else { - self::assertRegExp('/Running command.*\[method = ' . $method . ']/', $processOutput); - } - } - - public function getArchivingWithoutSignalData(): iterable - { - yield 'symfony process' => [self::METHOD_ASYNC_CLI_SYMFONY]; - yield 'default process (single process)' => [self::METHOD_SYNC_CLI]; - yield 'default process (multi process)' => [self::METHOD_ASYNC_CLI]; - yield 'curl' => [self::METHOD_CURL]; - } - - /** - * @dataProvider getArchivingStoppedDuringInitData - */ - public function testArchivingStoppedDuringInit(int $signal): void - { - self::$fixture->stepControl->blockCronArchiveStart(); - - // we don't care for the exact method, pick one with low setup complexity - $this->setUpArchivingMethod(self::METHOD_ASYNC_CLI); - - $process = $this->startCoreArchiver(self::METHOD_ASYNC_CLI); - - // wait until initialization step is reached - $result = self::$fixture->stepControl->waitForSuccess(static function () use ($process): bool { - return false !== strpos($process->getOutput(), 'Async process archiving supported'); - }); - - self::assertTrue($result, 'Archiving initialization check did not succeed'); - - $this->sendSignalToProcess($process, $signal, self::METHOD_ASYNC_CLI); - $this->waitForProcessToStop($process); - - $processOutput = $process->getOutput(); - - self::assertStringContainsString('Received system signal to stop archiving: ' . $signal, $processOutput); - self::assertStringContainsString('Archiving stopped', $processOutput); - } - - public function getArchivingStoppedDuringInitData(): iterable - { - yield 'stop using sigint' => [\SIGINT]; - yield 'stop using sigterm' => [\SIGTERM]; - } - - /** - * @dataProvider getSigintDuringArchivingData - * @dataProvider getSigtermDuringArchivingUnsupportedFallbackToSigintData - * - * @param array{segment: string, period: string, date: string} $blockSpec - * @param array{inProgress: int, total: int} $invalidationCountIntermediate - * @param array{inProgress: int, total: int} $invalidationCountFinal - */ - public function testSigintDuringArchiving( - string $method, - array $blockSpec, - array $invalidationCountIntermediate, - array $invalidationCountFinal, - bool $sigtermToSigintFallback = false - ): void { - $signalToProcess = $sigtermToSigintFallback ? \SIGTERM : \SIGINT; - $signalOutput = \SIGINT; - - self::$fixture->stepControl->blockCronArchiveStart(); - self::$fixture->stepControl->blockAPIArchiveReports($blockSpec); - - $this->setUpArchivingMethod($method); - - $process = $this->startCoreArchiver($method); - - self::$fixture->stepControl->unblockCronArchiveStart(); - - $this->waitForArchivingToStart($process, $method, $blockSpec); - $this->assertArchiveInvalidationCount($invalidationCountIntermediate); - $this->sendSignalToProcess($process, $signalToProcess, $method); - - self::$fixture->stepControl->unblockAPIArchiveReports(); - - $this->waitForProcessToStop($process); - $this->assertArchivingOutput($process, $method, $signalToProcess, $signalOutput, $blockSpec); - $this->assertArchiveInvalidationCount($invalidationCountFinal); - } - - public function getSigintDuringArchivingData(): iterable - { - $specToday = ['segment' => '', 'period' => 'day', 'date' => self::$fixture->today]; - - yield 'symfony process' => [ - 'method' => self::METHOD_ASYNC_CLI_SYMFONY, - 'blockSpec' => $specToday, - 'invalidationCountIntermediate' => ['inProgress' => 1, 'total' => 14], - 'invalidationCountFinal' => ['inProgress' => 0, 'total' => 13], - ]; - - yield 'default process (single process)' => [ - 'method' => self::METHOD_SYNC_CLI, - 'blockSpec' => $specToday, - 'invalidationCountIntermediate' => ['inProgress' => 1, 'total' => 15], - 'invalidationCountFinal' => ['inProgress' => 0, 'total' => 14], - ]; - - // empty day segment will always run as a single process - // so we use a non-empty segment for testing asyncCli - yield 'default process (multi process)' => [ - 'method' => self::METHOD_ASYNC_CLI, - 'blockSpec' => [ - 'segment' => CoreArchiverProcessSignalFixture::TEST_SEGMENT_CH, - 'period' => 'day', - 'date' => self::$fixture->today, - ], - 'invalidationCountIntermediate' => ['inProgress' => 2, 'total' => 12], - 'invalidationCountFinal' => ['inProgress' => 0, 'total' => 10], - ]; - - yield 'curl' => [ - 'method' => self::METHOD_CURL, - 'blockSpec' => $specToday, - 'invalidationCountIntermediate' => ['inProgress' => 1, 'total' => 14], - 'invalidationCountFinal' => ['inProgress' => 0, 'total' => 13], - ]; - } - - public function getSigtermDuringArchivingUnsupportedFallbackToSigintData(): iterable - { - // keep in sync with getSigintDuringArchivingData - // - remove "symfony process" case - // - add "sigtermToSigintFallback = true" to all cases - - $specToday = ['segment' => '', 'period' => 'day', 'date' => self::$fixture->today]; - - yield 'default process (single process) - signal fallback' => [ - 'method' => self::METHOD_SYNC_CLI, - 'blockSpec' => $specToday, - 'invalidationCountIntermediate' => ['inProgress' => 1, 'total' => 15], - 'invalidationCountFinal' => ['inProgress' => 0, 'total' => 14], - 'sigtermToSigintFallback' => true, - ]; - - // empty day segment will always run as a single process - // so we use a non-empty segment for testing asyncCli - yield 'default process (multi process) - signal fallback' => [ - 'method' => self::METHOD_ASYNC_CLI, - 'blockSpec' => [ - 'segment' => CoreArchiverProcessSignalFixture::TEST_SEGMENT_CH, - 'period' => 'day', - 'date' => self::$fixture->today, - ], - 'invalidationCountIntermediate' => ['inProgress' => 2, 'total' => 12], - 'invalidationCountFinal' => ['inProgress' => 0, 'total' => 10], - 'sigtermToSigintFallback' => true, - ]; - - yield 'curl - signal fallback' => [ - 'method' => self::METHOD_CURL, - 'blockSpec' => $specToday, - 'invalidationCountIntermediate' => ['inProgress' => 1, 'total' => 14], - 'invalidationCountFinal' => ['inProgress' => 0, 'total' => 13], - 'sigtermToSigintFallback' => true, - ]; - } - - /** - * @dataProvider getSigtermDuringArchivingData - * - * @param array{segment: string, period: string, date: string} $blockSpec - */ - public function testSigtermDuringArchiving(string $method, array $blockSpec): void - { - self::$fixture->stepControl->blockCronArchiveStart(); - self::$fixture->stepControl->blockAPIArchiveReports($blockSpec); - - $this->setUpArchivingMethod($method); - - $process = $this->startCoreArchiver($method); - - self::$fixture->stepControl->unblockCronArchiveStart(); - - $this->waitForArchivingToStart($process, $method, $blockSpec); - $this->assertArchiveInvalidationCount(['inProgress' => 1, 'total' => 14]); - $this->sendSignalToProcess($process, \SIGTERM, $method); - - $this->waitForProcessToStop($process); - $this->assertArchivingOutput($process, $method, \SIGTERM, \SIGTERM, $blockSpec); - $this->assertArchiveInvalidationCount(['inProgress' => 0, 'total' => 14]); - } - - public function getSigtermDuringArchivingData(): iterable - { - yield 'symfony process' => [ - 'method' => self::METHOD_ASYNC_CLI_SYMFONY, - 'blockSpec' => ['segment' => '', 'period' => 'day', 'date' => self::$fixture->today], - ]; - } - - /** - * @dataProvider getScheduledTasksStoppedData - */ - public function testScheduledTasksStopped(int $signal): void - { - self::$fixture->stepControl->blockScheduledTasks(); - self::$fixture->stepControl->executeScheduledTasks(); - - // we don't care for the exact method, pick one with low setup complexity - $this->setUpArchivingMethod(self::METHOD_ASYNC_CLI); - - $process = $this->startCoreArchiver(self::METHOD_ASYNC_CLI); - - // wait until scheduled tasks are running - $result = self::$fixture->stepControl->waitForSuccess(static function () use ($process): bool { - return false !== strpos($process->getOutput(), 'Scheduler: executing task'); - }, $timeoutInSeconds = 60); - - self::assertTrue($result, 'Scheduled tasks did not start'); - - $this->sendSignalToProcess($process, $signal, self::METHOD_ASYNC_CLI); - - self::$fixture->stepControl->unblockScheduledTasks(); - - $this->waitForProcessToStop($process); - - $processOutput = $process->getOutput(); - $expectedExecutedTask = Task::getTaskName(Tasks::class, 'invalidateOutdatedArchives', null); - $expectedSkippedTask = Task::getTaskName(Tasks::class, 'purgeOutdatedArchives', null); - - self::assertStringContainsString('executing task ' . $expectedExecutedTask, $processOutput); - self::assertStringNotContainsString('executing task ' . $expectedSkippedTask, $processOutput); - - self::assertStringContainsString('Received system signal to stop archiving: ' . $signal, $processOutput); - self::assertStringContainsString('Trying to stop running tasks...', $processOutput); - self::assertStringContainsString('Scheduler: Aborting due to received signal', $processOutput); - } - - public function getScheduledTasksStoppedData(): iterable - { - yield 'stop using sigint' => [\SIGINT]; - yield 'stop using sigterm' => [\SIGTERM]; - } - - /** - * @param array{inProgress: int, total: int} $expectedCounts - */ - private function assertArchiveInvalidationCount(array $expectedCounts): void - { - $actualInProgress = $this->dataAccessModel->getInvalidationsInProgress([self::$fixture->idSite]); - $actualTotal = (int) Db::fetchOne( - 'SELECT COUNT(*) FROM `' . Common::prefixTable('archive_invalidations') . '` WHERE idsite = ?', - [self::$fixture->idSite] - ); - - self::assertSame($expectedCounts['total'], $actualTotal); - self::assertCount($expectedCounts['inProgress'], $actualInProgress); - } - - /** - * @param array{segment: string, period: string, date: string} $blockSpec - */ - private function assertArchivingOutput( - ProcessSymfony $process, - string $method, - int $signalToProcess, - int $signalOutput, - array $blockSpec - ): void { - $idSite = self::$fixture->idSite; - $processOutput = $process->getOutput(); - - if (self::METHOD_CURL === $method) { - self::assertStringContainsString('Execute HTTP API request:', $processOutput); - } else { - self::assertRegExp('/Running command.*\[method = ' . $method . ']/', $processOutput); - } - - self::assertStringContainsString('Starting archiving for', $processOutput); - self::assertStringContainsString('Archiving will stop now because signal to abort received', $processOutput); - - if (self::METHOD_CURL !== $method) { - // curl handling does not acknowledge signals properly - // so only check this output was posted for all other methods - self::assertStringContainsString( - 'Received system signal to stop archiving: ' . $signalToProcess, - $processOutput - ); - - self::assertStringContainsString('Trying to stop running cli processes...', $processOutput); - } - - if (\SIGINT === $signalOutput) { - self::assertStringContainsString(sprintf( - "Archived website id %u, period = %s, date = %s, segment = '%s'", - $idSite, - $blockSpec['period'], - $blockSpec['date'], - $blockSpec['segment'] - ), $processOutput); - } - - if (\SIGTERM === $signalOutput) { - self::assertRegExp('/Aborting command.*\[method = ' . $method . ']/', $processOutput); - self::assertStringContainsString('Archiving process killed, reset invalidation', $processOutput); - } - } - - private function sendSignalToProcess( - ProcessSymfony $process, - int $signal, - string $method - ): void { - $process->signal($signal); - - if (in_array($method, [self::METHOD_CURL, self::METHOD_SYNC_CLI], true)) { - // not all methods are able to acknowledge the signal at this point - // wait for 250 milliseconds and rely on final result assertions - usleep(250 * 1000); - return; - } - - $result = self::$fixture->stepControl->waitForSuccess( - static function () use ($process, $signal): bool { - return false !== strpos( - $process->getOutput(), - 'Received system signal to stop archiving: ' . $signal - ); - } - ); - - self::assertTrue($result, 'Process did not acknowledge signal'); - } - - private function setUpArchivingMethod(string $method): void - { - $environment = self::$fixture->getTestEnvironment(); - - $featureFlag = new CliMultiProcessSymfony(); - $featureFlagConfigName = $featureFlag->getName() . '_feature'; - - if (self::METHOD_ASYNC_CLI_SYMFONY === $method) { - $environment->overrideConfig('FeatureFlags', $featureFlagConfigName, 'enabled'); - } else { - $environment->removeOverriddenConfig('FeatureFlags', $featureFlagConfigName); - } - - $environment->overrideConfig( - 'FeatureFlags', - (new SystemSignals())->getName() . '_feature', - 'enabled' - ); - - $environment->forceCliMultiViaCurl = (int) (self::METHOD_CURL === $method); - - $environment->save(); - } - - private function startCoreArchiver(string $method): ProcessSymfony - { - // exec is mandatory to send signals to the process - // not using array notation because "Fixture::getCliCommandBase" contains parameters - $process = ProcessSymfony::fromShellCommandline(sprintf( - 'exec %s core:archive -vvv %s', - Fixture::getCliCommandBase(), - self::METHOD_SYNC_CLI === $method ? '--concurrent-requests-per-website=1' : '' - )); - - $process->setEnv([CoreArchiverProcessSignalFixture::ENV_TRIGGER => '1']); - $process->setTimeout(null); - $process->start(); - - self::assertTrue($process->isRunning()); - self::assertNotNull($process->getPid()); - - return $process; - } - - /** - * @param array{segment: string, period: string, date: string} $blockSpec - */ - private function waitForArchivingToStart( - ProcessSymfony $process, - string $method, - array $blockSpec - ): void { - $segment = new Segment($blockSpec['segment'], [self::$fixture->idSite]); - $doneFlag = Rules::getDoneFlagArchiveContainsAllPlugins($segment); - - $result = self::$fixture->stepControl->waitForSuccess(function () use ($doneFlag, $blockSpec): bool { - $invalidations = $this->dataAccessModel->getInvalidationsInProgress([self::$fixture->idSite]); - - foreach ($invalidations as $invalidation) { - if ( - $invalidation['name'] === $doneFlag - && $invalidation['period'] == Piwik::$idPeriods[$blockSpec['period']] - && $invalidation['date1'] == $blockSpec['date'] - ) { - return true; - } - } - - return false; - }); - - self::assertTrue($result, 'Invalidation did not start for: ' . json_encode($blockSpec)); - - $result = self::$fixture->stepControl->waitForSuccess( - static function () use ($process, $method, $blockSpec): bool { - $processOutput = $process->getOutput(); - - $needles = [ - 'date=' . $blockSpec['date'], - 'period=' . $blockSpec['period'], - ]; - - if (self::METHOD_CURL === $method) { - $needles[] = 'Execute HTTP API request'; - } else { - $needles[] = 'Running command'; - } - - if ('' !== $blockSpec['segment']) { - $needles[] = 'segment=' . urlencode($blockSpec['segment']); - } - - foreach ($needles as $needle) { - if (false === strpos($processOutput, $needle)) { - return false; - } - } - - return true; - } - ); - - self::assertTrue($result, 'Archiving did not start for: ' . json_encode($blockSpec)); - } - - private function waitForProcessToStop(ProcessSymfony $process): void - { - $result = self::$fixture->stepControl->waitForSuccess(static function () use ($process): bool { - return !$process->isRunning(); - }); - - self::assertTrue($result, 'Archiving process did not stop'); - self::assertSame(0, $process->getExitCode()); - } -} - -CoreArchiverProcessSignalTest::$fixture = new CoreArchiverProcessSignalFixture(); diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php deleted file mode 100644 index 9cc7322aad2aa193b7c34c10aca85383dd347622..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php +++ /dev/null @@ -1,140 +0,0 @@ -applicationTester->setInputs(["N\n"]); - $result = $this->applicationTester->run(array( - 'command' => 'core:delete-logs-data', - '--dates' => $dateRange, - '--idsite' => self::$fixture->idSite, - '-vvv' => true, - )); - - $this->assertNotEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString('Invalid date range supplied', $this->applicationTester->getDisplay()); - } - - public function getTestDataForInvalidDateRangeTest() - { - return array( - array('completegarbage'), - array('2012-01-01,garbage'), - array('garbage,2012-01-01'), - array('2012-02-01,2012-01-01'), // first date is older than the last date - array(','), - ); - } - - public function testCommandFailsWhenInvalidSiteIdSupplied() - { - $this->applicationTester->setInputs(["N\n"]); - $result = $this->applicationTester->run(array( - 'command' => 'core:delete-logs-data', - '--dates' => '2012-01-01,2012-01-02', - '--idsite' => 43, - '-vvv' => true, - )); - - $this->assertNotEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString('Invalid site ID', $this->applicationTester->getDisplay()); - } - - /** - * @dataProvider getTestDataForInvalidIterationStepTest - */ - public function testCommandFailsWhenInvalidIterationStepSupplied($limit) - { - $this->applicationTester->setInputs(["N\n"]); - $result = $this->applicationTester->run(array( - 'command' => 'core:delete-logs-data', - '--dates' => '2012-01-01,2012-01-02', - '--idsite' => self::$fixture->idSite, - '--limit' => $limit, - '-vvv' => true, - )); - - $this->assertNotEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString('Invalid row limit supplied', $this->applicationTester->getDisplay()); - } - - public function getTestDataForInvalidIterationStepTest() - { - return array( - array(0), - array(-45), - ); - } - - public function testCommandSkipsLogDeletionIfUserDoesNotConfirm() - { - $this->applicationTester->setInputs(["N\n"]); - $dateRange = '2012-08-09,2012-08-11'; - $this->assertVisitsFoundInLogs($dateRange); - - $result = $this->applicationTester->run(array( - 'command' => 'core:delete-logs-data', - '--dates' => $dateRange, - '--idsite' => self::$fixture->idSite, - '-vvv' => true, - )); - - $this->assertEquals(1, $result, $this->getCommandDisplayOutputErrorMessage()); - $this->assertNotRegExp("/Successfully deleted [0-9]+ rows from all log tables/", $this->applicationTester->getDisplay()); - } - - public function testCommandCorrectlyDeletesRequestedLogFiles() - { - $this->applicationTester->setInputs(["Y\n"]); - $dateRange = '2012-08-09,2012-08-11'; - $this->assertVisitsFoundInLogs($dateRange); - - $options = array('interactive' => true); - $result = $this->applicationTester->run(array( - 'command' => 'core:delete-logs-data', - '--dates' => $dateRange, - '--idsite' => self::$fixture->idSite, - '-vvv' => true, - ), $options); - - $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Successfully deleted 19 visits", $this->applicationTester->getDisplay()); - } - - protected function assertVisitsFoundInLogs($dateRange) - { - list($from, $to) = explode(",", $dateRange); - - /** @var RawLogDao $dao */ - $dao = StaticContainer::get('Piwik\DataAccess\RawLogDao'); - $this->assertNotEmpty($dao->countVisitsWithDatesLimit($from, $to)); - } -} - -DeleteLogsDataTest::$fixture = new ManySitesImportedLogs(); diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php deleted file mode 100644 index e471e74e816706be23acdb99394fa6f02e530f28..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php +++ /dev/null @@ -1,1102 +0,0 @@ -configureNewCustomDimension( - $idSite, - 'test', - CustomDimensions::SCOPE_VISIT, - true - ); - - Rules::setBrowserTriggerArchiving(false); - SegmentEditorAPI::getInstance()->add('test segment', 'browserCode==IE', false, true); - SegmentEditorAPI::getInstance()->add('custom dimension', 'dimension1==test', $idSite, true); - SegmentEditorAPI::getInstance()->add('browser segment', 'browserCode==FF', false, false); - } - - public function setUp(): void - { - parent::setUp(); - self::$captureHandler->messages = []; - Db::query('TRUNCATE table ' . Common::prefixTable('archive_invalidations')); - } - - protected function tearDown(): void - { - self::$captureHandler->messages = []; - parent::tearDown(); - } - - /** - * @dataProvider getInvalidCommandOptions - */ - public function testCommandFailsWithInvalidOptions(array $commandOptions, array $expectedOutputs) - { - $commandOptions = array_merge(['command' => 'core:invalidate-report-data'], $commandOptions); - - $code = $this->applicationTester->run($commandOptions); - self::assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - foreach ($expectedOutputs as $expectedOutput) { - self::assertStringContainsString($expectedOutput, $this->getLogOutput()); - } - } - - public function getInvalidCommandOptions(): iterable - { - yield 'invalid dates parameter' => [ - [ - '--dates' => ['garbage'], - '--periods' => 'day', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ], - [ - 'Invalid date or date range specifier', - ], - ]; - - yield 'invalid dates parameter format' => [ - [ - '--dates' => ['2012-01-03 2013-02-01'], - '--periods' => 'day', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ], - [ - 'Invalid date or date range specifier', - ], - ]; - - yield 'dates parameter with too many dates in range' => [ - [ - '--dates' => ['2019-01-01,2019-01-09,2019-01-12,2019-01-15'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ], - [ - "The date '2019-01-01,2019-01-09,2019-01-12,2019-01-15' is not a correct date range", - ], - ]; - - yield 'invalid period parameter' => [ - [ - '--dates' => ['2012-01-03'], - '--periods' => 'cranberries', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ], - [ - 'Invalid period type', - ], - ]; - - yield 'non numeric sites parameter' => [ - [ - '--dates' => ['2012-01-03'], - '--periods' => 'day', - '--sites' => 'wolfalice', - '--dry-run' => true, - '-vvv' => true, - ], - [ - 'Invalid --sites value', - ], - ]; - - yield 'idSite list without values' => [ - [ - '--dates' => ['2012-01-03'], - '--periods' => 'day', - '--sites' => ',', - '--dry-run' => true, - '-vvv' => true, - ], - [ - 'Invalid --sites value', - ], - ]; - - yield 'not existing idSite included in list' => [ - [ - '--dates' => ['2012-01-03'], - '--periods' => 'day', - '--sites' => '1,500', - '--dry-run' => true, - '-vvv' => true, - ], - [ - 'Invalid --sites value', - ], - ]; - - yield 'invalid segment provided' => [ - [ - '--dates' => ['2012-01-03'], - '--periods' => 'day', - '--sites' => '1', - '--segment' => ['ablksdjfdslkjf'], - '--dry-run' => true, - '-vvv' => true, - ], - [ - "The segment condition 'ablksdjfdslkjf' is not valid", - ], - ]; - - yield 'segment name provided that does not exist for given site' => [ - [ - '--dates' => ['2012-01-03'], - '--periods' => 'day', - '--sites' => '2,3', - '--segment' => ['custom dimension'], - '--dry-run' => true, - '-vvv' => true, - ], - [ - "'custom dimension' did not match any stored segment, but invalidating it anyway.", - "The segment condition 'custom dimension' is not valid.", - ], - ]; - - yield 'segment provided that does not exist for given site' => [ - [ - '--dates' => ['2012-01-03'], - '--periods' => 'day', - '--sites' => '2', - '--segment' => ['dimension1==test'], - '--dry-run' => true, - '-vvv' => true, - ], - [ - "'dimension1==test' did not match any stored segment, but invalidating it anyway.", - "Segment 'dimension1' is not a supported segment.", - ], - ]; - } - - /** - * @dataProvider getTestDataForSuccessTests - */ - public function testCommandOutputSuccess($dates, $periods, $sites, $cascade, $segments, $plugin, $expectedOutputs) - { - $options = [ - 'command' => 'core:invalidate-report-data', - '--dates' => $dates, - '--periods' => $periods, - '--sites' => $sites, - '--cascade' => $cascade, - '--segment' => $segments ?: [], - '--dry-run' => true, - '-vvv' => true, - ]; - - if (!empty($plugin)) { - $options['--plugin'] = $plugin; - } - - $code = $this->applicationTester->run($options); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - foreach ($expectedOutputs as $output) { - self::assertStringContainsString($output, $this->getLogOutput()); - } - } - - /** - * @return iterable> - */ - public function getTestDataForSuccessTests(): iterable - { - yield 'no cascade, single site + single day' => [ - ['2012-01-01'], - 'day', - '1', - false, - null, - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ browserCode==IE ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ dimension1==test ]', - ], - ]; - - yield 'cascade, single site + single day' => [ - ['2012-01-01'], - 'day', - '1', - true, - null, - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ browserCode==IE ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ dimension1==test ]', - ], - ]; - - yield 'no cascade, single site, date, period' => [ - ['2012-01-01'], - 'week', - '1', - false, - null, - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ browserCode==IE ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ dimension1==test ]', - ], - ]; - - yield 'no cascade, multiple site, date & period' => [ - ['2012-01-01,2012-02-05', '2012-01-26,2012-01-27', '2013-03-19'], - 'month,week', - '1,3', - false, - null, - null, - [ - 'Segment [dimension1==test] not available for all sites, skipping this segment for sites [ 3 ].', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 0 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 0 ]', - ], - ]; - - yield 'cascade, single site, date, period' => [ - ['2012-01-30,2012-02-10'], - 'week', - '2', - true, - null, - null, - [ - '[Dry-run] invalidating archives for site = [ 2 ], dates = [ 2012-01-30, 2012-02-06 ], period = [ week ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 2 ], dates = [ 2012-01-30, 2012-02-06 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 1 ]', - ], - ]; - - yield 'cascade, multiple site, date & period' => [ - ['2012-02-03,2012-02-04', '2012-03-15'], - 'month,week,day', - 'all', - true, - null, - null, - [ - 'Segment [dimension1==test] not available for all sites, skipping this segment for sites [ 2, 3 ].', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ browserCode==IE ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ dimension1==test ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ browserCode==IE ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ dimension1==test ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 1 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 1 ]', - ], - ]; - - yield 'cascade, one week, date & period + segment' => [ - ['2012-01-01,2012-01-14'], - 'week', - 'all', - true, - ['browserCode==FF'], - null, - [ - '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09 ], period = [ week ], segment = [ browserCode==FF ], cascade = [ 1 ]', - ], - ]; - - yield 'w/ plugin' => [ - ['2015-05-04'], - 'day', - '1', - false, - null, - 'ExamplePlugin', - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ ], cascade = [ 0 ], plugin = [ ExamplePlugin ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 0 ], plugin = [ ExamplePlugin ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 0 ], plugin = [ ExamplePlugin ]', - ], - ]; - - yield 'match segment by id' => [ - ['2015-05-04'], - 'day', - '1', - false, - [1], - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 0 ]', - ], - ]; - - yield 'match segment by name' => [ - ['2015-05-04'], - 'day', - '1', - false, - ['test segment'], - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ browserCode==IE ], cascade = [ 0 ]', - ], - ]; - - yield 'match custom dimension segment by name' => [ - ['2015-05-04'], - 'day', - '1', - false, - ['custom dimension'], - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 0 ]', - ], - ]; - - yield 'match custom dimension segment by definition' => [ - ['2015-05-04'], - 'day', - '1', - false, - ['dimension1==test'], - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ dimension1==test ], cascade = [ 0 ]', - ], - ]; - - yield 'all visits segment only' => [ - ['2015-05-04'], - 'day', - '1', - false, - [''], - null, - [ - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2015-05-04 ], period = [ day ], segment = [ ], cascade = [ 0 ]', - ], - ]; - - yield 'segment only invalidated for supported sites, whileignoring others' => [ - ['2012-01-01'], - 'day', - '1,2', - false, - ['custom dimension'], - null, - [ - 'Segment [dimension1==test] not available for all sites, skipping this segment for sites [ 2 ]', - '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ dimension1==test ]', - ], - ]; - - yield 'invalidating multiple date ranges' => [ - ['2019-01-01,2019-01-09', '2019-01-12,2019-01-15'], - 'range', - '1', - false, - null, - null, - [ - "Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15 for site = [ 1 ], segment = [ ]", - "Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15 for site = [ 1 ], segment = [ browserCode==IE ]", - "Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15 for site = [ 1 ], segment = [ dimension1==test ]", - ], - ]; - - yield 'invalidating period type all for range invalidates all period types' => [ - ['2019-01-01,2019-01-09'], - 'all', - '1', - false, - null, - null, - [ - "Invalidating day periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", - "Invalidating day periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", - "Invalidating day periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", - "Invalidating week periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", - "Invalidating week periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", - "Invalidating week periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", - "Invalidating month periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", - "Invalidating month periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", - "Invalidating month periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", - "Invalidating year periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", - "Invalidating year periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", - "Invalidating year periods in 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", - "Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", - "Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", - "Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", - ], - ]; - } - - - /** - * @dataProvider getInvalidationTestData - */ - public function testCommandCreatesExpectedInvalidations(array $commandOptions, array $expectedInvalidations) - { - Db::query('TRUNCATE table ' . Common::prefixTable('archive_invalidations')); - - $commandOptions = array_merge(['command' => 'core:invalidate-report-data'], $commandOptions); - - $code = $this->applicationTester->run($commandOptions); - - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - self::assertInvalidationsPresent($expectedInvalidations); - } - - public function getInvalidationTestData(): iterable - { - yield "Invalidating a single day works for all segments, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - ], - [ - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a single day works for all visits segment only, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--segment' => [''], - ], - [ - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a single day works for specific segment only, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a single day works for multiple segments, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--segment' => ['browserCode==IE', 'dimension1==test'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating plugin for a single day works for all visits segment only, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--segment' => [''], - '--plugin' => 'Actions', - ], - [ - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating plugin for a single day works for all segments, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--plugin' => 'Actions', - ], - [ - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279.Actions', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a single day as period works for segment, one website" => [ - [ - '--dates' => ['2012-01-01,2012-01-01'], - '--sites' => '1', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a period works for all segments, one website" => [ - [ - '--dates' => ['2012-01-01,2012-01-12'], - '--sites' => '1', - ], - [ - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating multiple dates works for all segments, one website" => [ - [ - '--dates' => ['2012-01-01', '2012-01-06', '2012-01-12'], - '--sites' => '1', - ], - [ - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating multiple periods works for all segments, one website" => [ - [ - '--dates' => ['2012-01-01,2012-01-03', '2012-01-06,2012-01-07', '2012-01-10,2012-01-12'], - '--sites' => '1', - ], - [ - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a single day works for all segments, multiple websites" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1,2', - ], - [ - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done', 'idsite' => 2, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - // second segment is only valid for idsite 1, so missing here - ], - ]; - - yield "Invalidating a week period works for specific segment only, one website" => [ - [ - '--dates' => ['2012-01-08'], - '--sites' => '1', - '--periods' => 'week', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a week period accross years should not cascade up, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--periods' => 'week', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ], - ]; - - yield "Invalidating a week period accross months should not cascade up, one website" => [ - [ - '--dates' => ['2012-01-31'], - '--sites' => '1', - '--periods' => 'week', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-30', 'date2' => '2012-02-05', 'period' => 2, 'report' => null], - ], - ]; - - yield "Invalidating a month period works for specific segment only, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--periods' => 'month', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a year period works for specific segment only, one website" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--periods' => 'year', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a month period works for specific segment only, one website, cascade down" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--periods' => 'month', - '--cascade' => true, - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-02', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-03', 'date2' => '2012-01-03', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-04', 'date2' => '2012-01-04', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-05', 'date2' => '2012-01-05', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-06', 'date2' => '2012-01-06', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-07', 'date2' => '2012-01-07', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-08', 'date2' => '2012-01-08', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-09', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-10', 'date2' => '2012-01-10', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-11', 'date2' => '2012-01-11', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-12', 'date2' => '2012-01-12', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-13', 'date2' => '2012-01-13', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-14', 'date2' => '2012-01-14', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-15', 'date2' => '2012-01-15', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-16', 'date2' => '2012-01-16', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-17', 'date2' => '2012-01-17', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-18', 'date2' => '2012-01-18', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-19', 'date2' => '2012-01-19', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-20', 'date2' => '2012-01-20', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-21', 'date2' => '2012-01-21', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-22', 'date2' => '2012-01-22', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-23', 'date2' => '2012-01-23', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-24', 'date2' => '2012-01-24', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-25', 'date2' => '2012-01-25', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-26', 'date2' => '2012-01-26', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-27', 'date2' => '2012-01-27', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-28', 'date2' => '2012-01-28', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-29', 'date2' => '2012-01-29', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-30', 'date2' => '2012-01-30', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-31', 'date2' => '2012-01-31', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-09', 'date2' => '2012-01-15', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-16', 'date2' => '2012-01-22', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-23', 'date2' => '2012-01-29', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-30', 'date2' => '2012-02-05', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a week period accross years should not cascade up, one website, cascade down" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--periods' => 'week', - '--cascade' => true, - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2011-12-26', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-27', 'date2' => '2011-12-27', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-28', 'date2' => '2011-12-28', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-29', 'date2' => '2011-12-29', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-30', 'date2' => '2011-12-30', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-31', 'date2' => '2011-12-31', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-01', 'date2' => '2011-12-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-01-01', 'date2' => '2011-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating a week period should not invalidate dates before website creation, one website, cascade down" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '2', - '--periods' => 'week', - '--cascade' => true, - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-01', 'period' => 1, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating multiple periods works for specific segment only, one website, no cascade" => [ - [ - '--dates' => ['2012-01-01'], - '--sites' => '1', - '--periods' => 'week,year', - '--segment' => ['browserCode==IE'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - - yield "Invalidating plugin for multiple periods works for specific multiple segments, multiple websites, no cascade" => [ - [ - '--dates' => ['2012-01-01', '2012-01-06,2012-01-07'], - '--sites' => '1,2', - '--periods' => 'week,year', - '--segment' => ['browserCode==IE', 'dimension1==test'], - ], - [ - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done9aedf9b6022140586347897209404279', 'idsite' => 1, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2011-12-26', 'date2' => '2012-01-01', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-02', 'date2' => '2012-01-08', 'period' => 2, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-01-31', 'period' => 3, 'report' => null], - ['name' => 'done5f4f9bafeda3443c3c2d4b2ef4dffadc', 'idsite' => 2, 'date1' => '2012-01-01', 'date2' => '2012-12-31', 'period' => 4, 'report' => null], - ], - ]; - } - - public function testCommandInvalidateDateRange() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01-09'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ ]", $this->getLogOutput()); - self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ browserCode==IE ]", $this->getLogOutput()); - self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 for site = [ 1 ], segment = [ dimension1==test ]", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeInvalidDate() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01,2019-01--09'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("The date '2019-01-01,2019-01--09' is not a correct date range", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeOnlyOneDate() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01'], - '--periods' => 'range', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString("The date '2019-01-01' is not a correct date range", $this->getLogOutput()); - } - - public function testCommandInvalidateDateRangeInvalidateAllPeriodTypesSkipsRangeWhenNotRangeDAte() - { - $code = $this->applicationTester->run([ - 'command' => 'core:invalidate-report-data', - '--dates' => ['2019-01-01'], - '--periods' => 'all', - '--sites' => '1', - '--dry-run' => true, - '-vvv' => true, - ]); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringNotContainsString("range", $this->getLogOutput()); - self::assertStringNotContainsString("Range", $this->getLogOutput()); - } - - /** - * @return array - */ - public static function provideContainerConfigBeforeClass(): array - { - if (null === self::$captureHandler) { - self::$captureHandler = new class extends AbstractProcessingHandler { - public $messages = []; - - protected function write(array $record) - { - $this->messages[] = (string)$record['formatted']; - } - }; - } - - return [ - 'ini.tests.enable_logging' => 1, - 'Tests.log.allowAllHandlers' => true, - 'log.handlers' => [self::$captureHandler], - ]; - } - - private function getLogOutput(): string - { - return implode("\n", self::$captureHandler->messages); - } - - private static function assertInvalidationsPresent(array $expectedInvalidations): void - { - $existingInvalidations = Db::fetchAll('SELECT name, idsite, date1, date2, period, report from `' . Common::prefixTable('archive_invalidations') . '` ORDER BY idsite, name, period, date1'); - - self::assertEquals($expectedInvalidations, $existingInvalidations); - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/MigrateUserScopedSettingsTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/MigrateUserScopedSettingsTest.php deleted file mode 100644 index b74be0341e0a14a2235c71784c41e0b46e00a69c..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/MigrateUserScopedSettingsTest.php +++ /dev/null @@ -1,104 +0,0 @@ -addUser($activeUser, 'hashed-password', 'active@example.com', '2020-01-01 00:00:00'); - $usersModel->addUser($activeUserWithDot, 'hashed-password', 'active.dot@example.com', '2020-01-01 00:00:00'); - $usersModel->addUser($deletedUser, 'hashed-password', 'deleted@example.com', '2020-01-01 00:00:00'); - $usersModel->deleteUser($deletedUser); - - Option::set($activeUser . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION, '{"PhoneNumbers":{"123":{"verified":true}}}'); - Option::set($activeUserWithDot . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION, '{"PhoneNumbers":{"789":{"verified":true}}}'); - Option::set($deletedUser . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION, '{"PhoneNumbers":{"456":{"verified":true}}}'); - Option::set(MobileMessaging::USER_SETTINGS_POSTFIX_OPTION, '{"Provider":"StubbedProvider"}'); - - Option::set('Feedback.nextFeedbackReminder.' . $activeUser, '2030-01-01'); - Option::set('Feedback.nextFeedbackReminder.' . $activeUserWithDot, '2030-01-15'); - Option::set('Feedback.nextFeedbackReminder.' . $deletedUser, '2030-02-01'); - - Option::set('ProfessionalServices.DismissedWidget.ActiveWidget.' . $activeUser, 12345); - Option::set('ProfessionalServices.DismissedWidget.DotWidget.' . $activeUserWithDot, 24680); - Option::set('ProfessionalServices.DismissedWidget.DeletedWidget.' . $deletedUser, 67890); - - Option::set($activeUser . '_defaultReport', '7'); - Option::set($activeUserWithDot . '_defaultReport', '9'); - Option::set($deletedUser . '_defaultReport', '8'); - Option::set($activeUser . '_isLDAPUser', '1'); - Option::set($activeUserWithDot . '_isLDAPUser', '1'); - Option::set($deletedUser . '_isLDAPUser', '1'); - - $result = MigrateUserScopedSettings::migrate(); - - $this->assertSame(3, $result['mobileMessaging']); - $this->assertSame(2, $result['feedback']); - $this->assertSame(2, $result['professionalServices']); - $this->assertSame(4, $result['usersManagerPreferences']); - - $this->assertSame(['PhoneNumbers' => ['123' => ['verified' => true]]], $store->getAll('MobileMessaging', $activeUser)); - $this->assertSame(['PhoneNumbers' => ['789' => ['verified' => true]]], $store->getAll('MobileMessaging', $activeUserWithDot)); - $this->assertSame([], $store->getAll('MobileMessaging', $deletedUser)); - $globalSettings = (new Factory())->getPluginStorage('MobileMessaging', '')->getBackend()->load(); - $this->assertSame(['Provider' => 'StubbedProvider'], $globalSettings); - - $this->assertSame('2030-01-01', $store->get('Feedback', $activeUser, 'nextFeedbackReminder', false)); - $this->assertSame('2030-01-15', $store->get('Feedback', $activeUserWithDot, 'nextFeedbackReminder', false)); - $this->assertFalse($store->get('Feedback', $deletedUser, 'nextFeedbackReminder', false)); - - $this->assertSame(['ActiveWidget' => 12345], $store->get('ProfessionalServices', $activeUser, 'dismissedWidgets', [])); - $this->assertSame(['DotWidget' => 24680], $store->get('ProfessionalServices', $activeUserWithDot, 'dismissedWidgets', [])); - $this->assertSame([], $store->get('ProfessionalServices', $deletedUser, 'dismissedWidgets', [])); - - $this->assertSame('7', $store->get('UsersManager', $activeUser, 'defaultReport', false)); - $this->assertSame('1', $store->get('UsersManager', $activeUser, 'isLDAPUser', false)); - $this->assertSame('9', $store->get('UsersManager', $activeUserWithDot, 'defaultReport', false)); - $this->assertSame('1', $store->get('UsersManager', $activeUserWithDot, 'isLDAPUser', false)); - $this->assertFalse($store->get('UsersManager', $deletedUser, 'defaultReport', false)); - $this->assertFalse($store->get('UsersManager', $deletedUser, 'isLDAPUser', false)); - - $this->assertFalse(Option::get($activeUser . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION)); - $this->assertFalse(Option::get($activeUserWithDot . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION)); - $this->assertFalse(Option::get($deletedUser . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION)); - $this->assertFalse(Option::get(MobileMessaging::USER_SETTINGS_POSTFIX_OPTION)); - $this->assertFalse(Option::get('Feedback.nextFeedbackReminder.' . $activeUser)); - $this->assertFalse(Option::get('Feedback.nextFeedbackReminder.' . $activeUserWithDot)); - $this->assertFalse(Option::get('Feedback.nextFeedbackReminder.' . $deletedUser)); - $this->assertFalse(Option::get('ProfessionalServices.DismissedWidget.ActiveWidget.' . $activeUser)); - $this->assertFalse(Option::get('ProfessionalServices.DismissedWidget.DotWidget.' . $activeUserWithDot)); - $this->assertFalse(Option::get('ProfessionalServices.DismissedWidget.DeletedWidget.' . $deletedUser)); - $this->assertFalse(Option::get($activeUser . '_defaultReport')); - $this->assertFalse(Option::get($activeUserWithDot . '_defaultReport')); - $this->assertFalse(Option::get($deletedUser . '_defaultReport')); - $this->assertSame('1', Option::get($activeUser . '_isLDAPUser')); - $this->assertSame('1', Option::get($activeUserWithDot . '_isLDAPUser')); - $this->assertFalse(Option::get($deletedUser . '_isLDAPUser')); - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php deleted file mode 100644 index 5c0b76b51d34e8e039ef0709021bb844851089a8..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php +++ /dev/null @@ -1,97 +0,0 @@ -applicationTester->run(array( - 'command' => 'database:optimize-archive-tables', - 'dates' => $dates, - '--dry-run' => true, - )); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $output = $this->applicationTester->getDisplay(); - - preg_match_all('/Optimizing table \'([^\']+)\'/', $output, $matches); - $tablesOptimized = $matches[1]; - - $expectedOptimizedTables = array(); - foreach ($expectedOptimizedTableDates as $date) { - $expectedOptimizedTables[] = 'archive_numeric_' . $date; - $expectedOptimizedTables[] = 'archive_blob_' . $date; - } - - $this->assertEquals($expectedOptimizedTables, $tablesOptimized); - } - - public function getDatesToTest() - { - return array( - array( - array('all'), - array('2015_01', '2015_02', '2015_03'), - ), - - array( - array('now'), - array(date('Y_m')), - ), - - array( - array('2015-01-01', '2015-02-03', '2014-01-01', '2013-05-12', '2015-05-05'), - array('2015_01', '2015_02', '2014_01', '2013_05', '2015_05'), - ), - - array( - array('last1'), - array(Date::factory('now')->subMonth(1)->toString('Y_m')), - ), - - array( - array('last5'), - array( - Date::factory('now')->subMonth(1)->toString('Y_m'), - Date::factory('now')->subMonth(2)->toString('Y_m'), - Date::factory('now')->subMonth(3)->toString('Y_m'), - Date::factory('now')->subMonth(4)->toString('Y_m'), - Date::factory('now')->subMonth(5)->toString('Y_m'), - ), - ), - - array( - array('2015-01-01'), - array('2015_01'), - ), - ); - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/PurgeBrokenArchiveDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/PurgeBrokenArchiveDataTest.php deleted file mode 100644 index b425e934963348b27ad6d86618419ba98cfe6a1f..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/PurgeBrokenArchiveDataTest.php +++ /dev/null @@ -1,118 +0,0 @@ -getTimestamp(); - - $archivePurger = new ArchivePurger(); - $archivePurger->setTodayDate(Date::factory('2015-02-27')); - $archivePurger->setYesterdayDate(Date::factory('2015-02-26')); - $archivePurger->setNow(Date::factory('2015-02-27 08:00:00')->getTimestamp()); - - $this->application = new Console(); - $this->application->setAutoExit(false); - $this->application->add(new PurgeBrokenArchiveData($archivePurger)); - - $this->applicationTester = new ApplicationTester($this->application); - - // assert the test data was setup correctly - self::$fixture->assertBrokenArchivesNotPurged(self::$fixture->january); - self::$fixture->assertBrokenArchivesNotPurged(self::$fixture->february); - } - - public function tearDown(): void - { - Date::$now = null; - - parent::tearDown(); - } - - public function testExecutingCommandDefaultDatesPurgesFromExistingMonth() - { - $result = $this->applicationTester->run([ - 'command' => 'core:purge-broken-archive-data', - ]); - - $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - - self::$fixture->assertBrokenArchivesWithoutDoneFlagPurged(self::$fixture->february); - self::$fixture->assertBrokenArchivesNotPurged(self::$fixture->january); - } - - public function testExecutingCommandSpecificDatesPurgesOnlyInRange() - { - $result = $this->applicationTester->run([ - 'command' => 'core:purge-broken-archive-data', - 'startMonth' => '2015-01', - 'endMonth' => '2015-02', - ]); - - $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - self::$fixture->assertBrokenArchivesWithoutDoneFlagPurged(self::$fixture->january); - self::$fixture->assertBrokenArchivesWithoutDoneFlagPurged(self::$fixture->february); - } - - public function testExecutingCommandInvalidDates() - { - $result = $this->applicationTester->run([ - 'command' => 'core:purge-broken-archive-data', - 'startMonth' => '201-01', - ]); - - $this->assertEquals(2, $result, $this->getCommandDisplayOutputErrorMessage()); - - $result = $this->applicationTester->run([ - 'command' => 'core:purge-broken-archive-data', - 'startMonth' => '2015-01', - 'endMonth' => '201-001', - ]); - - $this->assertEquals(2, $result, $this->getCommandDisplayOutputErrorMessage()); - } - - protected function getCommandDisplayOutputErrorMessage() - { - return "Command did not behave as expected. Command output: " . $this->applicationTester->getDisplay(); - } -} - -PurgeBrokenArchiveDataTest::$fixture = new RawArchiveDataWithTempAndInvalidated(); diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php deleted file mode 100644 index e8aa15eaf73f701c5dfbaf4b7251bd8c4f5ddb7f..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php +++ /dev/null @@ -1,154 +0,0 @@ -setTodayDate(Date::factory('2015-02-27')); - $archivePurger->setYesterdayDate(Date::factory('2015-02-26')); - $archivePurger->setNow(Date::factory('2015-02-27 08:00:00')->getTimestamp()); - - $this->application = new Console(); - $this->application->setAutoExit(false); - $this->application->add(new PurgeOldArchiveData($archivePurger)); - - $this->applicationTester = new ApplicationTester($this->application); - - // assert the test data was setup correctly - self::$fixture->assertInvalidatedArchivesNotPurged(self::$fixture->january); - self::$fixture->assertInvalidatedArchivesNotPurged(self::$fixture->february); - } - - public function tearDown(): void - { - PurgeOldArchiveData::$todayOverride = null; - - parent::tearDown(); - } - - public function testExecutingCommandWithAllDatesPurgesAllExistingArchiveTables() - { - $result = $this->applicationTester->run(array( - 'command' => 'core:purge-old-archive-data', - 'dates' => array('all'), - '-vvv' => true, - )); - - $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - - self::$fixture->assertInvalidatedArchivesPurged(self::$fixture->february); - self::$fixture->assertTemporaryArchivesPurged($isBrowserTriggeredArchivingEnabled = true, self::$fixture->february); - self::$fixture->assertCustomRangesPurged(self::$fixture->february); - - self::$fixture->assertInvalidatedArchivesPurged(self::$fixture->january); - self::$fixture->assertTemporaryArchivesPurged($isBrowserTriggeredArchivingEnabled = true, self::$fixture->january); - self::$fixture->assertCustomRangesPurged(self::$fixture->january); - } - - public function testExecutingCommandWithNoDatePurgesArchiveTableForToday() - { - $result = $this->applicationTester->run(array( - 'command' => 'core:purge-old-archive-data', - '-vvv' => true, - )); - - $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - - self::$fixture->assertInvalidatedArchivesPurged(self::$fixture->february); - self::$fixture->assertTemporaryArchivesPurged($isBrowserTriggeredArchivingEnabled = true, self::$fixture->february); - self::$fixture->assertCustomRangesPurged(self::$fixture->february); - - self::$fixture->assertInvalidatedArchivesNotPurged(self::$fixture->january); - self::$fixture->assertTemporaryArchivesNotPurged(self::$fixture->january); - self::$fixture->assertCustomRangesNotPurged(self::$fixture->january); - } - - public function testExecutingCommandWithSpecificDatePurgesArchiveTableForDate() - { - $result = $this->applicationTester->run(array( - 'command' => 'core:purge-old-archive-data', - 'dates' => array('2015-01-14'), - '-vvv' => true, - )); - - $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - - self::$fixture->assertInvalidatedArchivesPurged(self::$fixture->january); - self::$fixture->assertTemporaryArchivesPurged($isBrowserTriggeredArchivingEnabled = true, self::$fixture->january); - self::$fixture->assertCustomRangesPurged(self::$fixture->january); - - self::$fixture->assertInvalidatedArchivesNotPurged(self::$fixture->february); - self::$fixture->assertTemporaryArchivesNotPurged(self::$fixture->february); - self::$fixture->assertCustomRangesNotPurged(self::$fixture->february); - } - - public function testExecutingCommandWithExcludeOptionsSkipsAppropriatePurging() - { - $result = $this->applicationTester->run(array( - 'command' => 'core:purge-old-archive-data', - 'dates' => array('2015-01-14'), - '--exclude-outdated' => true, - '--exclude-invalidated' => true, - '--exclude-ranges' => true, - '--skip-optimize-tables' => true, - '-vvv' => true, - )); - - $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage()); - - self::$fixture->assertInvalidatedArchivesNotPurged(self::$fixture->january); - self::$fixture->assertTemporaryArchivesNotPurged(self::$fixture->january); - self::$fixture->assertCustomRangesNotPurged(self::$fixture->january); - - self::assertStringContainsString("Skipping purge outdated archive data.", $this->applicationTester->getDisplay()); - self::assertStringContainsString("Skipping purge invalidated archive data.", $this->applicationTester->getDisplay()); - self::assertStringContainsString("Skipping OPTIMIZE TABLES.", $this->applicationTester->getDisplay()); - } - - protected function getCommandDisplayOutputErrorMessage() - { - return "Command did not behave as expected. Command output: " . $this->applicationTester->getDisplay(); - } -} - -PurgeOldArchiveDataTest::$fixture = new RawArchiveDataWithTempAndInvalidated(); diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/ResetInvalidationsTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/ResetInvalidationsTest.php deleted file mode 100644 index 5e40a564bc853cd004738e710db19dab3ef7a0b6..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/ResetInvalidationsTest.php +++ /dev/null @@ -1,658 +0,0 @@ -messages = []; - } - - protected function tearDown(): void - { - self::$captureHandler->messages = []; - parent::tearDown(); - } - - /** - * @dataProvider getInvalidDates - */ - public function testCommandFailsWhenInvalidDatesAreUsed($newerThan, $olderThan, $expectedMessage) - { - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '--newer-than' => $newerThan, - '--older-than' => $olderThan, - '--dry-run' => true, - ]); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString($expectedMessage, $this->getLogOutput()); - } - - public function getInvalidDates(): iterable - { - yield 'invalid newer than date' => [ - 'inValid', '', 'Invalid value for --newer-than provided.', - ]; - - yield 'invalid older than date' => [ - '', 'inValid', 'Invalid value for --older-than provided.', - ]; - } - - - /** - * @dataProvider getDryRunTestData - */ - public function testDryRunOutput($parameters, $expectedOutput, $expectedChangeInProgressInvalidations) - { - $this->prepareInvalidations(); - - $inProgressInvalidationCount = $this->getInProgressInvalidationCount(); - - $code = $this->applicationTester->run(array_merge([ - 'command' => 'core:reset-invalidations', - '--dry-run' => true, - ], $parameters)); - - $inProgressInvalidationCountAfterDryRun = $this->getInProgressInvalidationCount(); - - self::assertEquals($inProgressInvalidationCount, $inProgressInvalidationCountAfterDryRun); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString($expectedOutput, $this->applicationTester->getDisplay(true)); - - $code = $this->applicationTester->run(array_merge([ - 'command' => 'core:reset-invalidations', - ], $parameters)); - - $inProgressInvalidationCountAfterRun = $this->getInProgressInvalidationCount(); - - self::assertEquals($expectedChangeInProgressInvalidations, $inProgressInvalidationCountAfterDryRun - $inProgressInvalidationCountAfterRun); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - } - - public function getDryRunTestData(): iterable - { - yield 'no limitations returns everything' => [ - [], - "4 invalidations found: -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 2 | | 2024-12-30 | 2025-01-05 | 2 | 2025-01-01 19:15:01 | 2025-02-05 09:11:00 | host1 | 2333 | -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -| donec7445c35d0f9b340f5851df27a15c5ef.Actions | 1 | | 2025-01-01 | 2025-12-31 | 4 | 2025-01-01 16:00:02 | 2025-02-05 16:44:22 | anotherhost | 662 | -| done.VisitsSummary | 3 | | 2025-02-01 | 2025-02-28 | 3 | 2025-02-20 19:15:01 | 2025-02-23 18:35:00 | random | 8558 | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 4, - ]; - - yield 'limiting by all sites works as expected' => [ - ['--idsite' => ['all']], - "4 invalidations found: -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 2 | | 2024-12-30 | 2025-01-05 | 2 | 2025-01-01 19:15:01 | 2025-02-05 09:11:00 | host1 | 2333 | -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -| donec7445c35d0f9b340f5851df27a15c5ef.Actions | 1 | | 2025-01-01 | 2025-12-31 | 4 | 2025-01-01 16:00:02 | 2025-02-05 16:44:22 | anotherhost | 662 | -| done.VisitsSummary | 3 | | 2025-02-01 | 2025-02-28 | 3 | 2025-02-20 19:15:01 | 2025-02-23 18:35:00 | random | 8558 | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 4, - ]; - - yield 'limiting by site works as expected' => [ - ['--idsite' => [1]], - "2 invalidations found: -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -| donec7445c35d0f9b340f5851df27a15c5ef.Actions | 1 | | 2025-01-01 | 2025-12-31 | 4 | 2025-01-01 16:00:02 | 2025-02-05 16:44:22 | anotherhost | 662 | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 2, - ]; - - yield 'limiting by another site works as expected' => [ - ['--idsite' => [2]], - "1 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 2 | | 2024-12-30 | 2025-01-05 | 2 | 2025-01-01 19:15:01 | 2025-02-05 09:11:00 | host1 | 2333 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 1, - ]; - - - yield 'limiting by multiple sites works as expected' => [ - ['--idsite' => [1, 3]], - "3 invalidations found: -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -| donec7445c35d0f9b340f5851df27a15c5ef.Actions | 1 | | 2025-01-01 | 2025-12-31 | 4 | 2025-01-01 16:00:02 | 2025-02-05 16:44:22 | anotherhost | 662 | -| done.VisitsSummary | 3 | | 2025-02-01 | 2025-02-28 | 3 | 2025-02-20 19:15:01 | 2025-02-23 18:35:00 | random | 8558 | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 3, - ]; - - - yield 'limiting by a site without records works as expected' => [ - ['--idsite' => [4]], - "No invalidations found.", - 0, - ]; - - yield 'limiting by host works as expected' => [ - ['--processing-host' => ['host1']], - "2 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 2 | | 2024-12-30 | 2025-01-05 | 2 | 2025-01-01 19:15:01 | 2025-02-05 09:11:00 | host1 | 2333 | -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 2, - ]; - - yield 'limiting by multiple hosts works as expected' => [ - ['--processing-host' => ['host1', 'random']], - "3 invalidations found: -+--------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+--------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 2 | | 2024-12-30 | 2025-01-05 | 2 | 2025-01-01 19:15:01 | 2025-02-05 09:11:00 | host1 | 2333 | -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -| done.VisitsSummary | 3 | | 2025-02-01 | 2025-02-28 | 3 | 2025-02-20 19:15:01 | 2025-02-23 18:35:00 | random | 8558 | -+--------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 3, - ]; - - yield 'limiting by hosts without records works as expected' => [ - ['--processing-host' => ['unknown']], - "No invalidations found.", - 0, - ]; - - yield 'limiting by newer-than works as expected' => [ - ['--newer-than' => '2025-02-05 12:00:00'], - "2 invalidations found: -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| donec7445c35d0f9b340f5851df27a15c5ef.Actions | 1 | | 2025-01-01 | 2025-12-31 | 4 | 2025-01-01 16:00:02 | 2025-02-05 16:44:22 | anotherhost | 662 | -| done.VisitsSummary | 3 | | 2025-02-01 | 2025-02-28 | 3 | 2025-02-20 19:15:01 | 2025-02-23 18:35:00 | random | 8558 | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 2, - ]; - - yield 'limiting by older-than works as expected' => [ - ['--older-than' => '2025-02-05 12:00:00'], - "2 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 2 | | 2024-12-30 | 2025-01-05 | 2 | 2025-01-01 19:15:01 | 2025-02-05 09:11:00 | host1 | 2333 | -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 2, - ]; - - yield 'limiting by older-than and newer-than works as expected' => [ - ['--newer-than' => '2025-02-05 12:00:00', '--older-than' => '2025-02-21 12:00:00'], - "1 invalidations found: -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| donec7445c35d0f9b340f5851df27a15c5ef.Actions | 1 | | 2025-01-01 | 2025-12-31 | 4 | 2025-01-01 16:00:02 | 2025-02-05 16:44:22 | anotherhost | 662 | -+----------------------------------------------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 1, - ]; - - yield 'limiting by everything works as expected' => [ - ['--newer-than' => '2025-02-05 08:00:00', '--older-than' => '2025-02-21 12:00:00', '--idsite' => ['1'], '--processing-host' => ['host1']], - "1 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -", - 1, - ]; - } - - public function testDuplicateInvalidationIsRemovedOnReset() - { - $invalidationsToInsert = [ - [ - 'idarchive' => 7, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-01 16:00:00', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, 'ts_started' => '2025-02-05 11:30:00', 'processing_host' => 'host1', 'process_id' => 1256, - ], - [ - 'idarchive' => null, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-03 02:55:55', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_QUEUED, - 'report' => null, 'ts_started' => null, 'processing_host' => null, 'process_id' => null, - ], - ]; - - $this->insertInvalidations($invalidationsToInsert); - - $inProgressInvalidationCount = $this->getInProgressInvalidationCount(); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '--dry-run' => true, - ]); - - $inProgressInvalidationCountAfterDryRun = $this->getInProgressInvalidationCount(); - - self::assertEquals($inProgressInvalidationCount, $inProgressInvalidationCountAfterDryRun); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $expectedOutput = '1 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -'; - - self::assertStringContainsString($expectedOutput, $this->applicationTester->getDisplay(true)); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '-vvv' => true, - ]); - - self::assertEquals(0, $this->getInProgressInvalidationCount()); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $rows = Db::fetchAll('SELECT * FROM ' . Common::prefixTable('archive_invalidations')); - - self::assertEquals(1, count($rows)); - // expected invalidation date from second record, as first one should be removed instead of reset - self::assertEquals('2025-01-03 02:55:55', $rows[0]['ts_invalidated']); - - self::assertStringContainsString('Found duplicate invalidation for params (name = done, idsite = 1, date1 = 2025-01-01, date2 = 2025-01-01, period = 1, report = ). Removing invalidation 1 instead of resetting it.', $this->getLogOutput()); - } - - - public function testDuplicateInvalidationIsRemovedOnResetWhenOtherOneStartedAfterInvalidationDate() - { - $invalidationsToInsert = [ - [ - 'idarchive' => 7, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-01 16:00:00', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, 'ts_started' => '2025-02-05 11:30:00', 'processing_host' => 'host1', 'process_id' => 1256, - ], - [ - 'idarchive' => null, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-03 02:55:55', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, 'ts_started' => '2025-01-02 08:00:00', 'processing_host' => 'host4', 'process_id' => 22555, - ], - ]; - - $this->insertInvalidations($invalidationsToInsert); - - $inProgressInvalidationCount = $this->getInProgressInvalidationCount(); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '--processing-host' => ['host1'], - '--dry-run' => true, - ]); - - $inProgressInvalidationCountAfterDryRun = $this->getInProgressInvalidationCount(); - - self::assertEquals($inProgressInvalidationCount, $inProgressInvalidationCountAfterDryRun); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $expectedOutput = '1 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -'; - - self::assertStringContainsString($expectedOutput, $this->applicationTester->getDisplay(true)); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '--processing-host' => ['host1'], - '-vvv' => true, - ]); - - self::assertEquals(1, $this->getInProgressInvalidationCount()); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $rows = Db::fetchAll('SELECT * FROM ' . Common::prefixTable('archive_invalidations')); - - self::assertEquals(1, count($rows)); - // expected invalidation date from second record, as first one should be removed instead of reset - self::assertEquals('2025-01-03 02:55:55', $rows[0]['ts_invalidated']); - - self::assertStringContainsString('Found duplicate invalidation for params (name = done, idsite = 1, date1 = 2025-01-01, date2 = 2025-01-01, period = 1, report = ). Removing invalidation 1 instead of resetting it.', $this->getLogOutput()); - } - - public function testDuplicateInvalidationIsOnlyResetWhenOtherOneStartedBeforeInvalidationDate() - { - $invalidationsToInsert = [ - [ - 'idarchive' => 7, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-01 16:00:00', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, 'ts_started' => '2025-02-05 11:30:00', 'processing_host' => 'host1', 'process_id' => 1256, - ], - [ - 'idarchive' => null, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-03 02:55:55', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, 'ts_started' => '2025-01-01 08:00:00', 'processing_host' => 'host4', 'process_id' => 22555, - ], - ]; - - $this->insertInvalidations($invalidationsToInsert); - - $inProgressInvalidationCount = $this->getInProgressInvalidationCount(); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '--processing-host' => ['host1'], - '--dry-run' => true, - ]); - - $inProgressInvalidationCountAfterDryRun = $this->getInProgressInvalidationCount(); - - self::assertEquals($inProgressInvalidationCount, $inProgressInvalidationCountAfterDryRun); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $expectedOutput = '1 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -'; - - self::assertStringContainsString($expectedOutput, $this->applicationTester->getDisplay(true)); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '--processing-host' => ['host1'], - '-vvv' => true, - ]); - - self::assertEquals(1, $this->getInProgressInvalidationCount()); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $rows = Db::fetchAll('SELECT * FROM ' . Common::prefixTable('archive_invalidations')); - - self::assertEquals(2, count($rows)); - - self::assertStringNotContainsString('Found duplicate invalidation', $this->getLogOutput()); - } - - public function testDuplicateInvalidationIsRemovedWhenBothAreReset() - { - $invalidationsToInsert = [ - [ - 'idarchive' => 7, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-01 16:00:00', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, 'ts_started' => '2025-02-05 11:30:00', 'processing_host' => 'host1', 'process_id' => 1256, - ], - [ - 'idarchive' => null, 'name' => 'done', 'idsite' => 1, 'date1' => '2025-01-01', 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, 'ts_invalidated' => '2025-01-03 02:55:55', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, 'ts_started' => '2025-01-01 08:00:00', 'processing_host' => 'host4', 'process_id' => 22555, - ], - ]; - - $this->insertInvalidations($invalidationsToInsert); - - $inProgressInvalidationCount = $this->getInProgressInvalidationCount(); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '--dry-run' => true, - ]); - - $inProgressInvalidationCountAfterDryRun = $this->getInProgressInvalidationCount(); - - self::assertEquals($inProgressInvalidationCount, $inProgressInvalidationCountAfterDryRun); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $expectedOutput = '2 invalidations found: -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| name | idsite | report | date1 | date2 | period | ts_invalidated | ts_started | processing_host | process_id | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-03 02:55:55 | 2025-01-01 08:00:00 | host4 | 22555 | -| done | 1 | | 2025-01-01 | 2025-01-01 | 1 | 2025-01-01 16:00:00 | 2025-02-05 11:30:00 | host1 | 1256 | -+------+--------+--------+------------+------------+--------+---------------------+---------------------+-----------------+------------+ -'; - - self::assertStringContainsString($expectedOutput, $this->applicationTester->getDisplay(true)); - - $code = $this->applicationTester->run([ - 'command' => 'core:reset-invalidations', - '-vvv' => true, - ]); - - self::assertEquals(0, $this->getInProgressInvalidationCount()); - self::assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $rows = Db::fetchAll('SELECT * FROM ' . Common::prefixTable('archive_invalidations')); - - self::assertEquals(1, count($rows)); - - self::assertStringContainsString('Found duplicate invalidation for params (name = done, idsite = 1, date1 = 2025-01-01, date2 = 2025-01-01, period = 1, report = ). Removing invalidation 2 instead of resetting it.', $this->getLogOutput()); - } - - /** - * @return array - */ - public static function provideContainerConfigBeforeClass(): array - { - if (null === self::$captureHandler) { - self::$captureHandler = new class extends AbstractProcessingHandler { - public $messages = []; - - protected function write(array $record) - { - $this->messages[] = (string)$record['formatted']; - } - }; - } - - return [ - 'ini.tests.enable_logging' => 1, - 'Tests.log.allowAllHandlers' => true, - 'log.handlers' => [self::$captureHandler], - ]; - } - - private function getLogOutput(): string - { - return implode("\n", self::$captureHandler->messages); - } - - private function getInProgressInvalidationCount(): int - { - return (int) Db::fetchOne('SELECT COUNT(*) FROM ' . Common::prefixTable('archive_invalidations') . ' WHERE status = 1'); - } - - private function prepareInvalidations(): void - { - $invalidationsToInsert = [ - // invalidations idsite 1 - [ - 'idarchive' => 7, - 'name' => 'done', - 'idsite' => 1, - 'date1' => '2025-01-01', - 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, - 'ts_invalidated' => '2025-01-01 16:00:00', - 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, - 'ts_started' => '2025-02-05 11:30:00', - 'processing_host' => 'host1', - 'process_id' => 1256, - ], - [ - 'idarchive' => null, - 'name' => 'done', - 'idsite' => 1, - 'date1' => '2024-12-30', - 'date2' => '2025-01-05', - 'period' => Week::PERIOD_ID, - 'ts_invalidated' => '2025-01-01 16:00:01', - 'status' => ArchiveInvalidator::INVALIDATION_STATUS_QUEUED, - 'report' => null, - 'ts_started' => null, - 'processing_host' => null, - 'process_id' => null, - ], - [ - 'idarchive' => 66, - 'name' => 'donec7445c35d0f9b340f5851df27a15c5ef.Actions', - 'idsite' => 1, - 'date1' => '2025-01-01', - 'date2' => '2025-12-31', - 'period' => Year::PERIOD_ID, - 'ts_invalidated' => '2025-01-01 16:00:02', - 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, - 'ts_started' => '2025-02-05 16:44:22', - 'processing_host' => 'anotherhost', - 'process_id' => 662, - ], - - // invalidations idsite 2 - [ - 'idarchive' => 7, - 'name' => 'done', - 'idsite' => 2, - 'date1' => '2025-01-01', - 'date2' => '2025-01-01', - 'period' => Day::PERIOD_ID, - 'ts_invalidated' => '2025-01-01 19:15:00', - 'status' => ArchiveInvalidator::INVALIDATION_STATUS_QUEUED, - 'report' => null, - 'ts_started' => null, - 'processing_host' => null, - 'process_id' => null, - ], - [ - 'idarchive' => null, - 'name' => 'done', - 'idsite' => 2, - 'date1' => '2024-12-30', - 'date2' => '2025-01-05', - 'period' => Week::PERIOD_ID, - 'ts_invalidated' => '2025-01-01 19:15:01', - 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, - 'ts_started' => '2025-02-05 09:11:00', - 'processing_host' => 'host1', - 'process_id' => 2333, - ], - [ - 'idarchive' => 66, - 'name' => 'donec7445c35d0f9b340f5851df27a15c5ef', - 'idsite' => 2, - 'date1' => '2025-01-01', - 'date2' => '2025-12-31', - 'period' => Year::PERIOD_ID, - 'ts_invalidated' => '2025-01-01 19:15:02', - 'status' => ArchiveInvalidator::INVALIDATION_STATUS_QUEUED, - 'report' => null, - 'ts_started' => null, - 'processing_host' => null, - 'process_id' => null, - ], - - // invalidations idsite 3 - [ - 'idarchive' => null, - 'name' => 'done.VisitsSummary', - 'idsite' => 3, - 'date1' => '2025-02-01', - 'date2' => '2025-02-28', - 'period' => Month::PERIOD_ID, - 'ts_invalidated' => '2025-02-020 19:15:01', - 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS, - 'report' => null, - 'ts_started' => '2025-02-23 18:35:00', - 'processing_host' => 'random', - 'process_id' => 8558, - ], - ]; - - $this->insertInvalidations($invalidationsToInsert); - } - - private function insertInvalidations(array $invalidationsToInsert): void - { - Db::exec('TRUNCATE TABLE ' . Common::prefixTable('archive_invalidations')); - - $sql = 'INSERT INTO ' . Common::prefixTable('archive_invalidations') - . ' (`idarchive`, `name`, `idsite`, `date1`, `date2`, `period`, `ts_invalidated`, `status`, `report`, `ts_started`, `processing_host`, `process_id`)' - . ' VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; - - - foreach ($invalidationsToInsert as $invalidation) { - Db::query($sql, array_values($invalidation)); - } - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/RunScheduledTasksProcessSignalTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/RunScheduledTasksProcessSignalTest.php deleted file mode 100644 index 00efc546e0bf8870439f76ad21a00d449ff5da7d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/RunScheduledTasksProcessSignalTest.php +++ /dev/null @@ -1,140 +0,0 @@ -markTestSkipped('signal test cannot run without ext-pcntl'); - } - - parent::setUp(); - - $environment = self::$fixture->getTestEnvironment(); - $environment->overrideConfig( - 'FeatureFlags', - (new SystemSignals())->getName() . '_feature', - 'enabled' - ); - $environment->save(); - - self::$fixture->stepControl->reset(); - } - - /** - * @dataProvider getScheduledTasksStoppedData - */ - public function testScheduledTasksStopped(int $signal): void - { - self::$fixture->stepControl->blockScheduledTasks(); - - $process = $this->startScheduledTasks(); - - // wait until scheduled tasks are running - $result = self::$fixture->stepControl->waitForSuccess(static function () use ($process): bool { - return false !== strpos($process->getOutput(), 'Scheduler: executing task'); - }, $timeoutInSeconds = 30); - - self::assertTrue($result, 'Scheduled tasks did not start'); - - $this->sendSignalToProcess($process, $signal); - - self::$fixture->stepControl->unblockScheduledTasks(); - - $this->waitForProcessToStop($process); - - $processOutput = $process->getOutput(); - $expectedExecutedTask = Task::getTaskName(Tasks::class, 'invalidateOutdatedArchives', null); - $expectedSkippedTask = Task::getTaskName(Tasks::class, 'purgeOutdatedArchives', null); - - self::assertStringContainsString('executing task ' . $expectedExecutedTask, $processOutput); - self::assertStringNotContainsString('executing task ' . $expectedSkippedTask, $processOutput); - - self::assertStringContainsString( - 'Received system signal to stop scheduled tasks: ' . $signal, - $processOutput - ); - - self::assertStringContainsString('Scheduler: Aborting due to received signal', $processOutput); - } - - public function getScheduledTasksStoppedData(): iterable - { - yield 'stop using sigint' => [\SIGINT]; - yield 'stop using sigterm' => [\SIGTERM]; - } - - private function sendSignalToProcess(ProcessSymfony $process, int $signal): void - { - $process->signal($signal); - - $result = self::$fixture->stepControl->waitForSuccess( - static function () use ($process, $signal): bool { - return false !== strpos( - $process->getOutput(), - 'Received system signal to stop scheduled tasks: ' . $signal - ); - } - ); - - self::assertTrue($result, 'Process did not acknowledge signal'); - } - - private function startScheduledTasks(): ProcessSymfony - { - // exec is mandatory to send signals to the process - // not using array notation because "Fixture::getCliCommandBase" contains parameters - $process = ProcessSymfony::fromShellCommandline(sprintf( - 'exec %s scheduled-tasks:run -vvv --force', - Fixture::getCliCommandBase() - )); - - $process->setEnv([RunScheduledTasksProcessSignalFixture::ENV_TRIGGER => '1']); - $process->setTimeout(null); - $process->start(); - - self::assertTrue($process->isRunning()); - self::assertNotNull($process->getPid()); - - return $process; - } - - private function waitForProcessToStop(ProcessSymfony $process): void - { - $result = self::$fixture->stepControl->waitForSuccess(static function () use ($process): bool { - return !$process->isRunning(); - }); - - self::assertTrue($result, 'Archiving process did not stop'); - self::assertSame(0, $process->getExitCode()); - } -} - -RunScheduledTasksProcessSignalTest::$fixture = new RunScheduledTasksProcessSignalFixture(); diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/SetConfigTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/SetConfigTest.php deleted file mode 100644 index a7b8c33dde400db21b7c7332bc93c4fd13ee7d5d..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Commands/SetConfigTest.php +++ /dev/null @@ -1,235 +0,0 @@ -makeLocalConfigWritable(); - } - - public function testCommandSucceedsWhenOptionsUsed() - { - $code = $this->applicationTester->run(array( - 'command' => 'config:set', - '--section' => 'MySection', - '--key' => 'setting', - '--value' => 'myvalue', - '-vvv' => false, - )); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $config = $this->makeNewConfig(); - $this->assertEquals(array('setting' => 'myvalue'), $config->MySection); - - self::assertStringContainsString('Setting [MySection] setting = "myvalue"', $this->applicationTester->getDisplay()); - } - - /** - * @dataProvider getInvalidArgumentsForTest - */ - public function testCommandFailsWhenInvalidArgumentsUsed($invalidArgument) - { - $code = $this->applicationTester->run(array( - 'command' => 'config:set', - 'assignment' => array($invalidArgument), - '-vvv' => false, - )); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString('Invalid assignment string', $this->applicationTester->getDisplay()); - } - - public function getInvalidArgumentsForTest() - { - return array( - array("garbage"), - array("ab&cd.ghi=23"), - array("section.value = 34"), - array("section.value = notjson"), - array("section.array[0]=23"), - ); - } - - public function testCommandFailsWithMissingFilePermissionExceptionWhenConfigFileNotWritable() - { - $this->makeLocalConfigNotWritable(); - - $code = $this->applicationTester->run(array( - 'command' => 'config:set', - 'assignment' => array( - 'MySection.other_array_value=[]', - ), - '-vvv' => false, - )); - - $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - self::assertStringContainsString('[Piwik\Exception\MissingFilePermissionException]', $this->applicationTester->getDisplay()); - } - - public function testCommandSucceedsWhenArgumentsUsed() - { - $config = Config::getInstance(); - $config->General['trusted_hosts'] = array('www.trustedhost.com'); - $config->MySection['other_array_value'] = array('1', '2'); - $config->forceSave(); - - $code = $this->applicationTester->run(array( - 'command' => 'config:set', - 'assignment' => array( - 'General.action_url_category_delimiter="+"', - 'General.trusted_hosts[]="www.trustedhost2.com"', - 'MySection.array_value=["abc","def"]', - 'MySection.object_value={"abc":"def"}', - 'MySection.other_array_value=[]', - ), - '-vvv' => false, - )); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $config = self::makeNewConfig(); // create a new config instance so we read what's in the file - - $this->assertEquals('+', $config->General['action_url_category_delimiter']); - $this->assertEquals(array('www.trustedhost.com', 'www.trustedhost2.com'), $config->General['trusted_hosts']); - $this->assertEquals(array('abc', 'def'), $config->MySection['array_value']); - $this->assertEquals(array('abc' => 'def'), $config->MySection['object_value']); - $this->assertArrayNotHasKey('other_array_value', $config->MySection); - - self::assertStringContainsString("done.", $this->applicationTester->getDisplay()); - } - - /** - * @dataProvider getOptionsForSettingValueToZeroTests - */ - public function testCommandSucceedsWhenSettingValueToZero($options) - { - $config = Config::getInstance(); - $config->Tracker['debug'] = 1; - $config->forceSave(); - - $code = $this->applicationTester->run($options); - - $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); - - $config = self::makeNewConfig(); - - $this->assertEquals(0, $config->Tracker['debug']); - self::assertStringContainsString("done.", $this->applicationTester->getDisplay()); - } - - public function getOptionsForSettingValueToZeroTests() - { - return array( - array( - array( - 'command' => 'config:set', - '--section' => 'Tracker', - '--key' => 'debug', - '--value' => 0, - ), - ), - array( - array( - 'command' => 'config:set', - 'assignment' => array( - 'Tracker.debug=0', - ), - ), - ), - ); - } - - private static function getTestConfigFilePath() - { - return PIWIK_INCLUDE_PATH . self::TEST_CONFIG_PATH; - } - - public static function provideContainerConfigBeforeClass() - { - return array( - // use a config instance that will save to a test INI file - 'Piwik\Config' => function (Container $c) { - /** @var GlobalSettingsProvider $actualGlobalSettingsProvider */ - $actualGlobalSettingsProvider = $c->get('Piwik\Application\Kernel\GlobalSettingsProvider'); - - $config = SetConfigTest::makeNewConfig(); - - // copy over sections required for tests - $config->tests = $actualGlobalSettingsProvider->getSection('tests'); - $config->database = $actualGlobalSettingsProvider->getSection('database_tests'); - - return $config; - }, - ); - } - - private static function makeNewConfig() - { - $settings = new GlobalSettingsProvider(null, SetConfigTest::getTestConfigFilePath()); - return new Config($settings); - } - - private static function removeTestConfigFile() - { - $configPath = self::getTestConfigFilePath(); - if (file_exists($configPath)) { - unlink($configPath); - } - } - - protected function makeLocalConfigNotWritable() - { - $local = Config::getInstance()->getLocalPath(); - touch($local); - chmod($local, 0444); - $this->assertFalse(is_writable($local)); - } - - protected function makeLocalConfigWritable() - { - $local = Config::getInstance()->getLocalPath(); - @chmod(dirname($local), 0755); - @chmod($local, 0755); - $this->assertTrue(is_writable(dirname($local))); - if (file_exists($local)) { - $this->assertTrue(is_writable($local)); - } - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/ControllerTest.php b/plugins/CoreAdminHome/tests/Integration/ControllerTest.php deleted file mode 100644 index 38c539286c1e75b28b9935528920d3aa4cc413aa..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/ControllerTest.php +++ /dev/null @@ -1,424 +0,0 @@ -backupGet = $_GET; - $this->backupPost = $_POST; - $this->backupRequest = $_REQUEST; - $this->backupServer = $_SERVER; - $this->backupMail = Config::getInstance()->mail; - $this->backupGeneral = Config::getInstance()->General; - - Fixture::createSuperUser(); - if (!Fixture::siteCreated(1)) { - Fixture::createWebsite('2012-01-01 00:00:00'); - } - FakeAccess::clearAccess( - $superUser = true, - $idSitesAdmin = [1], - $idSitesView = [1], - $identity = 'superUserLogin' - ); - Fixture::resetTranslations(); - Fixture::loadAllTranslations(); - if (!Fixture::siteCreated(2)) { - Fixture::createWebsite('2012-01-02 00:00:00'); - } - $_GET = ['idSite' => 1, 'period' => 'day', 'date' => 'today']; - $_REQUEST = $_GET; - - UsersManagerAPI::getInstance()->setUserPreference( - 'superUserLogin', - UsersManagerAPI::PREFERENCE_DEFAULT_REPORT, - 2 - ); - - $this->controller = new Controller( - new Translator(new DevelopmentLoader(new JsonFileLoader())), - new OptOutManager(), - new PasswordVerifier() - ); - } - - public function testSetMailSettingsRejectsGetRequests(): void - { - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_GET = $this->getMailSettingsRequest('get.example.test'); - $_POST = []; - $_REQUEST = $_GET; - - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Invalid HTTP method.'); - - $this->controller->setMailSettings(); - } - - public function testSetMailSettingsUsesPostParametersOnly(): void - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_GET = $this->getMailSettingsRequest('get.example.test'); - $_POST = $this->getMailSettingsRequest('post.example.test'); - $_REQUEST = $_GET + $_POST; - - $controller = $this->getControllerSkippingTokenCheck(); - - $controller->setMailSettings(); - $this->mailSettingsSaved = true; - - $this->assertSame('post.example.test', Config::getInstance()->mail['host']); - $this->assertSame('smtp-user-post', Config::getInstance()->mail['username']); - $this->assertSame('smtp-password-post', Config::getInstance()->mail['password']); - $this->assertSame('mail-post@example.test', Config::getInstance()->General['noreply_email_address']); - $this->assertSame('Acme & "post"', Config::getInstance()->General['noreply_email_name']); - } - - public function testSetMailSettingsRejectsIncorrectPasswordConfirmation(): void - { - $originalHost = Config::getInstance()->mail['host']; - - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_POST = $this->getMailSettingsRequest('reject.example.test'); - $_REQUEST = $_POST; - - $controller = $this->getControllerSkippingTokenCheck($passwordCorrect = false); - - $response = $controller->setMailSettings(); - - $this->assertStringContainsString(Piwik::translate('UsersManager_CurrentPasswordNotCorrect'), $response); - // nothing must have been persisted - $this->assertSame($originalHost, Config::getInstance()->mail['host']); - } - - public function testSetMailSettingsRejectsMissingPasswordConfirmation(): void - { - $originalHost = Config::getInstance()->mail['host']; - - $_SERVER['REQUEST_METHOD'] = 'POST'; - $request = $this->getMailSettingsRequest('reject.example.test'); - unset($request['passwordConfirmation']); - $_POST = $request; - $_REQUEST = $_POST; - - $controller = $this->getControllerSkippingTokenCheck(); - - $response = $controller->setMailSettings(); - - $this->assertStringContainsString(Piwik::translate('UsersManager_CurrentPasswordNotCorrect'), $response); - // nothing must have been persisted - $this->assertSame($originalHost, Config::getInstance()->mail['host']); - } - - public function testWhatIsNewDoesNotPrefixBundledPluginsAndPrefixesThirdPartyPlugins(): void - { - $this->deleteAllChanges(); - - $changesModel = new ChangesModel(); - $changesModel->addChange('CoreHome', [ - 'version' => '1.0.0', - 'title' => 'Core bundled change', - 'description' => 'Core bundled description', - ]); - $changesModel->addChange('ProfessionalServices', [ - 'version' => '1.0.0', - 'title' => 'Professional services bundled change', - 'description' => 'Professional services bundled description', - ]); - $changesModel->addChange('ThirdPartyPlugin', [ - 'version' => '1.0.0', - 'title' => 'Third party change', - 'description' => 'Third party description', - ]); - - $html = $this->controller->whatIsNew(); - - $this->assertStringContainsString('>Core bundled change<', $html); - $this->assertStringContainsString('>Professional services bundled change<', $html); - $this->assertStringContainsString('>ThirdPartyPlugin - Third party change<', $html); - - $this->assertStringNotContainsString('>CoreHome - Core bundled change<', $html); - $this->assertStringNotContainsString('>ProfessionalServices - Professional services bundled change<', $html); - } - - public function testModifyErrorPageReplacesInvalidWebsiteMessage(): void - { - $_GET = ['idSite' => '999', 'period' => 'day', 'date' => 'today']; - $_REQUEST = $_GET; - - $output = Piwik_GetErrorMessagePage( - 'Original message', - false, - true, - true, - 'custom-logo.svg', - 'custom-favicon.png', - false, - '', - false, - 'https://example.test/redirect', - 5 - ); - $plugin = new CoreAdminHome(); - $plugin->onModifyErrorPage( - $output, - new UnexpectedWebsiteFoundException("The requested website id = 999 couldn't be found") - ); - - $this->assertStringContainsString('This URL is not valid. The content may have been moved, deleted, or is no longer available', $output); - $this->assertStringContainsString("website id was set to '999' on the URL", $output); - $this->assertStringContainsString('Please go back to your previous page', $output); - $this->assertStringContainsString('return to your dashboard', $output); - $this->assertStringNotContainsString('Original message', $output); - $this->assertStringContainsString('custom-logo.svg', $output); - $this->assertStringContainsString('custom-favicon.png', $output); - $this->assertStringContainsString('https://example.test/redirect', $output); - $this->assertStringContainsString('setTimeout(function(){window.location.href="https://example.test/redirect"}', $output); - } - - public function testModifyErrorPageDoesNotReplaceOtherUnexpectedWebsiteExceptions(): void - { - $_GET = ['idSite' => '1', 'period' => 'day', 'date' => 'today']; - $_REQUEST = $_GET; - - $output = Piwik_GetErrorMessagePage('Original message', false, true, true, false, false, false, '', false); - $plugin = new CoreAdminHome(); - $plugin->onModifyErrorPage( - $output, - new UnexpectedWebsiteFoundException("The requested website id = 999 couldn't be found") - ); - - $this->assertStringContainsString('Original message', $output); - $this->assertStringNotContainsString('This URL is not valid. The content may have been moved, deleted, or is no longer available', $output); - } - - public function testWhatIsNewRewritesInternalLinksToDefaultReportIdSite(): void - { - $this->deleteAllChanges(); - - $changesModel = new ChangesModel(); - $changesModel->addChange('UsersManager', [ - 'version' => '1.0.0', - 'title' => 'Settings change', - 'description' => 'Description', - 'link_name' => 'Open settings', - 'link' => 'index.php?module=UsersManager&action=userSettings&idSite=1', - ]); - $changesModel->addChange('SegmentEditor', [ - 'version' => '1.0.0', - 'title' => 'Segment change', - 'description' => 'Description', - 'link_name' => 'Open segments', - 'link' => '/index.php?module=CoreHome&action=index&idSite=1#?idSite=1&category=General_Visitors', - ]); - - $html = $this->controller->whatIsNew(); - - $this->assertStringContainsString('index.php?module=UsersManager&action=userSettings&idSite=2', $html); - $this->assertStringContainsString('index.php?module=CoreHome&action=index&idSite=2#?idSite=2&category=General_Visitors', $html); - $this->assertStringNotContainsString('href="/index.php?', $html); - $this->assertStringNotContainsString('idSite=1', $html); - } - - public function testWhatIsNewLeavesExternalLinksUnchanged(): void - { - $this->deleteAllChanges(); - - $changesModel = new ChangesModel(); - $changesModel->addChange('PrivacyManager', [ - 'version' => '1.0.0', - 'title' => 'External change', - 'description' => 'Description', - 'link_name' => 'Open docs', - 'link' => 'https://matomo.org/blog/2022/09/improvements-to-matomo-opt-out-form-feature/', - ]); - - $html = $this->controller->whatIsNew(); - - $this->assertStringContainsString( - 'https://matomo.org/blog/2022/09/improvements-to-matomo-opt-out-form-feature/', - $html - ); - } - - public function testWhatIsNewFallsBackToDefaultWebsiteIdWhenDefaultReportIsMultiSites(): void - { - $this->deleteAllChanges(); - - UsersManagerAPI::getInstance()->setUserPreference( - 'superUserLogin', - UsersManagerAPI::PREFERENCE_DEFAULT_REPORT, - 'MultiSites' - ); - - $changesModel = new ChangesModel(); - $changesModel->addChange('UsersManager', [ - 'version' => '1.0.0', - 'title' => 'Settings change', - 'description' => 'Description', - 'link_name' => 'Open settings', - 'link' => 'index.php?module=UsersManager&action=userSettings&idSite=99', - ]); - - $html = $this->controller->whatIsNew(); - - $this->assertStringContainsString('index.php?module=UsersManager&action=userSettings&idSite=1', $html); - } - - public function testWhatIsNewLeavesInternalLinksUnchangedWhenNoDefaultIdSiteIsAvailable(): void - { - FakeAccess::clearAccess( - $superUser = false, - $idSitesAdmin = [], - $idSitesView = [], - $identity = 'superUserLogin' - ); - - UsersManagerAPI::getInstance()->setUserPreference( - 'superUserLogin', - UsersManagerAPI::PREFERENCE_DEFAULT_REPORT, - 'MultiSites' - ); - - $changes = [[ - 'plugin_name' => 'UsersManager', - 'version' => '1.0.0', - 'title' => 'Settings change', - 'description' => 'Description', - 'link_name' => 'Open settings', - 'link' => 'index.php?module=UsersManager&action=userSettings&idSite=99', - ]]; - - $changes = $this->callEnrichChangesForWhatIsNew($changes); - - $this->assertSame( - 'index.php?module=UsersManager&action=userSettings&idSite=99', - $changes[0]['link'] - ); - } - - public function tearDown(): void - { - $this->deleteAllChanges(); - $_GET = $this->backupGet; - $_POST = $this->backupPost; - $_REQUEST = $this->backupRequest; - $_SERVER = $this->backupServer; - Config::getInstance()->mail = $this->backupMail; - Config::getInstance()->General = $this->backupGeneral; - if ($this->mailSettingsSaved) { - Config::getInstance()->forceSave(); - } - parent::tearDown(); - } - - public function provideContainerConfig() - { - return [ - 'Piwik\Access' => new FakeAccess(), - 'test.vars.loadChanges' => true, - ]; - } - - private function deleteAllChanges(): void - { - Db::query('DELETE FROM `' . Common::prefixTable('changes') . '`'); - } - - private function callEnrichChangesForWhatIsNew(array $changes): array - { - $method = new \ReflectionMethod($this->controller, 'enrichChangesForWhatIsNew'); - $method->setAccessible(true); - - return $method->invoke($this->controller, $changes); - } - - private function getControllerSkippingTokenCheck(bool $passwordCorrect = true): Controller - { - $controller = $this->getMockBuilder(Controller::class) - ->disableOriginalConstructor() - ->onlyMethods(['checkTokenInUrl']) - ->getMock(); - - $controller->expects($this->once()) - ->method('checkTokenInUrl'); - - $passwordVerify = $this->createMock(PasswordVerifier::class); - $passwordVerify->method('isPasswordCorrect')->willReturn($passwordCorrect); - - $property = new \ReflectionProperty(Controller::class, 'passwordVerify'); - $property->setAccessible(true); - $property->setValue($controller, $passwordVerify); - - return $controller; - } - - private function getMailSettingsRequest(string $mailHost): array - { - $hostPrefix = explode('.', $mailHost)[0]; - - return [ - 'mailUseSmtp' => '1', - 'mailPort' => '25', - 'mailHost' => $mailHost, - 'mailType' => '', - 'mailUsername' => 'smtp-user-' . $hostPrefix, - 'mailPassword' => 'smtp-password-' . $hostPrefix, - 'mailEncryption' => 'none', - 'mailFromAddress' => 'mail-' . $hostPrefix . '@example.test', - 'mailFromName' => 'Acme & "' . $hostPrefix . '"', - 'passwordConfirmation' => 'super-user-password', - ]; - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php b/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php deleted file mode 100644 index 33b7518837a928c5376cc5310b550ad1b752300c..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php +++ /dev/null @@ -1,176 +0,0 @@ -setAutoExit(false); - - $this->applicationTester = new ApplicationTester($application); - } - - public function testFixDuplicateLogActionsCorrectlyRemovesDuplicatesAndFixesReferencesInOtherTables() - { - $result = $this->applicationTester->run(array( - 'command' => 'core:fix-duplicate-log-actions', - '--invalidate-archives' => 0, - '-vvv' => false, - )); - - $this->assertEquals(0, $result, "Command failed: " . $this->applicationTester->getDisplay()); - - $this->assertDuplicateActionsRemovedFromLogActionTable(); - $this->assertDuplicatesFixedInLogLinkVisitActionTable(); - $this->assertDuplicatesFixedInLogConversionTable(); - $this->assertDuplicatesFixedInLogConversionItemTable(); - - self::assertStringContainsString("Found and deleted 7 duplicate action entries", $this->applicationTester->getDisplay()); - - $expectedAffectedArchives = array( - array('idsite' => '1', 'server_time' => '2012-01-01'), - array('idsite' => '2', 'server_time' => '2013-01-01'), - array('idsite' => '1', 'server_time' => '2012-02-01'), - array('idsite' => '2', 'server_time' => '2012-01-09'), - array('idsite' => '2', 'server_time' => '2012-03-01'), - ); - foreach ($expectedAffectedArchives as $archive) { - self::assertStringContainsString("[ idSite = {$archive['idsite']}, date = {$archive['server_time']} ]", $this->applicationTester->getDisplay()); - } - } - - private function assertDuplicateActionsRemovedFromLogActionTable() - { - $actions = Db::fetchAll("SELECT idaction, name FROM " . Common::prefixTable('log_action')); - $expectedActions = array( - array('idaction' => 1, 'name' => 'action1'), - array('idaction' => 4, 'name' => 'action2'), - array('idaction' => 5, 'name' => 'ACTION2'), - array('idaction' => 6, 'name' => 'action4'), - array('idaction' => 8, 'name' => 'action5'), - ); - $this->assertEquals($expectedActions, $actions); - } - - private function assertDuplicatesFixedInLogLinkVisitActionTable() - { - $columns = array( - 'idaction_url_ref', - 'idaction_name_ref', - 'idaction_name', - 'idaction_url', - 'idaction_event_action', - 'idaction_event_category', - 'idaction_content_interaction', - 'idaction_content_name', - 'idaction_content_piece', - 'idaction_content_target', - ); - $rows = Db::fetchAll("SELECT " . implode(',', $columns) . " FROM " . Common::prefixTable('log_link_visit_action')); - $expectedRows = array( - array( - 'idaction_url_ref' => '1', - 'idaction_name_ref' => '1', - 'idaction_name' => '1', - 'idaction_url' => '4', - 'idaction_event_action' => '5', - 'idaction_event_category' => '6', - 'idaction_content_interaction' => '5', - 'idaction_content_name' => '8', - 'idaction_content_piece' => '4', - 'idaction_content_target' => '6', - ), - array( - 'idaction_url_ref' => '1', - 'idaction_name_ref' => '1', - 'idaction_name' => '5', - 'idaction_url' => '5', - 'idaction_event_action' => '4', - 'idaction_event_category' => '6', - 'idaction_content_interaction' => '5', - 'idaction_content_name' => '5', - 'idaction_content_piece' => '6', - 'idaction_content_target' => '6', - ), - ); - $this->assertEquals($expectedRows, $rows); - } - - private function assertDuplicatesFixedInLogConversionTable() - { - $rows = Db::fetchAll("SELECT idaction_url FROM " . Common::prefixTable('log_conversion')); - $expectedRows = array( - array('idaction_url' => 4), - array('idaction_url' => 5), - ); - $this->assertEquals($expectedRows, $rows); - } - - private function assertDuplicatesFixedInLogConversionItemTable() - { - $columns = array( - 'idaction_sku', - 'idaction_name', - 'idaction_category', - 'idaction_category2', - 'idaction_category3', - 'idaction_category4', - 'idaction_category5', - ); - $rows = Db::fetchAll("SELECT " . implode(',', $columns) . " FROM " . Common::prefixTable('log_conversion_item')); - $expectedRows = array( - array( - 'idaction_sku' => '1', - 'idaction_name' => '1', - 'idaction_category' => '1', - 'idaction_category2' => '4', - 'idaction_category3' => '5', - 'idaction_category4' => '6', - 'idaction_category5' => '5', - ), - array( - 'idaction_sku' => '1', - 'idaction_name' => '1', - 'idaction_category' => '5', - 'idaction_category2' => '5', - 'idaction_category3' => '8', - 'idaction_category4' => '4', - 'idaction_category5' => '6', - ), - ); - $this->assertEquals($expectedRows, $rows); - } -} - -FixDuplicateActionsTest::$fixture = new DuplicateActions(); diff --git a/plugins/CoreAdminHome/tests/Integration/InvalidateReportDataTest.php b/plugins/CoreAdminHome/tests/Integration/InvalidateReportDataTest.php deleted file mode 100644 index cda93870426b86a8461d0a8432ae63a836fde91e..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/InvalidateReportDataTest.php +++ /dev/null @@ -1,100 +0,0 @@ -subDay(10); - $timezoneTestDate = $testDate->subSeconds(Date::getUtcOffset($timezone)); - - // disable browser archiving - Config::getInstance()->General['enable_browser_archiving_triggering'] = 0; - Config::getInstance()->General['browser_archiving_disabled_enforce'] = 1; - - SegmentEditorAPI::getInstance()->add('fr segment', 'languageCode==fr', $idSite, true); - - // track a visitor - $t = Fixture::getTracker($idSite, $timezoneTestDate->addHour(12)->getDatetime(), true); - $t->setUserAgent('Mozilla/5.0 (compatible; MSIE 10.0; Windows Vista; Trident/5.0'); - $t->setIp('10.11.12.13'); - $t->setUrl('http://piwik.net/randomsite'); - $t->doTrackPageView('random site'); - - // With a returning visit - $t->setForceVisitDateTime($timezoneTestDate->addHour(17)->getDatetime()); - $t->setForceNewVisit(); - $t->doTrackPageView('random site'); - - // track a second visitor - $t = Fixture::getTracker($idSite, $timezoneTestDate->addHour(12.5)->getDatetime(), true); - $t->setIp('20.21.22.23'); - $t->setUserAgent('Mozilla/5.0 (compatible; MSIE 10.0; Windows 8; Trident/5.0)'); - $t->setUrl('http://piwik.net/randomsite'); - $t->doTrackPageView('random site'); - - $archiver = new CronArchive(); - $archiver->main(); - - $result = VisitsSummaryAPI::getInstance()->get($idSite, 'week', $testDate->toString(), 'languageCode==fr'); - self::assertEquals(3, $result->getFirstRow()->getColumn('nb_visits')); - - $result = VisitFrequencyAPI::getInstance()->get($idSite, 'week', $testDate->toString(), 'languageCode==fr'); - self::assertEquals(1, $result->getFirstRow()->getColumn('nb_visits_returning')); - self::assertEquals(2, $result->getFirstRow()->getColumn('nb_visits_new')); - - // Remove one visit - $datasubject = StaticContainer::get(DataSubjects::class); - $datasubject->deleteDataSubjectsWithoutInvalidatingArchives([['idvisit' => 1]]); - - // Invalidate the segment - CoreAdminHomeAPI::getInstance()->invalidateArchivedReports($idSite, $testDate->toString(), 'day', 'languageCode==fr'); - - // re-run archiving - $archiver = new CronArchive(); - $archiver->main(); - - $result = VisitsSummaryAPI::getInstance()->get($idSite, 'week', $testDate->toString(), 'languageCode==fr'); - self::assertEquals(2, $result->getFirstRow()->getColumn('nb_visits')); - - // check that metrics built with dependent segment archives are updated as well - $result = VisitFrequencyAPI::getInstance()->get($idSite, 'week', $testDate->toString(), 'languageCode==fr'); - self::assertEquals(1, $result->getFirstRow()->getColumn('nb_visits_returning')); - self::assertEquals(1, $result->getFirstRow()->getColumn('nb_visits_new')); - } - - public function getTimezones() - { - return [['UTC-12'], ['UTC'], ['UTC+14']]; - } -} diff --git a/plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php b/plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php deleted file mode 100644 index d3cb0260be38d95b251cebd38c18ce5359e54ca7..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php +++ /dev/null @@ -1,120 +0,0 @@ -duplicateActionRemover = new DuplicateActionRemover(); - } - - public function testGetDuplicateIdActionsReturnsDuplicateIdActionsAndTreatsLowestIdActionAsOriginal() - { - $expectedResult = array( - array('name' => 'action1', 'idaction' => 1, 'duplicateIdActions' => array(2, 3)), - array('name' => 'action2', 'idaction' => 4, 'duplicateIdActions' => array(9)), - array('name' => 'ACTION2', 'idaction' => 5, 'duplicateIdActions' => array(7, 11)), - array('name' => 'action4', 'idaction' => 6, 'duplicateIdActions' => array(10, 12)), - ); - $actualResult = $this->duplicateActionRemover->getDuplicateIdActions(); - - // order of element is dependent to database engine, so sort before checking results - usort($actualResult, function ($a, $b) { - return $a['idaction'] <=> $b['idaction']; - }); - - $this->assertEquals($expectedResult, $actualResult); - } - - public function testFixDuplicateActionsInTableCorrectlyUpdatesIdActionColumnsInSpecifiedTable() - { - $this->duplicateActionRemover->fixDuplicateActionsInTable('log_conversion_item', 5, array(3, 6, 7, 10)); - - $columns = array('idaction_sku', 'idaction_name', 'idaction_category', 'idaction_category2', - 'idaction_category3', 'idaction_category4', 'idaction_category5'); - - $expectedResult = array( - array( - 'idaction_sku' => '1', - 'idaction_name' => '2', - 'idaction_category' => '5', - 'idaction_category2' => '4', - 'idaction_category3' => '5', - 'idaction_category4' => '5', - 'idaction_category5' => '5', - ), - array( - 'idaction_sku' => '2', - 'idaction_name' => '5', - 'idaction_category' => '5', - 'idaction_category2' => '5', - 'idaction_category3' => '8', - 'idaction_category4' => '9', - 'idaction_category5' => '5', - ), - ); - $actualResult = Db::fetchAll("SELECT " . implode(", ", $columns) . " FROM " . Common::prefixTable('log_conversion_item')); - $this->assertEquals($expectedResult, $actualResult); - } - - public function testGetSitesAndDatesOfRowsUsingDuplicatesReturnsTheServerTimeAndIdSiteOfRowsUsingSpecifiedActionIds() - { - $row = array( - 'idsite' => 3, - 'idvisitor' => pack("H*", DuplicateActions::DUMMY_IDVISITOR), - 'server_time' => '2012-02-13 00:00:00', - 'idvisit' => 5, - 'idorder' => 6, - 'price' => 15, - 'quantity' => 21, - 'deleted' => 1, - 'idaction_sku' => 3, - 'idaction_name' => 3, - 'idaction_category' => 12, - 'idaction_category2' => 3, - 'idaction_category3' => 3, - 'idaction_category4' => 3, - 'idaction_category5' => 3, - ); - Db::query("INSERT INTO " . Common::prefixTable('log_conversion_item') . " (" . implode(", ", array_keys($row)) - . ") VALUES ('" . implode("', '", array_values($row)) . "')"); - - $expectedResult = array( - array('idsite' => 1, 'server_time' => '2012-02-01'), - array('idsite' => 3, 'server_time' => '2012-02-13'), - ); - $actualResult = $this->duplicateActionRemover->getSitesAndDatesOfRowsUsingDuplicates('log_conversion_item', array(4, 6, 12)); - $this->assertEquals($expectedResult, $actualResult); - } -} - -DuplicateActionRemoverTest::$fixture = new DuplicateActions(); diff --git a/plugins/CoreAdminHome/tests/Integration/TasksTest.php b/plugins/CoreAdminHome/tests/Integration/TasksTest.php deleted file mode 100644 index 1f417d68703f5871c1c0928e0697940381d28b26..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Integration/TasksTest.php +++ /dev/null @@ -1,261 +0,0 @@ -loginAsSuperUser(); - - $this->january = Date::factory('2015-01-01'); - $this->february = Date::factory('2015-02-01'); - - $archivePurger = new ArchivePurger(); - $archivePurger->setTodayDate(Date::factory('2015-02-27')); - $archivePurger->setYesterdayDate(Date::factory('2015-02-26')); - $archivePurger->setNow(Date::factory('2015-02-27 08:00:00')->getTimestamp()); - - $this->tasks = new Tasks($archivePurger, new NullLogger(), new Failures()); - - $this->mail = null; - } - - public function tearDown(): void - { - Rules::$disablePureOutdatedArchive = false; - - parent::tearDown(); - } - - public function testPurgeInvalidatedArchivesPurgesCorrectInvalidatedArchivesAndOnlyPurgesDataForDatesAndSitesInInvalidatedReportsDistributedList() - { - $this->setUpInvalidatedReportsDistributedList($dates = array($this->february)); - - $this->tasks->purgeInvalidatedArchives(); - - self::$fixture->assertInvalidatedArchivesPurged($this->february); - self::$fixture->assertInvalidatedArchivesNotPurged($this->january); - - // assert invalidated reports distributed list has changed - $archivesToPurgeDistributedList = new ArchivesToPurgeDistributedList(); - $yearMonths = $archivesToPurgeDistributedList->getAll(); - - $this->assertEmpty($yearMonths); - } - - public function testPurgeOutdatedArchivesSkipsPurgingWhenBrowserArchivingDisabledAndCronArchiveTriggerNotPresent() - { - Rules::setBrowserTriggerArchiving(false); - $wasPurged = $this->tasks->purgeOutdatedArchives(); - $this->assertFalse($wasPurged); - } - - public function testPurgeOutdatedArchivesPurgesWhenBrowserArchivingEnabledAndCronArchiveTriggerPresent() - { - Rules::setBrowserTriggerArchiving(false); - Rules::$disablePureOutdatedArchive = true; - - $wasPurged = $this->tasks->purgeOutdatedArchives(); - $this->assertTrue($wasPurged); - } - - public function testScheduleAddsRightAmountOfTasks() - { - Fixture::createWebsite('2012-01-01 00:00:00'); - Fixture::createWebsite(Date::now()->subDay(5)->getDatetime()); - Fixture::createWebsite(Date::now()->subDay(2)->getDatetime()); - Fixture::createWebsite(Date::now()->subDay(4)->getDatetime()); - Fixture::createWebsite(Date::now()->getDatetime()); - - $this->tasks->schedule(); - - $tasks = $this->tasks->getScheduledTasks(); - $tasks = array_map(function (Task $task) { - return $task->getMethodName() . '.' . $task->getMethodParameter(); - }, $tasks); - - $expected = [ - 'invalidateOutdatedArchives.', - 'deleteOldFingerprintSalts.', - 'purgeOutdatedArchives.', - 'purgeInvalidatedArchives.', - 'purgeBrokenArchivesCurrentMonth.', - 'purgeInvalidationsForDeletedSites.', - 'purgeOrphanedArchives.', - 'optimizeArchiveTable.', - 'cleanupTrackingFailures.', - 'notifyTrackingFailures.', - 'updateSpammerList.', - 'checkSiteHasTrackedVisits.2', - 'checkSiteHasTrackedVisits.3', - 'checkSiteHasTrackedVisits.4', - 'checkSiteHasTrackedVisits.5', - ]; - $this->assertEquals($expected, $tasks); - } - - public function testCheckSiteHasTrackedVisitsDoesNothingIfTheSiteHasVisits() - { - $idSite = Fixture::createWebsite('2012-01-01 00:00:00'); - - $tracker = Fixture::getTracker($idSite, '2014-02-02 03:04:05'); - Fixture::checkResponse($tracker->doTrackPageView('alskdjfs')); - - $this->assertEquals(1, Db::fetchOne("SELECT COUNT(*) FROM " . Common::prefixTable('log_visit'))); - - $this->tasks->checkSiteHasTrackedVisits($idSite); - - $this->assertEmpty($this->mail); - } - - public function testCheckSiteHasTrackedVisitsDoesNothingIfSiteHasNoCreationUser() - { - $idSite = Fixture::createWebsite('2012-01-01 00:00:00'); - Db::query("UPDATE " . Common::prefixTable('site') . ' SET creator_login = NULL WHERE idsite = ' . $idSite . ';'); - - $this->assertEquals(0, Db::fetchOne("SELECT COUNT(*) FROM " . Common::prefixTable('log_visit'))); - - $this->tasks->checkSiteHasTrackedVisits($idSite); - - $this->assertEmpty($this->mail); - } - - public function testCheckSitesHasTrackedVisitsSendsJsCodeMissingEmailIfSiteHasNoVisitsAndCreationUser() - { - $idSite = Fixture::createWebsite('2012-01-01 00:00:00'); - - $this->assertEquals(0, Db::fetchOne("SELECT COUNT(*) FROM " . Common::prefixTable('log_visit'))); - - $this->tasks->checkSiteHasTrackedVisits($idSite); - - $this->assertInstanceOf(JsTrackingCodeMissingEmail::class, $this->mail); - - /** @var JsTrackingCodeMissingEmail $mail */ - $mail = $this->mail; - $this->assertEquals($mail->getLogin(), 'superUserLogin'); - $this->assertEquals($mail->getEmailAddress(), 'hello@example.org'); - $this->assertEquals($mail->getIdSite(), $idSite); - } - - public function testCleanupTrackingFailuresDoesNotCauseAnyException() - { - self::expectNotToPerformAssertions(); - - // it is only calling one method which is already tested... no need to write complex tests for it - $this->tasks->cleanupTrackingFailures(); - } - - public function testNotifyTrackingFailuresDoesNotSendAnyMailWhenThereAreNoTrackingRequests() - { - $this->tasks->notifyTrackingFailures(); - $this->assertNull($this->mail); - } - - public function testNotifyTrackingFailuresSendsMailWhenThereAreTrackingFailures() - { - $failures = new Failures(); - $failures->logFailure(1, new Request(array('idsite' => 9999, 'rec' => 1))); - $failures->logFailure(1, new Request(array('idsite' => 9998, 'rec' => 1))); - Fixture::createSuperUser(false); - $this->tasks->notifyTrackingFailures(); - - /** @var TrackingFailuresEmail $mail */ - $mail = $this->mail; - $this->assertInstanceOf(TrackingFailuresEmail::class, $mail); - $this->assertEquals('superUserLogin', $mail->getLogin()); - $this->assertEquals('hello@example.org', $mail->getEmailAddress()); - $this->assertEquals(2, $mail->getNumFailures()); - } - - /** - * @param Date[] $dates - */ - private function setUpInvalidatedReportsDistributedList($dates) - { - $yearMonths = array(); - foreach ($dates as $date) { - $yearMonths[] = $date->toString('Y_m'); - } - - $archivesToPurgeDistributedList = new ArchivesToPurgeDistributedList(); - $archivesToPurgeDistributedList->add($yearMonths); - } - - public function provideContainerConfig() - { - return [ - 'observers.global' => \Piwik\DI::add([ - ['Mail.send', \Piwik\DI::value(function (Mail $mail) { - $this->mail = $mail; - })], - ]), - ]; - } - - /** - * @param Fixture $fixture - */ - protected static function configureFixture($fixture) - { - parent::configureFixture($fixture); - $fixture->createSuperUser = true; - } -} - -TasksTest::$fixture = new RawArchiveDataWithTempAndInvalidated(); diff --git a/plugins/CoreAdminHome/tests/System/TrackingFailuresTest.php b/plugins/CoreAdminHome/tests/System/TrackingFailuresTest.php deleted file mode 100644 index b738ebeb150dcf58a63cbbf38f50e9daacf53817..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/System/TrackingFailuresTest.php +++ /dev/null @@ -1,63 +0,0 @@ -runApiTests($api, $params); - } - - public function getApiForTesting() - { - $api = array( - 'CoreAdminHome.getTrackingFailures', - ); - - $apiToTest = array(); - $apiToTest[] = array($api, - array( - 'testSuffix' => '', - ), - ); - - return $apiToTest; - } - - public static function getOutputPrefix() - { - return ''; - } - - public static function getPathToTestDirectory() - { - return dirname(__FILE__); - } -} - -TrackingFailuresTest::$fixture = new TrackingFailures(); diff --git a/plugins/CoreAdminHome/tests/System/expected/test___CoreAdminHome.getTrackingFailures.xml b/plugins/CoreAdminHome/tests/System/expected/test___CoreAdminHome.getTrackingFailures.xml deleted file mode 100644 index 511339901f6b42d818e96385967568a33095b40b..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/System/expected/test___CoreAdminHome.getTrackingFailures.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - 1 - 2 - - - Piwik test - - http://example.com/piwik/ - Request was not authenticated but authentication was required. - Set or correct a "token_auth" in your tracking request. - https://matomo.org/faq/how-to/faq_30835/ - - - 99999 - 1 - - - Unknown - - http://example.com/piwik/ - The site does not exist. - Update the configured idSite in the tracker. - https://matomo.org/faq/how-to/faq_30838/ - - \ No newline at end of file diff --git a/plugins/CoreAdminHome/tests/UI/CustomLogoUpload_spec.js b/plugins/CoreAdminHome/tests/UI/CustomLogoUpload_spec.js deleted file mode 100644 index a999f0899ce6d335a4dd9490cbfac84b818fb613..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/UI/CustomLogoUpload_spec.js +++ /dev/null @@ -1,127 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -var fs = require('fs'), - path = require('../../../../tests/lib/screenshot-testing/support/path'); - -describe("CustomLogoUpload", function () { - const contentSelector = 'div[vue-entry="CoreAdminHome.BrandingSettings"]'; - - const logoToUpload = path.join(PIWIK_INCLUDE_PATH, "/tests/resources/customlogo/logo.png"); - const faviconToUpload = path.join(PIWIK_INCLUDE_PATH, "/tests/resources/customlogo/favicon.png"); - - const logoPublicPath = path.join(PIWIK_INCLUDE_PATH, "/misc/user/logo.png"); - const faviconPublicPath = path.join(PIWIK_INCLUDE_PATH, "/misc/user/favicon.png"); - - // ba16a2cfb817c43df28fde559b8ee4774f422602 is sha1 of superUserLogin login - const logoTmpPath = path.join(PIWIK_INCLUDE_PATH, "/tmp/logos/ba16a2cfb817c43df28fde559b8ee4774f422602/logo.png"); - const faviconTmpPath = path.join(PIWIK_INCLUDE_PATH, "/tmp/logos/ba16a2cfb817c43df28fde559b8ee4774f422602/favicon.png"); - - before(function () { - testEnvironment.optionsOverride = { - branding_use_custom_logo: '1' - }; - testEnvironment.save(); - }); - - it('should enable logo upload', async function() { - await page.goto('?module=CoreAdminHome&action=generalSettings'); - await page.waitForNetworkIdle(); - - await page.evaluate(function(){ - $('input[name="useCustomLogo"]').trigger('change'); - }); - await page.waitForTimeout(200); - - expect(await page.screenshotSelector(contentSelector)).to.matchImage('enable_logo_upload'); - }); - - it('should upload a custom logo', async function() { - const fileInput = await page.$('input[name=customLogo]'); - await fileInput.uploadFile(logoToUpload); - - await page.waitForTimeout(2000); - await page.waitForNetworkIdle(); - - expect(await page.screenshotSelector(contentSelector)).to.matchImage('custom_logo_uploaded'); - - expect(fs.existsSync(logoTmpPath)).to.be.true; // custom file uploaded into tmp folder - expect(fs.existsSync(logoPublicPath)).to.be.false; // custom file not published as not saved - }); - - it('should publish custom logo when settings are saved', async function() { - await page.click('[vue-entry="CoreAdminHome.BrandingSettings"] .matomo-save-button'); - await page.waitForTimeout(1000); - await page.waitForNetworkIdle(); - - expect(fs.existsSync(logoPublicPath)).to.be.true; - expect(fs.existsSync(logoTmpPath)).to.be.false; - expect(fs.existsSync(faviconPublicPath)).to.be.false; - expect(fs.existsSync(faviconTmpPath)).to.be.false; - }); - - it('should upload a custom favicon without a page reload', async function() { - const fileInput = await page.$('input[name=customFavicon]'); - await fileInput.uploadFile(faviconToUpload); - - await page.waitForTimeout(2000); - await page.waitForNetworkIdle(); - - expect(await page.screenshotSelector(contentSelector)).to.matchImage('custom_favicon_uploaded'); - - expect(fs.existsSync(faviconTmpPath)).to.be.true; // custom file uploaded into tmp folder - expect(fs.existsSync(faviconPublicPath)).to.be.false; - }); - - it('should publish custom favicon and not alter custom logo when settings are saved again', async function() { - await page.click('[vue-entry="CoreAdminHome.BrandingSettings"] .matomo-save-button'); - await page.waitForTimeout(1000); - await page.waitForNetworkIdle(); - - expect(fs.existsSync(logoPublicPath)).to.be.true; - expect(fs.existsSync(logoTmpPath)).to.be.false; - expect(fs.existsSync(faviconPublicPath)).to.be.true; - expect(fs.existsSync(faviconTmpPath)).to.be.false; - }); - - it('should display custom logo and favicon when settings page is reloaded', async function() { - await page.reload(); - await page.waitForNetworkIdle(); - - expect(await page.screenshotSelector(contentSelector)).to.matchImage('branding_settings_reloaded_first'); - }); - - it('should not change anything when settings are saved with custom logos present', async function() { - await page.click('[vue-entry="CoreAdminHome.BrandingSettings"] .matomo-save-button'); - await page.waitForTimeout(1000); - await page.waitForNetworkIdle(); - - expect(await page.screenshotSelector(contentSelector)).to.matchImage('branding_settings_reloaded_second'); - - expect(fs.existsSync(logoPublicPath)).to.be.true; - expect(fs.existsSync(faviconPublicPath)).to.be.true; - expect(fs.existsSync(logoTmpPath)).to.be.false; - expect(fs.existsSync(faviconTmpPath)).to.be.false; - }); - - it('should disable custom logo feature and save settings', async function() { - const cb = await page.waitForSelector('input[name="useCustomLogo"]'); - await cb.click(); - await page.waitForTimeout(200); - - await page.click('[vue-entry="CoreAdminHome.BrandingSettings"] .matomo-save-button'); - await page.waitForTimeout(1000); - await page.waitForNetworkIdle(); - - expect(await page.screenshotSelector(contentSelector)).to.matchImage('disable_logo_upload'); - - expect(fs.existsSync(logoPublicPath)).to.be.false; - expect(fs.existsSync(logoTmpPath)).to.be.false; - expect(fs.existsSync(faviconPublicPath)).to.be.false; - expect(fs.existsSync(faviconTmpPath)).to.be.false; - }); -}); diff --git a/plugins/CoreAdminHome/tests/UI/CustomLogo_spec.js b/plugins/CoreAdminHome/tests/UI/CustomLogo_spec.js deleted file mode 100644 index a005e19558f18dc6ea2132d87f295c13fae37773..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/UI/CustomLogo_spec.js +++ /dev/null @@ -1,81 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -var fs = require('fs'), - path = require('../../../../tests/lib/screenshot-testing/support/path'); - -describe("CustomLogo", function () { - before(function () { - testEnvironment.optionsOverride = { - branding_use_custom_logo: '1' - }; - testEnvironment.save(); - }); - - afterEach(function () { - [ - path.join(PIWIK_INCLUDE_PATH, "/misc/user/logo.png"), - path.join(PIWIK_INCLUDE_PATH, "/misc/user/logo-header.png"), - path.join(PIWIK_INCLUDE_PATH, "/misc/user/logo.svg") - ].forEach(function(file) { - if (fs.existsSync(file)) { - fs.unlinkSync(file); - } - }); - testEnvironment.testUseMockAuth = 1; - testEnvironment.save(); - }); - - var copyLogo = function(svg) { - fs.copyFileSync(path.join(PIWIK_INCLUDE_PATH, "/tests/resources/customlogo/logo.png"), path.join(PIWIK_INCLUDE_PATH, "/misc/user/logo.png")); - fs.copyFileSync(path.join(PIWIK_INCLUDE_PATH, "/tests/resources/customlogo/logo-header.png"), path.join(PIWIK_INCLUDE_PATH, "/misc/user/logo-header.png")); - - if (svg) { - fs.copyFileSync(path.join(PIWIK_INCLUDE_PATH, "/tests/resources/customlogo/logo.svg"), path.join(PIWIK_INCLUDE_PATH, "/misc/user/logo.svg")); - } - }; - - [true, false].forEach(function (useSvg) { - - var appendName = useSvg ? '_svg' : ''; - var appendTitle = useSvg ? ' SVG' : ''; - - it('should show the custom'+appendTitle+' logo in admin header', async function () { - copyLogo(useSvg); - await page.goto("?idSite=1&period=year&date=2012-08-09&module=CoreAdminHome&action=index"); - - var navWrap = await page.$('.nav-wrapper'); - expect(await navWrap.screenshot()).to.matchImage('admin'+appendName); - }); - - it('should show the custom'+appendTitle+' logo in login header', async function () { - testEnvironment.testUseMockAuth = 0; - testEnvironment.save(); - - copyLogo(useSvg); - await page.goto(""); - var navWrap = await page.$('.nav-wrapper'); - expect(await navWrap.screenshot()).to.matchImage('login'+appendName); - }); - - it('should show the custom'+appendTitle+' logo in unsubscribe email header', async function () { - copyLogo(useSvg); - await page.goto("?module=ScheduledReports&action=unsubscribe&token="); - var navWrap = await page.$('.nav-wrapper'); - expect(await navWrap.screenshot()).to.matchImage('unsubscribe'+appendName); - }); - }); - - // dummy test to ensure custom logo usage is reset - it('should remove the custom logo usage', async function () { - testEnvironment.optionsOverride = { - branding_use_custom_logo: '0' - }; - testEnvironment.save(); - await page.goto(""); - }); -}); diff --git a/plugins/CoreAdminHome/tests/UI/SystemSettings_spec.js b/plugins/CoreAdminHome/tests/UI/SystemSettings_spec.js deleted file mode 100644 index 73a899c7530117cbb11e2e382c4ebbc5b5819a87..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/UI/SystemSettings_spec.js +++ /dev/null @@ -1,113 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * Screenshot integration tests. - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -describe("SystemSettings", function () { - - this.fixture = "Piwik\\Tests\\Fixtures\\EmptySite"; - - var baseUrl = '?module=CoreAdminHome&action=generalSettings'; - - async function screenshotPageWrap() { - const pageWrap = await page.$('.pageWrap'); - const screenshot = await pageWrap.screenshot(); - return screenshot; - } - - async function setCnilPolicyEnforced(enforced) { - if (enforced) { - testEnvironment.overrideConfig('CnilPolicy', 'cnil_v1_policy_enabled', 1); - } else { - delete testEnvironment.configOverride.CnilPolicy; - } - await testEnvironment.save(); - } - - it('should load the system settings correctly', async function () { - await page.goto(baseUrl); - - expect(await screenshotPageWrap()).to.matchImage('settings'); - }); - - it('should display compliance info for policy controlled settings', async function () { - await setCnilPolicyEnforced(true); - await page.goto(baseUrl); - await page.waitForNetworkIdle(); - await setCnilPolicyEnforced(false); - - expect(await screenshotPageWrap()).to.matchImage('compliance_info'); - }); - - describe('mail settings password confirmation', function () { - var smtpSaveButton = '[vue-entry="CoreAdminHome.SmtpSettings"] .matomo-save-button'; - - async function openMailSettingsConfirmation() { - // ensure no leftover modal/overlay from a previous interaction can swallow the click - await page.waitForFunction( - () => $('.modal.open').length === 0 && $('.modal-overlay').length === 0 - ); - await page.click(smtpSaveButton); - await page.waitForSelector('.modal.open #currentUserPassword', { visible: true }); - await page.waitForTimeout(250); - } - - it('should require password confirmation when saving the mail settings', async function () { - await page.goto(baseUrl); - await page.waitForNetworkIdle(); - - await openMailSettingsConfirmation(); - - const passwordFieldVisible = await page.evaluate( - () => $('.modal.open #currentUserPassword:visible').length > 0 - ); - expect(passwordFieldVisible).to.equal(true); - }); - - it('should not save the mail settings when the confirmation is aborted', async function () { - await (await page.jQuery('.confirm-password-modal .modal-close.modal-no:visible')).click(); - await page.waitForFunction(() => $('.modal.open').length === 0); - - const hasSuccessNotification = await page.evaluate( - () => $('.notification-success').length > 0 - ); - expect(hasSuccessNotification).to.equal(false); - }); - - it('should not save the mail settings when the confirmed password is wrong', async function () { - await openMailSettingsConfirmation(); - - await page.type('.modal.open #currentUserPassword', 'wrongpassword'); - await (await page.jQuery('.confirm-password-modal .confirm-password-btn:visible')).click(); - await page.waitForNetworkIdle(); - - await page.waitForSelector('.notification-error', { visible: true }); - - const notificationHtml = await page.evaluate( - () => $('.notification-error>div>div').html() - ); - expect(notificationHtml).to.equal('The current password you entered is not correct.'); - }); - - it('should save the mail settings when the correct password is confirmed', async function () { - await page.evaluate(() => $('.notification-error .close').click()); - - await openMailSettingsConfirmation(); - - await page.type('.modal.open #currentUserPassword', superUserPassword); - await (await page.jQuery('.confirm-password-modal .confirm-password-btn:visible')).click(); - await page.waitForNetworkIdle(); - - await page.waitForSelector('.notification-success', { visible: true }); - - const hasSuccessNotification = await page.evaluate( - () => $('.notification-success').length > 0 - ); - expect(hasSuccessNotification).to.equal(true); - }); - }); -}); diff --git a/plugins/CoreAdminHome/tests/UI/TrackingCodeGenerator_spec.js b/plugins/CoreAdminHome/tests/UI/TrackingCodeGenerator_spec.js deleted file mode 100644 index 22f35727005d4fc737ccf9b6139ce9e2df1d2596..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/UI/TrackingCodeGenerator_spec.js +++ /dev/null @@ -1,100 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * TrackingCodeGenerator screenshot tests. - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -describe("TrackingCodeGenerator", function () { - var generalParams = 'idSite=1&period=year&date=2023-08-09'; - - before(async function () { - await testEnvironment.callApi("SitesManager.setSiteAliasUrls", {idSite: 7, urls: ['https://another.site.com']}); - }); - - after(async function () { - await testEnvironment.callApi("SitesManager.setSiteAliasUrls", {idSite: 7, urls: []}); - }); - - it('should load the Tracking Code admin page correctly', async function () { - await page.goto("?" + generalParams + "&module=CoreAdminHome&action=trackingCodeGenerator"); - - // replace container id in tagmanager code, as it changes when updating omnifixture - await page.evaluate(function () { - $('.tagManagerTrackingCode pre').html($('.tagManagerTrackingCode pre').html().replace(/container_[A-z0-9]+\.js/, 'container_REPLACED.js')); - }); - - pageWrap = await page.$('.pageWrap'); - expect(await pageWrap.screenshot()).to.matchImage('initial'); - }); - - it('should be possible to show advanced options', async function () { - await page.click('.advance-option a'); - - pageWrap = await page.$('[vue-entry="CoreAdminHome.JsTrackingCodeGenerator"]'); - expect(await pageWrap.screenshot()).to.matchImage('advanced'); - }); - - it('should update tracking code when selecting some advanced options', async function () { - await page.click('#javascript-tracking-all-subdomains'); - await page.click('#javascript-tracking-group-by-domain'); - await page.click('#javascript-tracking-all-aliases'); - await page.click('#javascript-tracking-noscript'); - await page.click('#javascript-tracking-visitor-cv-check'); - await page.click('#javascript-tracking-do-not-track'); - await page.click('#javascript-tracking-disable-cookies'); - await page.click('#custom-campaign-query-params-check'); - await page.click('#require-consent-for-campaign-tracking'); - - await page.waitForNetworkIdle(); - await page.waitForTimeout(500); // wait till tracking code was updated - - pageWrap = await page.$('[vue-entry="CoreAdminHome.JsTrackingCodeGenerator"]'); - expect(await pageWrap.screenshot()).to.matchImage('advanced_selected_options'); - }); - - it('should include custom variables when added', async function () { - await (await page.jQuery('.custom-variable-name')).type('cvar1'); - await (await page.jQuery('.custom-variable-value')).type('value1'); - await page.waitForNetworkIdle(); - await page.click('.add-custom-variable'); - await (await page.jQuery('.custom-variable-name:eq(1)')).type('cvar2'); - await (await page.jQuery('.custom-variable-value:eq(1)')).type('Ysงv$美$ф'); - await page.click('.add-custom-variable'); - await page.waitForNetworkIdle(); - await page.waitForTimeout(500); // wait till tracking code was updated - - pageWrap = await page.$('[vue-entry="CoreAdminHome.JsTrackingCodeGenerator"]'); - expect(await pageWrap.screenshot()).to.matchImage('advanced_cvars'); - }); - - it('should use custom campaign parameters when provided', async function () { - await page.type('#custom-campaign-name-query-param', 'customname'); - await page.type('#custom-campaign-keyword-query-param', 'customkeyword'); - await page.waitForNetworkIdle(); - await page.waitForTimeout(500); // wait till tracking code was updated - - pageWrap = await page.$('[vue-entry="CoreAdminHome.JsTrackingCodeGenerator"]'); - expect(await pageWrap.screenshot()).to.matchImage('advanced_campaign'); - }); - - it('should allow selecting cross domain when multiple site urls configured', async function () { - await page.goto("?idSite=7&period=year&date=2023-08-09&module=CoreAdminHome&action=trackingCodeGenerator"); - await page.click('.advance-option a'); - - pageWrap = await page.$('[vue-entry="CoreAdminHome.JsTrackingCodeGenerator"]'); - expect(await pageWrap.screenshot()).to.matchImage('cross_domain'); - }); - - it('selecting cross domain will also check outlink option', async function () { - await page.click('#javascript-tracking-cross-domain'); - await page.waitForNetworkIdle(); - await page.waitForTimeout(500); // wait till tracking code was updated - - pageWrap = await page.$('[vue-entry="CoreAdminHome.JsTrackingCodeGenerator"]'); - expect(await pageWrap.screenshot()).to.matchImage('cross_domain_checked'); - }); - -}); diff --git a/plugins/CoreAdminHome/tests/UI/TrackingFailures_spec.js b/plugins/CoreAdminHome/tests/UI/TrackingFailures_spec.js deleted file mode 100644 index acb77a7ab477b7c53d6146725439cf4eb9baf29a..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/UI/TrackingFailures_spec.js +++ /dev/null @@ -1,94 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link https://matomo.org - * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -describe("TrackingFailures", function () { - this.fixture = 'Piwik\\Tests\\Fixtures\\InvalidVisits'; - - var manageUrl = '?module=CoreAdminHome&action=trackingFailures&idSite=1&period=day&date=today'; - var widgetUrl = '?module=Widgetize&action=iframe&moduleToWidgetize=CoreAdminHome&actionToWidgetize=getTrackingFailures&idSite=1&period=day&date=today&widget=1'; - - function generateTrackingFailures() - { - testEnvironment.generateTrackingFailures = 1; - testEnvironment.save(); - } - - async function confirmModal() - { - await (await page.jQuery('.modal.open .modal-footer a:contains(Yes):visible')).click(); - } - - afterEach(function () { - delete testEnvironment.generateTrackingFailures; - testEnvironment.save(); - }); - - it('should show widget with no failures', async function () { - await page.goto(widgetUrl); - expect(await page.screenshot({ fullPage: true })).to.matchImage('widget_no_failures'); - }); - - it('should show manage page with no failures', async function () { - await page.goto(manageUrl); - const frame = await page.waitForSelector('.matomoTrackingFailures'); - expect(await frame.screenshot()).to.matchImage('manage_no_failures'); - }); - - it('should show widget with failures', async function () { - generateTrackingFailures(); - await page.waitForTimeout(500); - await page.goto(widgetUrl); - expect(await page.screenshot({ fullPage: true })).to.matchImage('widget_with_failures'); - }); - - it('should show manage page with failures', async function () { - await page.goto(manageUrl); - await page.waitForSelector('.matomoTrackingFailures td'); - await page.waitForTimeout(250); - - const elem = await page.$('.matomoTrackingFailures'); - expect(await elem.screenshot()).to.matchImage('manage_with_failures'); - }); - - it('should show ask to confirm delete one', async function () { - await page.evaluate(function () { - $('.matomoTrackingFailures table tbody tr:nth-child(2) .icon-delete').click(); - }); - - const elem = await page.waitForSelector('.modal.open'); - await page.waitForTimeout(500); - expect(await elem.screenshot()).to.matchImage('manage_with_failures_delete_one_ask_confirmation'); - }); - - it('should show delete when confirmed', async function () { - await confirmModal(); - await page.waitForNetworkIdle(); - - await page.waitForSelector('.matomoTrackingFailures td .icon-delete'); - - await page.waitForTimeout(500); // animation - - const elem = await page.$('.matomoTrackingFailures'); - expect(await elem.screenshot()).to.matchImage('manage_with_failures_delete_one_confirmed'); - }); - - it('should show ask to confirm delete all', async function () { - await page.click('.matomoTrackingFailures .deleteAllFailures'); - await page.waitForSelector('.modal.open'); - await page.waitForTimeout(500); - expect(await (await page.$('.modal.open')).screenshot()).to.matchImage('manage_with_failures_delete_all_ask_confirmation'); - }); - - it('should show nothing when confirmed', async function () { - await confirmModal(); - await page.waitForSelector('.matomoTrackingFailures td .icon-ok'); - await page.waitForTimeout(500); - const frame = await page.waitForSelector('.matomoTrackingFailures'); - expect(await frame.screenshot()).to.matchImage('manage_with_failures_delete_all_confirmed'); - }); - -}); diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_reloaded_first.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_reloaded_first.png deleted file mode 100644 index 786a5d9e2cb56634afd821db7efb62aca378f33a..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_reloaded_first.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_reloaded_second.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_reloaded_second.png deleted file mode 100644 index 786a5d9e2cb56634afd821db7efb62aca378f33a..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_reloaded_second.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_saved.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_saved.png deleted file mode 100644 index 4740fc3febf98cc983c4ab8e83c847ac97080f5b..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_branding_settings_saved.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_custom_favicon_uploaded.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_custom_favicon_uploaded.png deleted file mode 100644 index b48a211c051e82a91c58eb6142cc7fe8ffe0e329..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_custom_favicon_uploaded.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_custom_logo_uploaded.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_custom_logo_uploaded.png deleted file mode 100644 index ad74599ccad7b93d9193dfeb482c9a3655364cb4..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_custom_logo_uploaded.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_disable_logo_upload.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_disable_logo_upload.png deleted file mode 100644 index 9880dab63256d574891a7dd7e7cd373e6e41d00f..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_disable_logo_upload.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_enable_logo_upload.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_enable_logo_upload.png deleted file mode 100644 index eb165420f8c77f25cebb855c1697db22426b8226..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogoUpload_enable_logo_upload.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_admin.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_admin.png deleted file mode 100644 index 8b5d0fe11aae99ce399fdd980b279cedddeebc35..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_admin.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_admin_svg.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_admin_svg.png deleted file mode 100644 index 6d27c45f23066c9dbf4cebe56549ce5164701414..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_admin_svg.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_login.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_login.png deleted file mode 100644 index 4e6c7502eab22f8aea9024944b61c104879f6869..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_login.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_login_svg.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_login_svg.png deleted file mode 100644 index 60e5aef651faff217e9bf0aa878804d9fa6a5d39..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_login_svg.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_unsubscribe.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_unsubscribe.png deleted file mode 100644 index 4e6c7502eab22f8aea9024944b61c104879f6869..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_unsubscribe.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_unsubscribe_svg.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_unsubscribe_svg.png deleted file mode 100644 index 60e5aef651faff217e9bf0aa878804d9fa6a5d39..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/CustomLogo_unsubscribe_svg.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/SystemSettings_compliance_info.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/SystemSettings_compliance_info.png deleted file mode 100644 index 85b1e7f3d51a770561b04e15e5681e754def3514..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/SystemSettings_compliance_info.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/SystemSettings_settings.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/SystemSettings_settings.png deleted file mode 100644 index d5b9f0447eab484768f17cff80400d98930b680b..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/SystemSettings_settings.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced.png deleted file mode 100644 index 39480553eac673b84b5a210e772b51dfe4880c6c..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_campaign.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_campaign.png deleted file mode 100644 index c615f835614ae4a28d44b56e568e934db6755485..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_campaign.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_cvars.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_cvars.png deleted file mode 100644 index 9c664a5a7fcf26df58dd593cfca3ad36e63e7c63..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_cvars.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_selected_options.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_selected_options.png deleted file mode 100644 index 6eae79d6747dac9461997b6cb3101180ded54cd0..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_advanced_selected_options.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_cross_domain.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_cross_domain.png deleted file mode 100644 index 3e925558afd84aa56a3bb560f70a89061426cc1c..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_cross_domain.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_cross_domain_checked.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_cross_domain_checked.png deleted file mode 100644 index ddebd76088e29d178ff033f8d93d3a48c4a6067a..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_cross_domain_checked.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_initial.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_initial.png deleted file mode 100644 index df0a06391f1d707398d92f2c43bc784360259439..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingCodeGenerator_initial.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_no_failures.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_no_failures.png deleted file mode 100644 index 88a63d4763912457291d7cff30c09de6eeb9406c..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_no_failures.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures.png deleted file mode 100644 index b80d6f5d271a5444e31a485b98c7cb92b1abde58..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png deleted file mode 100644 index afa86eace3e368444ae550bd5895231380afaa6b..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_all_confirmed.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_all_confirmed.png deleted file mode 100644 index 88a63d4763912457291d7cff30c09de6eeb9406c..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_all_confirmed.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png deleted file mode 100644 index aa20caf63b4964befdecdcb66f9e7c39fd7822e7..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_one_confirmed.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_one_confirmed.png deleted file mode 100644 index 35e1ee9b61e051ae0a3a8dbb84fd6ef775b56d7e..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_manage_with_failures_delete_one_confirmed.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_widget_no_failures.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_widget_no_failures.png deleted file mode 100644 index e84a2cb07c1ecdce900a393519dbd21ac0acda4a..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_widget_no_failures.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_widget_with_failures.png b/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_widget_with_failures.png deleted file mode 100644 index ad78440f805627f603baf1330ac8b9257919515e..0000000000000000000000000000000000000000 Binary files a/plugins/CoreAdminHome/tests/UI/expected-screenshots/TrackingFailures_widget_with_failures.png and /dev/null differ diff --git a/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php b/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php deleted file mode 100644 index 7bb7a1e9f826909584d1b5b080ceaff9786064bb..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php +++ /dev/null @@ -1,168 +0,0 @@ -mockConfigData[$sectionName])) { - $this->mockConfigData[$sectionName] = array(); - } - - $result =& $this->mockConfigData[$sectionName]; - return $result; - } - - public function __set($sectionName, $section) - { - $this->mockConfigData[$sectionName] = $section; - } -} - -/** - * @group CoreAdminHome - * @group CoreAdminHome_Unit - */ -class ConfigSettingManipulationTest extends \PHPUnit\Framework\TestCase -{ - /** - * @var Config - */ - private $mockConfig; - - public function setUp(): void - { - $this->mockConfig = new DumbMockConfig(); - } - - /** - * @dataProvider getTestDataForMake - */ - public function testMakeCreatesCorrectManipulation( - $assignmentString, - $expectedSectionName, - $expectedSettingName, - $expectedSettingValue, - $expectedIsArrayAppend - ) { - $manipulation = ConfigSettingManipulation::make($assignmentString); - - $this->assertEquals($expectedSectionName, $manipulation->getSectionName()); - $this->assertEquals($expectedSettingName, $manipulation->getName()); - $this->assertEquals($expectedSettingValue, $manipulation->getValue()); - $this->assertEquals($expectedIsArrayAppend, $manipulation->isArrayAppend()); - } - - public function getTestDataForMake() - { - return array( - // normal assign - array("General.myconfig=0", "General", "myconfig", 0, false), - - // array append - array("General.myconfig444[]=5", "General", "myconfig444", 5, true), - - // assign array - array("1General1.2config2=[\"abc\",\"def\"]", "1General1", "2config2", array('abc', 'def'), false), - - // assign string - array("MySection.value=\"ghi\"", "MySection", "value", "ghi", false), - - // assign boolean - array("MySection.value=false", "MySection", "value", false, false), - array("MySection.value=true", "MySection", "value", true, false), - ); - } - - /** - * @dataProvider getFailureTestDataForMake - */ - public function testMakeThrowsWhenInvalidAssignmentStringSupplied($assignmentString) - { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('Invalid assignment string'); - - ConfigSettingManipulation::make($assignmentString); - } - - public function getFailureTestDataForMake() - { - return array( - array("General&.value=1"), - array("General.val&*ue=12"), - array("General.value=[notjson]"), - array("General.value=notjson"), - array("General.array[abc]=\"def\""), - ); - } - - public function testManipulateThrowsIfAppendingNonArraySetting() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Trying to append to non-array setting value'); - - $this->mockConfig->mockConfigData['General']['config'] = "5"; - - $manipulation = new ConfigSettingManipulation("General", "config", "10", true); - $manipulation->manipulate($this->mockConfig); - } - - public function testManipulateThrowsIfAssigningNonArrayValueToArraySetting() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Trying to set non-array value to array setting'); - - $this->mockConfig->mockConfigData['General']['config'] = array("5"); - - $manipulation = new ConfigSettingManipulation("General", "config", "10", false); - $manipulation->manipulate($this->mockConfig); - } - - /** - * @dataProvider getTestDataForManipulate - */ - public function testManipulateCorrectlyManipulatesConfig($sectionName, $name, $value, $isArrayAppend, $expectedConfig) - { - $manipulation = new ConfigSettingManipulation($sectionName, $name, $value, $isArrayAppend); - $manipulation->manipulate($this->mockConfig); - - $this->assertEquals($expectedConfig, $this->mockConfig->mockConfigData); - } - - public function getTestDataForManipulate() - { - return array( - // normal assign (string, int, array, bool) - array("Section", "config_setting", "stringvalue", false, array("Section" => array("config_setting" => "stringvalue"))), - array("Section", "config_setting", 25, false, array("Section" => array("config_setting" => 25))), - array("Section", "config_setting", array('a' => 'b'), false, array("Section" => array("config_setting" => array('a' => 'b')))), - array("Section", "config_setting", false, false, array("Section" => array("config_setting" => false))), - - // array append - array("Section", "config_setting", "value", true, array("Section" => array("config_setting" => array('value')))), - array("Section", "config_setting", array(1,2), true, array("Section" => array("config_setting" => array(array(1,2))))), - ); - } -} diff --git a/plugins/CoreAdminHome/vue/dist/CoreAdminHome.umd.js b/plugins/CoreAdminHome/vue/dist/CoreAdminHome.umd.js deleted file mode 100644 index b51dad24d7ca5df299beb97091c141652219b3e2..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/vue/dist/CoreAdminHome.umd.js +++ /dev/null @@ -1,2245 +0,0 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("CoreHome"), require("vue"), require("CorePluginsAdmin")); - else if(typeof define === 'function' && define.amd) - define(["CoreHome", , "CorePluginsAdmin"], factory); - else if(typeof exports === 'object') - exports["CoreAdminHome"] = factory(require("CoreHome"), require("vue"), require("CorePluginsAdmin")); - else - root["CoreAdminHome"] = factory(root["CoreHome"], root["Vue"], root["CorePluginsAdmin"]); -})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__19dc__, __WEBPACK_EXTERNAL_MODULE__8bbf__, __WEBPACK_EXTERNAL_MODULE_a5a2__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "plugins/CoreAdminHome/vue/dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "fae3"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "19dc": -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE__19dc__; - -/***/ }), - -/***/ "8bbf": -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE__8bbf__; - -/***/ }), - -/***/ "a5a2": -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE_a5a2__; - -/***/ }), - -/***/ "fae3": -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -// ESM COMPAT FLAG -__webpack_require__.r(__webpack_exports__); - -// EXPORTS -__webpack_require__.d(__webpack_exports__, "ArchivingSettings", function() { return /* reexport */ ArchivingSettings; }); -__webpack_require__.d(__webpack_exports__, "BrandingSettings", function() { return /* reexport */ BrandingSettings; }); -__webpack_require__.d(__webpack_exports__, "SmtpSettings", function() { return /* reexport */ SmtpSettings; }); -__webpack_require__.d(__webpack_exports__, "JsTrackingCodeGenerator", function() { return /* reexport */ JsTrackingCodeGenerator; }); -__webpack_require__.d(__webpack_exports__, "JsTrackingCodeGeneratorSitesWithoutData", function() { return /* reexport */ JsTrackingCodeGeneratorSitesWithoutData; }); -__webpack_require__.d(__webpack_exports__, "ImageTrackingCodeGenerator", function() { return /* reexport */ ImageTrackingCodeGenerator; }); -__webpack_require__.d(__webpack_exports__, "TrackingFailures", function() { return /* reexport */ TrackingFailures; }); - -// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js -// This file is imported into lib/wc client bundles. - -if (typeof window !== 'undefined') { - var currentScript = window.document.currentScript - if (false) { var getCurrentScript; } - - var src = currentScript && currentScript.src.match(/(.+\/)[^/]+\.js(\?.*)?$/) - if (src) { - __webpack_require__.p = src[1] // eslint-disable-line - } -} - -// Indicate to webpack that this file can be concatenated -/* harmony default export */ var setPublicPath = (null); - -// EXTERNAL MODULE: external {"commonjs":"vue","commonjs2":"vue","root":"Vue"} -var external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__("8bbf"); - -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/CoreAdminHome/vue/src/ArchivingSettings/ArchivingSettings.vue?vue&type=template&id=554c5c7e - -const _hoisted_1 = { - class: "form-group row" -}; -const _hoisted_2 = { - class: "col s12" -}; -const _hoisted_3 = { - class: "col s12 m6" -}; -const _hoisted_4 = { - class: "form-description", - style: { - "margin-left": "4px" - } -}; -const _hoisted_5 = { - for: "enableBrowserTriggerArchiving2" -}; -const _hoisted_6 = ["innerHTML"]; -const _hoisted_7 = { - class: "col s12 m6" -}; -const _hoisted_8 = ["innerHTML"]; -const _hoisted_9 = { - class: "form-group row" -}; -const _hoisted_10 = { - class: "col s12" -}; -const _hoisted_11 = { - class: "input-field col s12 m6" -}; -const _hoisted_12 = ["disabled"]; -const _hoisted_13 = { - class: "form-description" -}; -const _hoisted_14 = { - class: "col s12 m6" -}; -const _hoisted_15 = { - key: 0, - class: "form-help" -}; -const _hoisted_16 = { - key: 0 -}; -const _hoisted_17 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); -const _hoisted_18 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); -const _hoisted_19 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); -function render(_ctx, _cache, $props, $setup, $data, $options) { - const _component_SaveButton = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("SaveButton"); - const _component_ContentBlock = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("ContentBlock"); - return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_ContentBlock, { - "content-title": _ctx.translate('CoreAdminHome_ArchivingSettings'), - anchor: "archivingSettings", - class: "matomo-archiving-settings" - }, { - default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(() => [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", _hoisted_2, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_AllowPiwikArchivingToTriggerBrowser')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("label", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { - type: "radio", - id: "enableBrowserTriggerArchiving1", - name: "enableBrowserTriggerArchiving", - value: "1", - "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => _ctx.enableBrowserTriggerArchivingValue = $event) - }, null, 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelRadio"], _ctx.enableBrowserTriggerArchivingValue]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Yes')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_4, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Default')), 1)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("label", _hoisted_5, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { - type: "radio", - id: "enableBrowserTriggerArchiving2", - name: "enableBrowserTriggerArchiving", - value: "0", - "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => _ctx.enableBrowserTriggerArchivingValue = $event) - }, null, 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelRadio"], _ctx.enableBrowserTriggerArchivingValue]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_No')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { - class: "form-description", - innerHTML: _ctx.$sanitize(_ctx.archivingTriggerDesc), - style: { - "margin-left": "4px" - } - }, null, 8, _hoisted_6)])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_7, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { - class: "form-help", - innerHTML: _ctx.$sanitize(_ctx.archivingInlineHelp) - }, null, 8, _hoisted_8)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", _hoisted_10, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ReportsContainingTodayWillBeProcessedAtMostEvery')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_11, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { - type: "text", - "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => _ctx.todayArchiveTimeToLiveValue = $event), - id: "todayArchiveTimeToLive", - disabled: !_ctx.isGeneralSettingsAdminEnabled - }, null, 8, _hoisted_12), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelText"], _ctx.todayArchiveTimeToLiveValue]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_13, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_RearchiveTimeIntervalOnlyForTodayReports')), 1)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_14, [_ctx.isGeneralSettingsAdminEnabled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_15, [_ctx.showWarningCron ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("strong", _hoisted_16, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_NewReportsWillBeProcessedByCron')), 1), _hoisted_17, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ReportsWillBeProcessedAtMostEveryHour')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_IfArchivingIsFastYouCanSetupCronRunMoreOften')), 1), _hoisted_18])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_SmallTrafficYouCanLeaveDefault', _ctx.todayArchiveTimeToLiveDefault)) + " ", 1), _hoisted_19, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_MediumToHighTrafficItIsRecommendedTo', 1800, 3600)), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_SaveButton, { - saving: _ctx.isLoading, - onConfirm: _cache[3] || (_cache[3] = $event => _ctx.save()) - }, null, 8, ["saving"])])])]), - _: 1 - }, 8, ["content-title"]); -} -// CONCATENATED MODULE: ./plugins/CoreAdminHome/vue/src/ArchivingSettings/ArchivingSettings.vue?vue&type=template&id=554c5c7e - -// EXTERNAL MODULE: external "CoreHome" -var external_CoreHome_ = __webpack_require__("19dc"); - -// EXTERNAL MODULE: external "CorePluginsAdmin" -var external_CorePluginsAdmin_ = __webpack_require__("a5a2"); - -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--15-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--15-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/CoreAdminHome/vue/src/ArchivingSettings/ArchivingSettings.vue?vue&type=script&lang=ts - - - -/* harmony default export */ var ArchivingSettingsvue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({ - props: { - enableBrowserTriggerArchiving: Boolean, - showSegmentArchiveTriggerInfo: Boolean, - isGeneralSettingsAdminEnabled: Boolean, - showWarningCron: Boolean, - todayArchiveTimeToLive: Number, - todayArchiveTimeToLiveDefault: Number - }, - components: { - ContentBlock: external_CoreHome_["ContentBlock"], - SaveButton: external_CorePluginsAdmin_["SaveButton"] - }, - data() { - return { - isLoading: false, - enableBrowserTriggerArchivingValue: this.enableBrowserTriggerArchiving ? 1 : 0, - todayArchiveTimeToLiveValue: this.todayArchiveTimeToLive - }; - }, - watch: { - enableBrowserTriggerArchiving(newValue) { - this.enableBrowserTriggerArchivingValue = newValue ? 1 : 0; - }, - todayArchiveTimeToLive(newValue) { - this.todayArchiveTimeToLiveValue = newValue; - } - }, - computed: { - archivingTriggerDesc() { - let result = ''; - result += Object(external_CoreHome_["translate"])('General_ArchivingTriggerDescription', Object(external_CoreHome_["externalLink"])('https://matomo.org/docs/setup-auto-archiving/'), ''); - if (this.showSegmentArchiveTriggerInfo) { - result += Object(external_CoreHome_["translate"])('General_ArchivingTriggerSegment'); - } - return result; - }, - archivingInlineHelp() { - let result = Object(external_CoreHome_["translate"])('General_ArchivingInlineHelp'); - result += '
    '; - result += Object(external_CoreHome_["translate"])('General_SeeTheOfficialDocumentationForMoreInformation', Object(external_CoreHome_["externalLink"])('https://matomo.org/docs/setup-auto-archiving/'), ''); - return result; - } - }, - methods: { - save() { - this.isLoading = true; - external_CoreHome_["AjaxHelper"].post({ - module: 'API', - method: 'CoreAdminHome.setArchiveSettings' - }, { - enableBrowserTriggerArchiving: this.enableBrowserTriggerArchivingValue, - todayArchiveTimeToLive: this.todayArchiveTimeToLiveValue - }).then(() => { - this.isLoading = false; - const notificationId = external_CoreHome_["NotificationsStore"].show({ - message: Object(external_CoreHome_["translate"])('CoreAdminHome_SettingsSaveSuccess'), - type: 'transient', - id: 'generalSettings', - context: 'success' - }); - external_CoreHome_["NotificationsStore"].scrollToNotification(notificationId); - }).finally(() => { - this.isLoading = false; - }); - } - } -})); -// CONCATENATED MODULE: ./plugins/CoreAdminHome/vue/src/ArchivingSettings/ArchivingSettings.vue?vue&type=script&lang=ts - -// CONCATENATED MODULE: ./plugins/CoreAdminHome/vue/src/ArchivingSettings/ArchivingSettings.vue - - - -ArchivingSettingsvue_type_script_lang_ts.render = render - -/* harmony default export */ var ArchivingSettings = (ArchivingSettingsvue_type_script_lang_ts); -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/CoreAdminHome/vue/src/BrandingSettings/BrandingSettings.vue?vue&type=template&id=68734f11 - -const BrandingSettingsvue_type_template_id_68734f11_hoisted_1 = { - id: "logoSettings" -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_2 = { - id: "logoUploadForm", - ref: "logoUploadForm", - method: "post", - enctype: "multipart/form-data", - action: "index.php?module=CoreAdminHome&format=json&action=uploadCustomLogo" -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_3 = { - key: 0 -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_4 = ["value"]; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_5 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { - type: "hidden", - name: "force_api_session", - value: "1" -}, null, -1); -const BrandingSettingsvue_type_template_id_68734f11_hoisted_6 = { - key: 0 -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_7 = { - key: 0, - class: "alert alert-warning uploaderror" -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_8 = { - class: "row" -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_9 = { - class: "col s12" -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_10 = ["src"]; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_11 = { - class: "row" -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_12 = { - class: "col s12" -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_13 = ["src"]; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_14 = { - key: 1 -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_15 = ["innerHTML"]; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_16 = { - key: 1 -}; -const BrandingSettingsvue_type_template_id_68734f11_hoisted_17 = { - class: "alert alert-warning" -}; -function BrandingSettingsvue_type_template_id_68734f11_render(_ctx, _cache, $props, $setup, $data, $options) { - const _component_Field = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("Field"); - const _component_SaveButton = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("SaveButton"); - const _component_ContentBlock = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("ContentBlock"); - const _directive_form = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDirective"])("form"); - return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_ContentBlock, { - "content-title": _ctx.translate('CoreAdminHome_BrandingSettings'), - anchor: "brandingSettings" - }, { - default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(() => [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("p", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('CoreAdminHome_CustomLogoHelpText')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { - name: "useCustomLogo", - uicontrol: "checkbox", - "model-value": _ctx.enabled, - "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => _ctx.onUseCustomLogoChange($event)), - title: _ctx.translate('CoreAdminHome_UseCustomLogo'), - "inline-help": _ctx.help - }, null, 8, ["model-value", "title", "inline-help"]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("form", BrandingSettingsvue_type_template_id_68734f11_hoisted_2, [_ctx.fileUploadEnabled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { - type: "hidden", - name: "token_auth", - value: _ctx.tokenAuth - }, null, 8, BrandingSettingsvue_type_template_id_68734f11_hoisted_4), BrandingSettingsvue_type_template_id_68734f11_hoisted_5, _ctx.logosWriteable ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_6, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Transition"], { - name: "fade-out" - }, { - default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(() => [_ctx.showUploadError ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_7, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('CoreAdminHome_LogoUploadFailed')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), - _: 1 - }), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { - uicontrol: "file", - name: "customLogo", - "model-value": _ctx.customLogo, - "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => _ctx.onCustomLogoChange($event)), - title: _ctx.translate('CoreAdminHome_LogoUpload'), - "inline-help": _ctx.translate('CoreAdminHome_LogoUploadHelp', 'JPG / PNG / GIF', '110') - }, null, 8, ["model-value", "title", "inline-help"]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_9, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", { - src: _ctx.pathUserLogoSrc, - id: "currentLogo", - style: { - "max-height": "150px" - }, - ref: "currentLogo" - }, null, 8, BrandingSettingsvue_type_template_id_68734f11_hoisted_10)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { - uicontrol: "file", - name: "customFavicon", - "model-value": _ctx.customFavicon, - "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => _ctx.onFaviconChange($event)), - title: _ctx.translate('CoreAdminHome_FaviconUpload'), - "inline-help": _ctx.translate('CoreAdminHome_LogoUploadHelp', 'JPG / PNG / GIF', '16') - }, null, 8, ["model-value", "title", "inline-help"]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_11, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_12, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", { - src: _ctx.pathUserFaviconSrc, - id: "currentFavicon", - width: "16", - height: "16", - ref: "currentFavicon" - }, null, 8, BrandingSettingsvue_type_template_id_68734f11_hoisted_13)])])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.logosWriteable ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_14, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { - class: "alert alert-warning", - innerHTML: _ctx.$sanitize(_ctx.logosNotWriteableWarning) - }, null, 8, BrandingSettingsvue_type_template_id_68734f11_hoisted_15)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.fileUploadEnabled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_16, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", BrandingSettingsvue_type_template_id_68734f11_hoisted_17, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('CoreAdminHome_FileUploadDisabled', "file_uploads=1")), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 512)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.enabled]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_SaveButton, { - onConfirm: _cache[3] || (_cache[3] = $event => _ctx.save()), - saving: _ctx.isLoading - }, null, 8, ["saving"])])), [[_directive_form]])]), - _: 1 - }, 8, ["content-title"]); -} -// CONCATENATED MODULE: ./plugins/CoreAdminHome/vue/src/BrandingSettings/BrandingSettings.vue?vue&type=template&id=68734f11 - -// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--15-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--15-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--1-1!./plugins/CoreAdminHome/vue/src/BrandingSettings/BrandingSettings.vue?vue&type=script&lang=ts - - - -const { - $: BrandingSettingsvue_type_script_lang_ts_$ -} = window; -/* harmony default export */ var BrandingSettingsvue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({ - props: { - fileUploadEnabled: { - type: Boolean, - required: true - }, - logosWriteable: { - type: Boolean, - required: true - }, - useCustomLogo: { - type: Boolean, - required: true - }, - pathUserLogoDirectory: { - type: String, - required: true - }, - pathUserLogo: { - type: String, - required: true - }, - pathUserLogoSmall: { - type: String, - required: true - }, - pathUserLogoSvg: { - type: String, - required: true - }, - hasUserLogo: { - type: Boolean, - required: true - }, - pathUserFavicon: { - type: String, - required: true - }, - hasUserFavicon: { - type: Boolean, - required: true - }, - isPluginsAdminEnabled: { - type: Boolean, - required: true - } - }, - components: { - Field: external_CorePluginsAdmin_["Field"], - ContentBlock: external_CoreHome_["ContentBlock"], - SaveButton: external_CorePluginsAdmin_["SaveButton"] - }, - directives: { - Form: external_CorePluginsAdmin_["Form"] - }, - data() { - return { - isLoading: false, - enabled: this.useCustomLogo, - customLogo: this.pathUserLogo, - customFavicon: this.pathUserFavicon, - showUploadError: false, - currentLogoSrcExists: this.hasUserLogo, - currentFaviconSrcExists: this.hasUserFavicon, - newLogoBase64Src: '', - newFaviconBase64Src: '' - }; - }, - computed: { - tokenAuth() { - return external_CoreHome_["Matomo"].token_auth; - }, - logosNotWriteableWarning() { - return Object(external_CoreHome_["translate"])('CoreAdminHome_LogoNotWriteableInstruction', `${this.pathUserLogoDirectory}
    `, `${this.pathUserLogo}, ${this.pathUserLogoSmall}, ${this.pathUserLogoSvg}`); - }, - help() { - if (!this.isPluginsAdminEnabled) { - return undefined; - } - const giveUsFeedbackText = `"${Object(external_CoreHome_["translate"])('General_GiveUsYourFeedback')}"`; - const linkStart = ''; - return Object(external_CoreHome_["translate"])('CoreAdminHome_CustomLogoFeedbackInfo', giveUsFeedbackText, linkStart, ''); - }, - pathUserLogoSrc() { - if (this.newLogoBase64Src) { - return `data:image/png;base64, ${this.newLogoBase64Src}`; - } - if (this.currentLogoSrcExists && this.pathUserLogo) { - return this.pathUserLogo; - } - return ''; - }, - pathUserFaviconSrc() { - if (this.newFaviconBase64Src) { - return `data:image/png;base64, ${this.newFaviconBase64Src}`; - } - if (this.currentFaviconSrcExists && this.pathUserFavicon) { - return this.pathUserFavicon; - } - return ''; - } - }, - methods: { - onUseCustomLogoChange(newValue) { - this.enabled = newValue; - }, - onCustomLogoChange(newValue) { - this.customLogo = newValue; - this.updateLogo(); - }, - onFaviconChange(newValue) { - this.customFavicon = newValue; - this.updateLogo(); - }, - save() { - this.isLoading = true; - external_CoreHome_["AjaxHelper"].post({ - module: 'API', - method: 'CoreAdminHome.setBrandingSettings' - }, { - useCustomLogo: this.enabled ? '1' : '0', - hasCustomLogo: this.newLogoBase64Src.length > 0 || this.customLogo ? '1' : '0', - hasCustomFavicon: this.newFaviconBase64Src.length > 0 || this.customFavicon ? '1' : '0' - }).then(response => { - this.enabled = !!response.useCustomLogo; - if (response.customLogoPath) { - this.customLogo = response.customLogoPath; - } - if (response.customFaviconPath) { - this.customFavicon = response.customFaviconPath; - } - const notificationInstanceId = external_CoreHome_["NotificationsStore"].show({ - message: Object(external_CoreHome_["translate"])('CoreAdminHome_SettingsSaveSuccess'), - type: 'transient', - id: 'generalSettings', - context: 'success' - }); - external_CoreHome_["NotificationsStore"].scrollToNotification(notificationInstanceId); - }).finally(() => { - if (!this.enabled) { - // reset fields so that values are not visible when setting is enabled without page reload - this.currentLogoSrcExists = false; - this.currentFaviconSrcExists = false; - this.customLogo = ''; - this.customFavicon = ''; - this.newFaviconBase64Src = ''; - this.newLogoBase64Src = ''; - } - this.isLoading = false; - }); - }, - updateLogo() { - const isSubmittingLogo = !!this.customLogo; - const isSubmittingFavicon = !!this.customFavicon; - if (!isSubmittingLogo && !isSubmittingFavicon) { - return; - } - this.showUploadError = false; - const frameName = `upload${new Date().getTime()}`; - const uploadFrame = BrandingSettingsvue_type_script_lang_ts_$(`