PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -0,0 +1,94 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\Overlay;
use Exception;
use Piwik\Config;
use Piwik\DataTable;
use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\Plugins\SitesManager\SitesManager;
use Piwik\Plugins\Transitions\API as APITransitions;
use Piwik\Tracker\PageUrl;
/**
* Class API
* @method static \Piwik\Plugins\Overlay\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
/**
* Get translation strings
*/
public function getTranslations($idSite)
{
$translations = array(
'oneClick' => 'Overlay_OneClick',
'clicks' => 'Overlay_Clicks',
'clicksFromXLinks' => 'Overlay_ClicksFromXLinks',
'link' => 'Overlay_Link'
);
return array_map(array('\\Piwik\\Piwik','translate'), $translations);
}
/**
* Get excluded query parameters for a site.
* This information is used for client side url normalization.
*/
public function getExcludedQueryParameters($idSite)
{
$sitesManager = APISitesManager::getInstance();
$site = $sitesManager->getSiteFromId($idSite);
try {
return SitesManager::getTrackerExcludedQueryParameters($site);
} catch (Exception $e) {
// an exception is thrown when the user has no view access.
// do not throw the exception to the outside.
return array();
}
}
/**
* Get following pages of a url.
* This is done on the logs - not the archives!
*
* Note: if you use this method via the regular API, the number of results will be limited.
* Make sure, you set filter_limit=-1 in the request.
*/
public function getFollowingPages($url, $idSite, $period, $date, $segment = false)
{
$url = PageUrl::excludeQueryParametersFromUrl($url, $idSite);
// we don't unsanitize $url here. it will be done in the Transitions plugin.
$resultDataTable = new DataTable;
try {
$limitBeforeGrouping = Config::getInstance()->General['overlay_following_pages_limit'];
$transitionsReport = APITransitions::getInstance()->getTransitionsForAction(
$url, $type = 'url', $idSite, $period, $date, $segment, $limitBeforeGrouping,
$part = 'followingActions');
} catch (Exception $e) {
return $resultDataTable;
}
$reports = array('followingPages', 'outlinks', 'downloads');
foreach ($reports as $reportName) {
if (!isset($transitionsReport[$reportName])) {
continue;
}
foreach ($transitionsReport[$reportName]->getRows() as $row) {
// don't touch the row at all for performance reasons
$resultDataTable->addRow($row);
}
}
return $resultDataTable;
}
}

View File

@ -0,0 +1,239 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\Overlay;
use Piwik\API\CORSHandler;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Config;
use Piwik\Metrics;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugins\Actions\ArchivingHelper;
use Piwik\Plugins\SegmentEditor\SegmentFormatter;
use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\ProxyHttp;
use Piwik\Segment;
use Piwik\Tracker\Action;
use Piwik\Tracker\PageUrl;
use Piwik\View;
use Piwik\Plugins\SitesManager;
class Controller extends \Piwik\Plugin\Controller
{
/**
* @var SegmentFormatter
*/
private $segmentFormatter;
public function __construct(SegmentFormatter $segmentFormatter)
{
$this->segmentFormatter = $segmentFormatter;
parent::__construct();
}
/** The index of the plugin */
public function index()
{
Piwik::checkUserHasViewAccess($this->idSite);
$template = '@Overlay/index';
if (Config::getInstance()->General['overlay_disable_framed_mode']) {
$template = '@Overlay/index_noframe';
}
$view = new View($template);
$this->setGeneralVariablesView($view);
$view->segment = Request::getRawSegmentFromRequest();
$view->ssl = ProxyHttp::isHttps();
$view->siteUrls = SitesManager\API::getInstance()->getSiteUrlsFromId($this->site->getId());
$this->outputCORSHeaders();
return $view->render();
}
/** Render the area left of the iframe */
public function renderSidebar()
{
$period = Common::getRequestVar('period');
$date = Common::getRequestVar('date');
$currentUrl = Common::getRequestVar('currentUrl');
$segment = Request::getRawSegmentFromRequest();
$currentUrl = Common::unsanitizeInputValue($currentUrl);
$segmentSidebar = '';
$normalizedCurrentUrl = PageUrl::excludeQueryParametersFromUrl($currentUrl, $this->idSite);
$normalizedCurrentUrl = Common::unsanitizeInputValue($normalizedCurrentUrl);
// load the appropriate row of the page urls report using the label filter
ArchivingHelper::reloadConfig();
$path = ArchivingHelper::getActionExplodedNames($normalizedCurrentUrl, Action::TYPE_PAGE_URL);
$path = array_map('urlencode', $path);
$label = implode('>', $path);
$params = array(
'idSite' => $this->idSite,
'date' => $date,
'period' => $period,
'label' => $label,
'format' => 'original',
'format_metrics' => 0,
);
if (!empty($segment)) {
$params['segment'] = $segment;
}
$dataTable = Request::processRequest('Actions.getPageUrls', $params);
$formatter = new Metrics\Formatter\Html();
$data = array();
if ($dataTable->getRowsCount() > 0) {
$row = $dataTable->getFirstRow();
$translations = Metrics::getDefaultMetricTranslations();
$showMetrics = array('nb_hits', 'nb_visits', 'nb_users', 'nb_uniq_visitors',
'bounce_rate', 'exit_rate', 'avg_time_on_page');
$segmentSidebar = $row->getMetadata('segment');
if (!empty($segmentSidebar) && !empty($segment)) {
$segmentSidebar = $segment . ';' . $segmentSidebar;
}
foreach ($showMetrics as $metric) {
$value = $row->getColumn($metric);
if ($value === false) {
// skip unique visitors for period != day
continue;
}
if ($metric == 'bounce_rate'
|| $metric == 'exit_rate'
) {
$value = $formatter->getPrettyPercentFromQuotient($value);
} else if ($metric == 'avg_time_on_page') {
$value = $formatter->getPrettyTimeFromSeconds($value, $displayAsSentence = true);
}
$data[] = array(
'name' => $translations[$metric],
'value' => $value
);
}
}
// generate page url string
foreach ($path as &$part) {
$part = preg_replace(';^/;', '', urldecode($part));
}
$page = '/' . implode('/', $path);
$page = preg_replace(';/index$;', '/', $page);
if ($page == '/') {
$page = '/index';
}
// render template
$view = new View('@Overlay/renderSidebar');
$view->data = $data;
$view->location = $page;
$view->normalizedUrl = $normalizedCurrentUrl;
$view->label = $label;
$view->idSite = $this->idSite;
$view->period = $period;
$view->date = $date;
$view->segment = $segmentSidebar;
$view->segmentDescription = $this->segmentFormatter->getHumanReadable($segment, $this->idSite);
$this->outputCORSHeaders();
return $view->render();
}
/**
* Start an Overlay session: Redirect to the tracked website. The Piwik
* tracker will recognize this referrer and start the session.
*/
public function startOverlaySession()
{
$this->checkSitePermission();
Piwik::checkUserHasViewAccess($this->idSite);
$view = new View('@Overlay/startOverlaySession');
$sitesManager = APISitesManager::getInstance();
$site = $sitesManager->getSiteFromId($this->idSite);
$urls = $sitesManager->getSiteUrlsFromId($this->idSite);
$view->isHttps = ProxyHttp::isHttps();
$view->knownUrls = json_encode($urls);
$view->mainUrl = $site['main_url'];
$this->outputCORSHeaders();
Common::sendHeader('Content-Type: text/html; charset=UTF-8');
return $view->render();
}
/**
* This method is called when the JS from startOverlaySession() detects that the target domain
* is not configured for the current site.
*/
public function showErrorWrongDomain()
{
$this->checkSitePermission();
Piwik::checkUserHasViewAccess($this->idSite);
$url = Common::getRequestVar('url', '');
$url = Common::unsanitizeInputValue($url);
$message = Piwik::translate('Overlay_RedirectUrlError', array($url, "\n"));
$message = nl2br(htmlentities($message, ENT_COMPAT | ENT_HTML401, 'UTF-8'));
$view = new View('@Overlay/showErrorWrongDomain');
$this->addCustomLogoInfo($view);
$view->message = $message;
if (Piwik::isUserHasWriteAccess($this->idSite)) {
// TODO use $idSite to link to the correct row. This is tricky because the #rowX ids don't match
// the site ids when sites have been deleted.
$url = 'index.php?module=SitesManager&action=index';
$troubleshoot = htmlentities(Piwik::translate('Overlay_RedirectUrlErrorAdmin'), ENT_COMPAT | ENT_HTML401, 'UTF-8');
$troubleshoot = sprintf($troubleshoot, '<a href="' . $url . '" target="_top">', '</a>');
$view->troubleshoot = $troubleshoot;
} else {
$view->troubleshoot = htmlentities(Piwik::translate('Overlay_RedirectUrlErrorUser'), ENT_COMPAT | ENT_HTML401, 'UTF-8');
}
$this->outputCORSHeaders();
return $view->render();
}
/**
* This method is used to pass information from the iframe back to Piwik.
* Due to the same origin policy, we can't do that directly, so we inject
* an additional iframe in the Overlay session that calls this controller
* method.
* The rendered iframe is from the same origin as the Piwik window so we
* can bypass the same origin policy and call the parent.
*/
public function notifyParentIframe()
{
$view = new View('@Overlay/notifyParentIframe');
$this->outputCORSHeaders();
return $view->render();
}
protected function outputCORSHeaders()
{
$corsHandler = new CORSHandler();
$corsHandler->handle();
}
}

View File

@ -0,0 +1,40 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\Overlay;
class Overlay extends \Piwik\Plugin
{
/**
* @see Piwik\Plugin::registerEvents
*/
function registerEvents()
{
return array(
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys'
);
}
/**
* Returns required Js Files
* @param $jsFiles
*/
public function getJsFiles(&$jsFiles)
{
$jsFiles[] = 'plugins/Overlay/javascripts/rowaction.js';
$jsFiles[] = 'plugins/Overlay/javascripts/Overlay_Helper.js';
}
public function getClientSideTranslationKeys(&$translationKeys)
{
$translationKeys[] = 'General_OverlayRowActionTooltipTitle';
$translationKeys[] = 'General_OverlayRowActionTooltip';
}
}

View File

@ -0,0 +1,145 @@
/**
* Reset styles
*/
#PIS_StatusBar,
#PIS_StatusBar .PIS_Item,
#PIS_StatusBar .PIS_Loading,
.PIS_LinkTag,
.PIS_LinkHighlightBoxTop,
.PIS_LinkHighlightBoxRight,
.PIS_LinkHighlightBoxLeft,
.PIS_LinkHighlightBoxText {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: normal;
font-style: normal;
font-size: 11px;
font-family: Arial, Helvetica, sans-serif;
vertical-align: baseline;
line-height: 1.4em;
text-indent: 0;
text-decoration: none;
text-transform: none;
cursor: default;
text-align: left;
float: none;
color: #333;
}
/**
* Link Tags
*/
.PIS_LinkTag {
position: absolute;
top: 0;
left: 0;
z-index: 999999;
width: 36px;
height: 21px;
text-align: left;
background: url(./linktags_lessshadow.png) no-repeat 0 -21px;
overflow: hidden;
transform-origin: 100% 50%;
transition: 0.2s ease-in-out;
}
.PIS_LinkTag span {
position: absolute;
width: 31px;
height: 14px;
font-size: 10px;
text-align: center;
font-weight: bold;
line-height: 14px;
margin-left: 1px;
}
.PIS_LinkTag.PIS_Highlighted {
z-index: 1000002;
}
.PIS_LinkTag.PIS_Highlighted span {
color: #E87500;
}
.PIS_LinkTag.PIS_Right {
background-position: -36px -21px;
transform-origin: 0% 50%;
}
.PIS_LinkTag.PIS_Right span,
.PIS_LinkTag.PIS_BottomRight span {
margin-left: 5px;
}
.PIS_LinkTag.PIS_Bottom {
background-position: 0 0;
transform-origin: 100% 50%;
}
.PIS_LinkTag.PIS_Bottom span,
.PIS_LinkTag.PIS_BottomRight span {
margin-top: 4px;
}
.PIS_LinkTag.PIS_BottomRight {
background-position: -36px 0;
transform-origin: 0% 50%;
}
/**
* Link Highlights
*/
.PIS_LinkHighlightBoxTop,
.PIS_LinkHighlightBoxRight,
.PIS_LinkHighlightBoxText,
.PIS_LinkHighlightBoxLeft {
position: absolute;
z-index: 1000001;
overflow: hidden;
width: 2px;
height: 2px;
background: #E87500;
}
.PIS_LinkHighlightBoxText {
line-height: 20px;
height: 20px;
font-size: 11px;
color: white;
width: auto;
}
/**
* Status bar
*/
#PIS_StatusBar {
padding: 10px 0;
position: fixed;
z-index: 1000020;
bottom: 0;
right: 0;
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
background: #fbfbfb;
border-radius: 6px 0 0;
}
#PIS_StatusBar .PIS_Item {
text-align: right;
padding: 3px 5px 0 0;
margin: 0 15px 0 20px;
font-weight: bold;
}
#PIS_StatusBar .PIS_Loading {
background: url(./loading.gif) no-repeat right center;
padding-right: 30px;
}

View File

@ -0,0 +1,258 @@
var Piwik_Overlay_Client = (function () {
var DOMAIN_PARSE_REGEX = /^http(s)?:\/\/(www\.)?([^\/]*)/i;
/** jQuery */
var $;
/** Url of the Piwik root */
var piwikRoot;
/** protocol and domain of Piwik root */
var piwikOrigin;
/** Piwik idsite */
var idSite;
/** The current period and date */
var period, date, segment;
/** Reference to the status bar DOM element */
var statusBar;
/** Counter for request IDs for postMessage based API requests. */
var lastRequestId = 0;
/** Map of callbacks for postMessage based API requests. */
var requestCallbacks = {};
/** Load the client CSS */
function loadCss() {
var css = c('link').attr({
rel: 'stylesheet',
type: 'text/css',
href: piwikRoot + '/plugins/Overlay/client/client.css'
});
$('head').append(css);
}
/**
* This method loads jQuery, if it is not there yet.
* The callback is triggered after jQuery is loaded.
*/
function loadJQuery(callback) {
if (typeof jQuery != 'undefined') {
$ = jQuery;
callback();
}
else {
Piwik_Overlay_Client.loadScript('libs/bower_components/jquery/dist/jquery.min.js', function () {
$ = jQuery;
jQuery.noConflict();
callback();
});
}
}
/**
* Notify Piwik of the current iframe location.
* This way, we can display additional metrics on the side of the iframe.
*/
function notifyPiwikOfLocation() {
// check whether the session has been opened in a new tab (instead of an iframe)
if (window != window.top) {
var iframe = c('iframe', false, {
src: piwikRoot + '/index.php?module=Overlay&action=notifyParentIframe#' + window.location.href
}).css({width: 0, height: 0, border: 0});
$('body').append(iframe);
}
}
/** Create a jqueryfied DOM element */
function c(tagName, className, attributes) {
var el = $(document.createElement(tagName));
if (className) {
if (className.substring(0, 1) == '#') {
var id = className.substring(1, className.length);
id = 'PIS_' + id;
el.attr('id', id);
}
else {
className = 'PIS_' + className;
el.addClass(className);
}
}
if (attributes) {
el.attr(attributes);
}
return el;
}
function nextRequestId() {
var nextId = lastRequestId + 1;
lastRequestId = nextId;
return nextId;
}
function handlePostMessages() {
window.addEventListener("message", function (event) {
if (event.origin !== piwikOrigin) {
return;
}
var strData = event.data.split(':', 3);
if (strData[0] !== 'overlay.response') {
return;
}
var requestId = strData[1];
if (!requestCallbacks[requestId]) {
return;
}
var callback = requestCallbacks[requestId];
delete requestCallbacks[requestId];
var data = JSON.parse(decodeURIComponent(strData[2]));
if (typeof data.result !== 'undefined'
&& data.result === 'error'
) {
alert('Error: ' + data.message);
} else {
callback(data);
}
}, false);
}
return {
/** Initialize in-site analytics */
initialize: function (pPiwikRoot, pIdSite, pPeriod, pDate, pSegment) {
piwikRoot = pPiwikRoot;
piwikOrigin = piwikRoot.match(DOMAIN_PARSE_REGEX)[0];
idSite = pIdSite;
period = pPeriod;
date = pDate;
segment = pSegment;
var load = this.loadScript;
var loading = this.loadingNotification;
loadJQuery(function () {
handlePostMessages();
notifyPiwikOfLocation();
loadCss();
// translations
load('plugins/Overlay/client/translations.js', function () {
Piwik_Overlay_Translations.initialize(function () {
// following pages
var finishPages = loading('Loading following pages');
load('plugins/Overlay/client/followingpages.js', function () {
Piwik_Overlay_FollowingPages.initialize(finishPages);
});
});
});
});
},
/** Create a jqueryfied DOM element */
createElement: function (tagName, className, attributes) {
return c(tagName, className, attributes);
},
/** Load a script and wait for it to be loaded */
loadScript: function (relativePath, callback) {
var loaded = false;
var onLoad = function () {
if (!loaded) {
loaded = true;
callback();
}
};
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.onreadystatechange = function () {
if (this.readyState == 'loaded' || this.readyState == 'complete') {
onLoad();
}
};
script.onload = onLoad;
script.src = piwikRoot + '/' + relativePath + '?v=1';
head.appendChild(script);
},
/** Piwik Overlay API Request */
api: function (method, callback, additionalParams) {
var url = piwikRoot + '/index.php?module=API&method=Overlay.' + method
+ '&idSite=' + idSite + '&period=' + period + '&date=' + date + '&format=JSON&filter_limit=-1';
if (segment) {
url += '&segment=' + segment;
}
if (additionalParams) {
url += '&' + additionalParams;
}
var requestId = nextRequestId();
requestCallbacks[requestId] = callback;
var matomoFrame = window.parent;
matomoFrame.postMessage('overlay.call:' + requestId + ':' + encodeURIComponent(url), piwikOrigin);
},
/**
* Initialize a notification
* To hide the notification use the returned callback
*/
notification: function (message, addClass) {
if (!statusBar) {
statusBar = c('div', '#StatusBar').css('opacity', .8);
$('body').prepend(statusBar);
}
var item = c('div', 'Item').html(message);
if (addClass) {
item.addClass('PIS_' + addClass);
}
statusBar.show().append(item);
return function () {
item.remove();
if (!statusBar.children().length) {
statusBar.hide();
}
};
},
/** Hide all notifications with a certain class */
hideNotifications: function (className) {
statusBar.find('.PIS_' + className).remove();
if (!statusBar.children().length) {
statusBar.hide();
}
},
/**
* Initialize a loading notification
* To hide the notification use the returned callback
*/
loadingNotification: function (message) {
return Piwik_Overlay_Client.notification(message, 'Loading');
}
};
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

View File

@ -0,0 +1,561 @@
var Piwik_Overlay_FollowingPages = (function () {
/** jQuery */
var $ = jQuery;
/** Info about the following pages */
var followingPages = [];
/** List of excluded get parameters */
var excludedParams = [];
/** Index of the links on the page */
var linksOnPage = {};
/** Reference to create element function */
var c;
/** Counter for the largest clickRate on the page */
var maxClickRate = 0;
/** Load the following pages */
function load(callback) {
// normalize current location
var location = window.location.href;
location = Piwik_Overlay_UrlNormalizer.normalize(location);
location = (("https:" == document.location.protocol) ? 'https' : 'http') + '://' + location;
var excludedParamsLoaded = false;
var followingPagesLoaded = false;
// load excluded params
Piwik_Overlay_Client.api('getExcludedQueryParameters', function (data) {
for (var i = 0; i < data.length; i++) {
if (typeof data[i] == 'object') {
data[i] = data[i][0];
}
}
excludedParams = data;
excludedParamsLoaded = true;
if (followingPagesLoaded) {
callback();
}
});
// load following pages
Piwik_Overlay_Client.api('getFollowingPages', function (data) {
followingPages = data;
processFollowingPages();
followingPagesLoaded = true;
if (excludedParamsLoaded) {
callback();
}
}, 'url=' + encodeURIComponent(location));
}
/** Normalize the URLs of following pages and aggregate some stats */
function processFollowingPages() {
var totalClicks = 0;
for (var i = 0; i < followingPages.length; i++) {
var page = followingPages[i];
// though the following pages are returned without the prefix, downloads
// and outlinks still have it.
page.label = Piwik_Overlay_UrlNormalizer.removeUrlPrefix(page.label);
totalClicks += followingPages[i].referrals;
}
for (i = 0; i < followingPages.length; i++) {
var clickRate = followingPages[i].referrals / totalClicks * 100;
followingPages[i].clickRate = clickRate;
if (clickRate > maxClickRate) maxClickRate = clickRate;
}
}
/**
* Build an index of links on the page.
* This function is passed to $('a').each()
*/
var processLinkDelta = false;
function processLink() {
var a = $(this);
a[0].piwikDiscovered = true;
var href = a.attr('href');
href = Piwik_Overlay_UrlNormalizer.normalize(href);
if (href) {
if (typeof linksOnPage[href] == 'undefined') {
linksOnPage[href] = [a];
}
else {
linksOnPage[href].push(a);
}
}
if (href && processLinkDelta !== false) {
if (typeof processLinkDelta[href] == 'undefined') {
processLinkDelta[href] = [a];
}
else {
processLinkDelta[href].push(a);
}
}
}
var repositionTimeout = false;
var resizeTimeout = false;
function build(callback) {
// build an index of all links on the page
$('a').each(processLink);
// add tags to known following pages
createLinkTags(linksOnPage);
// position the tags
positionLinkTags();
callback();
// check on a regular basis whether new links have appeared.
// we use a timeout instead of an interval to make sure one call is done before
// the next one is triggered
var repositionAfterTimeout;
repositionAfterTimeout = function () {
repositionTimeout = window.setTimeout(function () {
findNewLinks();
positionLinkTags(repositionAfterTimeout);
}, 1800);
};
repositionAfterTimeout();
// reposition link tags on window resize
$(window).resize(function () {
if (repositionTimeout) {
window.clearTimeout(repositionTimeout);
}
if (resizeTimeout) {
window.clearTimeout(resizeTimeout);
}
resizeTimeout = window.setTimeout(function () {
positionLinkTags();
repositionAfterTimeout();
}, 70);
});
}
/** Create a batch of link tags */
function createLinkTags(links) {
var body = $('body');
for (var i = 0; i < followingPages.length; i++) {
var url = followingPages[i].label;
if (typeof links[url] != 'undefined') {
for (var j = 0; j < links[url].length; j++) {
createLinkTag(links[url][j], url, followingPages[i], body);
}
}
}
}
/** Create the link tag element */
function createLinkTag(linkTag, linkUrl, data, body) {
if (typeof linkTag[0].piwikTagElement != 'undefined' && linkTag[0].piwikTagElement !== null) {
// this link tag already has a tag element. happens in rare cases.
return;
}
linkTag[0].piwikTagElement = true;
var rate = data.clickRate;
if( rate < 0.001 ) {
rate = '<0.001';
} else if (rate < 10) {
rate = Math.round(rate * 10) / 10;
} else {
rate = Math.round(rate);
}
var span = c('span').html(rate + '%');
var tagElement = c('div', 'LinkTag').append(span).hide();
tagElement.attr({'data-rateofmax': Math.round(100 * rate/maxClickRate)/100});
body.prepend(tagElement);
linkTag.add(tagElement).hover(function () {
highlightLink(linkTag, linkUrl, data);
}, function () {
unHighlightLink(linkTag, linkUrl);
});
// attach the tag element to the link element. we can't use .data() because jquery
// would remove it when removing the link from the dom. but we still need to find
// the tag element to remove it as well.
linkTag[0].piwikTagElement = tagElement;
}
/** Position the link tags next to the links */
function positionLinkTags(callback) {
var url, linkTag, tagElement, offset, top, left, isRight, hasOneChild, inlineChild;
var tagWidth = 36, tagHeight = 21;
var tagsToRemove = [];
for (var i = 0; i < followingPages.length; i++) {
url = followingPages[i].label;
if (typeof linksOnPage[url] != 'undefined') {
for (var j = 0; j < linksOnPage[url].length; j++) {
linkTag = linksOnPage[url][j];
tagElement = linkTag[0].piwikTagElement;
if (linkTag.closest('html').length == 0 || !tagElement) {
// the link has been removed from the dom
if (tagElement) {
tagElement.hide();
}
// mark for deletion. don't delete it now because we
// are iterating of the array it's in. it will be deleted
// below this for loop.
tagsToRemove.push({
index1: url,
index2: j
});
continue;
}
hasOneChild = checkHasOneChild(linkTag);
inlineChild = false;
if (hasOneChild && linkTag.css('display') != 'block') {
inlineChild = linkTag.children().eq(0);
}
if (getVisibility(linkTag) == 'hidden' || (
// in case of hasOneChild: jquery always returns linkTag.is(':visible')=false
!linkTag.is(':visible') && !(hasOneChild && inlineChild && inlineChild.is(':visible'))
)) {
// link is not visible
tagElement.hide();
continue;
}
tagElement.attr('class', 'PIS_LinkTag'); // reset class
if (tagElement[0].piwikHighlighted) {
tagElement.addClass('PIS_Highlighted');
}
// see comment in highlightLink()
if (hasOneChild && linkTag.find('> img').length === 1) {
offset = linkTag.find('> img').offset();
if (offset.left == 0 && offset.top == 0) {
offset = linkTag.offset();
}
} else if (inlineChild !== false) {
offset = inlineChild.offset();
} else {
offset = linkTag.offset();
}
var zoomFactor = 1 + +tagElement.attr('data-rateofmax');
top = offset.top - tagHeight + 6;
left = offset.left - tagWidth + 10;
if (isRight = (left < zoomFactor * tagWidth - tagWidth ) ) {
tagElement.addClass('PIS_Right');
left = offset.left + linkTag.outerWidth() - 10;
}
if (top < zoomFactor * tagHeight - tagHeight ) {
tagElement.addClass(isRight ? 'PIS_BottomRight' : 'PIS_Bottom');
top = offset.top + linkTag.outerHeight() - 6;
}
tagElement.css({
'-webkit-transform': 'translate(' + left + 'px, ' + top + 'px) scale(' + zoomFactor + ')',
'-moz-transform': 'translate(' + left + 'px, ' + top + 'px) scale(' + zoomFactor + ')',
'-ms-transform': 'translate(' + left + 'px, ' + top + 'px) scale(' + zoomFactor + ')',
'-o-transform': 'translate(' + left + 'px, ' + top + 'px) scale(' + zoomFactor + ')',
'transform': 'translate(' + left + 'px, ' + top + 'px) scale(' + zoomFactor + ')',
'opacity': zoomFactor/2
});
tagElement.show();
}
}
}
// walk tagsToRemove from back to front because it contains the indexes in ascending
// order. removing something from the front will impact the indexes that come after-
// wards. this can be avoided by starting in the back.
for (var k = tagsToRemove.length - 1; k >= 0; k--) {
var tagToRemove = tagsToRemove[k];
linkTag = linksOnPage[tagToRemove.index1][tagToRemove.index2];
// remove the tag element from the dom
if (linkTag && linkTag[0] && linkTag[0].piwikTagElement) {
tagElement = linkTag[0].piwikTagElement;
if (tagElement[0].piwikHighlighted) {
unHighlightLink(linkTag, tagToRemove.index1);
}
tagElement.remove();
linkTag[0].piwikTagElement = null;
}
// remove the link from the index
linksOnPage[tagToRemove.index1].splice(tagToRemove.index2, 1);
if (linksOnPage[tagToRemove.index1].length == 0) {
delete linksOnPage[tagToRemove.index1];
}
}
if (typeof callback == 'function') {
callback();
}
}
/** Get the visibility of an element */
function getVisibility(el) {
var visibility = el.css('visibility');
if (visibility == 'inherit') {
el = el.parent();
if (el.length) {
return getVisibility(el);
}
}
return visibility;
}
/**
* Find out whether a link has only one child. Using .children().length === 1 doesn't work
* because it doesn't take additional text nodes into account.
*/
function checkHasOneChild(linkTag) {
var hasOneChild = (linkTag.children().length === 1);
if (hasOneChild) {
// if the element contains one tag and some text, hasOneChild is set incorrectly
var contents = linkTag.contents();
if (contents.length > 1) {
// find non-empty text nodes
contents = contents.filter(function () {
return this.nodeType == 3 && // text node
$.trim(this.data).length > 0; // contains more than whitespaces
});
if (contents.length) {
hasOneChild = false;
}
}
}
return hasOneChild;
}
/** Check whether new links have been added to the dom */
function findNewLinks() {
var newLinks = $('a').filter(function () {
return typeof this.piwikDiscovered == 'undefined' || this.piwikDiscovered === null;
});
if (!newLinks.length) {
return;
}
processLinkDelta = {};
newLinks.each(processLink);
createLinkTags(processLinkDelta);
processLinkDelta = false;
}
/** Dom elements used for drawing a box around the link */
var highlightElements = [];
/** Highlight a link on hover */
function highlightLink(linkTag, linkUrl, data) {
if (highlightElements.length == 0) {
highlightElements.push(c('div', 'LinkHighlightBoxTop'));
highlightElements.push(c('div', 'LinkHighlightBoxRight'));
highlightElements.push(c('div', 'LinkHighlightBoxLeft'));
highlightElements.push(c('div', 'LinkHighlightBoxText'));
var body = $('body');
for (var i = 0; i < highlightElements.length; i++) {
body.prepend(highlightElements[i].css({display: 'none'}));
}
}
var width = linkTag.outerWidth();
var offset, height;
var hasOneChild = checkHasOneChild(linkTag);
if (hasOneChild && linkTag.find('img').length === 1) {
// if the <a> tag contains only an <img>, the offset and height methods don't work properly.
// as a result, the box around the image link would be wrong. we use the image to derive
// the offset and height instead of the link to get correct values.
var img = linkTag.find('img');
offset = img.offset();
height = img.outerHeight();
}
if (hasOneChild && linkTag.css('display') != 'block') {
// if the <a> tag is not displayed as block and has only one child, using the child to
// derive the offset and dimensions is more robust.
var child = linkTag.children().eq(0);
offset = child.offset();
height = child.outerHeight();
width = child.outerWidth();
} else {
offset = linkTag.offset();
height = linkTag.outerHeight();
}
var numLinks = linksOnPage[linkUrl].length;
putBoxAroundLink(offset, width, height, numLinks, data.referrals);
// highlight tags
for (var j = 0; j < numLinks; j++) {
var tag = linksOnPage[linkUrl][j][0].piwikTagElement;
tag.addClass('PIS_Highlighted');
tag[0].piwikHighlighted = true;
}
// Sometimes it fails to remove the notification when the hovered element is removed.
// To make sure we don't display more than one location at a time, we hide all before showing the new one.
Piwik_Overlay_Client.hideNotifications('LinkLocation');
// we don't use .data() because jquery would remove the callback when the link tag is removed
linkTag[0].piwikHideNotification = Piwik_Overlay_Client.notification(
Piwik_Overlay_Translations.get('link') + ': ' + linkUrl, 'LinkLocation');
}
function putBoxAroundLink(offset, width, height, numLinks, numReferrals) {
var borderWidth = 2;
var padding = 4; // the distance between the link and the border
// top border
highlightElements[0]
.width(width + 2 * padding)
.css({
top: offset.top - borderWidth - padding,
left: offset.left - padding
}).show();
// right border
highlightElements[1]
.height(height + 2 * borderWidth + 2 * padding)
.css({
top: offset.top - borderWidth - padding,
left: offset.left + width + padding
}).show();
// left border
highlightElements[2]
.height(height + 2 * borderWidth + 2 * padding)
.css({
top: offset.top - borderWidth - padding,
left: offset.left - borderWidth - padding
}).show();
// bottom box text
var text;
if (numLinks > 1) {
text = Piwik_Overlay_Translations.get('clicksFromXLinks')
.replace(/%1\$s/, numReferrals)
.replace(/%2\$s/, numLinks);
} else if (numReferrals == 1) {
text = Piwik_Overlay_Translations.get('oneClick');
} else {
text = Piwik_Overlay_Translations.get('clicks')
.replace(/%s/, numReferrals);
}
// bottom box position and dimension
var textPadding = '&nbsp;&nbsp;&nbsp;';
highlightElements[3].html(textPadding + text + textPadding).css({
width: 'auto',
top: offset.top + height + padding,
left: offset.left - borderWidth - padding
}).show();
var minBoxWidth = width + 2 * borderWidth + 2 * padding;
if (highlightElements[3].width() < minBoxWidth) {
// we cannot use minWidth because of IE7
highlightElements[3].width(minBoxWidth);
}
}
/** Remove highlight from link */
function unHighlightLink(linkTag, linkUrl) {
for (var i = 0; i < highlightElements.length; i++) {
highlightElements[i].hide();
}
var numLinks = linksOnPage[linkUrl].length;
for (var j = 0; j < numLinks; j++) {
var tag = linksOnPage[linkUrl][j][0].piwikTagElement;
if (tag) {
tag.removeClass('PIS_Highlighted');
tag[0].piwikHighlighted = false;
}
}
if ((typeof linkTag[0].piwikHideNotification) == 'function') {
linkTag[0].piwikHideNotification();
linkTag[0].piwikHideNotification = null;
}
}
return {
/**
* The main method
*/
initialize: function (finishCallback) {
c = Piwik_Overlay_Client.createElement;
Piwik_Overlay_Client.loadScript('plugins/Overlay/client/urlnormalizer.js', function () {
Piwik_Overlay_UrlNormalizer.initialize();
load(function () {
Piwik_Overlay_UrlNormalizer.setExcludedParameters(excludedParams);
build(function () {
finishCallback();
})
});
});
},
/**
* Remove everything from the dom and terminate timeouts.
* This can be used from the console in order to load a new implementation for debugging afterwards.
* If you add `Piwik_Overlay_FollowingPages.remove();` to the beginning and
* `Piwik_Overlay_FollowingPages.initialize(function(){});` to the end of this file, you can just
* paste it into the console to inject the new implementation.
*/
remove: function () {
for (var i = 0; i < followingPages.length; i++) {
var url = followingPages[i].label;
if (typeof linksOnPage[url] != 'undefined') {
for (var j = 0; j < linksOnPage[url].length; j++) {
var linkTag = linksOnPage[url][j];
var tagElement = linkTag[0].piwikTagElement;
if (tagElement) {
tagElement.remove();
}
linkTag[0].piwikTagElement = null;
$(linkTag).unbind('mouseenter').unbind('mouseleave');
}
}
}
for (i = 0; i < highlightElements.length; i++) {
highlightElements[i].remove();
}
if (repositionTimeout) {
window.clearTimeout(repositionTimeout);
}
if (resizeTimeout) {
window.clearTimeout(resizeTimeout);
}
$(window).unbind('resize');
}
};
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

View File

@ -0,0 +1,30 @@
var Piwik_Overlay_Translations = (function () {
/** Translations strings */
var translations = [];
return {
/**
* Initialize translations module.
* Callback is triggered when data is available.
*/
initialize: function (callback) {
// Load translation data
Piwik_Overlay_Client.api('getTranslations', function (data) {
translations = data[0];
callback();
});
},
/** Get translation string */
get: function (identifier) {
if (typeof translations[identifier] == 'undefined') {
return identifier;
}
return translations[identifier];
}
};
})();

View File

@ -0,0 +1,200 @@
/**
* URL NORMALIZER
* This utility preprocesses both the URLs in the document and
* from the Piwik logs in order to make matching possible.
*/
var Piwik_Overlay_UrlNormalizer = (function () {
/** Base href of the current document */
var baseHref = false;
/** Url of current folder */
var currentFolder;
/** The current domain */
var currentDomain;
/** Regular expressions for parameters to be excluded when matching links on the page */
var excludedParamsRegEx = [];
/**
* Basic normalizations for domain names
* - remove protocol and www from absolute urls
* - add a trailing slash to urls without a path
*
* Returns array
* 0: normalized url
* 1: true, if url was absolute (if not, no normalization was performed)
*/
function normalizeDomain(url) {
if (url === null) {
return '';
}
var absolute = false;
// remove protocol
if (url.substring(0, 7) == 'http://') {
absolute = true;
url = url.substring(7, url.length);
} else if (url.substring(0, 8) == 'https://') {
absolute = true;
url = url.substring(8, url.length);
}
if (absolute) {
// remove www.
url = removeWww(url);
// add slash to domain names
if (url.indexOf('/') == -1) {
url += '/';
}
}
return [url, absolute];
}
/** Remove www. from a domain */
function removeWww(domain) {
if (domain.substring(0, 4) == 'www.') {
return domain.substring(4, domain.length);
}
return domain;
}
return {
initialize: function () {
this.setCurrentDomain(document.location.host);
this.setCurrentUrl(window.location.href);
var head = document.getElementsByTagName('head');
if (head.length) {
var base = head[0].getElementsByTagName('base');
if (base.length && base[0].href) {
this.setBaseHref(base[0].href);
}
}
},
/**
* Explicitly set domain (for testing)
*/
setCurrentDomain: function (pCurrentDomain) {
currentDomain = removeWww(pCurrentDomain);
},
/**
* Explicitly set current url (for testing)
*/
setCurrentUrl: function (url) {
var index = url.lastIndexOf('/');
if (index != url.length - 1) {
currentFolder = url.substring(0, index + 1);
} else {
currentFolder = url;
}
currentFolder = normalizeDomain(currentFolder)[0];
},
/**
* Explicitly set base href (for testing)
*/
setBaseHref: function (pBaseHref) {
if (!pBaseHref) {
baseHref = false;
} else {
baseHref = normalizeDomain(pBaseHref)[0];
}
},
/**
* Set the parameters to be excluded when matching links on the page
*/
setExcludedParameters: function (pExcludedParams) {
excludedParamsRegEx = [];
for (var i = 0; i < pExcludedParams.length; i++) {
var paramString = pExcludedParams[i];
excludedParamsRegEx.push(new RegExp('&' + paramString + '=([^&#]*)', 'ig'));
}
},
/**
* Remove the protocol and the prefix of a URL
*/
removeUrlPrefix: function (url) {
return normalizeDomain(url)[0];
},
/**
* Normalize URL
* Can be an absolute or a relative URL
*/
normalize: function (url) {
if (!url) {
return '';
}
// ignore urls starting with #
if (url.substring(0, 1) == '#') {
return '';
}
// basic normalizations for absolute urls
var normalized = normalizeDomain(url);
url = normalized[0];
var absolute = normalized[1];
if (!absolute) {
/** relative url */
if (url.substring(0, 1) == '/') {
// relative to domain root
url = currentDomain + url;
} else if (baseHref) {
// relative to base href
url = baseHref + url;
} else {
// relative to current folder
url = currentFolder + url;
}
}
// replace multiple / with a single /
url = url.replace(/\/\/+/g, '/');
// handle ./ and ../
var parts = url.split('/');
var urlArr = [];
for (var i = 0; i < parts.length; i++) {
if (parts[i] == '.') {
// ignore
}
else if (parts[i] == '..') {
urlArr.pop();
}
else {
urlArr.push(parts[i]);
}
}
url = urlArr.join('/');
// remove ignored parameters
url = url.replace(/\?/, '?&');
for (i = 0; i < excludedParamsRegEx.length; i++) {
var regEx = excludedParamsRegEx[i];
url = url.replace(regEx, '');
}
url = url.replace(/\?&/, '?');
url = url.replace(/\?#/, '#');
url = url.replace(/\?$/, '');
url = url.replace(/%5B/gi, '[');
url = url.replace(/%5D/gi, ']');
return url;
}
};
})();

View File

@ -0,0 +1,16 @@
<?php
return array(
// Overlay needs the full URLs in order to find the links in the embedded page (otherwise the %
// tooltips don't show up)
'tests.ui.url_normalizer_blacklist.api' => DI\add(array(
'Overlay.getFollowingPages',
)),
'tests.ui.url_normalizer_blacklist.controller' => DI\add(array(
'Overlay.renderSidebar',
'Overlay.index',
'Overlay.startOverlaySession',
)),
);

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

View File

@ -0,0 +1,42 @@
/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
var Overlay_Helper = {
/** Encode the iframe url to put it behind the hash in sidebar mode */
encodeFrameUrl: function (url) {
// url encode + replace % with $ to make sure that browsers don't break the encoding
return encodeURIComponent(url).replace(/%/g, '$')
},
/** Decode the url after reading it from the hash */
decodeFrameUrl: function (url) {
// reverse encodeFrameUrl()
return decodeURIComponent(url.replace(/\$/g, '%'));
},
/** Get the url to launch overlay */
getOverlayLink: function (idSite, period, date, segment, link) {
var url = 'index.php?module=Overlay&period=' + encodeURIComponent(period) + '&date=' + encodeURIComponent(date) + '&idSite=' + encodeURIComponent(idSite);
if (segment) {
url += '&segment=' + encodeURIComponent(segment);
}
var token_auth = piwik.broadcast.getValueFromUrl("token_auth");
if (token_auth.length && piwik.shouldPropagateTokenAuth) {
url += '&token_auth=' + encodeURIComponent(token_auth);
}
if (link) {
url += '#?l=' + Overlay_Helper.encodeFrameUrl(link);
}
return url;
}
};

View File

@ -0,0 +1,374 @@
/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
var Piwik_Overlay = (function () {
var DOMAIN_PARSE_REGEX = /^http(s)?:\/\/(www\.)?([^\/]*)/i;
var ORIGIN_PARSE_REGEX = /^https?:\/\/[^\/]*/;
var ALLOWED_API_REQUEST_WHITELIST = [
'Overlay.getTranslations',
'Overlay.getExcludedQueryParameters',
'Overlay.getFollowingPages',
];
var $body, $iframe, $sidebar, $main, $location, $loading, $errorNotLoading;
var $rowEvolutionLink, $transitionsLink, $visitorLogLink;
var idSite, period, date, segment;
var iframeSrcBase;
var iframeDomain = '';
var iframeCurrentPage = '';
var iframeCurrentPageNormalized = '';
var iframeCurrentActionLabel = '';
var updateComesFromInsideFrame = false;
var iframeOrigin = '';
/** Load the sidebar for a url */
function loadSidebar(currentUrl) {
showLoading();
$location.html('&nbsp;').unbind('mouseenter').unbind('mouseleave');
iframeCurrentPage = currentUrl;
iframeDomain = currentUrl.match(DOMAIN_PARSE_REGEX)[3];
var params = {
module: 'Overlay',
action: 'renderSidebar',
currentUrl: currentUrl
};
if (segment) {
params.segment = segment;
}
globalAjaxQueue.abort();
var ajaxRequest = new ajaxHelper();
ajaxRequest.addParams(params, 'get');
ajaxRequest.setCallback(
function (response) {
hideLoading();
var $response = $(response);
var $responseLocation = $response.find('.overlayLocation');
var $url = $responseLocation.find('span');
iframeCurrentPageNormalized = $url.data('normalizedUrl');
iframeCurrentActionLabel = $url.data('label');
$url.html(piwikHelper.addBreakpointsToUrl($url.text()));
$location.html($responseLocation.html()).show();
$responseLocation.remove();
var $locationSpan = $location.find('span');
$locationSpan.html(piwikHelper.addBreakpointsToUrl($locationSpan.text()));
if (iframeDomain) {
// use addBreakpointsToUrl because it also encoded html entities
$locationSpan.tooltip({
track: true,
items: '*',
tooltipClass: 'overlayTooltip',
content: '<strong>' + Piwik_Overlay_Translations.domain + ':</strong> ' +
piwikHelper.addBreakpointsToUrl(iframeDomain),
show: false,
hide: false
});
}
$sidebar.empty().append($response).show();
if (!$sidebar.find('.overlayNoData').length) {
$rowEvolutionLink.show();
$transitionsLink.show();
if ($('#segment').val()) {
$visitorLogLink.show();
}
}
}
);
ajaxRequest.setErrorCallback(function () {
hideLoading();
$errorNotLoading.show();
});
ajaxRequest.setFormat('html');
ajaxRequest.send();
}
/** Adjust the dimensions of the iframe */
function adjustDimensions() {
$iframe.height($(window).height());
$iframe.width($body.width() - $iframe.offset().left - 2); // -2 because of 2px border
}
/** Display the loading message and hide other containers */
function showLoading() {
$loading.show();
$sidebar.hide();
$location.hide();
$rowEvolutionLink.hide();
$transitionsLink.hide();
$visitorLogLink.hide();
$errorNotLoading.hide();
}
/** Hide the loading message */
function hideLoading() {
$loading.hide();
}
function getOverlaySegment(url) {
var location = broadcast.getParamValue('segment', url);
// angular will encode the value again since it is added as the fragment path, not the fragment query parameter,
// so we have to decode it again after getParamValue
location = decodeURIComponent(location);
return location;
}
function getOverlayLocationFromHash(urlHash) {
var location = broadcast.getParamValue('l', urlHash);
// angular will encode the value again since it is added as the fragment path, not the fragment query parameter,
// so we have to decode it again after getParamValue
location = decodeURIComponent(location);
return location;
}
function setIframeOrigin(location) {
iframeOrigin = location.match(ORIGIN_PARSE_REGEX)[0];
// unset iframe origin if it is not one of the site URLs
var validSiteOrigins = Piwik_Overlay.siteUrls.map(function (url) {
return url.match(ORIGIN_PARSE_REGEX)[0];
});
if (iframeOrigin && validSiteOrigins.indexOf(iframeOrigin) === -1) {
try {
console.log('Found invalid iframe origin in hash URL: ' + iframeOrigin);
} catch (e) {
// ignore
}
iframeOrigin = null;
}
}
/** $.history callback for hash change */
function hashChangeCallback(urlHash) {
var location = getOverlayLocationFromHash(urlHash);
location = Overlay_Helper.decodeFrameUrl(location);
setIframeOrigin(location);
if (location == iframeCurrentPageNormalized) {
return;
}
if (!updateComesFromInsideFrame) {
var iframeUrl = iframeSrcBase;
if (location) {
iframeUrl += '#' + location;
}
$iframe.attr('src', iframeUrl);
showLoading();
} else {
loadSidebar(location);
}
updateComesFromInsideFrame = false;
}
function handleApiRequests() {
window.addEventListener("message", function (event) {
if (event.origin !== iframeOrigin || !iframeOrigin) {
return;
}
var strData = event.data.split(':', 3);
if (strData[0] !== 'overlay.call') {
return;
}
var requestId = strData[1];
var url = decodeURIComponent(strData[2]);
var params = broadcast.getValuesFromUrl(url);
Object.keys(params).forEach(function (name) {
params[name] = decodeURIComponent(params[name]);
});
params.module = 'API';
params.action = 'index';
if (ALLOWED_API_REQUEST_WHITELIST.indexOf(params.method) === -1) {
sendResponse({
result: 'error',
message: "'" + params.method + "' method is not allowed.",
});
return;
}
angular.element(document).injector().invoke(['piwikApi', function (piwikApi) {
piwikApi.fetch(params)
.then(function (response) {
sendResponse(response);
}).catch(function (err) {
sendResponse({
result: 'error',
message: err.message,
});
});
}]);
function sendResponse(data) {
var message = 'overlay.response:' + requestId + ':' + encodeURIComponent(JSON.stringify(data));
$iframe[0].contentWindow.postMessage(message, iframeOrigin);
}
}, false);
}
return {
/** This method is called when Overlay loads */
init: function (iframeSrc, pIdSite, pPeriod, pDate, pSegment) {
iframeSrcBase = iframeSrc;
idSite = pIdSite;
period = pPeriod;
date = pDate;
segment = pSegment;
$body = $('body');
$iframe = $('#overlayIframe');
$sidebar = $('#overlaySidebar');
$location = $('#overlayLocation');
$main = $('#overlayMain');
$loading = $('#overlayLoading');
$errorNotLoading = $('#overlayErrorNotLoading');
$rowEvolutionLink = $('#overlayRowEvolution');
$transitionsLink = $('#overlayTransitions');
$visitorLogLink = $('#overlaySegmentedVisitorLog');
adjustDimensions();
showLoading();
// apply initial dimensions
window.setTimeout(function () {
adjustDimensions();
}, 50);
// handle window resize
$(window).resize(function () {
adjustDimensions();
});
angular.element(document).injector().invoke(function ($rootScope) {
$rootScope.$on('$locationChangeSuccess', function () {
hashChangeCallback(broadcast.getHash());
});
hashChangeCallback(broadcast.getHash());
});
if (window.location.href.split('#').length == 1) {
hashChangeCallback('');
}
handleApiRequests();
// handle date selection
var $select = $('select#overlayDateRangeSelect').change(function () {
var parts = $(this).val().split(';');
if (parts.length == 2) {
period = parts[0];
date = parts[1];
window.location.href = Overlay_Helper.getOverlayLink(idSite, period, date, segment, iframeCurrentPage);
}
});
var optionMatchFound = false;
$select.find('option').each(function () {
if ($(this).val() == period + ';' + date) {
$(this).prop('selected', true);
optionMatchFound = true;
}
});
if (optionMatchFound) {
$select.material_select();
} else {
$select.prepend('<option selected="selected">');
}
// handle transitions link
$transitionsLink.click(function () {
var unescapedSegment = null;
if (segment) {
unescapedSegment = unescape(segment);
}
if (window.DataTable_RowActions_Transitions) {
DataTable_RowActions_Transitions.launchForUrl(iframeCurrentPageNormalized, unescapedSegment);
}
return false;
});
// handle row evolution link
$rowEvolutionLink.click(function () {
if (window.DataTable_RowActions_RowEvolution) {
DataTable_RowActions_RowEvolution.launch('Actions.getPageUrls', iframeCurrentActionLabel);
}
return false;
});
// handle segmented visitor log link
$visitorLogLink.click(function () {
SegmentedVisitorLog.show('Actions.getPageUrls', $('#segment').val(), {});
return false;
});
},
/** This callback is used from within the iframe */
setCurrentUrl: function (currentUrl) {
showLoading();
var locationParts = location.href.split('#');
var currentLocation = '';
if (locationParts.length > 1) {
currentLocation = getOverlayLocationFromHash(locationParts[1]);
}
var newFrameLocation = Overlay_Helper.encodeFrameUrl(currentUrl);
if (newFrameLocation != currentLocation) {
updateComesFromInsideFrame = true;
// available in global scope
var currentHashStr = broadcast.getHash();
if (currentHashStr.charAt(0) == '?') {
currentHashStr = currentHashStr.substr(1);
}
currentHashStr = broadcast.updateParamValue('l=' + newFrameLocation, currentHashStr);
var newLocation = window.location.href.split('#')[0] + '#?' + currentHashStr;
// window.location.replace changes the current url without pushing it on the browser's history stack
window.location.replace(newLocation);
} else {
// happens when the url is changed by hand or when the l parameter is there on page load
setIframeOrigin(currentUrl);
loadSidebar(currentUrl);
}
}
};
})();

View File

@ -0,0 +1,105 @@
/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
/**
* This file registers the Overlay row action on the pages report.
*/
function DataTable_RowActions_Overlay(dataTable) {
this.dataTable = dataTable;
}
DataTable_RowActions_Overlay.prototype = new DataTable_RowAction;
DataTable_RowActions_Overlay.registeredReports = [];
DataTable_RowActions_Overlay.registerReport = function (handler) {
DataTable_RowActions_Overlay.registeredReports.push(handler);
}
DataTable_RowActions_Overlay.prototype.onClick = function (actionA, tr, e) {
if (!actionA.data('overlay-manipulated')) {
actionA.data('overlay-manipulated', 1);
var segment, link;
var i = 0;
for (i; i < DataTable_RowActions_Overlay.registeredReports.length; i++) {
var report = DataTable_RowActions_Overlay.registeredReports[i];
if (report
&& report.onClick
&& report.isAvailableOnReport
&& report.isAvailableOnReport(this.dataTable.param)) {
var result = report.onClick.apply(this, arguments);
if (!result || !result.link) {
return;
}
link = result.link;
if (result.segment) {
segment = result.segment;
}
break;
}
}
if (link) {
var href = Overlay_Helper.getOverlayLink(this.dataTable.param.idSite, 'month', 'today', segment, link);
actionA.attr({
target: '_blank',
href: href
});
}
}
return true;
};
DataTable_RowActions_Registry.register({
name: 'Overlay',
dataTableIcon: 'icon-overlay',
order: 30,
dataTableIconTooltip: [
_pk_translate('General_OverlayRowActionTooltipTitle'),
_pk_translate('General_OverlayRowActionTooltip')
],
createInstance: function (dataTable) {
return new DataTable_RowActions_Overlay(dataTable);
},
isAvailableOnReport: function (dataTableParams) {
// Overlay plugin only works when Transitions plugin is enabled
if (!window.DataTable_RowActions_Transitions) {
return false;
}
var i = 0;
for (i; i < DataTable_RowActions_Overlay.registeredReports.length; i++) {
var report = DataTable_RowActions_Overlay.registeredReports[i];
if (report
&& report.isAvailableOnReport
&& report.isAvailableOnReport(dataTableParams)) {
return true;
}
}
return false;
},
isAvailableOnRow: function (dataTableParams, tr) {
var transitions = DataTable_RowActions_Registry.getActionByName('Transitions');
return transitions.isAvailableOnRow(dataTableParams, tr);
}
});

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "المكان"
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "Лакаця"
}
}

View File

@ -0,0 +1,16 @@
{
"Overlay": {
"Clicks": "%s клика",
"ClicksFromXLinks": "%1$s щраквания от една от %2$s връзките",
"Domain": "Домейн",
"ErrorNotLoadingDetails": "Възможно е заредената страница вдясно да няма последяващия Matomo код. В този случай опитайте да стартирате нова връзка за различна страница от доклада на страници.",
"ErrorNotLoadingLink": "Щраквайки тук, ще получите повече съвети за отстраняване на проблеми",
"Link": "Връзка",
"Location": "Местоположение",
"NoData": "Няма данни за тази страница по време на избрания период.",
"OneClick": "1 клик",
"OpenFullScreen": "Цял екран (без странична лента)",
"RedirectUrlErrorAdmin": "Може да добавите домейнът като допълнителен адрес %1$sв настройките%2$s.",
"RedirectUrlErrorUser": "Попитайте вашият администратор да добави домейна, като допълнителен URL."
}
}

View File

@ -0,0 +1,19 @@
{
"Overlay": {
"Clicks": "%s clicks",
"ClicksFromXLinks": "%1$s clicks de un de %2$s enllaços",
"Domain": "Domini",
"ErrorNotLoading": "No es pot iniciar la sessió de pàgines Overlay",
"ErrorNotLoadingDetails": "Potser la pàgina carregada a la dreta no te el codi de rastreig de Matomo. En aquest cas, proveu de llençar el Overlay d'un altra pàgina del informe de pàgines.",
"ErrorNotLoadingDetailsSSL": "Com esteu fent servir Matomo a través de https, es possible que el vostre lloc web no suporti el SSL. Proveu utilitzant el Matomo sobre http.",
"ErrorNotLoadingLink": "Feu click aquí per obtenir més informació sobre com solucionar el problema.",
"Link": "Enllaç",
"Location": "Ubicació",
"NoData": "No hi ha informació per aquesta pàgina en el període seleccionat.",
"OneClick": "1 click",
"OpenFullScreen": "Mostra a pantalla complerta (sense barra lateral)",
"Overlay": "Overlay de pàgina",
"RedirectUrlErrorAdmin": "Podeu afegir una URL addicional per un domini a %1$s les preferències%2$s.",
"RedirectUrlErrorUser": "Contacteu amb el vostre administrador per afegir el domini com una URL adicional."
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s kliknutí",
"ClicksFromXLinks": "%1$s kliknutí z některého z %2$s odkazů",
"Domain": "Doména",
"ErrorNotLoading": "Sezení překryvu stránky nemohlo být zatím spuštěno.",
"ErrorNotLoadingDetails": "Možná nemá načtená stránka na pravé straně sledovací kód. V tomto případě zkuste spustit překryv pro jinou stránku z hlášení stránek.",
"ErrorNotLoadingDetailsSSL": "Protože používáte Matomo přes HTTPS, nejpravděpodobnější je, že stránky nepodporují SSL. Zkuste přistoupit k Matomou přes HTTP.",
"ErrorNotLoadingLink": "Klikněte zde pro více tipů k řešení problémů",
"Link": "Odkaz",
"Location": "Umístění",
"NoData": "V daném období nejsou pro vybranou stránku k dispozici žádná data.",
"OneClick": "1 kliknutí",
"OpenFullScreen": "Přejít na celou obrazovku (bez postranní lišty)",
"Overlay": "Překryv stránky",
"PluginDescription": "Podívejte se na analytická data jako na překryv na svých stránkách. Zjistěte, kolik uživatelů kliklo na jaký odkaz. Poznámka: vyžaduje povolený zásuvný modul přechodů.",
"RedirectUrlErrorAdmin": "Doménu můžete jako další URL přidat v %1$snastavení%2$s.",
"RedirectUrlErrorUser": "Požádejte svého administrátora o přidání stránky jako další URL:."
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s klik",
"ClicksFromXLinks": "%1$s klik fra et af %2$s link",
"Domain": "Domæne",
"ErrorNotLoading": "Sideoverlay session kunne ikke startes endnu.",
"ErrorNotLoadingDetails": "Måske den indlæste side til højre ikke har Matomo sporingskode. I så tilfælde, kan du prøve at starte overlejring for en anden side fra siderapporter.",
"ErrorNotLoadingDetailsSSL": "Da du bruger Matomo over HTTPS, er den mest sandsynlige årsag, at hjemmesiden ikke understøtter SSL. Prøv at bruge Matomo over HTTP.",
"ErrorNotLoadingLink": "Klik her for at få flere tips til fejlfinding",
"Link": "Link",
"Location": "Lokation",
"NoData": "Der er ingen data for denne side i den valgte periode.",
"OneClick": "1 klik",
"OpenFullScreen": "Vis fuldskærm (ingen sidebjælke)",
"Overlay": "Side overlejring",
"PluginDescription": "Se dine analytiske data som et lag over din aktuelle webside. Se hvor mange gange brugere har klikket på de enkelte links. Note: Kræver at Transitions programtilføjelsen er aktiveret.",
"RedirectUrlErrorAdmin": "Du kan tilføje domænet som en yderligere URL %1$si indstillingerne%2$s.",
"RedirectUrlErrorUser": "Spørg administratoren om at tilføje domænet som en yderligere URL."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s Klicks",
"ClicksFromXLinks": "%1$s Klicks von einem von %2$s Verweisen",
"Domain": "Domain",
"ErrorNotLoading": "Die Seiten Overlay Sitzung kann gerade nicht aufgerufen werden.",
"ErrorNotLoadingDetails": "Möglicherweise hat die rechte Seite keinen Matomo Tracking Code. In diesem Fall bitte versuchen das Overlay für eine andere Seite aus dem Seitenbericht zu benutzen.",
"ErrorNotLoadingDetailsSSL": "Da Sie Matomo über https nutzen, ist es wahrscheinlich, dass Ihre Website kein SSL unterstützt. Bitte benutzen Sie Matomo über http.",
"ErrorNotLoadingLink": "Klicken Sie hier für weitere Tipps zur Fehlerbehebung",
"Link": "Link",
"Location": "Seite",
"NoData": "Für den gewählten Zeitraum gibt es keine Daten für diese Seite.",
"OneClick": "1-click",
"OpenFullScreen": "Vollbildmodus starten (keine Sidebar)",
"Overlay": "Seiten Overlay",
"PluginDescription": "Sehen Sie Ihre Analysedaten als ein Overlay auf Ihrer aktuellen Website an. Lassen Sie sich anzeigen wie oft Ihre Benutzer auf welchen Link geklickt haben. Hinweis: Benötigt das Transitions-Plugin.",
"RedirectUrlError": "Sie versuchen, eine Seiten Overlay Sitzung für die URL \"%1$s\" zu starten. %2$s Keine der in den Mamoto Einstellungen hinterlegten Domains passt zu diesem Link.",
"RedirectUrlErrorAdmin": "Sie können diese Domain %1$sin den Einstellungen%2$s als zusätzliche URL hinzufügen.",
"RedirectUrlErrorUser": "Bitten Sie Ihren Administrator diese Domain als zusätzliche URL hinzuzufügen."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s πατήματα",
"ClicksFromXLinks": "%1$s πατήματα από ένα από τους %2$s συνδέσμους",
"Domain": "Τομέας",
"ErrorNotLoading": "Η συνεδρία Υπερκάλυψης Σελίδας δεν προσπελάστηκε ακόμα.",
"ErrorNotLoadingDetails": "Ίσως η ιστοσελίδα που φορτώνει στα δεξιά δεν έχει τον κώδικα ιχνηλάτη του Matomo. Σε αυτή την περίπτωση, προσπαθήστε να εκκινήσετε την Επικάλυψη για μια διαφορετική σελίδα από την αναφορά σελίδων.",
"ErrorNotLoadingDetailsSSL": "Δεδομένου ότι χρησιμοποιείτε το Matomo σε https, η πιο πιθανή αιτία είναι ότι η ιστοσελίδα σας δεν υποστηρίζει SSL. Δοκιμάστε να χρησιμοποιήσετε το Matomo σε http.",
"ErrorNotLoadingLink": "Πατήστε εδώ για να λάβετε περισσότερες οδηγίες για την αντιμετώπιση προβλημάτων",
"Link": "Σύνδεσμος",
"Location": "Τοποθεσία",
"NoData": "Δεν υπάρχουν δεδομένα για αυτή τη σελίδα κατά τη διάρκεια της επιλεγμένης περιόδου.",
"OneClick": "1 πάτημα",
"OpenFullScreen": "Μετάβαση σε πλήρη οθόνη (χωρίς πλευρική γραμμή)",
"Overlay": "Υπερκάλυψη Σελίδας",
"PluginDescription": "Δείτε τα δεδομένα αναλυτικών σας ως Υπέρθεση στον ιστοτόπο σας. Δείτε πόσες φορές οι χρήστες σας κάνανε κλικ σε κάθε σύνδεσμο. Σημείωση: Απαιτείται να είναι ενεργοποιημένο το πρόσθετο Transitions.",
"RedirectUrlError": "Προσπαθείτε να ανοίξετε τη Σελίδα Υπέρθεσης για το URL \"%1$s\". %2$s Κανένα από τα ονόματα στις ρυθμίσεις του Matomo δεν συμφωνεί με το σύνδεσμο.",
"RedirectUrlErrorAdmin": "Μπορείτε να προσθέσετε το όνομα ως επιπρόσθετο URL %1$sστις ρυθμίσεις%2$s.",
"RedirectUrlErrorUser": "Ζητήστε από το διαχειριστή σας για να προσθέσετε το όνομα χώρου ως μια επιπλέον διεύθυνση URL."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s clicks",
"ClicksFromXLinks": "%1$s clicks from one of %2$s links",
"Domain": "Domain",
"ErrorNotLoading": "The Page Overlay session couldn't be launched yet.",
"ErrorNotLoadingDetails": "Maybe the page loaded on the right doesn't have the Matomo tracker code. In this case, try launching Overlay for a different page from the pages report.",
"ErrorNotLoadingDetailsSSL": "Since you're using Matomo over https, the most likely cause is that your website doesn't support SSL. Try using Matomo over http.",
"ErrorNotLoadingLink": "Click here to get more tips for troubleshooting",
"Link": "Link",
"Location": "Location",
"NoData": "There is no data for this page during the selected period.",
"OneClick": "1 click",
"OpenFullScreen": "Go full screen (no sidebar)",
"Overlay": "Page Overlay",
"PluginDescription": "See your analytics data as an Overlay on your actual website. View how many times your users have clicked on each link. Note: Requires the Transitions plugin enabled.",
"RedirectUrlError": "You are attempting to open Page Overlay for the URL \"%1$s\". %2$s None of the domains from the Matomo settings matches the link.",
"RedirectUrlErrorAdmin": "You can add the domain as an additional URL %1$sin the settings%2$s.",
"RedirectUrlErrorUser": "Ask your administrator to add the domain as an additional URL."
}
}

View File

@ -0,0 +1,17 @@
{
"Overlay": {
"Clicks": "%s clicks",
"ClicksFromXLinks": "%1$s clics desde uno de %2$s links",
"Domain": "Dominio",
"ErrorNotLoading": "La sesión de superposición de página no puede ser aun iniciada.",
"ErrorNotLoadingLink": "Clic aquí para obtener más ayuda acerca de soluciones de problemas.",
"Link": "Enlace",
"Location": "Ubicación",
"NoData": "No hay información para esta página en el período seleccionado.",
"OneClick": "1 clic",
"OpenFullScreen": "Ir a pantalla completa",
"Overlay": "Vísta general de página",
"RedirectUrlErrorAdmin": "Puede agregar el dominio como una dirección de internet %1$sen la configuración%2$s.",
"RedirectUrlErrorUser": "Pregunte a su administrador para agregar el dominio como una dirección de internet adicional."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s clics",
"ClicksFromXLinks": "%1$s clics desde uno de %2$s enlaces",
"Domain": "Dominio",
"ErrorNotLoading": "La sesión de superposición de página no puede ser aun iniciada.",
"ErrorNotLoadingDetails": "Tal vez la página cargada a su derecha no posee el código de rastreo Matomo. En este caso, trate de lanzar Overlay para una página diferente desde las páginas de informe.",
"ErrorNotLoadingDetailsSSL": "Ya que está utilizando Matomo sobre https, la causa más probable es que su sitio de internet no provea soporte SSL. Intente utilizar Matomo sobre http.",
"ErrorNotLoadingLink": "Clic aquí para obtener más ayuda acerca de soluciones de problemas",
"Link": "Enlace",
"Location": "Ubicación",
"NoData": "No hay información para esta página en el período seleccionado.",
"OneClick": "1 clic",
"OpenFullScreen": "Ir a pantalla completa (sin barras laterales)",
"Overlay": "Superposición de página",
"PluginDescription": "Vea su información analítica como una superposición en su actual sitio de internet. Vea cuántas veces sus usuarios han hecho clic en cada enlace. Nota: Requiere el complemento Transitions habilitado.",
"RedirectUrlError": "Está intentando abrir Page Overlay de la URL \"%1$s\". %2$s Ninguno de los dominios apuntados en lla configuración de Matomo coincide con el enlace.",
"RedirectUrlErrorAdmin": "Puede agregar el dominio como una URL %1$sen la configuración%2$s.",
"RedirectUrlErrorUser": "Pregunte a su administrador para agregar el dominio como una dirección de internet adicional."
}
}

View File

@ -0,0 +1,12 @@
{
"Overlay": {
"Clicks": "%s klikki",
"ClicksFromXLinks": "%1$s klikki %2$s lingilt",
"Domain": "Domeen",
"Link": "Link",
"Location": "Asukoht",
"OneClick": "1 klikk",
"OpenFullScreen": "Ava täisekraani vaade (ilma külgribata)",
"Overlay": "Lehe statistika kiht"
}
}

View File

@ -0,0 +1,17 @@
{
"Overlay": {
"Clicks": "%s کلیک",
"ClicksFromXLinks": "%1$s کلیک از یکی از %2$s لینک",
"Domain": "دامنه",
"ErrorNotLoading": "صفحه از دسترس خارج شد و نمی تواند راه اندازی می شود.",
"ErrorNotLoadingLink": "اینجا کلیک کنید تا نکات بیشتری درباره عیب یابی بدانید",
"Link": "لینک",
"Location": "موقعیت",
"NoData": "داده ای برای این صفحه در طی بازه ی انتخاب شده وجود ندارد.",
"OneClick": "1 کلیک",
"OpenFullScreen": "به حالت تمام صفحه برو (بدون ستون کناری)",
"Overlay": "صفحه از دسترس خارج شد",
"RedirectUrlErrorAdmin": "شما توانید آدرس های جدیدی را اضافه نمایید URL %1$sin the settings%2$s.",
"RedirectUrlErrorUser": "از مدیریت بخواهید که این دامنه را به عنوان دامنه اضافی بیافزاید."
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s klikkausta",
"ClicksFromXLinks": "%1$s klikkaukset yhdestä %2$s:n linkeistä",
"Domain": "Verkkotunnus",
"ErrorNotLoading": "Sivun leijuke sessiota ei voitu käynnistää vielä.",
"ErrorNotLoadingDetails": "On mahdollista, ettei ladatulla sivulla ole Matomon seurantakoodia. Yritä käynnistää leijuke toiselle sivulle sivuraportista.",
"ErrorNotLoadingDetailsSSL": "Koska käytät Matomoa https:llä, todennäköisin syy on, ettei verkkosivusi tue SSL:ää. Kokeile käyttää Matomoa http:llä.",
"ErrorNotLoadingLink": "Klikkaa tästä saadaksesi lisää vinkkejä vianetsintään",
"Link": "Linkki",
"Location": "Sijainti",
"NoData": "Tällä sivulla ei ole tietoja valitulla ajalla.",
"OneClick": "1 klikkaus",
"OpenFullScreen": "Siirry koko näytön tilaan (ei sivupalkkia)",
"Overlay": "Sivun leijuke",
"PluginDescription": "Näe analytiikkatietosi omalla verkkosivullasi. Katso kuinka monta kertaa käyttäjät ovat klikanneet linkkejäsi. Huom.: \"Transitions\"-lisäosan täytyy olla käytössä.",
"RedirectUrlErrorAdmin": "Voit lisätä domainin ylimääräisenä URL:nä %1$sasetuksissa%2$s.",
"RedirectUrlErrorUser": "Pyydä ylläpitää lisäämään domain ylimääräisenä verkkosivuna."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s clics",
"ClicksFromXLinks": "%1$s clics depuis un des %2$s liens",
"Domain": "Domaine",
"ErrorNotLoading": "L'analyse des pages web n'a pas pu être lancée pour le moment.",
"ErrorNotLoadingDetails": "Peut être que la page chargée sur la droite n'a pas de code de suivi Matomo. Dans ce cas, essayez de lancer la navigation superposée depuis une autre page que le rapport de pages.",
"ErrorNotLoadingDetailsSSL": "Etant donné que vous utilisez Matomo en https, la cause la plus probable est que votre site web ne supporte pas le SSL. Essayez d'utiliser Matomo en http.",
"ErrorNotLoadingLink": "Cliquez ici pour obtenir plus d'informations de dépannage.",
"Link": "Lien",
"Location": "Localisation",
"NoData": "Il n'y a aucune données durant cette période",
"OneClick": "1 clic",
"OpenFullScreen": "Ouvrir en plein écran",
"Overlay": "Analyse des pages web",
"PluginDescription": "Visualisez vos données d'analyse comme une Superposition de votre site web. Voyez combien de fois vos utilisateurs ont cliqué sur chaque lien. Remarque: Nécessite que le composant Transitions soit activé.",
"RedirectUrlError": "Vous tentez d'ouvrir l'analyse des pages web pour l'URL \"%1$s\". %2$s Aucun des domaines configurés dans Matomo ne correspond à cette URL.",
"RedirectUrlErrorAdmin": "Vous pouvez ajouter le domaine en tant qu'URL additionnelle %1$sdans les paramètres%2$s.",
"RedirectUrlErrorUser": "Demandez à votre administrateur d'ajouter le domaine en tant qu'URL additionnelle."
}
}

View File

@ -0,0 +1,7 @@
{
"Overlay": {
"Clicks": "%s לחיצות",
"Location": "מיקום",
"OneClick": "לחיצה 1"
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s क्लिक करता है",
"ClicksFromXLinks": "%1$s एक %2$sलिंक से क्लिक करता है",
"Domain": "डोमेन",
"ErrorNotLoading": "पृष्ठ आवरण सत्र अभी तक शुरू नहीं किया जा सका.",
"ErrorNotLoadingDetails": "शायद दाएँ तरफ लोड किया पृष्ठ पर Matomo ट्रैकर कोड नहीं है. इस मामले में, पृष्ठों की रिपोर्ट से एक अलग पेज के लिए आवरण शुरू करने का प्रयास करें.",
"ErrorNotLoadingDetailsSSL": "आप https के ऊपर Matomo का उपयोग कर रहे हैं, सबसे संभावित कारण आपकी वेबसाइट एसएसएल समर्थन नहीं करती है. Http पर Matomo का उपयोग करने का प्रयास करें.",
"ErrorNotLoadingLink": "समस्या निवारण के लिए और अधिक सुझाव प्राप्त के लिए यहां क्लिक करें",
"Link": "लिंक",
"Location": "स्थान",
"NoData": "चयनित अवधि के दौरान इस पृष्ठ के लिए कोई डाटा नहीं है.",
"OneClick": "1 क्लिक करें",
"OpenFullScreen": "पूर्ण स्क्रीन (कोई साइडबार नहीं ) के लिए जाओ",
"Overlay": "पृष्ठ आवरण",
"PluginDescription": "अपने वास्तविक वेबसाइट पर ओवरले के रूप में अपने Analytics डेटा देखें। अपने उपयोगकर्ताओं को एक लिंक पर क्लिक किया है कि कैसे कई बार देखें। नोट: सक्षम बदलाव प्लगइन की आवश्यकता है।",
"RedirectUrlErrorAdmin": "आप सेटिंग्स%1$s से एक अतिरिक्त URL%2$s के रूप में डोमेन जोड़ सकते हैं",
"RedirectUrlErrorUser": "एक अतिरिक्त URL के रूप में डोमेन को जोड़ने के लिए अपने व्यवस्थापक से पूछें."
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "Lokacija"
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "Hely"
}
}

View File

@ -0,0 +1,19 @@
{
"Overlay": {
"Clicks": "%s klik",
"ClicksFromXLinks": "%1$s klik dari salah satu %2$s tautan",
"Domain": "Ranah",
"ErrorNotLoading": "Sesi Penghampar Halaman belum dapat diluncurkan.",
"ErrorNotLoadingDetails": "Kemungkinan yang dimuat di kanan tidak memiliki kode pelcakan Matomo. Dalam hal ini, silakan mencoba meluncurkan Penghampar untuk halaman yang berbeda dari laporan halaman.",
"ErrorNotLoadingDetailsSSL": "Sejak Anda menggunakan Matomo melalui https, kemungkinan besar penyebabnya adalah situs Anda tidak mendukung SSL. Silakan menggunakan Matomo melalui http.",
"ErrorNotLoadingLink": "Klik di sini untuk memperoleh kiat-kiat pemecahan masalah",
"Link": "Tautan",
"Location": "Lokasi",
"NoData": "Tidak ada data untuk halaman ini selama periode terpilih.",
"OneClick": "1 kilik",
"OpenFullScreen": "Menuju halaman penuh (tanpa batang sisi)",
"Overlay": "Penghampar Halaman",
"RedirectUrlErrorAdmin": "Anda dapat menambah ranah sebagai URL tambahan di %1$spengaturan%2$s.",
"RedirectUrlErrorUser": "Silakan bertanya kepada pengelola Anda untuk menambah ranah sebagai URL tambahan."
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "Staðsetning"
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s clicks",
"ClicksFromXLinks": "%1$s clicks per uno di %2$s links",
"Domain": "Dominio",
"ErrorNotLoading": "La sessione di Overlay Pagina non può ancora essere lanciata.",
"ErrorNotLoadingDetails": "Forse la pagina caricata sulla destra non ha il codice di tracking di Matomo. In questo caso prova ad avviare Overlay per una pagina diversa dal report pagine.",
"ErrorNotLoadingDetailsSSL": "Dal momento che si sta utilizzando Matomo su HTTPS, la causa più probabile è che il vostro sito web non supporti SSL. Prova a utilizzare Matomo su HTTP.",
"ErrorNotLoadingLink": "Ottieni altri suggerimenti sui problemi",
"Link": "Link",
"Location": "Posizione",
"NoData": "Non vi sono dati per questa pagina nel periodo selezionato",
"OneClick": "1 click",
"OpenFullScreen": "Vai a schermo intero (niente barra laterale)",
"Overlay": "Overlay di Pagina",
"PluginDescription": "Vedi i tuoi dati statistici in sovrapposizione al tuo sito web. Guarda quante volte i tuoi utenti hanno cliccato su ciascun link. Nota: Richiede che sia abilitato il plugin Transitions.",
"RedirectUrlError": "Stai tentando di aprire Overlay Pagina per l'URL \"%1$s\". %2$sNessuno dei domini delle impostazioni Matomo corrisponde al link.",
"RedirectUrlErrorAdmin": "È possibile aggiungere il dominio come un ulteriore URL nelle %1$simpostazioni%2$s.",
"RedirectUrlErrorUser": "Chiedi all'amministratore di aggiungere il dominio come un URL aggiuntivo."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s クリック",
"ClicksFromXLinks": "%2$s リンクの 1 つからの%1$s クリック",
"Domain": "ドメイン",
"ErrorNotLoading": "ページオーバーレイ・セッションがまだ開始されていません。",
"ErrorNotLoadingDetails": "右側にロードされたページには、Matomo 追跡コードがありません。ページレポートとは異なるページで、オーバーレイの起動をお試しください。",
"ErrorNotLoadingDetailsSSL": "Matomo を https 経由で利用していますが、お使いのパソコンが SSL をサポートしていないことが原因として考えられます。http 経由でのご利用をお試しください。",
"ErrorNotLoadingLink": "トラブルシューティングのためのヒントは、こちらをクリック",
"Link": "リンク",
"Location": "位置情報",
"NoData": "このページに対する選択された期間のデータは存在しません。",
"OneClick": "1 クリック",
"OpenFullScreen": "フルスクリーンへ (サイドバーなし)",
"Overlay": "ページオーバーレイ",
"PluginDescription": "実際の web サイト上のオーバーレイ分析データを参照してください。ユーザーが各リンクをクリックした回数が表示されます。注: 有効なトランジションプラグインが必要です。",
"RedirectUrlError": "URL \"%1$s\" のページオーバーレイを開こうとしています。 %2$s Matomo 設定のドメインのどれもリンクに一致しません。",
"RedirectUrlErrorAdmin": "%1$s 設定で %2$s 追加の URL としてドメインを追加できます。",
"RedirectUrlErrorUser": "管理者に、任意のドメインを追加 URL として追加するよう管理者に依頼してください。"
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "მდებარეობა"
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s회 클릭",
"ClicksFromXLinks": "%2$s개의 링크 중 하나를 %1$s회 클릭",
"Domain": "도메인",
"ErrorNotLoading": "페이지 오버레이 세션을 아직 실행할 수 없습니다.",
"ErrorNotLoadingDetails": "오른쪽에 로드된 페이지는 Matomo의 추적 코드가 누락되었을 수 있습니다. 이 경우, 페이지 보고서에서 다른 페이지에서 오버레이를 실행해보세요.",
"ErrorNotLoadingDetailsSSL": "Matomo에서 HTTPS를 사용하도록 설정되었지만, 당신의 웹사이트는 SSL을 지원하지 않습니다. Matomo에 HTTP를 사용해 보세요.",
"ErrorNotLoadingLink": "이 곳을 클릭하여 더 많은 문제 해결에 대한 팁 보기",
"Link": "링크",
"Location": "위치",
"NoData": "선택한 기간 동안이 페이지에 대한 데이터가 없습니다.",
"OneClick": "1회 클릭",
"OpenFullScreen": "전체 화면 (사이드바 아님)으로 이동",
"Overlay": "페이지 오버레이",
"PluginDescription": "당신의 웹사이트 분석 데이터를 오버레이 형식으로 볼 수 있습니다. 사용자가 얼마나 각 링크를 클릭했는지 확인해보세요. 참고: Transitions 플러그인이 활성화 되어 있어야 합니다.",
"RedirectUrlErrorAdmin": "당신은 %1$s설정%2$s에서 추가적인 URL로 도메인을 추가할 수 있습니다.",
"RedirectUrlErrorUser": "도메인에 추가적인 URL을 추가하려면 관리자에게 문의하세요."
}
}

View File

@ -0,0 +1,6 @@
{
"Overlay": {
"Clicks": "%s spustelėjimų",
"Location": "Vietovė"
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "Lokācijas"
}
}

View File

@ -0,0 +1,10 @@
{
"Overlay": {
"Clicks": "%s klikk",
"Domain": "Domene",
"ErrorNotLoadingLink": "Klikk her for å få flere tips for feilsøking",
"Link": "Lenke",
"Location": "Sted",
"OneClick": "1 klikk"
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s kliks",
"ClicksFromXLinks": "%1$s Kliks van één van %2$s links",
"Domain": "Domein",
"ErrorNotLoading": "De Pagina Overlay sessie kon nog niet gestart worden.",
"ErrorNotLoadingDetails": "De aan de rechter kant geladen pagina heeft wellicht niet de Matomo tracker code. Probeer in dat geval een andere pagina van het rapport 'Pagina's' als overlay.",
"ErrorNotLoadingDetailsSSL": "Omdat u Matomo via https gebruikt is het waarschijnlijk dat uw website geen SSL ondersteunt. Probeer Matomo via http te gebruiken.",
"ErrorNotLoadingLink": "Klik hier voor meer tips tijdens het troubleshooten.",
"Link": "Link",
"Location": "Locatie",
"NoData": "Er is geen data voor deze pagina gedurende de geselecteerde periode.",
"OneClick": "1 klik",
"OpenFullScreen": "Naar volledig scherm (geen zijbalk)",
"Overlay": "Pagina Overlay",
"PluginDescription": "Zie je analyse data als een transparant op je eigenlijke website. Zie hoeveel keer je bezoekers hebben geklik op elke link. Opmerking: Vereist dat de Transitions plugin is ingeschakeld.",
"RedirectUrlErrorAdmin": "Je kunt het domein toevoegen als extra URL %1$sin de instellingen%2$s.",
"RedirectUrlErrorUser": "Vraag je beheerder om het domein toe te voegen als additionele URL."
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "Plass"
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s kliknięć",
"ClicksFromXLinks": "%1$s kliknięć z jednego z %2$s odnośników",
"Domain": "Domena",
"ErrorNotLoading": "Sesja Nakładki Strony nie mogła zostać uruchomiona.",
"ErrorNotLoadingDetails": "Może strona załadowana po prawej stronie nie ma kodu śledzącego Matomo. W takim przypadku spróbuj uruchomić Nakładkę dla innej strony widocznej w raporcie.",
"ErrorNotLoadingDetailsSSL": "W związku z faktem, że Matomo korzysta z połączenia HTTPS i jest prawdopodobne, że Twój serwis nie korzysta z SSL'a. Spróbuj użyuć Matomo'a na HTTP.",
"ErrorNotLoadingLink": "Kliknij tu, aby uzyskać więcej podpowiedzi i pomocy",
"Link": "Odnośnik",
"Location": "Lokalizacja",
"NoData": "Brak danych dla wybranej strony we wskazanym przedziale czasu.",
"OneClick": "1 kliknięcie",
"OpenFullScreen": "Tryb pełnoekranowy (bez paska)",
"Overlay": "Nakładka Strony",
"PluginDescription": "Oglądaj dane analityczne jako Nakładkę na Twoją stronę. Zobacz liczbę kliknięć wszystkich odwiedzających w poszczególne odnośniki. Notka: Wymaga włączenia wtyczki Transitions.",
"RedirectUrlError": "Próbujesz otworzyć Nakładkę Strony dla adresu \"%1$s\". %2$s Żadna ze skonfigurowanych w Matomo domen nie pasuje do wskazanego adresu.",
"RedirectUrlErrorAdmin": "Możesz dodać domenę jako dodatkowy adres URL %1$sw ustawieniach%2$s.",
"RedirectUrlErrorUser": "Zwrócić się do administratora, aby dodać domenę jako dodatkowy URL."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s cliques",
"ClicksFromXLinks": "%1$s cliques de um dos %2$s links",
"Domain": "Domínio",
"ErrorNotLoading": "A sessão de sobreposição de página (Page Overlay) ainda não pode ser exibida.",
"ErrorNotLoadingDetails": "Talvez a página carregada no lado direito não tem o código JS de rastreamento. Neste caso, tente iniciar sobreposição para uma página diferente das páginas do relatório.",
"ErrorNotLoadingDetailsSSL": "Desde que você está usando Matomo sobre https, a causa mais provável é que o seu site não suporta SSL. Tente usar Matomo sobre http.",
"ErrorNotLoadingLink": "Clique aqui para obter mais dicas para solução de problemas",
"Link": "Link",
"Location": "Localização",
"NoData": "Não há dados para esta página durante o período selecionado.",
"OneClick": "1 clique",
"OpenFullScreen": "Ir para tela cheia (sem barra lateral)",
"Overlay": "Sobreposição de Página",
"PluginDescription": "Veja os dados das suas análises como uma sobreposição em seu site real. Veja quantas vezes os usuários clicaram em cada link. Nota: Requer o plugin Transições ativado.",
"RedirectUrlError": "Você está tentando abrir a página para a URL \"1%1$s\". 2%2$s Nenhum dos domínios das configurações do Matomo corresponde ao link.",
"RedirectUrlErrorAdmin": "Você pode adicionar um domínio como uma URL adicional %1$sem definições%2$s.",
"RedirectUrlErrorUser": "Solicite ao seu administrador para adicionar o domínio como uma URL adicional."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s cliques",
"ClicksFromXLinks": "%1$s cliques de uma destas %2$s ligações",
"Domain": "Domínio",
"ErrorNotLoading": "A sessão de Sobreposição na página ainda não pode ser lançada.",
"ErrorNotLoadingDetails": "Talvez a página carregada à direita não tem o código de acompanhamento do Matomo. Neste caso, tente executar a Sobreposição para um página diferente no relatório de páginas.",
"ErrorNotLoadingDetailsSSL": "Se estiver a utilizar o Matomo sob https, o motivo mais comum é que o seu site não suporta SSL. Tente utilizar o Matomo sob http.",
"ErrorNotLoadingLink": "Clique aqui para obter mais dicas para diagnóstico",
"Link": "Ligação",
"Location": "Localização",
"NoData": "Não existem dados para esta página durante o período selecionado.",
"OneClick": "1 clique",
"OpenFullScreen": "Ir para ecrã inteiro (sem barra lateral)",
"Overlay": "Sobreposição na página",
"PluginDescription": "Veja os seus dados de análise como uma Sobreposição no seu próprio site. Veja quantas vezes os seus utilizadores clicaram em cada ligação. Nota: requer que a extensão Transições esteja ativa.",
"RedirectUrlError": "Está a tentar abrir uma Sobreposição na página para o endereço \"%1$s\". %2$s Nenhum dos domínios nas definições do Matomo coincide com esta ligação.",
"RedirectUrlErrorAdmin": "Pode adicionar o domínio como um endereço adicional %1$snas definições%2$s.",
"RedirectUrlErrorUser": "Peça ao seu administrador para adicionar o domínio como um endereço adicional."
}
}

View File

@ -0,0 +1,19 @@
{
"Overlay": {
"Clicks": "%s click-uri",
"ClicksFromXLinks": "%1$s click-uri de la unul dintre %2$s link-uri",
"Domain": "Domeniu",
"ErrorNotLoading": "Sesiunea de acoperire pagina nu a putut fi lansata încă.",
"ErrorNotLoadingDetails": "Poate pagina încărcată din dreapta nu are codul de urmărire Matomo. În acest caz, încercați lansarea Overlay pentru o altă pagină din raportul de pagini.",
"ErrorNotLoadingDetailsSSL": "Din moment ce utilizați Matomo peste https, cauza cea mai probabilă este că site-ul dvs. nu suporta SSL. Încercați să folosiți Matomo peste http.",
"ErrorNotLoadingLink": "Click aici pentru a obține mai multe sfaturi pentru depanare",
"Link": "Legătură",
"Location": "Localitate",
"NoData": "Nu există date pentru această pagină în perioada selectată.",
"OneClick": "1 click",
"OpenFullScreen": "Tot ecranul (fără bara laterală)",
"Overlay": "Acoperire Pagina",
"RedirectUrlErrorAdmin": "Puteți adăuga domeniul ca o suplimentare de URL-ul %1$s in setarile%2$s.",
"RedirectUrlErrorUser": "Adresați-vă administratorului pentru a adăuga un domeniu ca un URL suplimentar."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s кликов",
"ClicksFromXLinks": "%1$s кликов по одной из %2$s ссылок",
"Domain": "Домен",
"ErrorNotLoading": "Сеанс Page Overlay ещё не запущен.",
"ErrorNotLoadingDetails": "Возможно, страница, загруженная справа, не имеет кода отслеживания Matomo. В этом случае попробуйте запустить наложение для другой страницы из отчёта о страницах.",
"ErrorNotLoadingDetailsSSL": "Поскольку вы используете Matomo через https, наиболее вероятной причиной является то, что ваш сайт не поддерживает SSL. Попробуйте использовать Matomo через http.",
"ErrorNotLoadingLink": "Получить дополнительные советы по устранению неполадок",
"Link": "Ссылка",
"Location": "Местоположение",
"NoData": "Нет данных по этой странице за выбранный период.",
"OneClick": "1 клик",
"OpenFullScreen": "Перейти к полному экрану",
"Overlay": "Глубина проникновения",
"PluginDescription": "Просматривайте свои аналитические данные в виде наложения на ваш фактический веб-сайт. Посмотрите, сколько раз ваши пользователи нажимали на каждую ссылку. Примечание: Требуется наличие подключаемого модуля Transitions.",
"RedirectUrlError": "Вы пытаетесь открыть наложение страницы для URL «%1$s». %2$sНи один из доменов из настроек Matomo не соответствует ссылке.",
"RedirectUrlErrorAdmin": "Можете добавить домен как дополнительный URL %1$sв настройках%2$s.",
"RedirectUrlErrorUser": "Попросите администратора добавить домен как дополнительный URL."
}
}

View File

@ -0,0 +1,8 @@
{
"Overlay": {
"Clicks": "%s kliknutia",
"Location": "Miesto",
"OpenFullScreen": "Prejsť na celú obrazovku (bez bočnej lišty)",
"Overlay": "Prekrytie stránky"
}
}

View File

@ -0,0 +1,5 @@
{
"Overlay": {
"Location": "Lokacija"
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s klikime",
"ClicksFromXLinks": "%1$s klikime nga një prej %2$s lidhjeve",
"Domain": "Përkatësi",
"ErrorNotLoading": "Sesioni Përmbledhje Faqesh su nis dot ende.",
"ErrorNotLoadingDetails": "Ndoshta faqja e ngarkuar djathtas ska kod ndjekësi Matomo. Në këtë rast, provoni të hapni Përmbledhjen për një faqe tjetër që nga raporti për faqet.",
"ErrorNotLoadingDetailsSSL": "Meqë po e përdorni Matomo-n përmes https-je, shkaku më i mundshëm është që sajti juaj nuk e mbulon SSL-në. Provoni ta përdorni Matomo-n përmes http-je.",
"ErrorNotLoadingLink": "Klikoni këtu që të merrni më tepër ndihmëza diagnostikimi",
"Link": "Lidhje",
"Location": "Vend",
"NoData": "Ska të dhëna për këtë faqe gjatë periudhës së përzgjedhur.",
"OneClick": "1 klikim",
"OpenFullScreen": "Kalo sa krejt ekrani (pa anështyllë)",
"Overlay": "Përmbledhje Faqeje",
"PluginDescription": "Shihni të dhënat tuaja statistikore si një Përmbledhje te sajti juaj aktual. Shihni sa herë kanë klikuar përdoruesit tuaj në secilën lidhje. Shënim: Lyp të aktivizuar shtojcën Tranzicione.",
"RedirectUrlError": "Po përpiqeni të hapni Përmbledhje Faqeje për URL-në \\\"%1$s\\\". %2$s Asnjë nga përkatësitë prej rregullimeve të Matomo-s nuk përputhet me këtë lidhje.",
"RedirectUrlErrorAdmin": "Përkatësinë mund ta shtoni si URL shtesë %1$ste rregullimet%2$s.",
"RedirectUrlErrorUser": "Kërkojini përgjegjësit tuaj ta shtojë përkatësinë si URL shtesë."
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s klikova",
"ClicksFromXLinks": "%1$s klikova sa jednog od %2$s linkova",
"Domain": "Domen",
"ErrorNotLoading": "Nije moguće pokrenuti sesiju za ovaj prikaz.",
"ErrorNotLoadingDetails": "Možda stranica koja se učitala sa desne strane nema Matomo kod za praćenje. U tom slučaju, pokušajte da otvorite prikaz neke druge stranice sa izveštajem.",
"ErrorNotLoadingDetailsSSL": "S obzirom na to da koristite Matomo preko HTTPS-a, najverovatnije je da vaš sajt ne podržava SSL. Pokušajte da koristite Matomo preko HTTP-a.",
"ErrorNotLoadingLink": "Kliknite ovde za više saveta za rešavanje problema",
"Link": "Link",
"Location": "Lokacija",
"NoData": "Nema podataka o ovoj stranici za dati period.",
"OneClick": "1 klik",
"OpenFullScreen": "Prikaži preko celog ekrana",
"Overlay": "Prikaz preko (overlay)",
"PluginDescription": "Prikažite analitičke podatke preko vašeg sajta. Pogledajte koliko puta su korisnici kliknuli na svaki od linkova. Morate imati uključen Transitions dodatak.",
"RedirectUrlErrorAdmin": "Možete dodati domen kao dodatni URL %1$su podešavanjima%2$s.",
"RedirectUrlErrorUser": "Zamolite administratora da doda domen kao dodatni URL."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s klick",
"ClicksFromXLinks": "%1$s klick från en av %2$s länkar",
"Domain": "Domän",
"ErrorNotLoading": "Sessionen för sidöverlägg kunde inte startas.",
"ErrorNotLoadingDetails": "Möjligtvis så har inte sidan som laddats till höger Matomo's spårningskod. I det här falletkan du prova att starta Sidöverlägg för en annan sida från rapporten \\\"Sidor\\\".",
"ErrorNotLoadingDetailsSSL": "Eftersom du använder Matomo över https, så är den mest troliga orsaken att din webbläsare inte stödjer SSL. Försök att använda Matomo över http.",
"ErrorNotLoadingLink": "Klicka här för att få fler tips för felsökning",
"Link": "Länk",
"Location": "Plats",
"NoData": "Det finns inga data för denna sida under den valda perioden.",
"OneClick": "1 klick",
"OpenFullScreen": "Gå till helskärmsläge (ingen sidolist)",
"Overlay": "Sidöverlägg",
"PluginDescription": "Se din statistikdata som ett Overlay på din faktiska webbplats. Kolla hur många gånger dina användare har klickat på respektive länk. Notering: Kräver att du har aktiverat Översättningstillägget.",
"RedirectUrlError": "Du försöker öppna ett överliggande lager för URL \"%1$s\". %2$s Ingen av domänerna från Matomo's inställningar matchar länken.",
"RedirectUrlErrorAdmin": "Du kan lägga till domänen som en extra URL %1$si inställningarna%2$s.",
"RedirectUrlErrorUser": "Be administratören att lägga till domänen som en extra webbadress"
}
}

View File

@ -0,0 +1,8 @@
{
"Overlay": {
"Domain": "புலம்",
"Link": "இணைப்பு",
"Location": "இடம்",
"OneClick": "1 சொடுக்கு"
}
}

View File

@ -0,0 +1,7 @@
{
"Overlay": {
"Clicks": "%s నొక్కులు",
"Link": "లంకె",
"Location": "ప్రాంతం"
}
}

View File

@ -0,0 +1,9 @@
{
"Overlay": {
"Clicks": "%s คลิก",
"Domain": "โดเมน",
"Link": "ลิงก์",
"Location": "ตำแหน่งที่ตั้ง",
"OneClick": "1 คลิก"
}
}

View File

@ -0,0 +1,18 @@
{
"Overlay": {
"Clicks": "%s na mga click",
"ClicksFromXLinks": "%1$s i-click mula sa isa sa %2$s links.",
"Domain": "Domain",
"ErrorNotLoading": "Ang sesyon ng Page Overlay ay hindi pa mailunsad.",
"ErrorNotLoadingDetails": "Marahil ang pahina na naload sa kanan ay walang Matomo tracker code. Sa ganitong sitwasyon subukan mong e-launch ang overlay sa ibat-ibang pahina na nang-galing sa ulat ng mga pahina.",
"ErrorNotLoadingDetailsSSL": "Dahil ginagamit mo ang https sa Matomo ang pinakapang-karaniwang dahilan ay ang iyong website ay hindi suportado ang SSL. Subukang gamitin ang http sa Matomo.",
"ErrorNotLoadingLink": "I-click dito upang makakuha ng maraming tip sa pag-totroubleshoot.",
"Link": "Link",
"Location": "Lokasyon",
"NoData": "Walang datos para sa pahinang ito sa napiling panahon.",
"OpenFullScreen": "Mag full screen (walang sidebar)",
"Overlay": "Page Overlay",
"RedirectUrlErrorAdmin": "Maaari mong idagdag ang domain na karagdagang URL %1$s sa mga setting ng %2$s.",
"RedirectUrlErrorUser": "Tanungin ang iyong administrator upang idagdag ang domain bilang isang karagdagang URL."
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s tıklama",
"ClicksFromXLinks": "%2$s bağlantının birinden %1$s tıklama",
"Domain": "Etki Alanı",
"ErrorNotLoading": "Sayfa kaplama oturumu henüz başlatılmamış.",
"ErrorNotLoadingDetails": "Sağ tarafta yüklenmiş olan sayfada Matomo izleme kodu bulunmuyor olabilir. Bu durumda Kaplamayı sayfa raporlarından farklı bir sayfa için başlatmayı deneyin.",
"ErrorNotLoadingDetailsSSL": "Matomo uygulamasını https üzerinden kullandığınız için en olası neden web sitenizin SSL desteklemiyor olabileceğidir. Matomo uygulamasını http üzerinden kullanmayı deneyin.",
"ErrorNotLoadingLink": "Daha fazla sorun giderme ipucu almak için buraya tıklayın",
"Link": "Bağlantı",
"Location": "Konum",
"NoData": "Seçilmiş zaman aralığında bu sayfa ile ilgili bir veri yok.",
"OneClick": "1 tık",
"OpenFullScreen": "Tam ekran (yan çubuk olmadan)",
"Overlay": "Sayfa Kaplaması",
"PluginDescription": "İstatistik verilerinizi sitenizin üzerinde kaplama olarak konumlandırarak, kullanıcıların hangi bağlantıya kaç kez tıkladığını görüntüleyebilirsiniz. Not: Dönüşümler (transitions) uygulama ekinin etkinleştirilmiş olması gereklidir.",
"RedirectUrlError": "\"%1$s\" adresi için sayfa kaplamasını açmaya çalışıyorsunuz. %2$s Matomo ayarlarındaki etki alanlarından hiç biri bu bağlantı ile eşleşmiyor.",
"RedirectUrlErrorAdmin": "Bu etki alanını %1$sayarlar bölümünden%2$s ek bir adres olarak ekleyebilirsiniz.",
"RedirectUrlErrorUser": "Yöneticinizden bu etki alanını ek bir adres olarak eklemesini isteyin."
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s кліків",
"ClicksFromXLinks": "%1$s кліків від одного з %2$s джерел",
"Domain": "Домен",
"ErrorNotLoading": "Сторінка накладення сесії не може бути запущена.",
"ErrorNotLoadingDetails": "Можливо, сторінка що завантажується праворуч немає трекер коду Matomo. У цьому випадку, спробуйте запустити накладення на різні сторінки.",
"ErrorNotLoadingDetailsSSL": "Так як ви використовуєте Matomo по протоколу https, найбільш вірогідною причиною є те, що ваш сайт не підтримує протокол SSL. Спробуйте використовувати Matomo через http.",
"ErrorNotLoadingLink": "Отримати додаткові поради щодо усунення неполадок",
"Link": "Посилання",
"Location": "Місцезнаходження",
"NoData": "Немає даних по цій сторінці за обраний період.",
"OneClick": "1 клік",
"OpenFullScreen": "Перейти до повного екрану",
"Overlay": "Глибина проникнення",
"PluginDescription": "Переглядайте дані аналітики у вигляді накладення на ваш сайт. Подивіться, скільки разів користувачі натиснули на кожне посилання. Примітка: Потрібна активація плагіну Transitions.",
"RedirectUrlErrorAdmin": "Можете додати домен як додатковий URL %1$sв налаштуваннях%2$s.",
"RedirectUrlErrorUser": "Попросіть адміністратора додати домен як додатковий URL."
}
}

View File

@ -0,0 +1,19 @@
{
"Overlay": {
"Clicks": "%s click",
"ClicksFromXLinks": "%1$s click từ một trong %2$s link",
"Domain": "Tên miền",
"ErrorNotLoading": "Một phiên trang Overlay chưa thể đưa ra.",
"ErrorNotLoadingDetails": "Có thể các trang được tải về bên phải không có mã theo dõi Matomo. Trong trường hợp này, hãy thử đưa ra Overlay cho một trang khác nhau từ báo cáo trang.",
"ErrorNotLoadingDetailsSSL": "Kể từ khi bạn đang sử dụng Matomo qua HTTPS, nguyên nhân có thể nhất là trang web của bạn không hỗ trợ SSL. Hãy thử sử dụng Matomo qua http.",
"ErrorNotLoadingLink": "Click vào đây để có thêm các lời khuyên cho việc xử lý sự cố",
"Link": "Link",
"Location": "Vị trí",
"NoData": "Không có dữ liệu cho trang này trong khoảng thời gian đã chọn.",
"OneClick": "1 click",
"OpenFullScreen": "Toàn màn hình (không có sidebar)",
"Overlay": "Trang Overlay",
"RedirectUrlErrorAdmin": "Bạn có thể thêm các tên miền như một URL bổ sung %1$s trong cài đặt %2$s.",
"RedirectUrlErrorUser": "Yêu cầu quản trị của bạn thêm các tên miền như một URL bổ sung"
}
}

View File

@ -0,0 +1,20 @@
{
"Overlay": {
"Clicks": "%s 次点击",
"ClicksFromXLinks": "%1$s 次点击来自 %2$s 中的链接",
"Domain": "域名",
"ErrorNotLoading": "还无法运行页面叠加会话。",
"ErrorNotLoadingDetails": "也许右边加载的页面没有 Matomo 跟踪代码。如果是这样,试试在另外一个页面运行叠加。",
"ErrorNotLoadingDetailsSSL": "因为你通过 https 访问 Matomo最可能的原因是您的网站不支持 SSL试试用 http 访问 Matomo。",
"ErrorNotLoadingLink": "点这里了解更多排错的方法",
"Link": "链接",
"Location": "位置",
"NoData": "所选时间段内没有本页面的数据。",
"OneClick": "1 次点击",
"OpenFullScreen": "全屏(无边框)",
"Overlay": "页面叠加",
"PluginDescription": "请参阅您的分析数据为您的实际网站的叠加。查看有多少次你的用户点击每一个环节上。注:需要在转换插件启用。",
"RedirectUrlErrorAdmin": "您可以在 %1$s管理设置%2$s 中以附加网址添加域名。",
"RedirectUrlErrorUser": "请管理员以附加网址来添加域名。"
}
}

View File

@ -0,0 +1,21 @@
{
"Overlay": {
"Clicks": "%s 次點擊",
"ClicksFromXLinks": "%1$s 次點擊來自 %2$s 個連結之一",
"Domain": "域名",
"ErrorNotLoading": "網頁覆蓋功能尚無法執行。",
"ErrorNotLoadingDetails": "可能是右邊讀取的頁面沒有 Matomo 追蹤程式碼。在這種情況下,試著在頁面報表內的不同頁面中執行頁面覆蓋。",
"ErrorNotLoadingDetailsSSL": "你正透過 https 使用 Matomo最可能的原因是你的網站不支援 SSL。試著透過 http 使用 Matomo。",
"ErrorNotLoadingLink": "點擊這裡取得更多問題排除技巧",
"Link": "連結",
"Location": "位置",
"NoData": "此網頁在所選的期間中沒有任何資料。",
"OneClick": "1 次點擊",
"OpenFullScreen": "進入全螢幕模式(無側欄)",
"Overlay": "網頁覆蓋",
"PluginDescription": "在你的網站上以網頁覆蓋方式查看你的分析資料。查看你的訪客點擊了多少次連結。注意:需要啟用 Transitions 外掛。",
"RedirectUrlError": "你將要開啟網址「%1$s」的網頁覆蓋。%2$s該連結與 Matomo 所設定的域名不相符。",
"RedirectUrlErrorAdmin": "你可以在%1$s設定頁面%2$s中將域名新增為網站網址。",
"RedirectUrlErrorUser": "要求你的管理原將域名新增為網站網址。"
}
}

View File

@ -0,0 +1,181 @@
html {
width: 100%;
height: 100%;
/** hide scroll bar in ie7 */
*overflow: auto;
}
body {
width: 100%;
height: 100%;
overflow: hidden;
}
body #header {
margin-left: -6px;
}
a#overlayTitle {
font-size: 16px;
text-decoration: none;
color: #4d4d4d;
margin-left: 10px;
}
a#overlayTitle .icon-help {
margin-left: 4px;
}
#overlayDateRangeSelection {
padding: 0 0 0 25px;
margin: 20px 10px;
position: relative;
}
#overlayDateRangeSelection .icon-calendar {
position: absolute;
top: 18px;
left: 2px;
}
#overlayLocation, .overlaySegment {
width: 200px;
font-size: 12px;
}
#overlayLocation {
margin: 0 0 10px 10px;
}
.overlaySegment {
margin: 0 0 30px 0;
word-break: break-all;
}
#overlayLoading {
background: url(../../Morpheus/images/loading-blue.gif) no-repeat center 10px;
width: 190px;
padding-top: 30px;
margin-top: 30px;
text-align: center;
display: none;
}
#overlaySidebar {
width: 200px;
margin-left: 10px;
}
#overlaySidebar h2 {
font-size: 15px;
margin: 0 0 8px 0;
}
.overlayMainMetrics {
padding-bottom: 0 !important;
}
a#overlaySegmentedVisitorLog,
a#overlayRowEvolution,
a#overlayTransitions {
display: block;
color: #255792;
font-size: 13px;
line-height: 15px;
margin: 0 0 0 10px;
padding: 8px 10px 3px 0;
text-decoration: none;
}
a#overlaySegmentedVisitorLog .icon,
a#overlayRowEvolution .icon,
a#overlayTransitions .icon {
font-size: 18px;
display: block;
float: left;
margin-right: 5px;
}
a#overlayRowEvolution {
margin-top: 20px;
}
a#overlaySegmentedVisitorLog:hover,
a#overlayRowEvolution:hover,
a#overlayTransitions:hover {
color: #E87500;
}
#overlayMain {
margin-left: 220px;
position: absolute;
top: 0;
}
#root > nav {
width: 240px;
overflow: hidden;
}
#root > nav > .nav-wrapper > * {
display: none;
}
#root > nav > .nav-wrapper > .accessibility-skip-to-content,
#root > nav > .nav-wrapper > #logo {
display: block;
}
#overlayIframe {
border-left: 2px solid #ddd;
}
.overlayMetric {
font-size: 12px;
line-height: 14px;
padding: 5px 0;
}
.overlayMetricValue {
font-size: 12px;
font-weight: bold;
}
.overlayNoData {
font-size: 12px;
color: #7E7363;
}
body .ui-tooltip.overlayTooltip {
font-size: 11px;
padding: 3px 5px 3px 6px;
}
#overlayNoFrame {
padding: 20px 0 40px 2px;
}
#overlayErrorNotLoading {
width: 190px;
display: none;
margin: 20px 0 0 5px;
font-size: 14px;
}
#overlayErrorNotLoading span {
color: #E87500;
font-weight: bold;
}
.navbar .navbar-right {
display: none;
}
.top_controls {
display: none;
}
.overlay-sidebar-container {
width: 220px;
margin-left: -16px;
margin-top: 10px;
}

View File

@ -0,0 +1,17 @@
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
color: black;
background: white;
margin: 15px;
padding: 0;
}
p {
margin: 0 0 10px 0;
padding: 0;
}
a {
color: #255792;
}

View File

@ -0,0 +1,82 @@
{% extends 'dashboard.twig' %}
{% block head %}
{{ parent() }}
<script type="text/javascript" src="plugins/Overlay/javascripts/Piwik_Overlay.js"></script>
<link rel="stylesheet" type="text/css" href="plugins/Overlay/stylesheets/overlay.css" />
{% endblock %}
{% block content %}
<div class="overlay-sidebar-container">
<a id="overlayTitle" href="https://matomo.org/docs/page-overlay/" rel="noreferrer noopener" target="_blank">
{{ 'Overlay_Overlay'|translate }}
<span class="icon-info2"></span>
</a>
<div id="overlayDateRangeSelection">
<span class="icon icon-calendar"></span>
<select id="overlayDateRangeSelect" name="overlayDateRangeSelect">
<option value="day;today">{{ 'Intl_Today'|translate }}</option>
<option value="day;yesterday">{{ 'Intl_Yesterday'|translate }}</option>
<option value="week;today">{{ 'General_CurrentWeek'|translate }}</option>
<option value="month;today">{{ 'General_CurrentMonth'|translate }}</option>
<option value="year;today">{{ 'General_CurrentYear'|translate }}</option>
</select>
</div>
<div id="overlayErrorNotLoading">
<p>
<span>{{ 'Overlay_ErrorNotLoading'|translate }}</span>
</p>
<p>
{% if ssl %}
{{ 'Overlay_ErrorNotLoadingDetailsSSL'|translate }}
{% else %}
{{ 'Overlay_ErrorNotLoadingDetails'|translate }}
{% endif %}
</p>
<p>
<a href="https://matomo.org/docs/page-overlay/#toc-page-overlay-troubleshooting" rel="noreferrer noopener" target="_blank">
{{ 'Overlay_ErrorNotLoadingLink'|translate }}
</a>
</p>
</div>
<div id="overlayLocation">&nbsp;</div>
<div id="overlayLoading">{{ 'General_Loading'|translate }}</div>
<div id="overlaySidebar"></div>
<a id="overlayRowEvolution"><span class="icon icon-evolution"></span>{{ 'General_RowEvolutionRowActionTooltipTitle'|translate }}</a>
<a id="overlayTransitions"><span class="icon icon-transition"></span>{{ 'General_TransitionsRowActionTooltipTitle'|translate }}</a>
<a id="overlaySegmentedVisitorLog"><span class="icon icon-visitor-profile"></span>{{ 'Live_RowActionTooltipTitle'|translate }}</a>
{{ postEvent('Template.afterOverlaySidebar') }}
</div>
<div id="overlayMain">
<iframe id="overlayIframe" src="" frameborder="0"></iframe>
</div>
<script type="text/javascript">
broadcast._isInit = true;
$(function () {
Piwik_Overlay.siteUrls = {{ siteUrls|json_encode|raw }};
var iframeSrc = 'index.php?module=Overlay&action=startOverlaySession&idSite={{ idSite }}&period={{ period }}&date={{ rawDate }}&segment={{ segment }}';
if (piwik.shouldPropagateTokenAuth) {
iframeSrc += '&token_auth=' + piwik.token_auth;
}
Piwik_Overlay.init(iframeSrc, '{{ idSite }}', '{{ period }}', '{{ rawDate }}', '{{ segment }}');
window.Piwik_Overlay_Translations = {
domain: "{{ 'Overlay_Domain'|translate }}"
};
});
</script>
{% endblock %}

View File

@ -0,0 +1,24 @@
{% extends 'dashboard.twig' %}
{% block content %}
<h1>{{ 'Overlay_Overlay'|translate }}</h1>
<div id="overlayNoFrame">
<script type="text/javascript">
var newLocation = 'index.php?module=Overlay&action=startOverlaySession&idSite={{ idSite }}&period={{ period }}&date={{ date }}&segment={{ segment }}';
if (piwik.shouldPropagateTokenAuth) {
newLocation += '&token_auth=' + piwik.token_auth;
}
var locationParts = window.location.href.split('#');
if (locationParts.length > 1) {
var url = broadcast.getParamValue('l', locationParts[1]);
url = Overlay_Helper.decodeFrameUrl(url);
newLocation += '#' + url;
}
window.location.href = newLocation;
</script>
</div>
{% endblock %}

View File

@ -0,0 +1,15 @@
<html>
<head>
<title></title>
<meta name="robots" content="noindex,nofollow">
</head>
<body>
<script type="text/javascript">
// go up two iframes to find the piwik window
var piwikWindow = window.parent.parent;
// notify piwik of location change
// the location has been passed as the hash part of the url from the overlay session
piwikWindow.Piwik_Overlay.setCurrentUrl(window.location.hash.substring(1));
</script>
</body>
</html>

View File

@ -0,0 +1,30 @@
<div> <!-- Wrapper is needed that the html can be jQueryfied -->
<!-- This div is removed by JS and the content is put in the location div -->
<div class="overlayLocation">
<strong>{{ 'Overlay_Location'|translate }}:</strong>
<span data-normalized-url="{{ normalizedUrl }}" data-label="{{ label }}">
{{ location }}
</span>
</div>
<div class="overlaySegment">
<strong>{{ 'General_Segment'|translate }}:</strong>
<span>{{ segmentDescription }}</span>
</div>
{% if data|length > 0 %}
<h2 class="overlayMainMetrics">{{ 'General_MainMetrics'|translate }}</h2>
<ul class="overlayMetrics">
{% for metric in data %}
<li class="overlayMetric">
<span class="overlayMetricValue">{{ metric.value|raw }}</span> {{ metric.name }}
</li>
{% endfor %}
</ul>
<input type="hidden" value="{{ segment }}" id="segment" />
{% else %}
<!-- note: the class overlayNoData is used in Piwik_Overlay.js -->
<div class="overlayNoData">{{ 'Overlay_NoData'|translate }}</div>
{% endif %}
</div>

View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex,nofollow">
<title></title>
<meta name="generator" content="Matomo - free/libre analytics platform"/>
{% include "@CoreHome/_favicon.twig" %}
{% include "@CoreHome/_applePinnedTabIcon.twig" %}
<link rel="stylesheet" type="text/css" href="plugins/Overlay/stylesheets/showErrorWrongDomain.css" />
</head>
<body>
<p><strong>{{ message|raw }}</strong></p>
<p>{{ troubleshoot|raw }}</p>
</body>
</html>

View File

@ -0,0 +1,49 @@
<html><head><title></title></head><body>
<script type="text/javascript">
function handleProtocol(url) {
if ({% if isHttps %}true{% else %}false{% endif %}) {
return url.replace(/http:\/\//i, "https://");
} else {
return url.replace(/https:\/\//i, "http://");
}
}
if (window.location.hash) {
var match = false;
var parser = document.createElement('a');
var urlToRedirect = window.location.hash.substr(1);
parser.href = urlToRedirect;
var hostToRedirect = parser.hostname;
var knownUrls = {{ knownUrls|raw }};
for (var i = 0; i < knownUrls.length; i++) {
parser.href = knownUrls[i];
var testHost = parser.hostname;
if (hostToRedirect == testHost) {
match = true;
if (navigator.appName == "Microsoft Internet Explorer") {
// internet explorer loses the referrer if we use window.location.href=X
var referLink = document.createElement("a");
referLink.href = handleProtocol(urlToRedirect);
document.body.appendChild(referLink);
referLink.click();
} else {
window.location.href = handleProtocol(urlToRedirect);
}
break;
}
}
if (!match) {
var idSite = window.location.href.match(/idSite=([0-9]+)/i)[1];
window.location.href = "index.php?module=Overlay&action=showErrorWrongDomain"
+ "&idSite=" + idSite
+ "&url=" + encodeURIComponent(urlToRedirect);
}
}
else {
window.location.href = handleProtocol("{{ mainUrl|e('js') }}");
};
</script>
</body></html>