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,427 @@
<?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\Live;
use Exception;
use Piwik\Common;
use Piwik\Config;
use Piwik\DataTable;
use Piwik\Date;
use Piwik\Piwik;
use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\Site;
use Psr\Log\LoggerInterface;
/**
* @see plugins/Live/Visitor.php
*/
require_once PIWIK_INCLUDE_PATH . '/plugins/Live/Visitor.php';
require_once PIWIK_INCLUDE_PATH . '/plugins/UserCountry/functions.php';
/**
* The Live! API lets you access complete visit level information about your visitors. Combined with the power of <a href='http://matomo.org/docs/analytics-api/segmentation/' target='_blank'>Segmentation</a>,
* you will be able to request visits filtered by any criteria.
*
* The method "getLastVisitsDetails" will return extensive data for each visit, which includes: server time, visitId, visitorId,
* visitorType (new or returning), number of pages, list of all pages (and events, file downloaded and outlinks clicked),
* custom variables names and values set to this visit, number of goal conversions (and list of all Goal conversions for this visit,
* with time of conversion, revenue, URL, etc.), but also other attributes such as: days since last visit, days since first visit,
* country, continent, visitor IP,
* provider, referrer used (referrer name, keyword if it was a search engine, full URL), campaign name and keyword, operating system,
* browser, type of screen, resolution, supported browser plugins (flash, java, silverlight, pdf, etc.), various dates & times format to make
* it easier for API users... and more!
*
* With the parameter <a href='http://matomo.org/docs/analytics-api/segmentation/' rel='noreferrer' target='_blank'>'&segment='</a> you can filter the
* returned visits by any criteria (visitor IP, visitor ID, country, keyword used, time of day, etc.).
*
* The method "getCounters" is used to return a simple counter: visits, number of actions, number of converted visits, in the last N minutes.
*
* See also the documentation about <a href='http://matomo.org/docs/real-time/' rel='noreferrer' target='_blank'>Real time widget and visitor level reports</a> in Matomo.
* @method static \Piwik\Plugins\Live\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
/**
* This will return simple counters, for a given website ID, for visits over the last N minutes
*
* @param int $idSite Id Site
* @param int $lastMinutes Number of minutes to look back at
* @param bool|string $segment
* @param array $showColumns The columns to show / not to request. Eg 'visits', 'actions', ...
* @param array $hideColumns The columns to hide / not to request. Eg 'visits', 'actions', ...
* @return array( visits => N, actions => M, visitsConverted => P )
*/
public function getCounters($idSite, $lastMinutes, $segment = false, $showColumns = array(), $hideColumns = array())
{
Piwik::checkUserHasViewAccess($idSite);
$model = new Model();
if (is_string($showColumns)) {
$showColumns = explode(',', $showColumns);
}
if (is_string($hideColumns)) {
$hideColumns = explode(',', $hideColumns);
}
$counters = array();
$hasVisits = true;
if ($this->shouldColumnBePresentInResponse('visits', $showColumns, $hideColumns)) {
$counters['visits'] = $model->getNumVisits($idSite, $lastMinutes, $segment);
$hasVisits = !empty($counters['visits']);
}
if ($this->shouldColumnBePresentInResponse('actions', $showColumns, $hideColumns)) {
if ($hasVisits) {
$counters['actions'] = $model->getNumActions($idSite, $lastMinutes, $segment);
} else {
$counters['actions'] = 0;
}
}
if ($this->shouldColumnBePresentInResponse('visitors', $showColumns, $hideColumns)) {
if ($hasVisits) {
$counters['visitors'] = $model->getNumVisitors($idSite, $lastMinutes, $segment);
} else {
$counters['visitors'] = 0;
}
}
if ($this->shouldColumnBePresentInResponse('visitsConverted', $showColumns, $hideColumns)) {
if ($hasVisits) {
$counters['visitsConverted'] = $model->getNumVisitsConverted($idSite, $lastMinutes, $segment);
} else {
$counters['visitsConverted'] = 0;
}
}
return array($counters);
}
private function shouldColumnBePresentInResponse($column, $showColumns, $hideColumns)
{
$show = (empty($showColumns) || in_array($column, $showColumns));
$hide = in_array($column, $hideColumns);
return $show && !$hide;
}
/**
* The same functionality can be obtained using segment=visitorId==$visitorId with getLastVisitsDetails
*
* @deprecated
* @ignore
* @param int $visitorId
* @param int $idSite
* @param int $filter_limit
* @param bool $flat Whether to flatten the visitor details array
*
* @return DataTable
*/
public function getLastVisitsForVisitor($visitorId, $idSite, $filter_limit = 10, $flat = false)
{
Piwik::checkUserHasViewAccess($idSite);
$table = $this->loadLastVisitsDetailsFromDatabase($idSite, $period = false, $date = false, $segment = false, $offset = 0, $filter_limit, $minTimestamp = false, $filterSortOrder = false, $visitorId);
$this->addFilterToCleanVisitors($table, $idSite, $flat);
return $table;
}
/**
* Returns the last visits tracked in the specified website
* You can define any number of filters: none, one, many or all parameters can be defined
*
* @param int $idSite Site ID
* @param bool|string $period Period to restrict to when looking at the logs
* @param bool|string $date Date to restrict to
* @param bool|int $segment (optional) Number of visits rows to return
* @param bool|int $countVisitorsToFetch DEPRECATED (optional) Only return the last X visits. Please use the API paramaeter 'filter_offset' and 'filter_limit' instead.
* @param bool|int $minTimestamp (optional) Minimum timestamp to restrict the query to (useful when paginating or refreshing visits)
* @param bool $flat
* @param bool $doNotFetchActions
* @param bool $enhanced for plugins that want to expose additional information
* @return DataTable
*/
public function getLastVisitsDetails($idSite, $period = false, $date = false, $segment = false, $countVisitorsToFetch = false, $minTimestamp = false, $flat = false, $doNotFetchActions = false, $enhanced = false)
{
Piwik::checkUserHasViewAccess($idSite);
$idSite = Site::getIdSitesFromIdSitesString($idSite);
if (is_array($idSite) && count($idSite) === 1) {
$idSite = array_shift($idSite);
}
Piwik::checkUserHasViewAccess($idSite);
if ($countVisitorsToFetch !== false) {
$filterLimit = (int) $countVisitorsToFetch;
$filterOffset = 0;
} else {
$filterLimit = Common::getRequestVar('filter_limit', 10, 'int');
$filterOffset = Common::getRequestVar('filter_offset', 0, 'int');
}
$filterSortOrder = Common::getRequestVar('filter_sort_order', false, 'string');
$dataTable = $this->loadLastVisitsDetailsFromDatabase($idSite, $period, $date, $segment, $filterOffset, $filterLimit, $minTimestamp, $filterSortOrder, $visitorId = false);
$this->addFilterToCleanVisitors($dataTable, $idSite, $flat, $doNotFetchActions);
$filterSortColumn = Common::getRequestVar('filter_sort_column', false, 'string');
if ($filterSortColumn) {
$this->logger->warning('Sorting the API method "Live.getLastVisitDetails" by column is currently not supported. To avoid this warning remove the URL parameter "filter_sort_column" from your API request.');
}
// Usually one would Sort a DataTable and then apply a Limit. In this case we apply a Limit first in SQL
// for fast offset usage see https://github.com/piwik/piwik/issues/7458. Sorting afterwards would lead to a
// wrong sorting result as it would only sort the limited results. Therefore we do not support a Sort for this
// API
$dataTable->disableFilter('Sort');
$dataTable->disableFilter('Limit'); // limit is already applied here
return $dataTable;
}
/**
* Returns an array describing a visitor using their last visits (uses a maximum of 100).
*
* @param int $idSite Site ID
* @param bool|false|string $visitorId The ID of the visitor whose profile to retrieve.
* @param bool|false|string $segment
* @param bool|false|int $limitVisits
* @return array
*/
public function getVisitorProfile($idSite, $visitorId = false, $segment = false, $limitVisits = false)
{
Piwik::checkUserHasViewAccess($idSite);
if ($limitVisits === false) {
$limitVisits = VisitorProfile::VISITOR_PROFILE_MAX_VISITS_TO_SHOW;
} else {
$limitVisits = (int) $limitVisits;
}
if ($visitorId === false) {
$visitorId = $this->getMostRecentVisitorId($idSite, $segment);
}
$limit = Config::getInstance()->General['live_visitor_profile_max_visits_to_aggregate'];
$visits = $this->loadLastVisitsDetailsFromDatabase($idSite, $period = false, $date = false, $segment,
$offset = 0, $limit, false, false, $visitorId);
$this->addFilterToCleanVisitors($visits, $idSite, $flat = false, $doNotFetchActions = false, $filterNow = true);
if ($visits->getRowsCount() == 0) {
return array();
}
$profile = new VisitorProfile($idSite);
$result = $profile->makeVisitorProfile($visits, $visitorId, $segment, $limitVisits);
/**
* Triggered in the Live.getVisitorProfile API method. Plugins can use this event
* to discover and add extra data to visitor profiles.
*
* This event is deprecated, use [VisitorDetails](/api-reference/Piwik/Plugins/Live/VisitorDetailsAbstract#extendVisitorDetails) classes instead.
*
* For example, if an email address is found in a custom variable, a plugin could load the
* gravatar for the email and add it to the visitor profile, causing it to display in the
* visitor profile popup.
*
* The following visitor profile elements can be set to augment the visitor profile popup:
*
* - **visitorAvatar**: A URL to an image to display in the top left corner of the popup.
* - **visitorDescription**: Text to be used as the tooltip of the avatar image.
*
* @param array &$visitorProfile The unaugmented visitor profile info.
* @deprecated
*/
Piwik::postEvent('Live.getExtraVisitorDetails', array(&$result));
return $result;
}
/**
* Returns the visitor ID of the most recent visit.
*
* @param int $idSite
* @param bool|string $segment
* @return string
*/
public function getMostRecentVisitorId($idSite, $segment = false)
{
Piwik::checkUserHasViewAccess($idSite);
// for faster performance search for a visitor within the last 7 days first
$minTimestamp = Date::now()->subDay(7)->getTimestamp();
$dataTable = $this->loadLastVisitsDetailsFromDatabase(
$idSite, $period = false, $date = false, $segment, $offset = 0, $limit = 1, $minTimestamp
);
if (0 >= $dataTable->getRowsCount()) {
$minTimestamp = Date::now()->subYear(1)->getTimestamp();
// no visitor found in last 7 days, look further back for up to 1 year. This query will be slower
$dataTable = $this->loadLastVisitsDetailsFromDatabase(
$idSite, $period = false, $date = false, $segment, $offset = 0, $limit = 1, $minTimestamp
);
}
if (0 >= $dataTable->getRowsCount()) {
// no visitor found in last year, look over all logs. This query might be quite slow
$dataTable = $this->loadLastVisitsDetailsFromDatabase(
$idSite, $period = false, $date = false, $segment, $offset = 0, $limit = 1
);
}
if (0 >= $dataTable->getRowsCount()) {
return false;
}
$visitorFactory = new VisitorFactory();
$visitDetails = $dataTable->getFirstRow()->getColumns();
$visitor = $visitorFactory->create($visitDetails);
return $visitor->getVisitorId();
}
/**
* Returns the very first visit for the given visitorId
*
* @internal
*
* @param $idSite
* @param $visitorId
*
* @return DataTable
*/
public function getFirstVisitForVisitorId($idSite, $visitorId)
{
Piwik::checkUserHasSomeViewAccess();
if (empty($visitorId)) {
return new DataTable();
}
$model = new Model();
$data = $model->queryLogVisits($idSite, false, false, false, 0, 1, $visitorId, false, 'ASC');
$dataTable = $this->makeVisitorTableFromArray($data);
$this->addFilterToCleanVisitors($dataTable, $idSite, false, true);
return $dataTable;
}
/**
* @deprecated
*/
public function getLastVisits($idSite, $filter_limit = 10, $minTimestamp = false)
{
return $this->getLastVisitsDetails($idSite, $period = false, $date = false, $segment = false, $filter_limit, $minTimestamp, $flat = false);
}
/**
* For an array of visits, query the list of pages for this visit
* as well as make the data human readable
* @param DataTable $dataTable
* @param int $idSite
* @param bool $flat whether to flatten the array (eg. 'customVariables' names/values will appear in the root array rather than in 'customVariables' key
* @param bool $doNotFetchActions If set to true, we only fetch visit info and not actions (much faster)
* @param bool $filterNow If true, the visitors will be cleaned immediately
*/
private function addFilterToCleanVisitors(DataTable $dataTable, $idSite, $flat = false, $doNotFetchActions = false, $filterNow = false)
{
$filter = 'queueFilter';
if ($filterNow) {
$filter = 'filter';
}
$dataTable->$filter(function ($table) use ($idSite, $flat, $doNotFetchActions) {
/** @var DataTable $table */
$visitorFactory = new VisitorFactory();
// live api is not summable, prevents errors like "Unexpected ECommerce status value"
$table->deleteRow(DataTable::ID_SUMMARY_ROW);
$actionsByVisitId = array();
if (!$doNotFetchActions) {
$visitIds = $table->getColumn('idvisit');
$visitorDetailsManipulators = Visitor::getAllVisitorDetailsInstances();
foreach ($visitorDetailsManipulators as $instance) {
$instance->provideActionsForVisitIds($actionsByVisitId, $visitIds);
}
}
foreach ($table->getRows() as $visitorDetailRow) {
$visitorDetailsArray = Visitor::cleanVisitorDetails($visitorDetailRow->getColumns());
$visitor = $visitorFactory->create($visitorDetailsArray);
$visitorDetailsArray = $visitor->getAllVisitorDetails();
$visitorDetailsArray['actionDetails'] = array();
if (!$doNotFetchActions) {
$bulkFetchedActions = isset($actionsByVisitId[$visitorDetailsArray['idVisit']]) ? $actionsByVisitId[$visitorDetailsArray['idVisit']] : array();
$visitorDetailsArray = Visitor::enrichVisitorArrayWithActions($visitorDetailsArray, $bulkFetchedActions);
}
if ($flat) {
$visitorDetailsArray = Visitor::flattenVisitorDetailsArray($visitorDetailsArray);
}
$visitorDetailRow->setColumns($visitorDetailsArray);
}
});
}
private function loadLastVisitsDetailsFromDatabase($idSite, $period, $date, $segment = false, $offset = 0, $limit = 100, $minTimestamp = false, $filterSortOrder = false, $visitorId = false)
{
$model = new Model();
list($data, $hasMoreVisits) = $model->queryLogVisits($idSite, $period, $date, $segment, $offset, $limit, $visitorId, $minTimestamp, $filterSortOrder, true);
return $this->makeVisitorTableFromArray($data, $hasMoreVisits);
}
/**
* @param $data
* @param $hasMoreVisits
* @return DataTable
* @throws Exception
*/
private function makeVisitorTableFromArray($data, $hasMoreVisits=null)
{
$dataTable = new DataTable();
$dataTable->addRowsFromSimpleArray($data);
if (!empty($data[0])) {
$columnsToNotAggregate = array_map(function () {
return 'skip';
}, $data[0]);
$dataTable->setMetadata(DataTable::COLUMN_AGGREGATION_OPS_METADATA_NAME, $columnsToNotAggregate);
}
if (null !== $hasMoreVisits) {
$dataTable->setMetadata('hasMoreVisits', $hasMoreVisits);
}
return $dataTable;
}
}

View File

@ -0,0 +1,17 @@
<?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\Live\Categories;
use Piwik\Category\Category;
class LiveCategory extends Category
{
protected $id = 'Live!';
protected $order = 2;
}

View File

@ -0,0 +1,19 @@
<?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\Live\Categories;
use Piwik\Category\Subcategory;
class RealTimeVisitorsSubcategory extends Subcategory
{
protected $categoryId = 'General_Visitors';
protected $id = 'General_RealTime';
protected $order = 7;
}

View File

@ -0,0 +1,19 @@
<?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\Live\Categories;
use Piwik\Category\Subcategory;
class VisitorLogSubcategory extends Subcategory
{
protected $categoryId = 'General_Visitors';
protected $id = 'Live_VisitorLog';
protected $order = 5;
}

View File

@ -0,0 +1,218 @@
<?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\Live;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugins\Goals\API as APIGoals;
use Piwik\Url;
use Piwik\View;
/**
*/
class Controller extends \Piwik\Plugin\Controller
{
const SIMPLE_VISIT_COUNT_WIDGET_LAST_MINUTES_CONFIG_KEY = 'live_widget_visitor_count_last_minutes';
function index()
{
return $this->widget();
}
public function widget()
{
Piwik::checkUserHasViewAccess($this->idSite);
$view = new View('@Live/index');
$view->idSite = $this->idSite;
$view->isWidgetized = Common::getRequestVar('widget', 0, 'int');
$view = $this->setCounters($view);
$view->liveRefreshAfterMs = (int)Config::getInstance()->General['live_widget_refresh_after_seconds'] * 1000;
$view->visitors = $this->getLastVisitsStart();
$view->liveTokenAuth = Piwik::getCurrentUserTokenAuth();
return $this->render($view);
}
public function ajaxTotalVisitors()
{
Piwik::checkUserHasViewAccess($this->idSite);
$view = new View('@Live/ajaxTotalVisitors');
$view = $this->setCounters($view);
$view->idSite = $this->idSite;
return $this->render($view);
}
private function render(View $view)
{
$rendered = $view->render();
return $rendered;
}
public function indexVisitorLog()
{
Piwik::checkUserHasViewAccess($this->idSite);
$view = new View('@Live/indexVisitorLog.twig');
$view->visitorLog = $this->renderReport('getLastVisitsDetails');
return $view->render();
}
/**
* Widget
*/
public function getVisitorLog()
{
return $this->renderReport('getLastVisitsDetails');
}
public function getLastVisitsStart()
{
Piwik::checkUserHasViewAccess($this->idSite);
// hack, ensure we load today's visits by default
$_GET['date'] = 'today';
\Piwik\Period\Factory::checkPeriodIsEnabled('day');
$_GET['period'] = 'day';
$view = new View('@Live/getLastVisitsStart');
$view->idSite = (int) $this->idSite;
$api = new Request("method=Live.getLastVisitsDetails&idSite={$this->idSite}&filter_limit=10&format=original&serialize=0&disable_generic_filters=1");
$visitors = $api->process();
$view->visitors = $visitors;
return $this->render($view);
}
private function setCounters($view)
{
$segment = Request::getRawSegmentFromRequest();
$last30min = Request::processRequest('Live.getCounters', [
'idSite' => $this->idSite,
'lastMinutes' => 30,
'segment' => $segment,
'showColumns' => 'visits,actions',
], $default = []);
$last30min = $last30min[0];
$today = Request::processRequest('Live.getCounters', [
'idSite' => $this->idSite,
'lastMinutes' => 24 * 60,
'segment' => $segment,
'showColumns' => 'visits,actions',
], $default = []);
$today = $today[0];
$view->visitorsCountHalfHour = $last30min['visits'];
$view->visitorsCountToday = $today['visits'];
$view->pisHalfhour = $last30min['actions'];
$view->pisToday = $today['actions'];
return $view;
}
/**
* Echo's HTML for visitor profile popup.
*/
public function getVisitorProfilePopup()
{
Piwik::checkUserHasViewAccess($this->idSite);
$visitorData = Request::processRequest('Live.getVisitorProfile');
if (empty($visitorData)) {
throw new \Exception('Visitor could not be found'); // for example when URL parameter is not set
}
$view = new View('@Live/getVisitorProfilePopup.twig');
$view->idSite = $this->idSite;
$view->goals = Request::processRequest('Goals.getGoals', ['idSite' => $this->idSite, 'filter_limit' => '-1'], $default = []);
$view->visitorData = $visitorData;
$view->exportLink = $this->getVisitorProfileExportLink();
$this->setWidgetizedVisitorProfileUrl($view);
$summaryEntries = array();
$profileSummaries = StaticContainer::get('Piwik\Plugins\Live\ProfileSummaryProvider')->getAllInstances();
foreach ($profileSummaries as $profileSummary) {
$profileSummary->setProfile($view->visitorData);
$summaryEntries[] = [$profileSummary->getOrder(), $profileSummary->render()];
}
usort($summaryEntries, function($a, $b) {
return version_compare($a[0], $b[0]);
});
$summary = '';
foreach ($summaryEntries AS $summaryEntry) {
$summary .= $summaryEntry[1];
}
$view->profileSummary = $summary;
return $view->render();
}
public function getVisitList()
{
$this->checkSitePermission();
Piwik::checkUserHasViewAccess($this->idSite);
$filterLimit = Common::getRequestVar('filter_offset', 0, 'int');
$startCounter = Common::getRequestVar('start_number', 0, 'int');
$limit = Config::getInstance()->General['live_visitor_profile_max_visits_to_aggregate'];
if ($startCounter >= $limit) {
return ''; // do not return more visits than configured for profile
}
$nextVisits = Request::processRequest('Live.getLastVisitsDetails', array(
'segment' => Live::getSegmentWithVisitorId(),
'filter_limit' => VisitorProfile::VISITOR_PROFILE_MAX_VISITS_TO_SHOW,
'filter_offset' => $filterLimit,
'period' => false,
'date' => false
));
if (empty($nextVisits)) {
return '';
}
$view = new View('@Live/getVisitList.twig');
$view->idSite = $this->idSite;
$view->startCounter = $startCounter < count($nextVisits) ? count($nextVisits) : $startCounter;
$view->visits = $nextVisits;
return $view->render();
}
private function getVisitorProfileExportLink()
{
return Url::getCurrentQueryStringWithParametersModified(array(
'module' => 'API',
'action' => 'index',
'method' => 'Live.getVisitorProfile',
'format' => 'XML',
'expanded' => 1
));
}
private function setWidgetizedVisitorProfileUrl($view)
{
if (\Piwik\Plugin\Manager::getInstance()->isPluginLoaded('Widgetize')) {
$view->widgetizedLink = Url::getCurrentQueryStringWithParametersModified(array(
'module' => 'Widgetize',
'action' => 'iframe',
'moduleToWidgetize' => 'Live',
'actionToWidgetize' => 'getVisitorProfilePopup'
));
}
}
}

View File

@ -0,0 +1,155 @@
<?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\Live;
use Piwik\Cache;
use Piwik\CacheId;
use Piwik\API\Request;
use Piwik\Common;
/**
*
*/
class Live extends \Piwik\Plugin
{
/**
* @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
return array(
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
'Live.renderAction' => 'renderAction',
'Live.renderActionTooltip' => 'renderActionTooltip',
'Live.renderVisitorDetails' => 'renderVisitorDetails',
'Live.renderVisitorIcons' => 'renderVisitorIcons',
);
}
public function getStylesheetFiles(&$stylesheets)
{
$stylesheets[] = "plugins/Live/stylesheets/live.less";
$stylesheets[] = "plugins/Live/stylesheets/visitor_profile.less";
}
public function getJsFiles(&$jsFiles)
{
$jsFiles[] = "libs/bower_components/visibilityjs/lib/visibility.core.js";
$jsFiles[] = "plugins/Live/javascripts/live.js";
$jsFiles[] = "plugins/Live/javascripts/SegmentedVisitorLog.js";
$jsFiles[] = "plugins/Live/javascripts/visitorActions.js";
$jsFiles[] = "plugins/Live/javascripts/visitorProfile.js";
$jsFiles[] = "plugins/Live/javascripts/visitorLog.js";
$jsFiles[] = "plugins/Live/javascripts/rowaction.js";
}
public function getClientSideTranslationKeys(&$translationKeys)
{
$translationKeys[] = "Live_VisitorProfile";
$translationKeys[] = "Live_ClickToViewAllActions";
$translationKeys[] = "Live_NoMoreVisits";
$translationKeys[] = "Live_ShowMap";
$translationKeys[] = "Live_HideMap";
$translationKeys[] = "Live_PageRefreshed";
$translationKeys[] = "Live_RowActionTooltipTitle";
$translationKeys[] = "Live_RowActionTooltipDefault";
$translationKeys[] = "Live_RowActionTooltipWithDimension";
$translationKeys[] = "Live_SegmentedVisitorLogTitle";
$translationKeys[] = "General_Segment";
$translationKeys[] = "General_And";
}
public function renderAction(&$renderedAction, $action, $previousAction, $visitorDetails)
{
$visitorDetailsInstances = Visitor::getAllVisitorDetailsInstances();
foreach ($visitorDetailsInstances as $instance) {
$renderedAction .= $instance->renderAction($action, $previousAction, $visitorDetails);
}
}
public function renderActionTooltip(&$tooltip, $action, $visitInfo)
{
$detailEntries = [];
$visitorDetailsInstances = Visitor::getAllVisitorDetailsInstances();
foreach ($visitorDetailsInstances as $instance) {
$detailEntries = array_merge($detailEntries, $instance->renderActionTooltip($action, $visitInfo));
}
usort($detailEntries, function($a, $b) {
return version_compare($a[0], $b[0]);
});
foreach ($detailEntries AS $detailEntry) {
$tooltip .= $detailEntry[1];
}
}
public function renderVisitorDetails(&$renderedDetails, $visitorDetails)
{
$detailEntries = [];
$visitorDetailsInstances = Visitor::getAllVisitorDetailsInstances();
foreach ($visitorDetailsInstances as $instance) {
$detailEntries = array_merge($detailEntries, $instance->renderVisitorDetails($visitorDetails));
}
usort($detailEntries, function($a, $b) {
return version_compare($a[0], $b[0]);
});
foreach ($detailEntries AS $detailEntry) {
$renderedDetails .= $detailEntry[1];
}
}
public function renderVisitorIcons(&$renderedDetails, $visitorDetails)
{
$visitorDetailsInstances = Visitor::getAllVisitorDetailsInstances();
foreach ($visitorDetailsInstances as $instance) {
$renderedDetails .= $instance->renderIcons($visitorDetails);
}
}
/**
* Returns the segment for the most recent visitor id
*
* This method uses the transient cache to ensure it returns always the same id within one request
* as `Request::processRequest('Live.getMostRecentVisitorId')` might return different ids on each call
*
* @return mixed|string
*/
public static function getSegmentWithVisitorId()
{
$cache = Cache::getTransientCache();
$cacheId = 'segmentWithVisitorId';
if ($cache->contains($cacheId)) {
return $cache->fetch($cacheId);
}
$segment = Request::getRawSegmentFromRequest();
if (!empty($segment)) {
$segment = urldecode($segment) . ';';
}
$idVisitor = Common::getRequestVar('visitorId', false);
if ($idVisitor === false) {
$idVisitor = Request::processRequest('Live.getMostRecentVisitorId');
}
$result = urlencode($segment . 'visitorId==' . $idVisitor);
$cache->save($cacheId, $result);
return $result;
}
}

View File

@ -0,0 +1,405 @@
<?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\Live;
use Exception;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\Date;
use Piwik\Db;
use Piwik\Period;
use Piwik\Period\Range;
use Piwik\Piwik;
use Piwik\Segment;
use Piwik\Site;
class Model
{
/**
* @param $idSite
* @param $period
* @param $date
* @param $segment
* @param $limit
* @param $visitorId
* @param $minTimestamp
* @param $filterSortOrder
* @param $checkforMoreEntries
* @return array
* @throws Exception
*/
public function queryLogVisits($idSite, $period, $date, $segment, $offset, $limit, $visitorId, $minTimestamp, $filterSortOrder, $checkforMoreEntries = false)
{
// to check for more entries increase the limit by one, but cut off the last entry before returning the result
if ($checkforMoreEntries) {
$limit++;
}
list($sql, $bind) = $this->makeLogVisitsQueryString($idSite, $period, $date, $segment, $offset, $limit, $visitorId, $minTimestamp, $filterSortOrder);
$visits = Db::fetchAll($sql, $bind);
if ($checkforMoreEntries) {
if (count($visits) == $limit) {
array_pop($visits);
return [$visits, true];
}
return [$visits, false];
}
return $visits;
}
/**
* @param $idSite
* @param $lastMinutes
* @param $segment
* @return int
* @throws Exception
*/
public function getNumActions($idSite, $lastMinutes, $segment)
{
return $this->getLastMinutesCounterForQuery(
$idSite,
$lastMinutes,
$segment,
'COUNT(*)',
'log_link_visit_action',
'log_link_visit_action.server_time >= ?'
);
}
/**
* @param $idSite
* @param $lastMinutes
* @param $segment
* @return int
* @throws Exception
*/
public function getNumVisitsConverted($idSite, $lastMinutes, $segment)
{
return $this->getLastMinutesCounterForQuery(
$idSite,
$lastMinutes,
$segment,
'COUNT(*)',
'log_conversion',
'log_conversion.server_time >= ?'
);
}
/**
* @param $idSite
* @param $lastMinutes
* @param $segment
* @return int
* @throws Exception
*/
public function getNumVisits($idSite, $lastMinutes, $segment)
{
return $this->getLastMinutesCounterForQuery(
$idSite,
$lastMinutes,
$segment,
'COUNT(log_visit.visit_last_action_time)',
'log_visit',
'log_visit.visit_last_action_time >= ?'
);
}
/**
* @param $idSite
* @param $lastMinutes
* @param $segment
* @return int
* @throws Exception
*/
public function getNumVisitors($idSite, $lastMinutes, $segment)
{
return $this->getLastMinutesCounterForQuery(
$idSite,
$lastMinutes,
$segment,
'COUNT(DISTINCT log_visit.idvisitor)',
'log_visit',
'log_visit.visit_last_action_time >= ?'
);
}
private function getLastMinutesCounterForQuery($idSite, $lastMinutes, $segment, $select, $from, $where)
{
$lastMinutes = (int)$lastMinutes;
if (empty($lastMinutes)) {
return 0;
}
list($whereIdSites, $idSites) = $this->getIdSitesWhereClause($idSite, $from);
$now = null;
try {
$now = StaticContainer::get('Tests.now');
} catch (\Exception $ex) {
// ignore
}
$now = $now ?: time();
$bind = $idSites;
$bind[] = Date::factory($now - $lastMinutes * 60)->toString('Y-m-d H:i:s');
$where = $whereIdSites . "AND " . $where;
$segment = new Segment($segment, $idSite);
$query = $segment->getSelectQuery($select, $from, $where, $bind);
$numVisitors = Db::fetchOne($query['sql'], $query['bind']);
return $numVisitors;
}
/**
* @param $idSite
* @param string $table
* @return array
*/
private function getIdSitesWhereClause($idSite, $table = 'log_visit')
{
if (is_array($idSite)) {
$idSites = $idSite;
} else {
$idSites = array($idSite);
}
Piwik::postEvent('Live.API.getIdSitesString', array(&$idSites));
$idSitesBind = Common::getSqlStringFieldsArray($idSites);
$whereClause = $table . ".idsite in ($idSitesBind) ";
return array($whereClause, $idSites);
}
/**
* Returns the ID of a visitor that is adjacent to another visitor (by time of last action)
* in the log_visit table.
*
* @param int $idSite The ID of the site whose visits should be looked at.
* @param string $visitorId The ID of the visitor to get an adjacent visitor for.
* @param string $visitLastActionTime The last action time of the latest visit for $visitorId.
* @param string $segment
* @param bool $getNext Whether to retrieve the next visitor or the previous visitor. The next
* visitor will be the visitor that appears chronologically later in the
* log_visit table. The previous visitor will be the visitor that appears
* earlier.
* @return string The hex visitor ID.
* @throws Exception
*/
public function queryAdjacentVisitorId($idSite, $visitorId, $visitLastActionTime, $segment, $getNext)
{
if ($getNext) {
$visitLastActionTimeCondition = "sub.visit_last_action_time <= ?";
$orderByDir = "DESC";
} else {
$visitLastActionTimeCondition = "sub.visit_last_action_time >= ?";
$orderByDir = "ASC";
}
$visitLastActionDate = Date::factory($visitLastActionTime);
$dateOneDayAgo = $visitLastActionDate->subDay(1);
$dateOneDayInFuture = $visitLastActionDate->addDay(1);
$select = "log_visit.idvisitor, MAX(log_visit.visit_last_action_time) as visit_last_action_time";
$from = "log_visit";
$where = "log_visit.idsite = ? AND log_visit.idvisitor <> ? AND visit_last_action_time >= ? and visit_last_action_time <= ?";
$whereBind = array($idSite, @Common::hex2bin($visitorId), $dateOneDayAgo->toString('Y-m-d H:i:s'), $dateOneDayInFuture->toString('Y-m-d H:i:s'));
$orderBy = "MAX(log_visit.visit_last_action_time) $orderByDir";
$groupBy = "log_visit.idvisitor";
$segment = new Segment($segment, $idSite);
$queryInfo = $segment->getSelectQuery($select, $from, $where, $whereBind, $orderBy, $groupBy);
$sql = "SELECT sub.idvisitor, sub.visit_last_action_time FROM ({$queryInfo['sql']}) as sub
WHERE $visitLastActionTimeCondition
LIMIT 1";
$bind = array_merge($queryInfo['bind'], array($visitLastActionTime));
$visitorId = Db::fetchOne($sql, $bind);
if (!empty($visitorId)) {
$visitorId = bin2hex($visitorId);
}
return $visitorId;
}
/**
* @param $idSite
* @param $period
* @param $date
* @param $segment
* @param int $offset
* @param int $limit
* @param $visitorId
* @param $minTimestamp
* @param $filterSortOrder
* @return array
* @throws Exception
*/
public function makeLogVisitsQueryString($idSite, $period, $date, $segment, $offset, $limit, $visitorId, $minTimestamp, $filterSortOrder)
{
// If no other filter, only look at the last 24 hours of stats
if (empty($visitorId)
&& empty($limit)
&& empty($offset)
&& empty($period)
&& empty($date)
) {
$period = 'day';
$date = 'yesterdaySameTime';
}
list($whereClause, $bindIdSites) = $this->getIdSitesWhereClause($idSite);
list($whereBind, $where) = $this->getWhereClauseAndBind($whereClause, $bindIdSites, $idSite, $period, $date, $visitorId, $minTimestamp);
if (strtolower($filterSortOrder) !== 'asc') {
$filterSortOrder = 'DESC';
}
$segment = new Segment($segment, $idSite);
// Subquery to use the indexes for ORDER BY
$select = "log_visit.*";
$from = "log_visit";
$groupBy = false;
$limit = $limit >= 1 ? (int)$limit : 0;
$offset = $offset >= 1 ? (int)$offset : 0;
$orderBy = '';
if (count($bindIdSites) <= 1) {
$orderBy = 'idsite ' . $filterSortOrder . ', ';
}
$orderBy .= "visit_last_action_time " . $filterSortOrder;
$orderByParent = "sub.visit_last_action_time " . $filterSortOrder;
// this $innerLimit is a workaround (see https://github.com/piwik/piwik/issues/9200#issuecomment-183641293)
$innerLimit = $limit;
if (!$segment->isEmpty()) {
$innerLimit = $limit * 10;
}
$innerQuery = $segment->getSelectQuery($select, $from, $where, $whereBind, $orderBy, $groupBy, $innerLimit, $offset);
$bind = $innerQuery['bind'];
// Group by idvisit so that a given visit appears only once, useful when for example:
// 1) when a visitor converts 2 goals
// 2) when an Action Segment is used, the inner query will return one row per action, but we want one row per visit
$sql = "
SELECT sub.* FROM (
" . $innerQuery['sql'] . "
) AS sub
GROUP BY sub.idvisit
ORDER BY $orderByParent
";
if($limit) {
$sql .= sprintf("LIMIT %d \n", $limit);
}
return array($sql, $bind);
}
/**
* @param $idSite
* @return Site
*/
protected function makeSite($idSite)
{
return new Site($idSite);
}
/**
* @param string $whereClause
* @param array $bindIdSites
* @param $idSite
* @param $period
* @param $date
* @param $visitorId
* @param $minTimestamp
* @return array
* @throws Exception
*/
private function getWhereClauseAndBind($whereClause, $bindIdSites, $idSite, $period, $date, $visitorId, $minTimestamp)
{
$where = array();
if (!empty($whereClause)) {
$where[] = $whereClause;
}
$whereBind = $bindIdSites;
if (!empty($visitorId)) {
$where[] = "log_visit.idvisitor = ? ";
$whereBind[] = @Common::hex2bin($visitorId);
}
if (!empty($minTimestamp)) {
$where[] = "log_visit.visit_last_action_time > ? ";
$whereBind[] = date("Y-m-d H:i:s", $minTimestamp);
}
// SQL Filter with provided period
if (!empty($period) && !empty($date)) {
if ($idSite === 'all' || is_array($idSite)) {
$currentTimezone = Request::processRequest('SitesManager.getDefaultTimezone');
} else {
$currentSite = $this->makeSite($idSite);
$currentTimezone = $currentSite->getTimezone();
}
$dateString = $date;
if ($period == 'range' || Period::isMultiplePeriod($date, $period)) {
$processedPeriod = new Range('range', $date);
if ($parsedDate = Range::parseDateRange($date)) {
$dateString = $parsedDate[2];
}
} else {
$processedDate = Date::factory($date);
if ($date == 'today'
|| $date == 'now'
|| $processedDate->toString() == Date::factory('now', $currentTimezone)->toString()
) {
$processedDate = $processedDate->subDay(1);
}
$processedPeriod = Period\Factory::build($period, $processedDate);
}
$dateStart = $processedPeriod->getDateStart()->setTimezone($currentTimezone);
$where[] = "log_visit.visit_last_action_time >= ?";
$whereBind[] = $dateStart->toString('Y-m-d H:i:s');
if (!in_array($date, array('now', 'today', 'yesterdaySameTime'))
&& strpos($date, 'last') === false
&& strpos($date, 'previous') === false
&& Date::factory($dateString)->toString('Y-m-d') != Date::factory('now', $currentTimezone)->toString()
) {
$dateEnd = $processedPeriod->getDateEnd()->setTimezone($currentTimezone);
$where[] = " log_visit.visit_last_action_time <= ?";
$dateEndString = $dateEnd->addDay(1)->toString('Y-m-d H:i:s');
$whereBind[] = $dateEndString;
}
}
if (count($where) > 0) {
$where = join("
AND ", $where);
} else {
$where = false;
}
return array($whereBind, $where);
}
}

View File

@ -0,0 +1,47 @@
<?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\Live\ProfileSummary;
use Piwik\Piwik;
use Piwik\View;
/**
* Class ImportantVisits
*
* @api
*/
class ImportantVisits extends ProfileSummaryAbstract
{
/**
* @inheritdoc
*/
public function getName()
{
return Piwik::translate('General_Summary');
}
/**
* @inheritdoc
*/
public function render()
{
$viewVisits = new View('@Live/_profileSummaryVisits.twig');
$viewVisits->visitorData = $this->profile;
return $viewVisits->render();
}
/**
* @inheritdoc
*/
public function getOrder()
{
return 30;
}
}

View File

@ -0,0 +1,67 @@
<?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\Live\ProfileSummary;
/**
* Class ProfileSummaryAbstract
*
* This class can be implemented in a plugin to provide a new profile summary
*
* @api
*/
abstract class ProfileSummaryAbstract
{
/**
* Visitor profile information
*
* @var array
*/
protected $profile = [];
/**
* Set profile information
*
* @param array $profile
*/
public function setProfile($profile)
{
$this->profile = $profile;
}
/**
* Returns the unique ID
*
* @return string
*/
public function getId()
{
return static::class;
}
/**
* Returns the descriptive name
*
* @return string
*/
abstract function getName();
/**
* Renders and returns the summary
*
* @return string
*/
abstract function render();
/**
* Returns order indicator used to sort all summaries before displaying them
*
* @return int
*/
abstract function getOrder();
}

View File

@ -0,0 +1,53 @@
<?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\Live\ProfileSummary;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Piwik;
use Piwik\View;
use Piwik\Plugins\Goals\API as APIGoals;
/**
* Class ProfileSummaryAbstract
*
* This class can be implemented in a plugin to provide a new profile summary
*
* @api
*/
class Summary extends ProfileSummaryAbstract
{
/**
* @inheritdoc
*/
public function getName()
{
return Piwik::translate('General_Summary');
}
/**
* @inheritdoc
*/
public function render()
{
$idSite = Common::getRequestVar('idSite', null, 'int');
$view = new View('@Live/_profileSummary.twig');
$view->goals = Request::processRequest('Goals.getGoals', ['idSite' => $idSite, 'filter_limit' => '-1'], $default = []);
$view->visitorData = $this->profile;
return $view->render();
}
/**
* @inheritdoc
*/
public function getOrder()
{
return 0;
}
}

View File

@ -0,0 +1,98 @@
<?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\Live;
use Piwik\Cache;
use Piwik\CacheId;
use Piwik\Plugin;
use Piwik\Piwik;
use Piwik\Plugins\Live\ProfileSummary\ProfileSummaryAbstract;
/**
*
*/
class ProfileSummaryProvider
{
/**
* @var Plugin\Manager
*/
private $pluginManager;
public function __construct(Plugin\Manager $pluginManager)
{
$this->pluginManager = $pluginManager;
}
/**
* Returns all available profile summaries
*
* @return ProfileSummaryAbstract[]
* @throws \Exception
*/
public function getAllInstances()
{
$cacheId = CacheId::pluginAware('ProfileSummaries');
$cache = Cache::getTransientCache();
if (!$cache->contains($cacheId)) {
$instances = [];
/**
* Triggered to add new live profile summaries.
*
* **Example**
*
* public function addProfileSummary(&$profileSummaries)
* {
* $profileSummaries[] = new MyCustomProfileSummary();
* }
*
* @param ProfileSummaryAbstract[] $profileSummaries An array of profile summaries
*/
Piwik::postEvent('Live.addProfileSummaries', array(&$instances));
foreach ($this->getAllProfileSummaryClasses() as $className) {
$instances[] = new $className();
}
/**
* Triggered to filter / restrict profile summaries.
*
* **Example**
*
* public function filterProfileSummary(&$profileSummaries)
* {
* foreach ($profileSummaries as $index => $profileSummary) {
* if ($profileSummary->getId() === 'myid') {}
* unset($profileSummaries[$index]); // remove all summaries having this ID
* }
* }
* }
*
* @param ProfileSummaryAbstract[] $profileSummaries An array of profile summaries
*/
Piwik::postEvent('Live.filterProfileSummaries', array(&$instances));
$cache->save($cacheId, $instances);
}
return $cache->fetch($cacheId);
}
/**
* Returns class names of all VisitorDetails classes.
*
* @return string[]
* @api
*/
protected function getAllProfileSummaryClasses()
{
return $this->pluginManager->findMultipleComponents('ProfileSummary', 'Piwik\Plugins\Live\ProfileSummary\ProfileSummaryAbstract');
}
}

View File

@ -0,0 +1,21 @@
<?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\Live\Reports;
abstract class Base extends \Piwik\Plugin\Report
{
protected function init()
{
$this->categoryId = 'Live!';
}
public function configureReportMetadata(&$availableReports, $infos)
{
}
}

View File

@ -0,0 +1,22 @@
<?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\Live\Reports;
class GetLastVisits extends Base
{
// this class only exists to disable the default sort column
protected $defaultSortColumn = '';
public function buildReportMetadata()
{
// do not add this report as metadata
}
}

View File

@ -0,0 +1,48 @@
<?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\Live\Reports;
use Piwik\Plugin\Report;
use Piwik\Plugins\Live\Visualizations\VisitorLog;
use Piwik\Report\ReportWidgetFactory;
use Piwik\Widget\WidgetsList;
class GetLastVisitsDetails extends Base
{
protected $defaultSortColumn = '';
protected function init()
{
parent::init();
$this->order = 2;
$this->categoryId = 'General_Visitors';
$this->subcategoryId = 'Live_VisitorLog';
}
public function getDefaultTypeViewDataTable()
{
return VisitorLog::ID;
}
public function alwaysUseDefaultViewDataTable()
{
return true;
}
public function configureWidgets(WidgetsList $widgetsList, ReportWidgetFactory $factory)
{
$widget = $factory->createWidget()
->forceViewDataTable(VisitorLog::ID)
->setName('Live_VisitorLog')
->setOrder(10)
->setParameters(array('small' => 1));
$widgetsList->addWidgetConfig($widget);
}
}

View File

@ -0,0 +1,64 @@
<?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\Live\Reports;
use Piwik\Config;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugins\Live\Controller;
use Piwik\API\Request;
use Piwik\Report\ReportWidgetFactory;
use Piwik\View;
use Piwik\Widget\WidgetsList;
class GetSimpleLastVisitCount extends Base
{
protected function init()
{
parent::init();
$this->categoryId = 'General_Visitors';
$this->order = 3;
}
public function configureWidgets(WidgetsList $widgetsList, ReportWidgetFactory $factory)
{
$widget = $factory->createWidget()->setName('Live_RealTimeVisitorCount')->setOrder(15);
$widgetsList->addWidgetConfig($widget);
}
public function render()
{
$lastMinutes = Config::getInstance()->General[Controller::SIMPLE_VISIT_COUNT_WIDGET_LAST_MINUTES_CONFIG_KEY];
$params = array('lastMinutes' => $lastMinutes, 'showColumns' => array('visits', 'visitors', 'actions'));
$lastNData = Request::processRequest('Live.getCounters', $params);
$formatter = new Formatter();
$view = new View('@Live/getSimpleLastVisitCount');
$view->lastMinutes = $lastMinutes;
$view->visitors = $formatter->getPrettyNumber($lastNData[0]['visitors']);
$view->visits = $formatter->getPrettyNumber($lastNData[0]['visits']);
$view->actions = $formatter->getPrettyNumber($lastNData[0]['actions']);
$view->refreshAfterXSecs = Config::getInstance()->General['live_widget_refresh_after_seconds'];
$view->translations = array(
'one_visitor' => Piwik::translate('Live_NbVisitor'),
'visitors' => Piwik::translate('Live_NbVisitors'),
'one_visit' => Piwik::translate('General_OneVisit'),
'visits' => Piwik::translate('General_NVisits'),
'one_action' => Piwik::translate('General_OneAction'),
'actions' => Piwik::translate('VisitsSummary_NbActionsDescription'),
'one_minute' => Piwik::translate('Intl_OneMinute'),
'minutes' => Piwik::translate('Intl_NMinutes')
);
return $view->render();
}
}

View File

@ -0,0 +1,338 @@
<?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\Live;
use Piwik\Cache;
use Piwik\CacheId;
use Piwik\Config;
use Piwik\DataTable\Filter\ColumnDelete;
use Piwik\Date;
use Piwik\Metrics\Formatter;
use Piwik\Plugin;
use Piwik\Piwik;
use Piwik\Tracker\GoalManager;
class Visitor implements VisitorInterface
{
private $details = array();
function __construct($visitorRawData)
{
$this->details = $visitorRawData;
}
function getAllVisitorDetails()
{
$visitor = array();
$instances = self::getAllVisitorDetailsInstances();
foreach ($instances as $instance) {
$instance->setDetails($this->details);
$instance->extendVisitorDetails($visitor);
}
/**
* This event can be used to add any details to a visitor. The visitor's details are for instance used in
* API requests like 'Live.getVisitorProfile' and 'Live.getLastVisitDetails'. This can be useful for instance
* in case your plugin defines any visit dimensions and you want to add the value of your dimension to a user.
* It can be also useful if you want to enrich a visitor with custom fields based on other fields or if you
* want to change or remove any fields from the user.
*
* **Example**
*
* Piwik::addAction('Live.getAllVisitorDetails', function (&visitor, $details) {
* $visitor['userPoints'] = $details['actions'] + $details['events'] + $details['searches'];
* unset($visitor['anyFieldYouWantToRemove']);
* });
*
* @param array &visitor You can add or remove fields to the visitor array and it will reflected in the API output
* @param array $details The details array contains all visit dimensions (columns of log_visit table)
*
* @deprecated will be removed in Piwik 4
*/
Piwik::postEvent('Live.getAllVisitorDetails', array(&$visitor, $this->details));
return $visitor;
}
/**
* Returns all available visitor details instances
*
* @return VisitorDetailsAbstract[]
* @throws \Exception
*/
public static function getAllVisitorDetailsInstances()
{
$cacheId = CacheId::pluginAware('VisitorDetails');
$cache = Cache::getTransientCache();
if (!$cache->contains($cacheId)) {
$instances = [
new VisitorDetails() // needs to be first
];
/**
* Triggered to add new visitor details that cannot be picked up by the platform automatically.
*
* **Example**
*
* public function addVisitorDetails(&$visitorDetails)
* {
* $visitorDetails[] = new CustomVisitorDetails();
* }
*
* @param VisitorDetailsAbstract[] $visitorDetails An array of visitorDetails
*/
Piwik::postEvent('Live.addVisitorDetails', array(&$instances));
foreach (self::getAllVisitorDetailsClasses() as $className) {
$instance = new $className();
if ($instance instanceof VisitorDetails) {
continue;
}
$instances[] = $instance;
}
/**
* Triggered to filter / restrict vistor details.
*
* **Example**
*
* public function filterVisitorDetails(&$visitorDetails)
* {
* foreach ($visitorDetails as $index => $visitorDetail) {
* if (strpos(get_class($visitorDetail), 'MyPluginName') !== false) {}
* unset($visitorDetails[$index]); // remove all visitor details for a specific plugin
* }
* }
* }
*
* @param VisitorDetailsAbstract[] $visitorDetails An array of visitorDetails
*/
Piwik::postEvent('Live.filterVisitorDetails', array(&$instances));
$cache->save($cacheId, $instances);
}
return $cache->fetch($cacheId);
}
/**
* Returns class names of all VisitorDetails classes.
*
* @return string[]
* @api
*/
protected static function getAllVisitorDetailsClasses()
{
return Plugin\Manager::getInstance()->findComponents('VisitorDetails', 'Piwik\Plugins\Live\VisitorDetailsAbstract');
}
function getVisitorId()
{
if (isset($this->details['idvisitor'])) {
return bin2hex($this->details['idvisitor']);
}
return false;
}
/**
* Removes fields that are not meant to be displayed (md5 config hash)
* Or that the user should only access if they are Super User or admin (cookie, IP)
*
* @param array $visitorDetails
* @return array
*/
public static function cleanVisitorDetails($visitorDetails)
{
$toUnset = array('config_id');
if (Piwik::isUserIsAnonymous()) {
$toUnset[] = 'idvisitor';
$toUnset[] = 'user_id';
$toUnset[] = 'location_ip';
}
foreach ($toUnset as $keyName) {
if (isset($visitorDetails[$keyName])) {
unset($visitorDetails[$keyName]);
}
}
return $visitorDetails;
}
/**
* The &flat=1 feature is used by API.getSuggestedValuesForSegment
*
* @param $visitorDetailsArray
* @return array
*/
public static function flattenVisitorDetailsArray($visitorDetailsArray)
{
// NOTE: if you flatten more fields from the "actionDetails" array
// ==> also update API/API.php getSuggestedValuesForSegment(), the $segmentsNeedActionsInfo array
// flatten visit custom variables
if (!empty($visitorDetailsArray['customVariables'])
&& is_array($visitorDetailsArray['customVariables'])) {
foreach ($visitorDetailsArray['customVariables'] as $thisCustomVar) {
$visitorDetailsArray = array_merge($visitorDetailsArray, $thisCustomVar);
}
unset($visitorDetailsArray['customVariables']);
}
// flatten page views custom variables
$count = 1;
foreach ($visitorDetailsArray['actionDetails'] as $action) {
if (!empty($action['customVariables'])) {
foreach ($action['customVariables'] as $thisCustomVar) {
foreach ($thisCustomVar as $cvKey => $cvValue) {
$flattenedKeyName = $cvKey . ColumnDelete::APPEND_TO_COLUMN_NAME_TO_KEEP . $count;
$visitorDetailsArray[$flattenedKeyName] = $cvValue;
$count++;
}
}
}
}
// Flatten Goals
$count = 1;
foreach ($visitorDetailsArray['actionDetails'] as $action) {
if (!empty($action['goalId'])) {
$flattenedKeyName = 'visitConvertedGoalId' . ColumnDelete::APPEND_TO_COLUMN_NAME_TO_KEEP . $count;
$visitorDetailsArray[$flattenedKeyName] = $action['goalId'];
$count++;
}
}
// Flatten Page Titles/URLs
$count = 1;
foreach ($visitorDetailsArray['actionDetails'] as $action) {
// API.getSuggestedValuesForSegment
$flattenForActionType = array(
'outlink' => 'outlinkUrl',
'download' => 'downloadUrl',
'event' => 'eventUrl',
'action' => 'pageUrl'
);
foreach($flattenForActionType as $actionType => $flattenedKeyPrefix) {
if (!empty($action['url'])
&& $action['type'] == $actionType) {
$flattenedKeyName = $flattenedKeyPrefix . ColumnDelete::APPEND_TO_COLUMN_NAME_TO_KEEP . $count;
$visitorDetailsArray[$flattenedKeyName] = $action['url'];
}
}
$flatten = array( 'pageTitle', 'siteSearchKeyword', 'eventCategory', 'eventAction', 'eventName', 'eventValue');
foreach($flatten as $toFlatten) {
if (!empty($action[$toFlatten])) {
$flattenedKeyName = $toFlatten . ColumnDelete::APPEND_TO_COLUMN_NAME_TO_KEEP . $count;
$visitorDetailsArray[$flattenedKeyName] = $action[$toFlatten];
}
}
$count++;
}
// Entry/exit pages
$firstAction = $lastAction = false;
foreach ($visitorDetailsArray['actionDetails'] as $action) {
if ($action['type'] == 'action') {
if (empty($firstAction)) {
$firstAction = $action;
}
$lastAction = $action;
}
}
if (!empty($firstAction['pageTitle'])) {
$visitorDetailsArray['entryPageTitle'] = $firstAction['pageTitle'];
}
if (!empty($firstAction['url'])) {
$visitorDetailsArray['entryPageUrl'] = $firstAction['url'];
}
if (!empty($lastAction['pageTitle'])) {
$visitorDetailsArray['exitPageTitle'] = $lastAction['pageTitle'];
}
if (!empty($lastAction['url'])) {
$visitorDetailsArray['exitPageUrl'] = $lastAction['url'];
}
return $visitorDetailsArray;
}
/**
* @param array $visitorDetailsArray
* @param array $actionDetails preset action details
*
* @return array
*/
public static function enrichVisitorArrayWithActions($visitorDetailsArray, $actionDetails = array())
{
$actionsLimit = (int)Config::getInstance()->General['visitor_log_maximum_actions_per_visit'];
$visitorDetailsManipulators = self::getAllVisitorDetailsInstances();
foreach ($visitorDetailsManipulators as $instance) {
$instance->provideActionsForVisit($actionDetails, $visitorDetailsArray);
}
foreach ($visitorDetailsManipulators as $instance) {
$instance->filterActions($actionDetails, $visitorDetailsArray);
}
usort($actionDetails, array('static', 'sortByServerTime'));
$actionDetails = array_values($actionDetails);
// limit actions
if ($actionsLimit < count($actionDetails)) {
$visitorDetailsArray['truncatedActionsCount'] = count($actionDetails) - $actionsLimit;
$actionDetails = array_slice($actionDetails, 0, $actionsLimit);
}
foreach ($actionDetails as $actionIdx => &$actionDetail) {
$actionDetail =& $actionDetails[$actionIdx];
$nextAction = isset($actionDetails[$actionIdx+1]) ? $actionDetails[$actionIdx+1] : null;
foreach ($visitorDetailsManipulators as $instance) {
$instance->extendActionDetails($actionDetail, $nextAction, $visitorDetailsArray);
}
}
$visitorDetailsArray['actionDetails'] = $actionDetails;
return $visitorDetailsArray;
}
private static function sortByServerTime($a, $b)
{
$ta = strtotime($a['serverTimePretty']);
$tb = strtotime($b['serverTimePretty']);
if ($ta < $tb) {
return -1;
}
if ($ta == $tb) {
if ($a['idlink_va'] == $b['idlink_va']) {
return strcmp($a['type'], $b['type']);
}
if ($a['idlink_va'] > $b['idlink_va']) {
return 1;
}
return -1;
}
return 1;
}
}

View File

@ -0,0 +1,276 @@
<?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\Live;
use Piwik\API\Request;
use Piwik\Config;
use Piwik\Date;
use Piwik\DataTable;
use Piwik\Metrics\Formatter;
use Piwik\Network\IPUtils;
use Piwik\Piwik;
use Piwik\Site;
use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\Plugins\Referrers\API as APIReferrers;
use Piwik\View;
class VisitorDetails extends VisitorDetailsAbstract
{
public function extendVisitorDetails(&$visitor)
{
$idSite = $this->getIdSite();
$website = new Site($idSite);
$timezone = $website->getTimezone();
$currency = $website->getCurrency();
$currencies = APISitesManager::getInstance()->getCurrencySymbols();
$visitor += array(
'idSite' => $idSite,
'idVisit' => $this->getIdVisit(),
'visitIp' => $this->getIp(),
'visitorId' => $this->getVisitorId(),
// => false are placeholders to be filled in API later
'actionDetails' => false,
'goalConversions' => false,
'siteCurrency' => false,
'siteCurrencySymbol' => false,
// all time entries
'serverDate' => $this->getServerDate(),
'visitServerHour' => $this->getVisitServerHour(),
'lastActionTimestamp' => $this->getTimestampLastAction(),
'lastActionDateTime' => $this->getDateTimeLastAction(),
);
$visitor['siteCurrency'] = $currency;
$visitor['siteCurrencySymbol'] = @$currencies[$visitor['siteCurrency']];
$visitor['siteName'] = $website->getName();
$visitor['serverTimestamp'] = $visitor['lastActionTimestamp'];
$visitor['firstActionTimestamp'] = strtotime($this->details['visit_first_action_time']);
$dateTimeVisit = Date::factory($visitor['lastActionTimestamp'], $timezone);
if ($dateTimeVisit) {
$visitor['serverTimePretty'] = $dateTimeVisit->getLocalized(Date::TIME_FORMAT);
$visitor['serverDatePretty'] = $dateTimeVisit->getLocalized(Date::DATE_FORMAT_LONG);
}
$dateTimeVisitFirstAction = Date::factory($visitor['firstActionTimestamp'], $timezone);
$visitor['serverDatePrettyFirstAction'] = $dateTimeVisitFirstAction->getLocalized(Date::DATE_FORMAT_LONG);
$visitor['serverTimePrettyFirstAction'] = $dateTimeVisitFirstAction->getLocalized(Date::TIME_FORMAT);
}
public function renderAction($action, $previousAction, $visitorDetails)
{
switch ($action['type']) {
case 'ecommerceOrder':
case 'ecommerceAbandonedCart':
$template = '@Live/_actionEcommerce.twig';
break;
case 'goal':
$template = '@Live/_actionGoal.twig';
break;
case 'action':
case 'search':
case 'outlink':
case 'download':
$template = '@Live/_actionCommon.twig';
break;
}
if (empty($template)) {
return;
}
$view = new View($template);
$view->action = $action;
$view->previousAction = $previousAction;
$view->visitInfo = $visitorDetails;
return $view->render();
}
public function renderActionTooltip($action, $visitInfo)
{
$view = new View('@Live/_actionTooltip');
$view->action = $action;
$view->visitInfo = $visitInfo;
return [[ 0, $view->render() ]];
}
public function renderVisitorDetails($visitorDetails)
{
$view = new View('@Live/_visitorDetails.twig');
$view->visitInfo = $visitorDetails;
return [[ 0, $view->render() ]];
}
public function renderIcons($visitorDetails)
{
$view = new View('@Live/_visitorLogIcons.twig');
$view->visitor = $visitorDetails;
return $view->render();
}
function getVisitorId()
{
if (isset($this->details['idvisitor'])) {
return bin2hex($this->details['idvisitor']);
}
return false;
}
function getVisitServerHour()
{
return date('G', strtotime($this->details['visit_last_action_time']));
}
function getServerDate()
{
return date('Y-m-d', strtotime($this->details['visit_last_action_time']));
}
function getIp()
{
if (isset($this->details['location_ip'])) {
return IPUtils::binaryToStringIP($this->details['location_ip']);
}
return null;
}
function getIdVisit()
{
return $this->details['idvisit'];
}
function getIdSite()
{
return $this->details['idsite'];
}
function getTimestampLastAction()
{
return strtotime($this->details['visit_last_action_time']);
}
function getDateTimeLastAction()
{
return date('Y-m-d H:i:s', strtotime($this->details['visit_last_action_time']));
}
public function initProfile($visits, &$profile)
{
$profile['totalVisits'] = 0;
$profile['totalVisitDuration'] = 0;
}
public function handleProfileVisit($visit, &$profile)
{
++$profile['totalVisits'];
$profile['totalVisitDuration'] += $visit->getColumn('visitDuration');
}
public function finalizeProfile($visits, &$profile)
{
$formatter = new Formatter();
$profile['totalVisitDurationPretty'] = $formatter->getPrettyTimeFromSeconds($profile['totalVisitDuration'], true);
$rows = $visits->getRows();
$firstVisit = $profile['visit_first'];
if (count($rows) >= Config::getInstance()->General['live_visitor_profile_max_visits_to_aggregate']) {
$firstVisit = $this->fetchFirstVisit();
}
$profile['userId'] = $visits->getLastRow()->getColumn('userId');
$profile['firstVisit'] = $this->getVisitorProfileVisitSummary($firstVisit);
$profile['lastVisit'] = $this->getVisitorProfileVisitSummary($profile['visit_last']);
$profile['visitsAggregated'] = count($rows);
}
/**
* Fetch first visit from Live API
*
* @return DataTable\Row
*/
private function fetchFirstVisit()
{
$response = Request::processRequest('Live.getFirstVisitForVisitorId', [
'idSite' => $this->getIdSite(),
'visitorId' => $this->getVisitorId(),
]);
return $response->getFirstRow();
}
/**
* Returns a summary for an important visit. Used to describe the first & last visits of a visitor.
*
* @param DataTable\Row $visit
* @return array
*/
private function getVisitorProfileVisitSummary($visit)
{
$today = Date::today();
$serverDate = $visit->getColumn('firstActionTimestamp');
return array(
'date' => $serverDate,
'prettyDate' => Date::factory($serverDate)->getLocalized(Date::DATE_FORMAT_LONG),
'daysAgo' => (int)Date::secondsToDays($today->getTimestamp() - Date::factory($serverDate)->getTimestamp()),
'referrerType' => $visit->getColumn('referrerType'),
'referrerUrl' => $visit->getColumn('referrerUrl') ?: '',
'referralSummary' => self::getReferrerSummaryForVisit($visit),
);
}
/**
* Returns a summary for a visit's referral.
*
* @param DataTable\Row $visit
* @return bool|mixed|string
*/
public static function getReferrerSummaryForVisit($visit)
{
$referrerType = $visit->getColumn('referrerType');
if ($referrerType === false
|| $referrerType == 'direct'
) {
return Piwik::translate('Referrers_DirectEntry');
}
if ($referrerType == 'search') {
$referrerName = $visit->getColumn('referrerName');
$keyword = $visit->getColumn('referrerKeyword');
if ($keyword !== false
&& $keyword != APIReferrers::getKeywordNotDefinedString()
) {
$referrerName .= ' (' . $keyword . ')';
}
return $referrerName;
}
if ($referrerType == 'campaign') {
$summary = Piwik::translate('Referrers_ColumnCampaign') . ': ' . $visit->getColumn('referrerName');
$keyword = $visit->getColumn('referrerKeyword');
if (!empty($keyword)) {
$summary .= ' - ' . $keyword;
}
return $summary;
}
return $visit->getColumn('referrerName');
}
}

View File

@ -0,0 +1,275 @@
<?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\Live;
use Piwik\DataTable;
/**
* Class VisitorDetailsAbstract
*
* This class can be implemented in a plugin to extend the Live reports, visitor log and profile
*
* @api
*/
abstract class VisitorDetailsAbstract
{
protected $details = array();
/**
* Set details of current visit
*
* @param array $details
*/
public function setDetails($details)
{
$this->details = $details;
}
/**
* Makes it possible to extend the visitor details returned from API
*
* **Example**
*
* public function extendVisitorDetails(&$visitor) {
* $crmData = Model::getCRMData($visitor['userid']);
*
* foreach ($crmData as $prop => $value) {
* $visitor[$prop] = $value;
* }
* }
*
* @param array $visitor
* @return void
*/
public function extendVisitorDetails(&$visitor)
{
}
/**
* Makes it possible to enrich the action set for a single visit
*
* **Example**
*
* public function provideActionsForVisit(&$actions, $visitorDetails) {
* $adviews = Model::getAdviews($visitorDetails['visitid']);
* $actions += $adviews;
* }
*
* @param array $actions List of action to manipulate
* @param array $visitorDetails
* @return void
*/
public function provideActionsForVisit(&$actions, $visitorDetails)
{
}
/**
* Makes it possible to enrich the action set for multiple visits identified by given visit ids
*
* action set to enrich needs to have the following structure
*
* $actions = array (
* 'idvisit' => array ( list of actions for this visit id ),
* 'idvisit' => array ( list of actions for this visit id ),
* ...
* )
*
* **Example**
*
* public function provideActionsForVisitIds(&$actions, $visitIds) {
* $adviews = Model::getAdviewsByVisitIds($visitIds);
* foreach ($adviews as $idVisit => $adView) {
* $actions[$idVisit][] = $adView;
* }
* }
*
* @param array $actions action set to enrich
* @param array $visitIds list of visit ids
*/
public function provideActionsForVisitIds(&$actions, $visitIds)
{
}
/**
* Allows filtering the provided actions
*
* **Example:**
*
* public function filterActions(&$actions, $visitorDetailsArray) {
* foreach ($actions as $idx => $action) {
* if ($action['type'] == 'customaction') {
* unset($actions[$idx]);
* continue;
* }
* }
* }
*
* @param array $actions
* @param array $visitorDetailsArray
*/
public function filterActions(&$actions, $visitorDetailsArray)
{
}
/**
* Allows extended each action with additional information
*
* @param array $action
* @param array $nextAction
* @param array $visitorDetails
*/
public function extendActionDetails(&$action, $nextAction, $visitorDetails)
{
}
/**
* Called when rendering a single Action
*
* @param array $action
* @param array $previousAction
* @param array $visitorDetails
* @return string
*/
public function renderAction($action, $previousAction, $visitorDetails)
{
}
/**
* Called for rendering the tooltip on actions
* returned array needs to look like this:
* array (
* 20, // order id
* 'rendered html content'
* )
*
* @param array $action
* @param array $visitInfo
* @return array
*/
public function renderActionTooltip($action, $visitInfo)
{
return [];
}
/**
* Called when rendering the Icons in visitor log
*
* @param array $visitorDetails
* @return string
*/
public function renderIcons($visitorDetails)
{
}
/**
* Called when rendering the visitor details in visitor log
* returned array needs to look like this:
* array (
* 20, // order id
* 'rendered html content'
* )
*
* **Example**
* public function renderVisitorDetails($visitorDetails) {
* $view = new View('@MyPlugin/_visitorDetails.twig');
* $view->visitInfo = $visitorDetails;
* return $view->render();
* }
*
* @param array $visitorDetails
* @return array
*/
public function renderVisitorDetails($visitorDetails)
{
return array();
}
/**
* Allows manipulating the visitor profile properties
* Will be called when visitor profile is initialized
*
* **Example**
*
* public function initProfile($visit, &$profile) {
* // initialize properties that will be filled based on visits or actions
* $profile['totalActions'] = 0;
* $profile['totalActionsOfMyType'] = 0;
* }
*
* @param DataTable $visits
* @param array $profile
* @return void
*/
public function initProfile($visits, &$profile)
{
}
/**
* Allows manipulating the visitor profile properties based on included visits
* Will be called for every action within the profile
*
* **Example**
*
* public function handleProfileVisit($visit, &$profile) {
* $profile['totalActions'] += $visit->getColumn('actions');
* }
*
* @param DataTable\Row $visit
* @param array $profile
* @return void
*/
public function handleProfileVisit($visit, &$profile)
{
}
/**
* Allows manipulating the visitor profile properties based on included actions
* Will be called for every action within the profile
*
* **Example**
*
* public function handleProfileAction($action, &$profile)
* {
* if ($action['type'] != 'myactiontype') {
* return;
* }
*
* $profile['totalActionsOfMyType']++;
* }
*
* @param array $action
* @param array $profile
* @return void
*/
public function handleProfileAction($action, &$profile)
{
}
/**
* Will be called after iterating over all actions
* Can be used to set profile information that requires data that was set while iterating over visits & actions
*
* **Example**
*
* public function finalizeProfile($visits, &$profile) {
* $profile['isPowerUser'] = false;
*
* if ($profile['totalActionsOfMyType'] > 20) {
* $profile['isPowerUser'] = true;
* }
* }
*
* @param DataTable $visits
* @param array $profile
* @return void
*/
public function finalizeProfile($visits, &$profile)
{
}
}

View File

@ -0,0 +1,49 @@
<?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\Live;
use Exception;
use Piwik\Piwik;
class VisitorFactory
{
/**
* Returns Visitor object.
* This method can be overwritten to use a different Visitor object
*
* @param array $visitorRawData
* @throws \Exception
* @return \Piwik\Plugins\Live\VisitorInterface
* @ignore
*/
public function create(array $visitorRawData = array())
{
$visitor = null;
/**
* Triggered while visit is filtering in live plugin. Subscribers to this
* event can force the use of a custom visitor object that extends from
* {@link Piwik\Plugins\Live\VisitorInterface}.
*
* @param \Piwik\Plugins\Live\VisitorInterface &$visitor Initialized to null, but can be set to
* a new visitor object. If it isn't modified
* Piwik uses the default class.
* @param array $visitorRawData Raw data using in Visitor object constructor.
*/
Piwik::postEvent('Live.makeNewVisitorObject', array(&$visitor, $visitorRawData));
if (is_null($visitor)) {
$visitor = new Visitor($visitorRawData);
} elseif (!($visitor instanceof VisitorInterface)) {
throw new Exception("The Visitor object set in the plugin must implement VisitorInterface");
}
return $visitor;
}
}

View File

@ -0,0 +1,22 @@
<?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\Live;
interface VisitorInterface
{
/**
* @return array
*/
public function getAllVisitorDetails();
/**
* @return string|bool
*/
public function getVisitorId();
}

View File

@ -0,0 +1,99 @@
<?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\Live;
use Exception;
use Piwik\DataTable;
class VisitorProfile
{
const VISITOR_PROFILE_MAX_VISITS_TO_SHOW = 10;
protected $profile = array();
public function __construct($idSite)
{
$this->idSite = $idSite;
}
/**
* @param $visits
* @param $visitorId
* @param $segment
* @param $numLastVisits
* @return array
* @throws Exception
*/
public function makeVisitorProfile(DataTable $visits, $visitorId, $segment, $numLastVisits)
{
$visitorDetailsManipulators = Visitor::getAllVisitorDetailsInstances();
$this->profile['visitorId'] = $visitorId;
$this->profile['hasMoreVisits'] = $visits->getMetadata('hasMoreVisits');
$this->profile['visit_first'] = $visits->getLastRow();
$this->profile['visit_last'] = $visits->getFirstRow();
foreach ($visitorDetailsManipulators as $instance) {
$instance->initProfile($visits, $this->profile);
}
/** @var DataTable\Row $visit */
foreach ($visits->getRows() as $visit) {
foreach ($visitorDetailsManipulators as $instance) {
$instance->handleProfileVisit($visit, $this->profile);
}
foreach ($visit->getColumn('actionDetails') as $action) {
foreach ($visitorDetailsManipulators as $instance) {
$instance->handleProfileAction($action, $this->profile);
}
}
}
// use N most recent visits for last_visits
$visits->deleteRowsOffset($numLastVisits);
$this->profile['lastVisits'] = $visits;
$this->handleAdjacentVisitorIds($visits, $visitorId, $segment);
foreach ($visitorDetailsManipulators as $instance) {
$instance->finalizeProfile($visits, $this->profile);
}
unset($this->profile['visit_first'], $this->profile['visit_last']);
return $this->profile;
}
/**
* @param DataTable $visits
* @param $visitorId
* @param $segment
*/
private function handleAdjacentVisitorIds(DataTable $visits, $visitorId, $segment)
{
if (!$visits->getRowsCount()) {
$this->profile['nextVisitorId'] = false;
$this->profile['previousVisitorId'] = false;
return;
}
// get visitor IDs that are adjacent to this one in log_visit
// TODO: make sure order of visitor ids is not changed if a returning visitor visits while the user is
// looking at the popup.
$rows = $visits->getRows();
$latestVisitTime = reset($rows)->getColumn('lastActionDateTime');
$model = new Model();
$this->profile['nextVisitorId'] = $model->queryAdjacentVisitorId($this->idSite, $visitorId,
$latestVisitTime, $segment, $getNext = true);
$this->profile['previousVisitorId'] = $model->queryAdjacentVisitorId($this->idSite, $visitorId,
$latestVisitTime, $segment, $getNext = false);
}
}

View File

@ -0,0 +1,136 @@
<?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\Live\Visualizations;
use Piwik\Common;
use Piwik\Config;
use Piwik\DataTable;
use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugin\Visualization;
use Piwik\Plugins\PrivacyManager\PrivacyManager;
use Piwik\View;
/**
* A special DataTable visualization for the Live.getLastVisitsDetails API method.
*
* @property VisitorLog\Config $config
*/
class VisitorLog extends Visualization
{
const ID = 'VisitorLog';
const TEMPLATE_FILE = "@Live/_dataTableViz_visitorLog.twig";
const FOOTER_ICON_TITLE = '';
const FOOTER_ICON = '';
public static function getDefaultConfig()
{
return new VisitorLog\Config();
}
public function beforeLoadDataTable()
{
$this->requestConfig->addPropertiesThatShouldBeAvailableClientSide(array(
'filter_limit',
'filter_offset',
'filter_sort_column',
'filter_sort_order',
));
if (!is_numeric($this->requestConfig->filter_limit)
|| $this->requestConfig->filter_limit == -1 // 'all' is not supported for this visualization
) {
$defaultLimit = Config::getInstance()->General['datatable_default_limit'];
$this->requestConfig->filter_limit = $defaultLimit;
}
$this->requestConfig->request_parameters_to_modify['filter_limit'] = $this->requestConfig->filter_limit+1; // request one more record, to check if a next page is available
$this->requestConfig->disable_generic_filters = true;
$this->requestConfig->filter_sort_column = false;
$view = $this;
$this->config->filters[] = function (DataTable $table) use ($view) {
if (Plugin\Manager::getInstance()->isPluginActivated('PrivacyManager') && PrivacyManager::haveLogsBeenPurged($table)) {
$settings = PrivacyManager::getPurgeDataSettings();
if (!empty($settings['delete_logs_older_than'])) {
$numDaysDelete = $settings['delete_logs_older_than'];
$view->config->no_data_message = Piwik::translate('CoreHome_ThereIsNoDataForThisReport') . ' ' . Piwik::translate('Live_VisitorLogNoDataMessagePurged', $numDaysDelete);
}
}
};
}
public function afterGenericFiltersAreAppliedToLoadedDataTable()
{
$this->requestConfig->filter_sort_column = false;
}
/**
* Configure visualization.
*/
public function beforeRender()
{
$this->config->show_as_content_block = false;
$this->config->title = Piwik::translate('Live_VisitorLog');
$this->config->disable_row_actions = true;
$this->config->datatable_js_type = 'VisitorLog';
$this->config->enable_sort = false;
$this->config->show_search = false;
$this->config->show_exclude_low_population = false;
$this->config->show_offset_information = false;
$this->config->show_all_views_icons = false;
$this->config->show_table_all_columns = false;
$this->config->show_export_as_rss_feed = false;
$this->config->disable_all_rows_filter_limit = true;
$this->config->documentation = Piwik::translate('Live_VisitorLogDocumentation', array('<br />', '<br />'));
if (!is_array($this->config->custom_parameters)) {
$this->config->custom_parameters = array();
}
// ensure to show next link if there are enough rows for a next page
if ($this->dataTable->getRowsCount() > $this->requestConfig->filter_limit) {
$this->dataTable->deleteRowsOffset($this->requestConfig->filter_limit);
$this->config->custom_parameters['totalRows'] = 10000000;
}
$this->config->custom_parameters['smallWidth'] = (1 == Common::getRequestVar('small', 0, 'int'));
$this->config->custom_parameters['hideProfileLink'] = (1 == Common::getRequestVar('hideProfileLink', 0, 'int'));
$this->config->custom_parameters['pageUrlNotDefined'] = Piwik::translate('General_NotDefined', Piwik::translate('Actions_ColumnPageURL'));
$this->config->footer_icons = array(
array(
'class' => 'tableAllColumnsSwitch',
'buttons' => array(
array(
'id' => static::ID,
'title' => Piwik::translate('Live_LinkVisitorLog'),
'icon' => 'plugins/Morpheus/images/table.png'
)
)
)
);
$enableAddNewSegment = Common::getRequestVar('enableAddNewSegment', false);
if ($enableAddNewSegment) {
$this->config->datatable_actions[] = [
'id' => 'addSegmentToMatomo',
'title' => Piwik::translate('SegmentEditor_AddThisToMatomo'),
'icon' => 'icon-segment',
];
}
}
public static function canDisplayViewDataTable(ViewDataTable $view)
{
return ($view->requestConfig->getApiModuleToRequest() === 'Live');
}
}

View File

@ -0,0 +1,39 @@
<?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\Live\Visualizations\VisitorLog;
use Piwik\ViewDataTable\Config as VisualizationConfig;
/**
* DataTable Visualization that derives from HtmlTable and sets show_extra_columns to true.
*/
class Config extends VisualizationConfig
{
/**
* Controls whether any DataTable Row Action icons are shown. If true, no icons are shown.
*
* Default value: false
*/
public $disable_row_actions = false;
public function __construct()
{
parent::__construct();
$this->addPropertiesThatShouldBeAvailableClientSide(array(
'disable_row_actions',
));
$this->addPropertiesThatCanBeOverwrittenByQueryParams(array(
'disable_row_actions',
));
}
}

View File

@ -0,0 +1,33 @@
<?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\Live\Widgets;
use Piwik\Piwik;
use Piwik\Widget\WidgetConfig;
class GetVisitorProfilePopup extends \Piwik\Widget\Widget
{
public static function configure(WidgetConfig $config)
{
$config->setCategoryId('General_Visitors');
$config->setName('Live_VisitorProfile');
$config->setOrder(25);
if (Piwik::isUserIsAnonymous()) {
$config->disable();
}
}
public function render()
{
}
}

View File

@ -0,0 +1,23 @@
<?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\Live\Widgets;
use Piwik\Widget\WidgetConfig;
class Widget extends \Piwik\Widget\Widget
{
public static function configure(WidgetConfig $config)
{
$config->setCategoryId('General_Visitors');
$config->setSubcategoryId('General_RealTime');
$config->setName('Live_VisitorsInRealTime');
$config->setIsWide();
$config->setOrder(20);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 681 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

View File

@ -0,0 +1,142 @@
var SegmentedVisitorLog = function() {
function getDataTableFromApiMethod(apiMethod)
{
var div = $(require('piwik/UI').DataTable.getDataTableByReport(apiMethod));
if (div.length && div.data('uiControlObject')) {
return div.data('uiControlObject');
}
}
function getLabelFromTr ($tr, apiMethod) {
var label;
if (apiMethod && 0 === apiMethod.indexOf('Actions.')) {
// for now only use this for Actions... I know a hack :( Otherwise in Search Engines
// it would show "http://www.searchenginename.org" instead of "SearchEngineName"
label = $tr.attr('data-url-label');
}
if (!label) {
label = $tr.find('.label .value').text();
}
if (label) {
label = $.trim(label);
}
return label;
}
function getDimensionFromApiMethod(apiMethod)
{
if (!apiMethod) {
return;
}
var dataTable = getDataTableFromApiMethod(apiMethod);
var metadata = getMetadataFromDataTable(dataTable);
if (metadata && metadata.dimension) {
return metadata.dimension;
}
}
function getMetadataFromDataTable(dataTable)
{
if (dataTable) {
return dataTable.getReportMetadata();
}
}
function findTitleOfRowHavingRawSegmentValue(apiMethod, rawSegmentValue)
{
var $tr = $('[data-report="' + apiMethod + '"] tr[data-segment-filter="' + rawSegmentValue + '"]').first();
return getLabelFromTr($tr, apiMethod);
}
function setPopoverTitle(apiMethod, segment, index) {
var dataTable = getDataTableFromApiMethod(apiMethod);
if (!dataTable) {
if (index < 15) {
// this is needed when the popover is opened before the dataTable is there which can often
// happen when opening the popover directly via URL (broadcast.popoverHandler)
setTimeout(function () {
setPopoverTitle(apiMethod, segment, index + 1);
}, 150);
}
return;
}
var segmentName = getDimensionFromApiMethod(apiMethod);
var segmentValue = findTitleOfRowHavingRawSegmentValue(apiMethod, segment);
if (!segmentName || (segment && segment.indexOf(';') > 0)) {
segmentName = _pk_translate('General_Segment');
var segmentParts = segment.split(';');
segmentValue = segmentParts.join(' ' + _pk_translate('General_And') + ' ');
}
segmentName = piwikHelper.escape(segmentName);
segmentName = piwikHelper.htmlEntities(segmentName);
segmentValue = piwikHelper.escape(segmentValue);
segmentValue = piwikHelper.htmlEntities(segmentValue);
segmentName = segmentName.replace(/(&amp;)(#[0-9]{2,5};)/g, '&$2');
segmentValue = segmentValue.replace(/(&amp;)(#[0-9]{2,5};)/g, '&$2');
var title = _pk_translate('Live_SegmentedVisitorLogTitle', [segmentName, segmentValue]);
Piwik_Popover.setTitle(title);
}
function show(apiMethod, segment, extraParams) {
// open the popover
var box = Piwik_Popover.showLoading('Segmented Visit Log');
box.addClass('segmentedVisitorLogPopover');
var callback = function (html) {
Piwik_Popover.setContent(html);
// remove title returned from the server
var title = box.find('h2[piwik-enriched-headline]');
var defaultTitle = title.text();
if (title.length) {
title.remove();
}
Piwik_Popover.setTitle(defaultTitle);
setPopoverTitle(apiMethod, segment, 0);
};
// prepare loading the popover contents
var requestParams = {
module: 'Live',
action: 'indexVisitorLog',
segment: encodeURIComponent(segment),
disableLink: 1,
small: 1,
enableAddNewSegment: 1,
};
$.extend(requestParams, extraParams);
var ajaxRequest = new ajaxHelper();
ajaxRequest.addParams(requestParams, 'get');
ajaxRequest.setCallback(callback);
ajaxRequest.setFormat('html');
ajaxRequest.send();
}
return {
show: show
}
}();

View File

@ -0,0 +1,361 @@
/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
/**
* jQueryUI widget for Live visitors widget
*/
(function ($) {
$.widget('piwik.liveWidget', {
/**
* Default settings for widgetPreview
*/
options:{
// Maximum numbers of rows to display in widget
maxRows: 10,
// minimal time in microseconds to wait between updates
interval: 3000,
// maximum time to wait between requests
maxInterval: 300000,
// url params to use for data request
dataUrlParams: null,
// callback triggered on a successful update (content of widget changed)
onUpdate: null,
// speed for fade animation
fadeInSpeed: 'slow'
},
/**
* current updateInterval used
*/
currentInterval: null,
/**
* identifies if content has updated (eg new visits/views)
*/
updated: false,
/**
* window timeout interval
*/
updateInterval: null,
/**
* identifies if the liveWidget ist started or not
*/
isStarted: true,
/**
* Update the widget
*
* @return void
*/
_update: function () {
this.updated = false;
var that = this;
var ajaxRequest = new ajaxHelper();
ajaxRequest.addParams(this.options.dataUrlParams, 'GET');
ajaxRequest.setFormat('html');
ajaxRequest.setCallback(function (r) {
if (that.options.replaceContent) {
$(that.element).html(r);
if (that.options.fadeInSpeed) {
$(that.element).effect("highlight", {}, that.options.fadeInSpeed);
}
} else {
that._parseResponse(r);
}
// add default interval to last interval if not updated or reset to default if so
if (!that.updated) {
that.currentInterval += that.options.interval;
} else {
that.currentInterval = that.options.interval;
if (that.options.onUpdate) that.options.onUpdate();
}
// check new interval doesn't reach the defined maximum
if (that.options.maxInterval < that.currentInterval) {
that.currentInterval = that.options.maxInterval;
}
if (that.isStarted) {
window.clearTimeout(that.updateInterval);
if (that.element.length && $.contains(document, that.element[0])) {
that.updateInterval = window.setTimeout(function() { that._update() }, that.currentInterval);
}
}
});
ajaxRequest.send();
},
/**
* Parses the given response and updates the widget if newer content is available
*
* @return void
*/
_parseResponse: function (data) {
if (!data || !data.length) {
this.updated = false;
return;
}
var items = $('li.visit', $(data));
for (var i = items.length; i--;) {
this._parseItem(items[i]);
}
this._initTooltips();
},
/**
* Initializes the icon tooltips
*/
_initTooltips: function() {
$('li.visit').tooltip({
items: '.visitorLogIconWithDetails',
track: true,
show: false,
hide: false,
content: function() {
return $('<ul>').html($('ul', $(this)).html());
},
tooltipClass: 'small'
});
},
/**
* Parses the given item and updates or adds an entry to the list
*
* @param item to parse
* @return void
*/
_parseItem: function (item) {
var visitId = $(item).attr('id');
if ($('#' + visitId, this.element).length) {
if ($('#' + visitId, this.element).html() != $(item).html()) {
this.updated = true;
}
$('#' + visitId, this.element).remove();
$(this.element).prepend(item);
} else {
this.updated = true;
$(item).hide();
$(this.element).prepend(item);
$(item).fadeIn(this.options.fadeInSpeed);
}
// remove rows if there are more than the maximum
$('li.visit:gt(' + (this.options.maxRows - 1) + ')', this.element).remove();
},
/**
* Constructor
*
* @return void
*/
_create: function () {
if (!this.options.dataUrlParams) {
console && console.error('liveWidget error: dataUrlParams needs to be defined in settings.');
return;
}
this.currentInterval = this.options.interval;
var self = this;
window.setTimeout(function() { self._initTooltips(); }, 250);
this.updateInterval = window.setTimeout(function() { self._update(); }, this.currentInterval);
},
/**
* Stops requests if widget is destroyed
*/
_destroy: function () {
this.stop();
},
/**
* Triggers an update for the widget
*
* @return void
*/
update: function () {
this._update();
},
/**
* Starts the automatic update cycle
*
* @return void
*/
start: function () {
this.isStarted = true;
this.currentInterval = 0;
this._update();
},
/**
* Stops the automatic update cycle
*
* @return void
*/
stop: function () {
this.isStarted = false;
window.clearTimeout(this.updateInterval);
},
/**
* Return true in case widget is started.
* @returns {boolean}
*/
started: function() {
return this.isStarted;
},
/**
* Set the interval for refresh
*
* @param {int} interval new interval for refresh
* @return void
*/
setInterval: function (interval) {
this.currentInterval = interval;
}
});
})(jQuery);
$(function() {
var refreshWidget = function (element, refreshAfterXSecs) {
// if the widget has been removed from the DOM, abort
if (!element.length || !$.contains(document, element[0])) {
return;
}
function scheduleAnotherRequest()
{
setTimeout(function () { refreshWidget(element, refreshAfterXSecs); }, refreshAfterXSecs * 1000);
}
if (Visibility.hidden()) {
scheduleAnotherRequest();
return;
}
var lastMinutes = $(element).attr('data-last-minutes') || 3,
translations = JSON.parse($(element).attr('data-translations'));
var ajaxRequest = new ajaxHelper();
ajaxRequest.addParams({
module: 'API',
method: 'Live.getCounters',
format: 'json',
lastMinutes: lastMinutes
}, 'get');
ajaxRequest.setFormat('json');
ajaxRequest.setCallback(function (data) {
data = data[0];
// set text and tooltip of visitors count metric
var visitors = data['visitors'];
if (visitors == 1) {
var visitorsCountMessage = translations['one_visitor'];
}
else {
var visitorsCountMessage = sprintf(translations['visitors'], visitors);
}
$('.simple-realtime-visitor-counter', element)
.attr('title', visitorsCountMessage)
.find('div').text(visitors);
// set text of individual metrics spans
var metrics = $('.simple-realtime-metric', element);
var visitsText = data['visits'] == 1
? translations['one_visit'] : sprintf(translations['visits'], data['visits']);
$(metrics[0]).text(visitsText);
var actionsText = data['actions'] == 1
? translations['one_action'] : sprintf(translations['actions'], data['actions']);
$(metrics[1]).text(actionsText);
var lastMinutesText = lastMinutes == 1
? translations['one_minute'] : sprintf(translations['minutes'], lastMinutes);
$(metrics[2]).text(lastMinutesText);
scheduleAnotherRequest();
});
ajaxRequest.send();
};
var exports = require("piwik/Live");
exports.initSimpleRealtimeVisitorWidget = function () {
$('.simple-realtime-visitor-widget').each(function() {
var $this = $(this),
refreshAfterXSecs = $this.attr('data-refreshAfterXSecs');
if ($this.attr('data-inited')) {
return;
}
$this.attr('data-inited', 1);
setTimeout(function() { refreshWidget($this, refreshAfterXSecs ); }, refreshAfterXSecs * 1000);
});
};
});
function onClickPause() {
$('#pauseImage').hide();
$('#playImage').show();
return $('#visitsLive').liveWidget('stop');
}
function onClickPlay() {
$('#playImage').hide();
$('#pauseImage').show();
return $('#visitsLive').liveWidget('start');
}
(function () {
if (!Visibility.isSupported()) {
return;
}
var isStoppedByBlur = false;
function isStarted()
{
return $('#visitsLive').liveWidget('started');
}
function onTabBlur() {
if (isStarted()) {
isStoppedByBlur = true;
onClickPause();
}
}
function onTabFocus() {
if (isStoppedByBlur && !isStarted()) {
isStoppedByBlur = false;
onClickPlay();
}
}
Visibility.change(function (event, state) {
if (Visibility.hidden()) {
onTabBlur();
} else {
onTabFocus();
}
});
})();

View File

@ -0,0 +1,185 @@
/*!
* 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 () {
var actionName = 'SegmentVisitorLog';
function getRawSegmentValueFromRow(tr)
{
return $(tr).attr('data-segment-filter');
}
function getDataTableFromApiMethod(apiMethod)
{
var div = $(require('piwik/UI').DataTable.getDataTableByReport(apiMethod));
if (div.length && div.data('uiControlObject')) {
return div.data('uiControlObject');
}
}
function getMetadataFromDataTable(dataTable)
{
if (dataTable) {
return dataTable.getReportMetadata();
}
}
function getDimensionFromApiMethod(apiMethod)
{
if (!apiMethod) {
return;
}
var dataTable = getDataTableFromApiMethod(apiMethod);
var metadata = getMetadataFromDataTable(dataTable);
if (metadata && metadata.dimension) {
return metadata.dimension;
}
}
function DataTable_RowActions_SegmentVisitorLog(dataTable) {
this.dataTable = dataTable;
this.actionName = actionName;
// has to be overridden in subclasses
this.trEventName = 'piwikTriggerSegmentVisitorLogAction';
}
DataTable_RowActions_SegmentVisitorLog.prototype = new DataTable_RowAction();
DataTable_RowActions_SegmentVisitorLog.prototype.openPopover = function (apiMethod, segment, extraParams) {
var urlParam = apiMethod + ':' + encodeURIComponent(segment) + ':' + encodeURIComponent(JSON.stringify(extraParams));
broadcast.propagateNewPopoverParameter('RowAction', actionName + ':' + urlParam);
};
DataTable_RowActions_SegmentVisitorLog.prototype.trigger = function (tr, e, subTableLabel) {
var segment = getRawSegmentValueFromRow(tr);
if (this.dataTable.param.segment) {
segment = decodeURIComponent(this.dataTable.param.segment) + ';' + segment;
}
if (this.dataTable.props.segmented_visitor_log_segment_suffix) {
segment = segment + ';' + this.dataTable.props.segmented_visitor_log_segment_suffix;
}
this.performAction(segment, tr, e);
};
DataTable_RowActions_SegmentVisitorLog.prototype.performAction = function (segment, tr, e) {
var apiMethod = this.dataTable.param.module + '.' + this.dataTable.param.action;
var extraParams = {};
if (this.dataTable.param.date && this.dataTable.param.period) {
extraParams = {date: this.dataTable.param.date, period: this.dataTable.param.period};
}
$.each(this.dataTable.param, function (index, value) {
// we automatically add fields like idDimension, idGoal etc.
if (index !== 'idSite' && index.indexOf('id') === 0 && $.isNumeric(value)) {
extraParams[index] = value;
}
});
this.openPopover(apiMethod, segment, extraParams);
};
DataTable_RowActions_SegmentVisitorLog.prototype.doOpenPopover = function (urlParam) {
var urlParamParts = urlParam.split(':');
var apiMethod = urlParamParts.shift();
var segment = decodeURIComponent(urlParamParts.shift());
var extraParamsString = urlParamParts.shift(),
extraParams = {}; // 0/1 or "0"/"1"
try {
extraParams = JSON.parse(decodeURIComponent(extraParamsString));
} catch (e) {
// assume the parameter is an int/string describing whether to use multi row evolution
}
SegmentedVisitorLog.show(apiMethod, segment, extraParams);
};
DataTable_RowActions_Registry.register({
name: actionName,
dataTableIcon: 'icon-segmented-visits-log',
order: 30,
dataTableIconTooltip: [
_pk_translate('Live_RowActionTooltipTitle'),
_pk_translate('Live_RowActionTooltipDefault')
],
isAvailableOnReport: function (dataTableParams, undefined) {
return true;
},
isAvailableOnRow: function (dataTableParams, tr) {
var value = getRawSegmentValueFromRow(tr)
if ('undefined' === (typeof value)) {
return false;
}
var reportTitle = null;
var apiMethod = $(tr).parents('div.dataTable').last().attr('data-report');
var dimension = getDimensionFromApiMethod(apiMethod);
if (dimension) {
reportTitle = _pk_translate('Live_RowActionTooltipWithDimension', [dimension])
} else {
reportTitle = _pk_translate('Live_RowActionTooltipDefault');
}
this.dataTableIconTooltip[1] = reportTitle;
return true;
},
createInstance: function (dataTable, param) {
if (dataTable !== null && typeof dataTable.segmentVisitorLogInstance != 'undefined') {
return dataTable.segmentVisitorLogInstance;
}
if (dataTable === null && param) {
// when segmented visitor log is triggered from the url (not a click on the data table)
// we look for the data table instance in the dom
var report = param.split(':')[0];
var tempTable = getDataTableFromApiMethod(report);
if (tempTable) {
dataTable = tempTable;
if (typeof dataTable.segmentVisitorLogInstance != 'undefined') {
return dataTable.segmentVisitorLogInstance;
}
}
}
var instance = new DataTable_RowActions_SegmentVisitorLog(dataTable);
if (dataTable !== null) {
dataTable.segmentVisitorLogInstance = instance;
}
return instance;
}
});
})();

View File

@ -0,0 +1,92 @@
/**
* Piwik - free/libre analytics platform
*
* Actions list in Visitor Log and Profile
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
function initializeVisitorActions(elem) {
var tooltipIsOpened = false;
$('a', elem).on('focus', function () {
// see https://github.com/piwik/piwik/issues/4099
if (tooltipIsOpened) {
elem.tooltip('close');
}
});
elem.tooltip({
items: '[title],.visitorLogIconWithDetails',
track: true,
show: false,
hide: false,
content: function() {
if ($(this).hasClass('visitorLogIconWithDetails')) {
return $('<ul>').html($('ul', $(this)).html());
}
var title = $(this).attr('title');
return $('<a>').text( title ).html().replace(/\n/g, '<br />');
},
tooltipClass: 'small',
open: function() { tooltipIsOpened = true; },
close: function() { tooltipIsOpened = false; }
});
// show refresh icon for duplicate page views in a row
$("ol.visitorLog", elem).each(function () {
var prevelement;
var prevhtml;
var counter = 0, duplicateCounter = 0;
$(this).find("> li").each(function () {
counter++;
$(this).val(counter);
var current = $(this).html();
if (current == prevhtml) {
duplicateCounter++;
$(this).find('>div').prepend($("<span>"+(duplicateCounter+1)+"</span>").attr({'class': 'repeat icon-refresh', 'title': _pk_translate('Live_PageRefreshed')}));
prevelement.addClass('duplicate');
} else {
duplicateCounter = 0;
}
prevhtml = current;
prevelement = $(this);
var $this = $(this);
var tooltipIsOpened = false;
$('a', $this).on('focus', function () {
// see https://github.com/piwik/piwik/issues/4099
if (tooltipIsOpened) {
$this.tooltip('close');
}
});
});
});
$("ol.visitorLog > li:not(.duplicate)", elem).each(function(){
if (!$('.icon-refresh', $(this)).length) {
return;
}
$(this).attr('origtitle', $(this).attr('title'));
$(this).attr('title', _pk_translate('Live_ClickToViewAllActions'));
$(this).click(function(e){
e.preventDefault();
$(this).prevUntil('li:not(.duplicate)').removeClass('duplicate').find('.icon-refresh').hide();
var elem = $(this);
window.setTimeout(function() {
elem.attr('title', elem.attr('origtitle'));
elem.attr('origtitle', null);
}, 150);
$(this).off('click').find('.icon-refresh').hide();
return false;
});
});
}

View File

@ -0,0 +1,75 @@
/**
* Piwik - free/libre analytics platform
*
* Visitor profile popup control.
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
(function ($, require) {
var exports = require('piwik/UI'),
DataTable = exports.DataTable,
dataTablePrototype = DataTable.prototype;
/**
* DataTable UI class for jqPlot graph datatable visualizations.
*
* @constructor
*/
exports.VisitorLog = function (element) {
DataTable.call(this, element);
};
$.extend(exports.VisitorLog.prototype, dataTablePrototype, {
handleColumnHighlighting: function () {
},
setFixWidthToMakeEllipsisWork: function () {
},
/**
* Initializes this class.
*/
init: function () {
dataTablePrototype.init.call(this);
var self = this;
initializeVisitorActions(this.$element);
// launch visitor profile on visitor profile link click
this.$element.on('click', '.visitor-log-visitor-profile-link', function (e) {
e.preventDefault();
broadcast.propagateNewPopoverParameter('visitorProfile', $(this).attr('data-visitor-id'));
return false;
});
this.$element.on('click', '.addSegmentToMatomo.dataTableAction', function (e) {
e.preventDefault();
e.stopPropagation();
var url = window.location.href;
url = broadcast.updateParamValue('addSegmentAsNew=' + decodeURIComponent(self.param.segment), url);
url = broadcast.updateParamValue('segment=', url);
url = broadcast.updateParamValue('popover=', url);
window.open(url, "_blank");
});
},
_destroy: function () {
try {
this.$element.tooltip('destroy');
} catch (e) {
// ignore
}
dataTablePrototype._destroy.call(this);
}
});
})(jQuery, require);

View File

@ -0,0 +1,266 @@
/**
* Piwik - free/libre analytics platform
*
* Visitor profile popup control.
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
(function ($, require) {
var piwik = require('piwik'),
exports = require('piwik/UI'),
UIControl = exports.UIControl;
/**
* Sets up and handles events for the visitor profile popup.
*
* @param {Element} element The HTML element returned by the Live.getVisitorLog controller
* action. Should have the CSS class 'visitor-profile'.
* @constructor
*/
var VisitorProfileControl = function (element) {
UIControl.call(this, element);
this._setupControl();
this._bindEventCallbacks();
};
/**
* Initializes all elements w/ the .visitor-profile CSS class as visitor profile popups,
* if the element has not already been initialized.
*/
VisitorProfileControl.initElements = function () {
UIControl.initElements(this, '.visitor-profile');
};
/**
* Shows the visitor profile popover for a visitor ID. This should not be called directly.
* Instead broadcast.propagateNewPopoverParameter('visitorProfile', visitorId) should be
* called. This would make sure the popover would be opened if the URL is copied and pasted
* in a new tab/window.
*
* @param {String} visitorId The string visitor ID.
*/
VisitorProfileControl.showPopover = function (visitorId, idSite) {
var url = 'module=Live&action=getVisitorProfilePopup&visitorId=' + encodeURIComponent(visitorId);
if (idSite) {
url += '&idSite=' + idSite;
}
// if there is already a map shown on the screen, do not show the map in the popup. kartograph seems
// to only support showing one map at a time.
if ($('.RealTimeMap').length > 0) {
url += '&showMap=0';
}
var ajaxRequest = new ajaxHelper();
ajaxRequest.removeDefaultParameter('segment');
Piwik_Popover.createPopupAndLoadUrl(url, _pk_translate('Live_VisitorProfile'), 'visitor-profile-popup', ajaxRequest);
};
$.extend(VisitorProfileControl.prototype, UIControl.prototype, {
_setupControl: function () {
// focus the popup so it will accept key events
this.$element.focus();
},
_bindEventCallbacks: function () {
var self = this,
$element = this.$element;
$element.on('click', '.visitor-profile-close', function (e) {
e.preventDefault();
try {
$element.tooltip('destroy');
} catch (e) {}
broadcast.propagateNewPopoverParameter(false);
return false;
});
$element.on('click', '.visitor-profile-toggle-actions', function (e) {
e.preventDefault();
$(this).toggleClass('minimized');
if ($(this).hasClass('minimized')) {
$('.visitor-profile-actions', $element).slideUp();
} else {
$('.visitor-profile-actions', $element).slideDown();
}
return false;
});
$element.on('click', '.visitor-profile-more-info>a', function (e) {
e.preventDefault();
self._loadMoreVisits();
return false;
});
$element.on('click', '.visitor-profile-visit-title', function () {
$('.visitor-profile-visit-details-extended', $(this).parents('li')).slideToggle();
});
$element.on('click', '.visitor-profile-show-actions', function () {
$('.visitor-profile-actions', $(this).parents('li')).slideToggle();
return false;
});
$element.on('click', '.visitor-profile-prev-visitor', function (e) {
e.preventDefault();
self._loadPreviousVisitor();
return false;
});
$element.on('click', '.visitor-profile-next-visitor', function (e) {
e.preventDefault();
self._loadNextVisitor();
return false;
});
$element.on('keydown', function (e) {
if (e.which == 37 && !e.altKey) { // on <- key press, load previous visitor
self._loadPreviousVisitor();
} else if (e.which == 39 && !e.altKey) { // on -> key press, load next visitor
self._loadNextVisitor();
}
});
$element.on('click', '.visitor-profile-show-map', function (e) {
e.preventDefault();
self.toggleMap();
return false;
});
// append token_auth dynamically to export link
$element.on('mousedown', '.visitor-profile-export', function (e) {
var url = $(this).attr('href');
if (url.indexOf('&token_auth=') == -1) {
$(this).attr('href', url + '&token_auth=' + piwik.token_auth);
}
});
initializeVisitorActions($element);
},
toggleMap: function () {
var $element = this.$element,
$map = $('.visitor-profile-map', $element);
if (!$map.children().length) { // if the map hasn't been loaded, load it
this._loadMap($map);
return;
}
if ($map.is(':hidden')) { // show the map if it is hidden
if ($map.height() < 1) {
$map.resize();
}
$map.slideDown('slow');
var newLabel = 'Live_HideMap';
piwikHelper.lazyScrollTo($('.visitor-profile-location', $element)[0], 400);
} else { // hide the map if it is shown
$map.slideUp('slow');
var newLabel = 'Live_ShowMap';
}
newLabel = _pk_translate(newLabel).replace(' ', '\xA0');
$('.visitor-profile-show-map', $element).text('(' + newLabel + ')');
},
_loadMap: function ($map) {
var self = this;
var ajax = new ajaxHelper();
ajax.setUrl($map.attr('data-href'));
ajax.setCallback(function (response) {
$map.html(response);
self.toggleMap();
});
ajax.setFormat('html');
ajax.setLoadingElement($('.visitor-profile-location > p > .loadingPiwik', self.$element));
ajax.send();
},
_loadMoreVisits: function () {
var self = this,
$element = this.$element;
var loading = $('.visitor-profile-more-info > .loadingPiwik', $element);
loading.show();
var ajax = new ajaxHelper();
ajax.removeDefaultParameter('segment');
ajax.addParams({
module: 'Live',
action: 'getVisitList',
period: '',
date: '',
visitorId: $element.attr('data-visitor-id'),
filter_offset: $('.visitor-profile-visits>li', $element).length,
start_number: $('.visitor-profile-visits>li:last', $element).data('number') - 1
}, 'GET');
ajax.setCallback(function (response) {
if (response == "") { // no more visits left
self._showNoMoreVisitsSpan();
} else {
response = $(response);
loading.hide();
$('.visitor-profile-visits', $element).append(response);
if (response.filter('li').length < 10) {
self._showNoMoreVisitsSpan();
}
piwikHelper.lazyScrollTo($(response)[0], 400, true);
}
});
ajax.setFormat('html');
ajax.send();
},
_showNoMoreVisitsSpan: function () {
var noMoreSpan = $('<span/>').text(_pk_translate('Live_NoMoreVisits')).addClass('visitor-profile-no-visits');
$('.visitor-profile-more-info', this.$element).html(noMoreSpan);
},
_loadPreviousVisitor: function () {
this._gotoAdjacentVisitor(this.$element.attr('data-prev-visitor'));
},
_loadNextVisitor: function () {
this._gotoAdjacentVisitor(this.$element.attr('data-next-visitor'));
},
_gotoAdjacentVisitor: function (idVisitor) {
if (!idVisitor) {
return;
}
if (this._inPopover()) {
broadcast.propagateNewPopoverParameter('visitorProfile', idVisitor);
} else if (this._inWidget()) {
this.$element.closest('[widgetid]').dashboardWidget('reload', false, true, {visitorId: idVisitor});
}
},
_getFirstVisitId: function () {
return $('.visitor-profile-visits>li:first-child>h2', this.$element).attr('data-idvisit');
},
_inPopover: function () {
return !! this.$element.closest('#Piwik_Popover').length;
},
_inWidget: function () {
return !! this.$element.closest('.widget').length;
}
});
exports.VisitorProfileControl = VisitorProfileControl;
// add the popup handler that creates a visitor profile
broadcast.addPopoverHandler('visitorProfile', VisitorProfileControl.showPopover);
})(jQuery, require);

View File

@ -0,0 +1,9 @@
{
"Live": {
"GoalType": "النوع",
"KeywordRankedOnSearchResultForThisVisitor": "الكلمة الدلالية %1$s كان ترتيبها %2$s في %3$s في صفحة نتائج البحث لهذا الزائر.",
"LastHours": "آخر %s ساعة",
"LastMinutes": "آخر %s دقيقة",
"Referrer_URL": "جاء من"
}
}

View File

@ -0,0 +1,10 @@
{
"Live": {
"GoalType": "Тып",
"KeywordRankedOnSearchResultForThisVisitor": "Ключавое слова %1$s заняла %2$s на %3$s старонцы вынікаў пошуку для гэтага наведвальніка",
"LastHours": "Апошніх %s гадзін",
"LastMinutes": "Апошніх %s хвілін",
"Referrer_URL": "URL спасыльніка",
"VisitorLogDocumentation": "Гэтая табліца паказвае апошнія наведванні ў межах выбранага дыяпазону дат. %1$s Калі дыяпазон дат ўключае ў сябе сёння, то вы можаце ўбачыць вашых наведвальнікаў у рэжыме рэальнага часу! %2$s Дадзеныя, якія адлюстроўваюцца тут заўсёды \"жывыя\", незалежна ад таго, і як часта вы карыстаецеся cron архіваваннем."
}
}

View File

@ -0,0 +1,31 @@
{
"Live": {
"AveragePageGenerationTime": "Всяка страница отнема средно по %1$s, за да бъде заредена от този посетител.",
"ClickToViewMoreAboutVisit": "Щракнете, за да видите повече информация за това посещение",
"ConvertedNGoals": "Конвертирани %s цели",
"FirstVisit": "Първо посещение",
"GoalType": "Тип",
"HideMap": "скриване на картата",
"LastHours": "Последните %s часа",
"LastMinutes": "Последните %s минути",
"LastVisit": "Последно посещение",
"LoadMoreVisits": "Зареждане на повече посещения",
"MorePagesNotDisplayed": "повечето страници от този посетител не се показват",
"NbVisitor": "1 посетител",
"NbVisitors": "%s посетители",
"NextVisitor": "Следващ посетител",
"NoMoreVisits": "Няма повече посещения за този посетител.",
"PageRefreshed": "Броят пъти, които тази страница е гледана \/ обновена в ред.",
"PreviousVisitor": "Предишен посетител",
"RealTimeVisitorCount": "Броене на посетителите в реално време",
"Referrer_URL": "URL Референции",
"ShowMap": "покажи картата",
"SimpleRealTimeWidget_Message": "%1$s и %2$s в последното %3$s",
"ViewVisitorProfile": "Преглед профила на посетителя",
"VisitedPages": "Посетени страници",
"VisitorLogDocumentation": "Тази таблица показва последните посещения, включени в избраният обхват от време. Можете да видите кога се е случило последното посещение на посетител, като посочите върху датата на посещението. %1$s Ако обхвата на датата включва днешния ден, можете да видите вашите посетители в реално време! %2$s Информацията тук винаги е в реално време, независимо дали и колко често използвате инструментите за архивиране.",
"VisitorProfile": "Профил на посетителя",
"VisitorsLastVisit": "Последното посещение от този посетител беше от преди %s дни.",
"VisitsFrom": "%1$s%2$s посещения%3$s от"
}
}

View File

@ -0,0 +1,13 @@
{
"Live": {
"GoalType": "Tipus",
"KeywordRankedOnSearchResultForThisVisitor": "La paraula clau %1$s està a la posició %2$s del ranking de %3$s resultats de cerca per aquest visitant.",
"LastHours": "Últimes %s hores",
"LastMinutes": "Últims %s minuts",
"MorePagesNotDisplayed": "No es mostre més pàgines per aquest visitant",
"PageRefreshed": "Nombre de vegades que s'ha vist\/refrescat una pàgina",
"Referrer_URL": "URL del referent",
"VisitorLogDocumentation": "Aquesta taula mostra les últimes visites pel període de temps seleccionat. Podeu veure quan s'ha produït l'últim accès d'un visitant pasant per damunt de la data de visita. %1$s Si el període de temps inclou avui, podeu veure els visitants en temps real! %2$s La informació que es mostra és sempre en directa, sense dependre de cada quan executeu el treball programat d'arxivat.",
"VisitorsLastVisit": "L'ultima visita d'aquest visitant va ser fa %s dies."
}
}

View File

@ -0,0 +1,43 @@
{
"Live": {
"AveragePageGenerationTime": "Pro tohoto návštěvníka se každá stránka načetla v průměru za %1$s.",
"CalculatedOverNPageViews": "Vypočítáno na základě %1$s posledních zobrazení stránek tohoto návštěvníka.",
"ClickToViewMoreAboutVisit": "Klikněte pro zobrazení více informací o této návštěvě",
"ClickToViewAllActions": "Kliknutím zobrazíte podrobně všechny akce této skupiny",
"ConvertedNGoals": "Proměněno %s cílů",
"FirstVisit": "První návštěva",
"GoalType": "Typ",
"HideMap": "skrýt mapu",
"KeywordRankedOnSearchResultForThisVisitor": "Klíčové slovo %1$s ohodnoceno %2$s na %3$s stránce výsledků vyhledávání pro tohoto návštěvníka",
"LastHours": "Posledních %s hodin",
"LastMinutes": "Posledních %s minut",
"LastVisit": "Poslední návštěva",
"LoadMoreVisits": "Načíst více návštěv",
"MorePagesNotDisplayed": "další stránky tohoto návštěvníka nejsou zobrazeny",
"NbVisitor": "1 návštěvník",
"NbVisitors": "%s návštěvníků",
"NextVisitor": "Další návštěvník",
"NoMoreVisits": "Pro tohoto návštěvníka už nejsou k dispozici další návštěvy.",
"PageRefreshed": "Počet po sobě jdoucích zobrazení\/obnovení stránky",
"PluginDescription": "Poskytuje živý záznam návštěvníků a ve widgetu na nástěnce vám umožňuje ho sledovat živě v reálném čase. Zásuvný modul také umožňuje zobrazit profil pro každého návštěvníka.",
"PreviousVisitor": "Předchozí návštěvník",
"RealTimeVisitorCount": "Počet návštěvníků v reálném čase",
"Referrer_URL": "Odkazující URL",
"ShowMap": "Zobrazit mapu",
"ActionsAndDuration": "%1$s akcí v %2$s",
"SimpleRealTimeWidget_Message": "%1$s a %2$s v posledních %3$s.",
"ViewVisitorProfile": "Zobrazit profil návštěvníka",
"VisitedPages": "Navštívené stránky",
"RevisitedPages": "Stránky navštívené více než jednou",
"ToggleActions": "Přepnout viditelnost všech akcí",
"TopVisitedPages": "Nejnavštěvovanější stránky",
"VisitorLogDocumentation": "Tato tabulka zobrazuje poslední návštěvy v daném období. Najetím na datum návštěvy zobrazíte čas, kdy tento návštěvník navštívil stránky naposledy. %1$s Pokud období zahrnuje dnešek, můžete vidět návštěvníky v reálném čase! %2$s Zde zobrazovaná data jsou vždy živá bez ohledu na to, jak a kdy probíhá archivační cron úloha.",
"VisitorProfile": "Profil návštěvníka",
"VisitorsLastVisit": "K poslední návštěvě tohoto návštěvníka došlo před %s dny.",
"VisitsFrom": "%1$s%2$s návštěv%3$s z",
"VisitSummary": "Strávil celkem %1$s%2$s na stránkách%3$s, a zobrazil %4$s stránek%5$s při %6$s návštěvách%7$s.",
"VisitSummaryWithActionDetails": "Strávil celkem %1$s%2$s na stránkách%3$s, a provedl %4$s akcí%5$s (%6$s) při %7$s návštěvách%8$s.",
"OnClickPause": "%s běží. Klikněte pro pozastavení.",
"OnClickStart": "%s je zastaven. Klikněte pro spuštění."
}
}

View File

@ -0,0 +1,42 @@
{
"Live": {
"AveragePageGenerationTime": "Det tog gennemsnitligt %1$s at indlæse hver side for denne besøgende.",
"CalculatedOverNPageViews": "Beregnet på baggrund af denne besøgendes seneste %1$s sidevisninger.",
"ClickToViewMoreAboutVisit": "Klik for at se mere information om dette besøg",
"ConvertedNGoals": "Omregnet %s mål",
"FirstVisit": "Første besøg",
"GoalType": "Type",
"HideMap": "skjul kort",
"KeywordRankedOnSearchResultForThisVisitor": "Nøgleordet %1$s blev rangeret %2$s på %3$s side med søgeresultater for denne besøgende",
"LastHours": "Sidste %s timer",
"LastMinutes": "Sidste %s minutter",
"LastVisit": "Seneste besøg",
"LinkVisitorLog": "Vis detaljeret besøgslog",
"LoadMoreVisits": "Indlæs flere besøg",
"MorePagesNotDisplayed": "yderligere sider vises ikke for denne besøgende",
"NbVisitor": "1 besøgende",
"NbVisitors": "%s besøgende",
"NextVisitor": "Næste besøgende",
"NoMoreVisits": "Der er ikke flere besøg fra denne besøgende.",
"PageRefreshed": "Antal gange siden er blevet vist \/ opdateret i træk.",
"PreviousVisitor": "Forrige besøgende",
"RealTimeVisitorCount": "Tidstro besøgsantal",
"Referrer_URL": "Henvisning netadresse",
"ShowMap": "vis kort",
"ActionsAndDuration": "%1$s handlinger på %2$s",
"SimpleRealTimeWidget_Message": "%1$s og %2$s i den sidste %3$s.",
"ViewVisitorProfile": "Vis besøgendes profil",
"VisitedPages": "Besøgte sider",
"RevisitedPages": "Sider vist mere end én gang",
"VisitsLog": "Besøgslog",
"VisitorLog": "Besøgslog",
"VisitorLogDocumentation": "Tabelen viser de nyeste besøg inden for det valgte datointerval.%1$s Hvis datointervallet omfatter i dag, kan du se dine besøgende i virkelig tid! %2$s Data, der vises her er altid live, uanset hvor ofte arkiveringsjob kører.",
"VisitorProfile": "Besøgendes profil",
"VisitorsInRealTime": "Besøg i realtid",
"VisitorsLastVisit": "Besøgendes seneste besøg var for %s dage siden.",
"VisitsFrom": "%1$s%2$s besøg %3$s fra",
"VisitSummary": "Brugte i alt %1$s%2$s på hjemmesiden %3$s og besøgte %4$s sider%5$s på %6$s besøg%7$s.",
"VisitSummaryWithActionDetails": "Brugte i alt %1$s%2$s på hjemmesiden%3$s og udførte %4$s handlinger%5$s (%6$s) på %7$s besøg%8$s.",
"SegmentedVisitorLogTitle": "Besøgsloggen viser besøg, hvor %1$s er \"%2$s\""
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Jede Seite benötigte im Durchschnitt %1$s um bei diesem Besucher zu laden.",
"CalculatedOverNPageViews": "Berechnet mithilfe der letzten %1$s Seitenansichten dieses Besuchers.",
"ClickToViewMoreAboutVisit": "Klicken Sie um nähere Informationen zu diesem Besuch zu sehen",
"ClickToViewAllActions": "Klicken Sie um alle Aktionen dieser Gruppe im Detail zu sehen",
"ConvertedNGoals": "%s Ziele konvertiert",
"FirstVisit": "Erster Besuch",
"GoalType": "Typ",
"HideMap": "Karte ausblenden",
"KeywordRankedOnSearchResultForThisVisitor": "Der Begriff %1$s war für diesen Besucher auf Platz %2$s der Suchergebnisseite von %3$s",
"LastHours": "Letzte %s Stunden",
"LastMinutes": "Letzte %s Minuten",
"LastVisit": "Letzter Besuch",
"LinkVisitorLog": "Detailliertes Besucher-Log anzeigen",
"LoadMoreVisits": "Mehr Besuche laden",
"LimitedSummary": "Die Informationen in diesem Profil fasst die letzten %1$s Besuche zusammen. Dieser Benutzer hat im Gesamten mehr Besuche.",
"LimitedVisitsShown": "Nur die letzten %1$s Besuche werden angezeigt. Dieser Benutzer hat im Gesamten mehr Besuche.",
"MorePagesNotDisplayed": "weitere Seiten von diesem Besucher werden nicht angezeigt",
"NbVisitor": "1 Besucher",
"NbVisitors": "%s Besucher",
"NextVisitor": "Nächster Besucher",
"NoMoreVisits": "Für diesen Besucher sind keine weiteren Besuche vorhanden.",
"PageRefreshed": "Die Anzahl wie oft diese Seite hintereinander angeschaut\/aktualisiert worden ist.",
"PluginDescription": "Unterstützt den Live Besucher-Log und lässt Sie Ihre Besucher live im Echtzeit-Dashboard-Widget anzeigen. Das Plugin lässt Sie auch ein Besucherprofil für einen vorgegebenen Benutzer anzeigen.",
"PreviousVisitor": "Vorheriger Besucher",
"RealTimeVisitors": "Echtzeitbesuche",
"RealTimeVisitorCount": "Echtzeit-Besucherzähler",
"Referrer_URL": "Herkunftsseite",
"ShowMap": "Karte einblenden",
"ActionsAndDuration": "%1$s Aktionen in %2$s",
"SimpleRealTimeWidget_Message": "%1$s und %2$s in den letzten %3$s.",
"ViewVisitorProfile": "Besucherprofil ansehen",
"VisitedPages": "Besuchte Seiten",
"RevisitedPages": "Seiten die mehrmals angesehen wurden",
"ToggleActions": "Sichtbarkeit aller Aktionen umschalten",
"TopVisitedPages": "Meistbesuchte Seiten",
"VisitsLog": "Besucher-Log",
"VisitorLog": "Besucher-Log",
"VisitorLogDocumentation": "Diese Tabelle zeigt die letzten Besuche innerhalb der ausgewählten Periode. Sie können sehen, wann der Besucher die Seite zuletzt besucht hat, wenn Sie die Maus über das Datum eines Besuches bewegen. %1$s Wenn die gewählte Periode den heutigen Tag enthält, können Sie die Besuche in Echtzeit sehen! %2$s Die angezeigten Daten sind immer live, egal ob und in welchem Intervall Sie den Archivierungs-Cronjob verwenden.",
"VisitorLogNoDataMessagePurged": "Wahrscheinlich wurden die Daten bereinigt, weil das reguläre Löschen alter Daten aktiviert ist und das Datum für diesen Bericht älter als %s Tage alt ist. Ein Hauptadministrator kann diese Einstellung im Menü Administration => Privatsphäre ändern.",
"VisitorProfile": "Besucherprofil",
"VisitorsInRealTime": "Besuche in Echtzeit",
"VisitorsLastVisit": "Der letzte Besuch dieses Besuchers war vor %s Tagen.",
"VisitsFrom": "%1$s%2$s Besuche%3$s aus",
"VisitSummary": "Verbrachte insgesamt %1$s%2$s auf der Website%3$s, und besuchte %4$s Seiten%5$s in %6$s Besuchen%7$s.",
"VisitSummaryWithActionDetails": "Verbrachte insgesamt %1$s%2$s auf der Website%3$s und führte %4$s Aktionen%5$s (%6$s) in %7$s Besuchen%8$s aus.",
"RowActionTooltipDefault": "Zeige Besucher-Log segmentiert mit dieser Zeile",
"RowActionTooltipWithDimension": "Zeige Besucher-Log segmentiert mit %s",
"RowActionTooltipTitle": "Öffne segmentiertes Besucher-Log",
"SegmentedVisitorLogTitle": "Zeige Log bei denen %1$s \"%2$s\" ist",
"OnClickPause": "%s ist gestartet. Klicken Sie um zu pausieren.",
"OnClickStart": "%s ist gestoppt. Klicken Sie um zu starten."
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Κάθε σελίδα χρειάστηκε κατά μέσο όρο %1$s για να φορτωθεί στον επισκέπτη.",
"CalculatedOverNPageViews": "Έγινε υπολογισμός βάση των τελευταίων %1$s αναγνώσεων σελίδων του επισκέπτη.",
"ClickToViewMoreAboutVisit": "Κάντε κλικ για να δείτε περισσότερες λεπτομέρειες γύρω από την επίσκεψη",
"ClickToViewAllActions": "Κάντε κλικ για να δείτε με λεπτομέρεια όλες τις ενέργειες αυτής της ομάδας",
"ConvertedNGoals": "Μετατράπηκαν %s Στόχοι",
"FirstVisit": "Πρώτη επίσκεψη",
"GoalType": "Τύπος",
"HideMap": "απόκρυψη χάρτη",
"KeywordRankedOnSearchResultForThisVisitor": "Η λέξη-κλειδί %1$s βαθμολογήθηκε ως %2$s στη σελίδα αποτελεσμάτων αναζήτησης %3$s για αυτόν τον επισκέπτη",
"LastHours": "Τις τελευταίες %s ώρες",
"LastMinutes": "Τα τελευταία %s λεπτά",
"LastVisit": "Τελευταία επίσκεψη",
"LinkVisitorLog": "Προβολή λεπτομερούς καταγραφής επισκέψεων",
"LoadMoreVisits": "Να φορτωθούν περισσότερες επισκέψεις",
"LimitedSummary": "Οι πληροφορίες στο προφίλ εμφανίζουν μια περίληψη των τελευταίων %1$s επισκέψεων. Ο χρήστης είχε περισσότερες επισκέψεις στο σύνολο.",
"LimitedVisitsShown": "Μόνο οι τελευταίες %1$s επισκέψεις εμφανίζονται. Ο χρήστης είχε περισσότερες επισκέψεις στο σύνολο.",
"MorePagesNotDisplayed": "περισσότερες σελίδες από αυτόν τον επισκέπτη δεν προβάλλονται",
"NbVisitor": "1 επισκέπτης",
"NbVisitors": "%s επισκέπτες",
"NextVisitor": "Επόμενος επισκέπτης",
"NoMoreVisits": "Δεν υπάρχουν άλλες επισκέψεις για αυτόν τον επισκέπτη.",
"PageRefreshed": "Φορές που η σελίδα προβλήθηκε \/ ανανεώθηκε στη σειρά.",
"PluginDescription": "Παρέχει ζωντανό Ημερολόγιο Επισκεπτών και επιτρέπει να παρακολουθείτε τους επισκέπτες στο γραφικό συστατικό πραγματικού χρόνου του πίνακα. Το πρόσθετο επίσης επιτρέπει να δείτε οποιοδήποτε προφίλ Επισκέπτη για οποιοδήποτε χρήστη.",
"PreviousVisitor": "Προηγούμενος επισκέπτης",
"RealTimeVisitors": "Επισκέψεις σε Πραγματικό Χρόνο",
"RealTimeVisitorCount": "Αριθμός επισκεπτών σε πραγματικό χρόνο",
"Referrer_URL": "Διεύθυνση URL παραπομπού",
"ShowMap": "εμφάνιση χάρτη",
"ActionsAndDuration": "%1$s ενέργειες σε %2$s",
"SimpleRealTimeWidget_Message": "%1$s και %2$s στα τελευταία %3$s",
"ViewVisitorProfile": "Εμφάνιση του προφίλ επισκέπτη",
"VisitedPages": "Σελίδες που έχουν επισκεφθεί",
"RevisitedPages": "Σελίδες που αναγνώστηκαν παραπάνω από μία φορές",
"ToggleActions": "Εναλλαγή της ορατότητας όλων των ενεργειών",
"TopVisitedPages": "Κορυφαίες σε επισκεψιμότητα σελίδες",
"VisitsLog": "Ημερολόγιο Επισκέψεων",
"VisitorLog": "Ημερολόγιο Επισκέψεων",
"VisitorLogDocumentation": "Ο πίνακας εμφανίζει τις τελευταίες επισκέψεις στο επιλεγμένο εύρος ημερομηνιών. Μπορείτε να δείτε την τελευταία ημερομηνία επίσκεψης ενός επισκέπτη πηγαίνοντας με το ποντίκι πάνω από την ημερομηνία μιας επίσκεψης. %1$s Αν το εύρος ημερομηνιών περιλαμβάνει και τη σημερινή μέρα, μπορείτε να δείτε τους επισκέπτες σε πραγματικό χρόνο! %2$s Τα δεδομένα που εμφανίζονται είναι πάντα σε πραγματικό χρόνο, ανεξάρτητα από το αν και πόσο συχνά χρησιμοποιείτε την αυτοματοποιημένη εργασία αρχειοθέτησης του cron.",
"VisitorLogNoDataMessagePurged": "Είναι πιθανό τα δεδομένα να έχουν εκκαθαριστεί λόγω της ενεργοποίησης τακτικής διαγραφής των εγγραφών που δεν έχουν επεξεργαστεί και η ημερομηνία για την αναφορά είναι παλιότερη από %s ημέρες. Ένας υπερ-χρήστης μπορεί να αλλάξει τη ρύθμιση πηγαίνοντας στη Διαχείριση => Ιδιωτικότητα.",
"VisitorProfile": "Προφίλ επισκέπτη",
"VisitorsInRealTime": "Επισκέψεις σε πραγματικό χρόνο",
"VisitorsLastVisit": "Η τελευταία επίσκεψη αυτού του επισκέπτη ήταν πριν από %s ημέρες.",
"VisitsFrom": "%1$s%2$s επισκέψεις%3$s από",
"VisitSummary": "Σπαταλήθηκε συνολικός χρόνος %1$s%2$s στον ιστοτόπο %3$s και αναγνώστηκαν %4$s σελίδες%5$s σε %6$s επισκέψεις%7$s.",
"VisitSummaryWithActionDetails": "Σπαταλήθηκε συνολικός χρόνος %1$s%2$s στον ιστοτόπο %3$s και έγιναν %4$s ενέργειες%5$s (%6$s) σε %7$s επισκέψεις%8$s.",
"RowActionTooltipDefault": "Εμφάνιση του Ημερολογίου Επισκέψεων κατατμημένο σε αυτή τη γραμμή",
"RowActionTooltipWithDimension": "Εμφάνιση του Ημερολογίου Επισκέψεων κατατμημένο με αυτό το %s",
"RowActionTooltipTitle": "Άνοιγμα κατατμημένου Ημερολογίου Επισκέψεων",
"SegmentedVisitorLogTitle": "Ημερολόγιο Επισκέψεων με επισκέψεις όπου το %1$s είναι \"%2$s\"",
"OnClickPause": "Το %s έχει ξεκινήσει. Πατήστε για παύση.",
"OnClickStart": "Το %s είναι σταματημένο. Πατήστε για εκκίνηση."
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Each page took on average %1$s to load for this visitor.",
"CalculatedOverNPageViews": "Calculated using this visitor's last %1$s page views.",
"ClickToViewMoreAboutVisit": "Click to view more information about this visit",
"ClickToViewAllActions": "Click to view all actions of this group in detail",
"ConvertedNGoals": "Converted %s Goals",
"FirstVisit": "First visit",
"GoalType": "Type",
"HideMap": "hide map",
"KeywordRankedOnSearchResultForThisVisitor": "The keyword %1$s was ranked %2$s on the %3$s search result page for this visitor",
"LastHours": "Last %s hours",
"LastMinutes": "Last %s minutes",
"LastVisit": "Last visit",
"LinkVisitorLog": "View detailed visit log",
"LoadMoreVisits": "Load more visits",
"LimitedSummary": "The information in this profile summarizes the last %1$s visits. This user had more visits in total.",
"LimitedVisitsShown": "Only the last %1$s visits are shown. This user had more visits in total.",
"MorePagesNotDisplayed": "more pages by this visitor are not displayed",
"NbVisitor": "1 visitor",
"NbVisitors": "%s visitors",
"NextVisitor": "Next visitor",
"NoMoreVisits": "There are no more visits for this visitor.",
"PageRefreshed": "Number of times this page was viewed \/ refreshed in a row.",
"PluginDescription": "Provides the live Visitor Log and lets you watch your visitors live in the real-time dashboard widget. The plugin also lets you see a Visitor profile for any given user.",
"PreviousVisitor": "Previous visitor",
"RealTimeVisitors": "Real-time Visits",
"RealTimeVisitorCount": "Real Time Visitor Count",
"Referrer_URL": "Referrer URL",
"ShowMap": "show map",
"ActionsAndDuration": "%1$s actions in %2$s",
"SimpleRealTimeWidget_Message": "%1$s and %2$s in the last %3$s",
"ViewVisitorProfile": "View visitor profile",
"VisitedPages": "Visited pages",
"RevisitedPages": "Pages viewed more than once",
"ToggleActions": "Toggle visibility of all actions",
"TopVisitedPages": "Top visited pages",
"VisitsLog": "Visits Log",
"VisitorLog": "Visits Log",
"VisitorLogDocumentation": "This table shows the latest visits within the selected date range. You can see when a visitor's last visit occurred by hovering over the date of a visit. %1$s If the date range includes today, you can see your visitors real time! %2$s The data displayed here is always live, regardless of whether and how often you are using the archiving cron job.",
"VisitorLogNoDataMessagePurged": "Likely the data has been purged because the regular deletion of old raw data is enabled and the date for this report is more than %s days old. A super user can change this setting by going to Administration => Privacy.",
"VisitorProfile": "Visitor profile",
"VisitorsInRealTime": "Visits in Real-time",
"VisitorsLastVisit": "This visitor's last visit was %s days ago.",
"VisitsFrom": "%1$s%2$s visits%3$s from",
"VisitSummary": "Spent a total of %1$s%2$s on the website%3$s, and viewed %4$s pages%5$s in %6$s visits%7$s.",
"VisitSummaryWithActionDetails": "Spent a total of %1$s%2$s on the website%3$s, and performed %4$s actions%5$s (%6$s) in %7$s visits%8$s.",
"RowActionTooltipDefault": "Show Visit Log segmented by this row",
"RowActionTooltipWithDimension": "Show Visit Log segmented by this %s",
"RowActionTooltipTitle": "Open segmented Visit Log",
"SegmentedVisitorLogTitle": "Visit Log showing visits where %1$s is \"%2$s\"",
"OnClickPause": "%s is started. Click to pause.",
"OnClickStart": "%s is stopped. Click to start."
}
}

View File

@ -0,0 +1,39 @@
{
"Live": {
"AveragePageGenerationTime": "Cada página tomó en promedio %1$s para cargarse para este visitante.",
"CalculatedOverNPageViews": "Calculado usando las últimas %1$s páginas vistas de este visitante.",
"ClickToViewMoreAboutVisit": "Clic para ver más información acerca de esta visita",
"ConvertedNGoals": "%s objetivos convertidos",
"FirstVisit": "Primer visita",
"GoalType": "Tipo",
"HideMap": "ocultar mapa",
"KeywordRankedOnSearchResultForThisVisitor": "La palabra clave %1$s fue posicionada %2$s en la página de resultados de la búsqueda %3$s para este visitante",
"LastHours": "Últimas %s horas",
"LastMinutes": "Últimos %s minutos",
"LastVisit": "Última visita",
"LoadMoreVisits": "Cargar más visitas",
"MorePagesNotDisplayed": "más páginas de este visitante no son mostradas",
"NbVisitor": "1 visitante",
"NbVisitors": "%s visitantes",
"NextVisitor": "Siguiente visitante",
"NoMoreVisits": "No hay más visitas de este visitante.",
"PageRefreshed": "Número de veces que esta página fue vista \/ refrescada consecutivamente.",
"PluginDescription": "Ofrece el registro de visitante en vivo y te permite ver tus visitantes en el widget del panel en tiempo real. El plugin también te permite ver el perfil de un visitante para un usuario determinado.",
"PreviousVisitor": "Visitante anterior",
"RealTimeVisitorCount": "Conteo de visitante en tiempo real",
"Referrer_URL": "Dirección web de origen del visitante",
"ShowMap": "mostrar mapa",
"SimpleRealTimeWidget_Message": "%1$s y %2$s en los últimos %3$s",
"ViewVisitorProfile": "Ver perfil de visitante",
"VisitedPages": "Páginas visitadas",
"RevisitedPages": "Páginas vistas más de una vez",
"VisitorLogDocumentation": "Esta tabla muestra las últimas visitas en el rango de fecha seleccionado. Podés ver cuándo fue la última visita del visitante pasando el cursor sobre la fecha de una visita. %1$s Si el rango de fecha incluye hoy, ¡podés ver tus visitantes en tiempo real! %2$s La información mostrada aquí es siempre en tiempo real, sin tener en cuenta cuándo y cuán seguido estás usando el trabajo de cron para archivar.",
"VisitorProfile": "Perfil de visitante",
"VisitorsLastVisit": "La última visita de este visitante fue hace %s días.",
"VisitsFrom": "%1$s%2$s visitas%3$s desde",
"VisitSummary": "Pasó un total de %1$s%2$s en el sitio web%3$s y vio %4$s páginas%5$s en %6$s visitas%7$s.",
"VisitSummaryWithActionDetails": "Pasó un total de %1$s%2$s en el sitio web%3$s y ejecutó %4$s acciones%5$s (%6$s) en %7$s visitas%8$s.",
"OnClickPause": "%s está iniciado. Hacé clic para pausar.",
"OnClickStart": "%s está detenido. Hacé clic para iniciar."
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Cada página tomó en promedio %1$s para cargar este visitante.",
"CalculatedOverNPageViews": "Calculado usando las últimas %1$s páginas vistas de este visitante.",
"ClickToViewMoreAboutVisit": "Clic para ver más información acerca de esta visita.",
"ClickToViewAllActions": "Clic para ver todas las acciones en detalle de este grupo",
"ConvertedNGoals": "%s Objetivos convertidos",
"FirstVisit": "Primer visita",
"GoalType": "Tipo",
"HideMap": "ocultar mapa",
"KeywordRankedOnSearchResultForThisVisitor": "La palabra clave %1$s fue posicionada %2$s en la página de resultados de búsqueda %3$s para este visitante",
"LastHours": "Últimas %s horas",
"LastMinutes": "Últimos %s minutos",
"LastVisit": "Última visita",
"LinkVisitorLog": "Ver el registro de visitas detallado",
"LoadMoreVisits": "Cargar más visitas",
"LimitedSummary": "La información en este perfil resume las últimas %1$svisitas. Este usuario posee más visitas en total.",
"LimitedVisitsShown": "Solamente las últimas %1$s visitas se muestran. Este usuario posee más visitas en total.",
"MorePagesNotDisplayed": "más páginas de este visitante no son mostradas",
"NbVisitor": "1 visitante",
"NbVisitors": "%s visitantes",
"NextVisitor": "Siguiente visitante",
"NoMoreVisits": "No hay más visitas de este visitante.",
"PageRefreshed": "Número de veces que esta página ha sido vista\/actualizada en una fila",
"PluginDescription": "Suministra el Registro de Visitantes y le permite observar en directo a sus visitantes en el módulo correspondiente del panel de control de tiempo real. El complemento también le permite observar el perfil de visitante para cualquier usuario dado.",
"PreviousVisitor": "Visitante anterior",
"RealTimeVisitors": "Visitas en tiempo real",
"RealTimeVisitorCount": "Contador de visitantes en tiempo real",
"Referrer_URL": "URL de referencia",
"ShowMap": "mostrar mapa",
"ActionsAndDuration": "%1$s acciones en %2$s",
"SimpleRealTimeWidget_Message": "%1$s y %2$s en los últimos %3$s",
"ViewVisitorProfile": "Ver perfil de visitante",
"VisitedPages": "Páginas visitadas",
"RevisitedPages": "Páginas vistas más de una vez",
"ToggleActions": "Cambiar la visibilidad de todas las acciones",
"TopVisitedPages": "Principales páginas visitadas",
"VisitsLog": "Registro de visitas",
"VisitorLog": "Registro de visitas",
"VisitorLogDocumentation": "Esta tabla muestra las últimas visitas en el rango de fecha seleccionado. Puede ver cuándo fue la última visita de un visitante posicionándose sobre la fecha de la visita. %1$s Si el rango de fecha incluye el día actual, ¡puede ver a sus visitantes en tiempo real! %2$s La información mostrada aquí es siempre en tiempo real, independientemente de si -y con qué frecuencia- está utilizando un cron para archivar.",
"VisitorLogNoDataMessagePurged": "Es probable que los datos se hayan borrado porque la eliminación regular de los datos antiguos sin procesar está habilitada y la fecha de este informe tiene más de %s días de antigüedad. Un superusuario puede cambiar esta configuración yendo a Administración => Privacidad.",
"VisitorProfile": "Perfil de visitante",
"VisitorsInRealTime": "Visitas en tiempo real",
"VisitorsLastVisit": "La última visita de este visitante fue hace %s días.",
"VisitsFrom": "%1$s%2$s visitas%3$s desde",
"VisitSummary": "Pasó un total de %1$s%2$s en el sitio de internet%3$s, y vió %4$s páginas%5$s en %6$s visitas%7$s.",
"VisitSummaryWithActionDetails": "Pasó un total de %1$s%2$s en el sitio de internet%3$s, y ejecutó %4$s acciones%5$s (%6$s) en %7$s visitas%8$s.",
"RowActionTooltipDefault": "Mostrar registro de visitas segmentado por esta fila",
"RowActionTooltipWithDimension": "Mostrar registro de visitas segmentado por este %s",
"RowActionTooltipTitle": "Abrir registro de visitas segmentadas",
"SegmentedVisitorLogTitle": "Registro de visitas mostrando las visitas donde %1$s es \"%2$s\"",
"OnClickPause": "%s está iniciado. Clic para pausar.",
"OnClickStart": "%s está detenido. Clic para iniciar."
}
}

View File

@ -0,0 +1,31 @@
{
"Live": {
"AveragePageGenerationTime": "Iga lehe laadimine võttis antud külastajal keskeltläbi %1$s.",
"CalculatedOverNPageViews": "Arvutatud kasutades külastaja viimast %1$s lehe kuvamist.",
"ClickToViewMoreAboutVisit": "Vali, et kuvada külastuse kohta rohkem infot",
"ConvertedNGoals": "Muutus tulutoovaks %s korral",
"FirstVisit": "Esimene külastus",
"GoalType": "Tüüp",
"HideMap": "peida kaart",
"LastHours": "Viimased %s tundi",
"LastMinutes": "Viimased %s minutit",
"LastVisit": "Viimane külastus",
"LoadMoreVisits": "Ava rohkem külastusi",
"MorePagesNotDisplayed": "rohkem lehti külastaja kohta ei kuvata",
"NbVisitor": "1 külastaja",
"NbVisitors": "%s külastajat",
"NextVisitor": "Järgmine külastaja",
"NoMoreVisits": "Antud külastajalt rohkem külastusi ei leitud.",
"PageRefreshed": "Arv, mitu korda antud lehte vaadati \/ värskendati järjest",
"PreviousVisitor": "Eelmine külastaja",
"RealTimeVisitorCount": "Reaalajas külastuste arv",
"Referrer_URL": "Viitaja URL",
"ShowMap": "kuva kaart",
"SimpleRealTimeWidget_Message": "%1$s ja %2$s perioodis viimased %3$s",
"ViewVisitorProfile": "Kuva külastaja profiil",
"VisitedPages": "Külastatud lehed",
"VisitorProfile": "Külastaja profiil",
"VisitorsLastVisit": "Antud külastaja viimane külastus lehel oli %s päeva tagasi.",
"VisitsFrom": "%1$s%2$s külastust %3$s pärineb"
}
}

View File

@ -0,0 +1,5 @@
{
"Live": {
"Referrer_URL": "URL erreferentea"
}
}

View File

@ -0,0 +1,33 @@
{
"Live": {
"AveragePageGenerationTime": "هر صفحه به طور متوسط %1$s زمان می برد تا برای بیننده بارگزاری شود.",
"CalculatedOverNPageViews": "محاسبه شده بر اسا آخرید بازدیدکنندگان %1$s بازدید.",
"ClickToViewMoreAboutVisit": "برای مشاهده اطلاعات بیشتر درباره این بازدید کلیک کنید",
"ConvertedNGoals": "تبدیل %s اهداف",
"FirstVisit": "بازدید اول",
"GoalType": "نوع",
"HideMap": "پنهان کردن نقشه",
"LastHours": "آخرین %s ساعات",
"LastMinutes": "آخرین %s دقایق",
"LastVisit": "اخرین بازدید",
"LoadMoreVisits": "نمایش بازدیدهای بیشتر",
"MorePagesNotDisplayed": "صفحات بیشتر به این بازدید کننده ها نشان داده نمی شود",
"NbVisitor": "یک ویزیتور",
"NbVisitors": "%s ویزیتور",
"NextVisitor": "دیدن کننده بعدی",
"NoMoreVisits": "این بازدید کننده، بازدید دیگری نداشته است.",
"PageRefreshed": "تعداد بار این صفحه \/ مشاهده شده در یک ردیف تجدید شد.",
"PreviousVisitor": "بازدید کننده قبلی",
"RealTimeVisitorCount": "زمان واقعی تعداد بازدید کنندگان",
"Referrer_URL": "URL بازگشتی",
"ShowMap": "نمایش نقشه",
"SimpleRealTimeWidget_Message": "%1$s و %2$s در اخرین %3$s",
"ViewVisitorProfile": "مشاهده نمایه دیدن کننده",
"VisitedPages": "صفحات بازدید شده",
"RevisitedPages": "صحات بیش از یک بار مشاهده شده‌اند",
"VisitorProfile": "مشخصات بازدید کننده",
"VisitorsLastVisit": "بازدید گذشته ی این بازدیدکننده %s روز پیش بوده است.",
"VisitsFrom": "%1$s%2$s بازدیدکننده%3$s از",
"OnClickStart": "%s متوقف شد, اینجا کلیک کنید"
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Jokainen sivun lataaminen kesti keskimäärin %1$s tälle käyttäjälle.",
"CalculatedOverNPageViews": "Laskettu käyttämällä tämän kävijän %1$s viimeisintä nähtyä sivua.",
"ClickToViewMoreAboutVisit": "Klikkaa saadaksesi lisätietoa tästä käynnistä",
"ClickToViewAllActions": "Klikkaa näyttääksesi tarkat tiedot tästä ryhmästä",
"ConvertedNGoals": "Konvertoidut %s tavoitteet",
"FirstVisit": "Ensimmäinen käynti",
"GoalType": "Tyyppi",
"HideMap": "piilota kartta",
"KeywordRankedOnSearchResultForThisVisitor": "Hakusana %1$s oli %2$s. sivulla %3$s hakukoneen tuloksissa tälle kävijälle.",
"LastHours": "Edelliset %s tuntia",
"LastMinutes": "Edelliset %s minuuttia",
"LastVisit": "Edellinen käynti",
"LinkVisitorLog": "Näytä tarkka käyntiloki",
"LoadMoreVisits": "Lataa lisää käyntejä",
"LimitedSummary": "Tässä profiilissa on yhteenveto %1$s viimeisestä käynnistä. Käyttäjällä on useampia käyntejä.",
"LimitedVisitsShown": "Näytetään vain %1$s viimeistä käyntiä. Käyttäjällä on useampia käyntejä.",
"MorePagesNotDisplayed": "muita sivuja tältä kävijältä ei näytetä",
"NbVisitor": "1 kävijä",
"NbVisitors": "%s kävijää",
"NextVisitor": "Seuraava kävijä",
"NoMoreVisits": "Ei enempää käyntejä tälle kävijälle.",
"PageRefreshed": "Montako kertaa tätä sivua katsottiin \/ päivitettiin peräkkäin.",
"PluginDescription": "Tarjoaa käyntilokin ja vimpaimen, jolla voi seurata kävijöitä reaaliajassa. Mahdollistaa myös kävijäprofiilin näyttämisen mille tahansa käyttäjälle.",
"PreviousVisitor": "Edellinen kävijä",
"RealTimeVisitors": "Käynnit reaaliajassa",
"RealTimeVisitorCount": "Reaaliaikainen kävijälaskuri",
"Referrer_URL": "Saapumisosoite",
"ShowMap": "näytä kartta",
"ActionsAndDuration": "%1$s toimintoa - %2$s",
"SimpleRealTimeWidget_Message": "%1$s ja %2$s viimeisessä %3$s",
"ViewVisitorProfile": "Näytä kävijäprofiili",
"VisitedPages": "Vieraillut sivut",
"RevisitedPages": "Sivut, joita on katsottu useita kertoja",
"ToggleActions": "Vaihda kaikkien toimintojen näkyvyys",
"TopVisitedPages": "Suosituimmat sivut",
"VisitsLog": "Käyntiloki",
"VisitorLog": "Käyntiloki",
"VisitorLogDocumentation": "Tämä taulukko näyttää viimeisimmät käynnit valitulta aikaväliltä. Voit nähdä, koska viimeisin käynti oli pitämällä hiirtä päiväyksen päällä. %1$s Jos aikaväli sisältää tämän päivän, näet kävijät reaaliaikaisena! %2$s Näytetyt tiedot ovat aina reaaliaikaisia, riippumatta arkistoinnista.",
"VisitorLogNoDataMessagePurged": "Tiedot on luultavasti poistettu, koska säännöllinen vanhan raakadatan poisto on käytössä, ja tämän raportin päivämäärä on yli %s päivää sitten. Pääkäyttäjä voi muuttaa tätä asetusta kohdassa Ylläpitö => Yksityisyys.",
"VisitorProfile": "Kävijäprofiili",
"VisitorsInRealTime": "Käynnit reaaliajassa",
"VisitorsLastVisit": "Tämän kävijän edellinen käynti oli %s päivää sitten.",
"VisitsFrom": "%1$s%2$s käyntiä%3$s lähteestä",
"VisitSummary": "Käytti yhteensä %1$s%2$s sivustolla%3$s ja katsoi %4$s sivua%5$s %6$s käynnin aikana%7$s.",
"VisitSummaryWithActionDetails": "Käytti yhteensä %1$s%2$s sivustolla%3$s ja suoritti %4$s toimintoa%5$s (%6$s) %7$s käynnin aikana%8$s.",
"RowActionTooltipDefault": "Näytä käyntiloki paloiteltuna tämän rivin mukaan",
"RowActionTooltipWithDimension": "Näytä käyntiloki paloiteltuna: %s",
"RowActionTooltipTitle": "Näytä paloiteltu käyntiloki",
"SegmentedVisitorLogTitle": "Käyntilokin käynnit, joissa %1$s on \"%2$s\"",
"OnClickPause": "%s on käynnissä. Pysäytä klikkaamalla.",
"OnClickStart": "%s on pysäytetty. Aloita klikkaamalla."
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Chaque page a pris en moyenne %1$s à charger pour ce visiteur.",
"CalculatedOverNPageViews": "Calculé sur la base des %1$s dernières pages vues par ce visiteur.",
"ClickToViewMoreAboutVisit": "Cliquez pour afficher plus d'informations à propos de cette visite",
"ClickToViewAllActions": "Cliquez pour visualiser l'ensemble des actions de ce groupe en détails",
"ConvertedNGoals": "Conversion de %s objectifs",
"FirstVisit": "Première visite",
"GoalType": "Type",
"HideMap": "Cacher la carte",
"KeywordRankedOnSearchResultForThisVisitor": "Le mot-clé %1$s a été noté %2$s dans la page de résultats de recherche %3$s pour ce visiteur",
"LastHours": "Dernières %s heures",
"LastMinutes": "Dernières %s minutes",
"LastVisit": "Dernière visite",
"LinkVisitorLog": "Afficher le journal détaillé des visites",
"LoadMoreVisits": "Charger plus de visites",
"LimitedSummary": "Les information de ce profil récapitulent les %1$sdernières visites. Cet utilisateur a effectué plus de visites.",
"LimitedVisitsShown": "Uniquement les %1$s dernières visites sont affichées. Cet utilisateur a effectué plus de visites.",
"MorePagesNotDisplayed": "plus de pages de ce visiteur ne sont pas affichées",
"NbVisitor": "1 visiteur",
"NbVisitors": "%s visiteurs",
"NextVisitor": "Visiteur suivant",
"NoMoreVisits": "Il n'y a pas d'autres visites pour ce visiteur.",
"PageRefreshed": "Nombre de fois où cette page a été vue \/ rafraîchie d'affilée.",
"PluginDescription": "Fournit le log en temps réel des visiteurs et vous permet de visualiser vos visiteurs en temps réel au sein d'un gadget du tableau de bord. Ce composant vous permet aussi de voir le profil d'un visiteur pour n'importe quel utilisateur.",
"PreviousVisitor": "Visiteur précédent",
"RealTimeVisitors": "Visites en temps-réel",
"RealTimeVisitorCount": "Décompte des visiteurs en temps réel",
"Referrer_URL": "URL du référent",
"ShowMap": "Montrer la carte",
"ActionsAndDuration": "%1$sactions en %2$s",
"SimpleRealTimeWidget_Message": "%1$s et %2$s dans le(s)\/la dernier(s)\/ière(s) %3$s.",
"ViewVisitorProfile": "Afficher le profil du visiteur",
"VisitedPages": "Pages visitées",
"RevisitedPages": "Pages vues plus d'une fois",
"ToggleActions": "Activer l'affichage de toutes les actions",
"TopVisitedPages": "Pages les plus visitées",
"VisitsLog": "Journal des Visites",
"VisitorLog": "Journal des Visites",
"VisitorLogDocumentation": "Ce tableau affiche les dernières visites parmi la période sélectionnée. %1$s Si la période inclut aujourd'hui, vous pouvez voir vos visiteurs en temps réel! %2$s Les données affichées ici le sont toujours en temps réel, indépendamment de quand et à quelle fréquence vous utilisez la tâche automatique (cron) d'archivage.",
"VisitorLogNoDataMessagePurged": "Il est probable que les données ait été supprimées par la suppression régulière des anciennes données brutes et ce rapport a plus de %s jours. Un super utilisateur peut modifier ce paramètre en allant dans Administration => Vie privée.",
"VisitorProfile": "Profil visiteur",
"VisitorsInRealTime": "Visites en temps-réel",
"VisitorsLastVisit": "La dernière visite du visiteur était il y a %s jours.",
"VisitsFrom": "%1$s%2$s visites%3$s de",
"VisitSummary": "A passé un total de %1$s%2$s sur le site web%3$s, et affiché %4$s pages%5$s en %6$s visites%7$s.",
"VisitSummaryWithActionDetails": "A passé un total de %1$s%2$s sur le site web%3$s, et effectué %4$s actions %5$s (%6$s) en %7$s visites%8$s.",
"RowActionTooltipDefault": "Afficher le journal des visites segmenté en fonction de cet enregistrement",
"RowActionTooltipWithDimension": "Afficher le journal des visites segmenté en fonction de %s",
"RowActionTooltipTitle": "Ouvrir le journal segmenté des visites",
"SegmentedVisitorLogTitle": "Le journal des visites affiche les visites qui ont %1$s à \"%2$s\"",
"OnClickPause": "%s est démarré. Cliquer pour mettre en pause.",
"OnClickStart": "%s est arrêté. Cliquer pour démarrer."
}
}

View File

@ -0,0 +1,30 @@
{
"Live": {
"AveragePageGenerationTime": "प्रत्येक पृष्ठ इस आगंतुक के लिए लोड करने के लिए औसत %1$s पर ले लिया।",
"CalculatedOverNPageViews": "इस आगंतुक के अंतिम %1$s पृष्ठ विचार उपयोग कर की गणना।",
"ClickToViewMoreAboutVisit": "इस यात्रा के बारे में अधिक जानकारी देखने के लिए क्लिक करें",
"ConvertedNGoals": "लक्ष्य %s बदल दिया गया है",
"FirstVisit": "पहला दौरा",
"GoalType": "प्रकार",
"HideMap": "नक्शा छिपाना",
"KeywordRankedOnSearchResultForThisVisitor": "खोजशब्द %1$sके इस आगंतुक %2$sके लिए %3$sखोज परिणाम पृष्ठ पर स्थान दिया गया था",
"LastHours": "अंतिम %s घंटे",
"LastMinutes": "अंतिम %s मिनट",
"LastVisit": "अंतिम दौरा",
"LoadMoreVisits": "अधिक यात्राओं लोड",
"MorePagesNotDisplayed": "इस आगंतुक से अधिक पृष्ठों को प्रदर्शित नहीं कर रहे हैं",
"NbVisitor": "1 आगंतुक",
"NbVisitors": "%s आगंतुकों",
"NextVisitor": "अगले आगंतुक",
"PageRefreshed": "यह पृष्ठ देखा गया था \/ एक पंक्ति में रिफ्रेश की संख्या।",
"RealTimeVisitorCount": "रीयल टाइम आगंतुक गणना",
"Referrer_URL": "संदर्भ URL",
"ShowMap": "नक्शा दिखाना",
"SimpleRealTimeWidget_Message": "अंतिम %1$s में %2$s और %3$s है.",
"VisitedPages": "पृष्ठों का दौरा",
"VisitorLogDocumentation": "इस तालिका में चयनित तिथि सीमा के भीतर नवीनतम यात्राओं से पता चलता है. %1$sआप देख सकते हैं जब एक आगंतुक की अंतिम यात्रा की तारीख के आस-पास उत्पन्न हुई।तिथि सीमा आज भी शामिल है, तो आप अपने दर्शकों के वास्तविक समय देख सकते हैं! %2$s यहाँ प्रदर्शित डेटा की परवाह किए बिना कि क्या और कितनी बार आप पुरालेखण क्रॉन जॉब का उपयोग कर रहे हैं.",
"VisitorProfile": "आगंतुक रूपरेखा",
"VisitorsLastVisit": "इस आगंतुक की आखिरी यात्रा %s दिन पहले की बात है.",
"VisitsFrom": "%1$s%2$s से दौरा %3$s"
}
}

View File

@ -0,0 +1,13 @@
{
"Live": {
"GoalType": "Vrsta",
"HideMap": "sakrij mapu",
"LoadMoreVisits": "Učitaj više posjeta",
"NbVisitor": "1 visitor",
"NextVisitor": "Slijedeći posjetitelj",
"PreviousVisitor": "Prijašnji posjetitelj",
"Referrer_URL": "Referrer URL",
"ShowMap": "pokaži mapu",
"VisitedPages": "Posjećene stranice"
}
}

View File

@ -0,0 +1,10 @@
{
"Live": {
"GoalType": "Típus",
"KeywordRankedOnSearchResultForThisVisitor": "A %1$s kulcsszó %2$s. helyezésen jelent meg a(z) %3$s. találati lista oldalon a látogató számára.",
"LastHours": "Legutóbbi %s óra",
"LastMinutes": "Legutóbbi %s perc",
"Referrer_URL": "Hivatkozó URL",
"VisitorLogDocumentation": "Ez a táblázat a legutolsó látogatásokat mutatja a kiválasztott időintervallumon belül.%1$s Ha az időintervallum tartalmazz a mai napot is, akkor élőben láthatod látogatóid! %2$s Az itt kijelzett adatok mindig élőek maradnak, függetlenül, hogy hogyan és milyen gyakran használod az archiválásra szolgáló cron job-ot."
}
}

View File

@ -0,0 +1,28 @@
{
"Live": {
"AveragePageGenerationTime": "Setiap halaman rata-rata memakan %1$s membuat untuk pengguna ini.",
"ClickToViewMoreAboutVisit": "Klik untuk melihat informasi lebih lanjut tentang kunjungan ini",
"FirstVisit": "Kunjungan pertama",
"GoalType": "Jenis",
"HideMap": "sembunyikan peta",
"KeywordRankedOnSearchResultForThisVisitor": "Kata kunci %1$s menuduki peringkat %2$s dalam halaman pencarian %3$s untuk pengunjung ini",
"LastHours": "Jam %s terakhir",
"LastMinutes": "Menit %s terakhir",
"LastVisit": "Kunjungan terakhir",
"LoadMoreVisits": "Muat kunjungan lebih banyak",
"MorePagesNotDisplayed": "halaman lain untuk pengguna tersebut tak dapat ditampilkan",
"NbVisitor": "1 pengunjung",
"NbVisitors": "%s pengunjung",
"NextVisitor": "Pengunjung selanjutnya",
"PageRefreshed": "Jumlah kali halaman ini ditampilkan \/ disegarkan berurutan.",
"PreviousVisitor": "Pengunjung sebelumnya",
"RealTimeVisitorCount": "Jumlah Pengunjung Waktu Nyata",
"Referrer_URL": "URL Pengarah",
"ShowMap": "tampilkan peta",
"SimpleRealTimeWidget_Message": "%1$s dan %2$s dalam %3$s terakhir.",
"ViewVisitorProfile": "Lihat profil pengunjung",
"VisitorLogDocumentation": "Tabel berikut menampilkan kunjungan terakhir selama rentang tanggal yang dipilih.%1$s Bila hari ini termasuk dalam rentang tanggal, Anda dapat melihat pengunjung Anda dalam waktu nyata! %2$s Data yang ditampilkan di sini selalu ditampilkan secara langsung, tidak terpengaruh bagaimana Anda mengatur pengarsipan di tugas Cron.",
"VisitorProfile": "Profil pengunjung",
"VisitorsLastVisit": "Pengunjung ini telah berkunjung %s hari yang lalu."
}
}

View File

@ -0,0 +1,8 @@
{
"Live": {
"GoalType": "Tegund",
"LastHours": "Síðustu %s klukkustundir",
"LastMinutes": "Síðustu %s mínútur",
"Referrer_URL": "URL Sendanda"
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Ciascuna pagina ha richiesto una media di %1$s per essere caricata per questo visitatore.",
"CalculatedOverNPageViews": "Calcolate usando le ultime %1$s pagine visualizzate da questo visitatore.",
"ClickToViewMoreAboutVisit": "Clicca per vedere ulteriori informazioni su questa visita",
"ClickToViewAllActions": "Clicca per vedere in dettaglio tutte le azioni di questo gruppo",
"ConvertedNGoals": "%s Obiettivi Convertiti",
"FirstVisit": "Prima visita",
"GoalType": "Tipo",
"HideMap": "nascondi mappa",
"KeywordRankedOnSearchResultForThisVisitor": "La parola chiave %1$s è stata classificata %2$s su %3$s nei risultati di ricerca per questo visitatore",
"LastHours": "Ultime %s ore",
"LastMinutes": "Ultimi %s minuti",
"LastVisit": "Ultima visita",
"LinkVisitorLog": "Visualizza log dettagliato visite",
"LoadMoreVisits": "Carica più visite",
"LimitedSummary": "Le informazioni in questo profilo riassumono le ultime %1$s visite. Questo utente ha avuto in totale più visite.",
"LimitedVisitsShown": "Vengono mostrate solo le ultime %1$s visite. Questo utente ha avuto in totale più visite.",
"MorePagesNotDisplayed": "Altre pagine di questo visitatore non vengono visualizzate",
"NbVisitor": "1 visitatore",
"NbVisitors": "%s visitatori",
"NextVisitor": "Visitatore successivo",
"NoMoreVisits": "Non ci sono più visite per questo visitatore.",
"PageRefreshed": "Numero di volte che la pagina è stata visitata \/ aggiornata in una riga.",
"PluginDescription": "Fornisce un log dei visitatori \\\"live\\\" e ti permette di vedere i tuoi visitatori in tempo reale in un widget della dashboard. Il plugin ti permette anche di vedere un profilo visitatore per ciascuno degli utenti.",
"PreviousVisitor": "Visitatore precedente",
"RealTimeVisitors": "Visite in Tempo Reale",
"RealTimeVisitorCount": "Conteggio Visitatori in Tempo Reale",
"Referrer_URL": "URL del referrer",
"ShowMap": "mostra mappa",
"ActionsAndDuration": "%1$sazioni in %2$s",
"SimpleRealTimeWidget_Message": "%1$s e %2$s negli ultimi %3$s",
"ViewVisitorProfile": "Guarda profilo visitatore",
"VisitedPages": "Pagine visitate",
"RevisitedPages": "Pagine viste più di una volta.",
"ToggleActions": "Cambia la visibilità di tutte le azioni",
"TopVisitedPages": "Le pagine più visitate",
"VisitsLog": "Log Visite",
"VisitorLog": "Log Visite",
"VisitorLogDocumentation": "Questa tabella mostra le ultime visite nell'intervallo di date selezionato. Puoi vedere quando c'è stata l'ultima visita di un visitatore posizionando il mouse sopra la data di una visita. %1$sSe l'intervallo di date comprende oggi, è possibile vedere in tempo reale i tuoi visitatori!%2$s I dati visualizzati qui sono sempre aggiornati, indipendentemente da quanto spesso usi l'archiviazione automatica.",
"VisitorLogNoDataMessagePurged": "Probabilmente i dati sono stati eliminati perché è abilitata la cancellazione regolare dei vecchi dati grezzi e la data di questo report è più vecchia di %s giorni. Un super user può modificare questa impostazione andando su Amministrazione => Privacy.",
"VisitorProfile": "Profilo visitatore",
"VisitorsInRealTime": "Visite in Tempo Reale",
"VisitorsLastVisit": "L'ultima visita di questo visitatore è stata %s giorni fa.",
"VisitsFrom": "%1$s%2$s visite%3$s da",
"VisitSummary": "Speso un totale di %1$s%2$s sul sito%3$s, e viste %4$s pagine%5$s in %6$s visite%7$s.",
"VisitSummaryWithActionDetails": "Speso un totale di %1$s%2$s sul sito%3$s, ed eseguite %4$s azioni%5$s (%6$s) in %7$s visite%8$s.",
"RowActionTooltipDefault": "Mostra log visite segmentato da questa riga",
"RowActionTooltipWithDimension": "Mostra log visite segmentato da questa %s",
"RowActionTooltipTitle": "Apri Log Visite segmentato",
"SegmentedVisitorLogTitle": "Log Visite che mostra dove %1$s è \"%2$s\"",
"OnClickPause": "%s è avviato. Clicca per mettere in pausa.",
"OnClickStart": "%s è stato arrestato. Clicca per avviare."
}
}

View File

@ -0,0 +1,50 @@
{
"Live": {
"AveragePageGenerationTime": "このビジターのロードに、各ページ平均 %1$s かかりました。",
"CalculatedOverNPageViews": "このビジターの最終 %1$s ページビューを利用して計算",
"ClickToViewMoreAboutVisit": "この訪問に関する詳細情報を見るには、クリックしてください。",
"ClickToViewAllActions": "クリックすると、このグループのすべてのアクションが詳細に表示されます",
"ConvertedNGoals": "変換された %s 目標",
"FirstVisit": "最初の訪問",
"GoalType": "タイプ",
"HideMap": "隠れたマップ",
"KeywordRankedOnSearchResultForThisVisitor": "キーワード %1$s はこのビジターの %3$s 検索結果ページで %2$s にランクされました。",
"LastHours": "最近の %s 時間",
"LastMinutes": "最近の %s 分",
"LastVisit": "最新のビジット",
"LinkVisitorLog": "詳細な訪問履歴を表示する",
"LoadMoreVisits": "さらに訪問をロード",
"LimitedSummary": "このプロファイルの情報は、過去 %1$s 回のビジットをまとめたものです。 このユーザーは合計でより多くのビジットを受けました。",
"LimitedVisitsShown": "過去 %1$s 回のビジットのみが表示されます。 このユーザーは合計でより多くのビジットを受けました。",
"MorePagesNotDisplayed": "このビジターの表示はこれ以上ありません",
"NbVisitor": "1人のビジター",
"NbVisitors": "%s のビジター",
"NextVisitor": "次のビジター",
"NoMoreVisits": "このビジターのさらなる訪問はありません。",
"PageRefreshed": "このページが見られた\/更新された回数",
"PluginDescription": "行動中のビジターログを提供し、リアルタイムダッシュボードウェジェット内に行動中のビジターを表示します。このプラグインでは、任意のユーザーのビジタープロフィールを見ることもできます。",
"PreviousVisitor": "前のビジター",
"RealTimeVisitors": "リアルタイムビジット",
"RealTimeVisitorCount": "リアルタイムのビジター数",
"Referrer_URL": "リファラー URL",
"ShowMap": "地図を表示",
"ActionsAndDuration": "%2$s 中 %1$s アクション",
"SimpleRealTimeWidget_Message": "最後の %1$s の %2$s と %3$s",
"ViewVisitorProfile": "ビジタープロフィールをみる",
"VisitedPages": "訪問されたページ",
"RevisitedPages": "複数回閲覧されたページ",
"ToggleActions": "すべてのアクションの表示を切り替える",
"TopVisitedPages": "上位のページ",
"VisitsLog": "訪問履歴",
"VisitorLog": "訪問履歴",
"VisitorLogDocumentation": "この表は選択した日付期間内で最新のビジットについて表示しています。ビジットの日付の上にマウスを移動して、そのビジターの最後のビジットが何日前か見ることが出来ます。%1$s 期間内に本日が含まれていれば、ビジターをリアルタイムで見られます! %2$s ここに表示されるのは、アーカイブのための cron ジョブ設定の頻度に関わらず、常にライブのデータです。",
"VisitorProfile": "ビジタープロフィール",
"VisitorsInRealTime": "リアルタイムのビジット",
"VisitorsLastVisit": "このビジターの最新のビジットは %s 日前です。",
"VisitsFrom": "から %1$s%2$s が %3$s を訪問",
"VisitSummary": "ウェブサイト%3$sに合計%1$s%2$sを費やし、%6$s 回の訪問%7$sで %4$sページ%5$sを閲覧しました。",
"VisitSummaryWithActionDetails": "ウェブサイト%3$sに合計 %1$s%2$s を費やし、%7$s 回の訪問%8$sで %4$s 回のアクション%5$s (%6$s) を実行しました。",
"OnClickPause": "%s が開始されました。クリックして一時停止します。",
"OnClickStart": "%s は停止しています。クリックして開始します。"
}
}

View File

@ -0,0 +1,8 @@
{
"Live": {
"GoalType": "ტიპი",
"LastHours": "ბოლო %s საათი",
"LastMinutes": "ბოლო %s წუთი",
"Referrer_URL": "რეფერერის URL"
}
}

View File

@ -0,0 +1,32 @@
{
"Live": {
"CalculatedOverNPageViews": "해당 방문자의 %1$s 번 페이지 방문을 통해 계산되었습니다.",
"ClickToViewMoreAboutVisit": "이 방문에 대해 더 자세한 정보를 보기 위해서 클릭하세요.",
"ConvertedNGoals": "변환된 %s 목표",
"FirstVisit": "첫 방문",
"GoalType": "유형",
"HideMap": "지도 숨기기",
"KeywordRankedOnSearchResultForThisVisitor": "키워드 %1$s 이 방문자의 %3$s 검색 결과 페이지에서 %2$s에 랭크되었습니다.",
"LastHours": "최근 %s시간",
"LastMinutes": "최근 %s분",
"LastVisit": "최근 방문",
"LoadMoreVisits": "더 많은 방문들 불러오기",
"MorePagesNotDisplayed": "이 방문객의 표시는 더이상 없습니다",
"NbVisitor": "1명 방문자",
"NbVisitors": "%s 방문자들",
"NextVisitor": "다음 방문자",
"NoMoreVisits": "이 방문자가 방문한 페이지는 더 이상 없습니다.",
"PageRefreshed": "이 페이지를 볼 수 있음 \/ 업데이트된 횟수",
"PreviousVisitor": "이전 방문자",
"RealTimeVisitorCount": "실시간 방문자 합계",
"Referrer_URL": "참조 URL",
"ShowMap": "지도 보이기",
"ViewVisitorProfile": "방문자 프로필 보기",
"VisitedPages": "방문한 페이지들",
"VisitorLogDocumentation": "이 표는 선택한 날짜 기간 내에 최신 방문에 표시하고 있습니다. 방문 날짜 위로 마우스를 이동하고, 그 방문자의 마지막 방문이 며칠 전인지 볼 수 있습니다. %1$s 기간내에 오늘이 포함되어 있으면, 방문객을 실시간으로 볼 수 있습니다! %2$s 여기에 표시되는 것은 보관을위한 cron 작업 설정 빈도에 상관없는 라이브 데이터입니다.",
"VisitorProfile": "방문자 프로필",
"VisitorsLastVisit": "이 방문객의 최신 방문은 %s일 입니다.",
"OnClickPause": "%s이\/가 시작되었습니다. 멈추기 위해서 클릭해주세요.",
"OnClickStart": "%s이\/가 멈추었습니다. 시작하기 위해서 클릭해주세요."
}
}

View File

@ -0,0 +1,21 @@
{
"Live": {
"FirstVisit": "Pirmasis apsilankymas",
"GoalType": "Tipas",
"HideMap": "paslėpti žemėlapį",
"KeywordRankedOnSearchResultForThisVisitor": "Šiam lankytojui raktažodis %1$s buvo parodytas %2$s %3$s paieškos rezultatuose",
"LastHours": "Paskutinės %s valandos",
"LastMinutes": "Paskutinės %s minutės",
"LastVisit": "Paskutinis apsilankymas",
"LoadMoreVisits": "Įkelti daugiau apsilankymų",
"NbVisitor": "1 lankytojas",
"NbVisitors": "%s lankytojų",
"NextVisitor": "Kitas lankytojas",
"PreviousVisitor": "Ankstesnis lankytojas",
"Referrer_URL": "Persiunčiančiojo URL",
"ShowMap": "rodyti žemėlapį",
"ViewVisitorProfile": "Peržiūrėti lankytojo profilį",
"VisitedPages": "Aplankyti puslapiai",
"VisitorsLastVisit": "Šio lankytojo paskutinis apsilankymas buvo prieš %s dienų."
}
}

View File

@ -0,0 +1,11 @@
{
"Live": {
"GoalType": "Tips",
"KeywordRankedOnSearchResultForThisVisitor": "Atslēgvārds %1$s ir %2$s vietā %3$s šī lietotāja meklēšanas rezultātu lapā.",
"LastHours": "Pēdējās %s stundas",
"LastMinutes": "Pēdējās %s minūtes",
"Referrer_URL": "Atsauces URL",
"VisitorLogDocumentation": "Šī tabula atspoguļo pēdējos apmeklējumus izvēlētajā datumu intervālā. Jūs varat apskatīt pēdējo apmeklētāja apmeklējuma laiku kursoru uzbīdot uz apmeklējuma datuma. %1$s Ja datumu intervāls iekļauj šodienu, Jūs varat skatīt apmeklētājus reāllaikā! %2$s Dati, kas apskatāmi šeit, ir vienmēr aktuālie, neatkarīgi no tā vai lietojat arhivēšanas darbu, vai nē.",
"VisitorsLastVisit": "Šī apmeklētāja pēdējais apmklējums bija %s dienas atpakaļ."
}
}

View File

@ -0,0 +1,28 @@
{
"Live": {
"AveragePageGenerationTime": "Hver side tok i gjennomsnitt %1$s å laste for denne brukeren.",
"ClickToViewMoreAboutVisit": "Klikk for å se mer informasjon om dette besøket",
"ConvertedNGoals": "Konverterte %s mål",
"FirstVisit": "Første besøk",
"GoalType": "Type",
"HideMap": "skjul kart",
"LastHours": "Siste %s timer",
"LastMinutes": "Siste %s minutter",
"LastVisit": "Siste besøk",
"NbVisitor": "1 besøker",
"NbVisitors": "%s besøkere",
"NextVisitor": "Neste besøker",
"PreviousVisitor": "Forrige besøker",
"RealTimeVisitorCount": "Besøkstall i sanntid",
"Referrer_URL": "Henvisnings-URL",
"ShowMap": "vis kart",
"SimpleRealTimeWidget_Message": "%1$s og %2$s i de siste %3$s",
"ViewVisitorProfile": "Vis besøksprofil",
"VisitedPages": "Besøkte sider",
"VisitorProfile": "Besøksprofil",
"VisitsFrom": "%1$s%2$s besøk%3$s fra",
"VisitSummaryWithActionDetails": "Brukte totalt %1$s%2$s på nettstedet%3$s, og utførte %4$s handlinger%5$s (%6$s) i løpet av %7$s besøk%8$s.",
"OnClickPause": "%s er startet. Klikk for å sette på pause.",
"OnClickStart": "%s er stoppet. Klikk for å starte."
}
}

View File

@ -0,0 +1,44 @@
{
"Live": {
"AveragePageGenerationTime": "Elke pagina duurde gemiddeld %1$s om te laden voor deze bezoeker.",
"CalculatedOverNPageViews": "Berekend met de laatste %1$s paginaweergaves van deze bezoeker.",
"ClickToViewMoreAboutVisit": "Klik om meer informatie over dit bezoek te zien",
"ConvertedNGoals": "Behaalde %s Doelen",
"FirstVisit": "Eerste bezoek",
"GoalType": "Type",
"HideMap": "Verberg kaart",
"KeywordRankedOnSearchResultForThisVisitor": "Het trefwoord %1$s scoorde voor deze bezoeker op positie %2$s op de %3$s zoekresultaat pagina.",
"LastHours": "Laatste %s uur",
"LastMinutes": "Laatste %s minuten",
"LastVisit": "Laatste bezoek",
"LoadMoreVisits": "Meer bezoeken laden",
"MorePagesNotDisplayed": "meer pagina's worden niet getoond bij deze bezoeker",
"NbVisitor": "1 bezoeker",
"NbVisitors": "%s bezoekers",
"NextVisitor": "Volgende bezoeker",
"NoMoreVisits": "Er zijn niet meer bezoeken van deze bezoeker.",
"PageRefreshed": "Aantal keren dat deze pagina werd bekeken \/ ververst in een rij.",
"PluginDescription": "Bevat de bezoekerslog en toont je bezoekers real-time in de widget op het dashboard. De plugin toont je ook het bezoekersprofiel van elke bezoeker.",
"PreviousVisitor": "Vorige bezoeker",
"RealTimeVisitorCount": "Real Time bezoekers aantal",
"Referrer_URL": "Referrer URL",
"ShowMap": "kaart tonen",
"ActionsAndDuration": "%1$s acties in %2$s",
"SimpleRealTimeWidget_Message": "%1$s en %2$s in de laatste %3$s",
"ViewVisitorProfile": "Profiel bezoeker bekijken",
"VisitedPages": "Bezochte pagina's",
"RevisitedPages": "Pagina's die meer dan eens zijn bekeken",
"ToggleActions": "Schakelen tussen zichtbaarheid van alle acties",
"TopVisitedPages": "Best bezochte pagina's",
"VisitsLog": "Logboek bezoeken",
"VisitorLog": "Bezoekerslogboek",
"VisitorLogDocumentation": "Deze tabel toont de laatste bezoeken binnen het geselecteerde datumbereik. Je kunt zien wanneer een bezoeker zijn laatste bezoek bracht door je muis boven de datum te houden. %1$s Indien het datumbereik ook vandaag bevat, kun je je bezoekers zien in real time! %2$s De data die hier wordt getoond is steeds live, ongeacht of en wanneer je de archiving cron job gebruikt.",
"VisitorProfile": "Profiel bezoeker",
"VisitorsLastVisit": "Het laatste bezoek van deze bezoekers was %s dagen geleden.",
"VisitsFrom": "%1$s%2$s bezoeken%3$s van",
"VisitSummary": "Besteedde in totaal %1$s%2$s op de website %3$s, en bekeek %4$s pagina's %5$s in %6$s bezoeken %7$s.",
"VisitSummaryWithActionDetails": "Besteedde in totaal %1$s%2$s op de website%3$s, en verrichte %4$s acties%5$s (%6$s) in %7$s bezoeken%8$s.",
"OnClickPause": "%s is gestart. Klik om te pauzeren.",
"OnClickStart": "%s is gestopt. Klik om te starten."
}
}

View File

@ -0,0 +1,11 @@
{
"Live": {
"GoalType": "Type",
"LastHours": "Seinaste %s timar",
"LastMinutes": "Seinaste %s minutt",
"MorePagesNotDisplayed": "fleire sider av denne vitjaren er ikkje vist",
"PageRefreshed": "Tal på gonger denne sida var vist \/ oppdatert.",
"VisitorLogDocumentation": "Denne tabellen visar dei seinaste vitjingane innan tidsperioden. Du kan sjå den førre vitjinga til ein vitjar ved å halda peikaren over datoen til ei vitjing. %1$s Viss tidsperioden inkluderer idag, kan du sjå vitjarane dine i sanntid! %2$s Data her er alltid i sanntid, same om og kor ofte Matomo arkiverer dei.",
"VisitorsLastVisit": "Den førre vitjinga til vitjaren var %s dagar sidan."
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Średni czas ładowania podstron dla tego oglądającego wyniósł:%1$s.",
"CalculatedOverNPageViews": "Obliczono biorąc pod uwagę ostatnie %1$s wyświetleń strony.",
"ClickToViewMoreAboutVisit": "Kliknij po więcej informacji o tej wizycie",
"ClickToViewAllActions": "Kliknij, aby zobaczyć szczegóły wszystkich akcji tej grupy",
"ConvertedNGoals": "%s konwersji celów",
"FirstVisit": "Pierwsza wizyta",
"GoalType": "Rodzaj",
"HideMap": "ukryj mapę",
"KeywordRankedOnSearchResultForThisVisitor": "Słowo kluczowe %1$s zdobyło pozycję %2$s w %3$s wynikach wyszukiwania strony dla tego odwiedzającego",
"LastHours": "Ostatnie %s godziny",
"LastMinutes": "Ostatnie %s minut",
"LastVisit": "Ostatnia wizyta",
"LinkVisitorLog": "Zobacz szczegółowy dziennik wyzyty",
"LoadMoreVisits": "Załaduj więcej odwiedzin",
"LimitedSummary": "Informacja w tym profilu podsumowuje ostatnie %1$s wizyt. Użytkownik złożył więcej wizyt łącznie.",
"LimitedVisitsShown": "Wyświetlane jest tylko ostatnich %1$s wizyt. Użytkownik złożył więcej wizyt.",
"MorePagesNotDisplayed": "pozostałe podstrony dla tego oglądającego nie zostaną wyświetlone",
"NbVisitor": "1 gość",
"NbVisitors": "%s gości",
"NextVisitor": "Następny gość",
"NoMoreVisits": "Nie było więcej wizyt tego odwiedzającego.",
"PageRefreshed": "Liczba odsłon \/ odświeżeń tej strony z rzędu.",
"PluginDescription": "Dostarcza podgląd \"na żywo\" Dziennika odwiedzajacych i pozwala \"na żywo\" śledzić odwiedzających w widżecie na Pulpicie. Wtyczka pozwala również oglądać profil dowolnego odwiedzającego.",
"PreviousVisitor": "Poprzedni odwiedzający",
"RealTimeVisitors": "Wizyty w czasie rzeczywistym",
"RealTimeVisitorCount": "Licznik odwiedzin aktualizowany w czasie rzeczywistym",
"Referrer_URL": "Adres URL odnośnika",
"ShowMap": "pokaż mapę",
"ActionsAndDuration": "%1$s akcji w %2$s",
"SimpleRealTimeWidget_Message": "%1$s %2$s na %3$s ostatni",
"ViewVisitorProfile": "Zobacz profil odwiedzającego",
"VisitedPages": "Odwiedzone strony",
"RevisitedPages": "Strony wyświetlone więcej niż raz",
"ToggleActions": "Przełącz widoczność wszystkich akcji",
"TopVisitedPages": "Najczęściej odwiedzane strony",
"VisitsLog": "Dziennik wizyt",
"VisitorLog": "Dziennik wizyt",
"VisitorLogDocumentation": "Ta tabela prezentuje ostatnie wizyty w wybranym przedziale czasowym. Przesuwając wskaźnik nad wybraną datę wizyty, możesz określić czas ostatniej wizyty odwiedzającego. %1$s Jeśli przedział zawiera dzień dzisiejszy, możesz obserwować odwiedzających w czasie rzeczywistym! %2$s Dane tu wyświetlane są zawsze na żywo, bez względu na to jak często używasz cron'a archiwizującego.",
"VisitorLogNoDataMessagePurged": "Najprawdopodobniej dane zostały wykasowane, ponieważ regularne czyszczenie starych logów odwiedzin jest aktywne, a data tego raportu jest większa niż %s dni. Super Użytkownik może zmienić to ustawienia w panelu Zarządzanie > Prywatność.",
"VisitorProfile": "Profil odwiedzającego",
"VisitorsInRealTime": "Wizyty w czasie rzeczywistym",
"VisitorsLastVisit": "Ostatnia wizyta tego gościa była %s dni temu.",
"VisitsFrom": "%1$s%2$s wizyt%3$s z",
"VisitSummary": "Spędził łącznie %1$s%2$s w serwisie%3$s i obejrzał %4$s podstron%5$s w trakcie %6$s wizyt%7$s.",
"VisitSummaryWithActionDetails": "Spędził łącznie %1$s%2$s w serwisie%3$s i przeprowadził %4$s działań%5$s (%6$s) w trakcie %7$s wizyt%8$s.",
"RowActionTooltipDefault": "Wyświetl Dziennik wizyt pogrupowany według tego rzędu",
"RowActionTooltipWithDimension": "Wyświetl Dziennik wizyt pogrupowany według %s",
"RowActionTooltipTitle": "Otwórz pogrupowany Dziennik wizyt",
"SegmentedVisitorLogTitle": "Wyświetlam Dziennik wizyt dla %1$s równego \"%2$s\"",
"OnClickPause": "%s został uruchomiony. Kliknij aby zatrzymać.",
"OnClickStart": "%s jest zatrzymany. Kliknij aby uruchomić."
}
}

View File

@ -0,0 +1,43 @@
{
"Live": {
"AveragePageGenerationTime": "Cada página levou em média %1$s para carregar para este visitante.",
"CalculatedOverNPageViews": "Calculado usando as últimas %1$s exibições de página deste visitante.",
"ClickToViewMoreAboutVisit": "Clique para ver mais informações sobre esta visita",
"ClickToViewAllActions": "Clicar para ver todas as ações deste grupo em detalhes",
"ConvertedNGoals": "%s Metas convertidas",
"FirstVisit": "Primeiro visitante",
"GoalType": "Tipo",
"HideMap": "esconder mapa",
"KeywordRankedOnSearchResultForThisVisitor": "A palavra-chave %1$s foi classificada %2$s em %3$s páginas de resultados de pesquisa para este visitante",
"LastHours": "Últimas %s horas",
"LastMinutes": "Últimos %s minuto(s)",
"LastVisit": "Última visita",
"LoadMoreVisits": "Carregar mais visitas",
"MorePagesNotDisplayed": "mais páginas por este visitante não são exibidos",
"NbVisitor": "1 visitante",
"NbVisitors": "%s visitantes",
"NextVisitor": "Próximo visitante",
"NoMoreVisits": "Não existem mais visitas para este visitante.",
"PageRefreshed": "Número de vezes que esta página foi vista \/ recarregada em uma linha.",
"PluginDescription": "Fornece o Registro de Visitantes em tempo real e permite que você assista seus visitantes ao vivo no widget do painel. O plugin também permite que você veja o perfil de Visitante de qualquer usuário.",
"PreviousVisitor": "Visitante anterior",
"RealTimeVisitorCount": "Contagem de visitantes em tempo real",
"Referrer_URL": "URL do Referenciador",
"ShowMap": "mostrar mapa",
"ActionsAndDuration": "%1$s ações em %2$s",
"SimpleRealTimeWidget_Message": "%1$s e %2$s na última %3$s.",
"ViewVisitorProfile": "Ver o perfil do visitante",
"VisitedPages": "Páginas visitadas",
"RevisitedPages": "Páginas visualizadas mais de uma vez",
"ToggleActions": "Alternar visibilidade de todas as ações",
"TopVisitedPages": "Principais páginas visitadas",
"VisitorLogDocumentation": "Esta tabela mostra as últimas visitas dentro do período selecionado. Você pode ver quando a última visita de um visitante ocorreu passando o mouse sobre a data da visita. %1$s se o intervalo de data incluir hoje, você pode ver os seus visitantes em tempo real! %2$s Os dados exibidos aqui são sempre ao vivo, independentemente de estar usando o arquivamento agendado por cron.",
"VisitorProfile": "Páginas visitadas",
"VisitorsLastVisit": "A última visita deste visitante foi a %s dias atrás.",
"VisitsFrom": "%1$s%2$s visitas%3$s de",
"VisitSummary": "Passou um total de %1$s%2$s no website%3$s, e viu %4$s páginas%5$s em %6$s visitas%7$s.",
"VisitSummaryWithActionDetails": "Passou um total de %1$s%2$s no website%3$s, e realizou %4$s ações%5$s (%6$s) em %7$s visitas%8$s.",
"OnClickPause": "%s iniciou. Clique para pausar.",
"OnClickStart": "%s parou. Clique para iniciar."
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Cada página demorou uma média de %1$s a carregar para este visitante.",
"CalculatedOverNPageViews": "Calculado utilizando as últimas %1$s visualizações de páginas do visitante.",
"ClickToViewMoreAboutVisit": "Clique para ver mais informação sobre esta visita",
"ClickToViewAllActions": "Clique para ver em detalhe todas as ações para este grupo",
"ConvertedNGoals": "%s objetivos convertidos",
"FirstVisit": "Primeira visita",
"GoalType": "Tipo",
"HideMap": "ocultar mapa",
"KeywordRankedOnSearchResultForThisVisitor": "A palavra-chave %1$s foi classificada %2$s na página de resultados de pesquisa %3$s para este visitante",
"LastHours": "Últimas %s horas",
"LastMinutes": "Últimos %s minutos",
"LastVisit": "Última visita",
"LinkVisitorLog": "Ver registo detalhado de visitas",
"LoadMoreVisits": "Carregar mais visitas",
"LimitedSummary": "A informação deste perfil resume as últimas %1$s visitas. No total, este utilizador teve mais visitas.",
"LimitedVisitsShown": "Apenas as últimas %1$s visitas são mostradas. No total, este utilizador teve mais visitas.",
"MorePagesNotDisplayed": "não são mostradas mais páginas por este visitante",
"NbVisitor": "1 visitante",
"NbVisitors": "%s visitantes",
"NextVisitor": "Próximo visitante",
"NoMoreVisits": "Não existem mais visitas para este visitante",
"PageRefreshed": "O número de vezes que esta página foi vista\/atualizada de uma vez.",
"PluginDescription": "Fornece o registo em tempo real do visitante e permite-lhe ver os seus visitantes em tempo real na widget do painel. A extensão também lhe permite ver o perfil do Visitante para qualquer utilizador.",
"PreviousVisitor": "Visitante anterior",
"RealTimeVisitors": "Visitas em tempo-real",
"RealTimeVisitorCount": "Contagem dos visitantes em tempo real",
"Referrer_URL": "Endereço do referenciador",
"ShowMap": "mostrar o mapa",
"ActionsAndDuration": "%1$s ações em %2$s",
"SimpleRealTimeWidget_Message": "%1$s e %2$s nos últimos %3$s",
"ViewVisitorProfile": "Ver perfil do visitante",
"VisitedPages": "Páginas visitadas",
"RevisitedPages": "Páginas vistas mais do que uma vez",
"ToggleActions": "Ativar visibilidade para todas as ações",
"TopVisitedPages": "Principais páginas visitadas",
"VisitsLog": "Registo de visitas",
"VisitorLog": "Registo de visitas",
"VisitorLogDocumentation": "Esta tabela mostra as últimas visitas dentro do período selecionado. Pode ver quando ocorreu a última visita de um visitante passando o cursor sobre os dados de uma visita. %1$s Se o intervalo de datas incluir hoje, pode ver os seus visitantes em tempo real! %2$s Os dados apresentados aqui são sempre em tempo real, independentemente de quantas vezes está a utilizar a tarefa cron de arquivamento.",
"VisitorLogNoDataMessagePurged": "É provável que os dados tenham sido limpos visto que a eliminação periódica de dados em bruto antigos está ativa e a data para este relatório ultrapassa os %s dias. Um super-utilizador pode alterar esta configuração ao aceder a Administração => Privacidade.",
"VisitorProfile": "Perfil do visitante",
"VisitorsInRealTime": "Visitas em tempo-real",
"VisitorsLastVisit": "A última visita do utilizador ocorreu à %s dias atrás.",
"VisitsFrom": "%1$s%2$s visitas%3$s de",
"VisitSummary": "Despendeu um total de %1$s%2$s no site%3$s, e viu %4$s páginas%5$s em %6$s visitas%7$s.",
"VisitSummaryWithActionDetails": "Despendeu um total de %1$s%2$s no site%3$s, e executou %4$s ações%5$s (%6$s) em %7$s visitas%8$s.",
"RowActionTooltipDefault": "Mostrar o registo segmentado de visitas por esta linha",
"RowActionTooltipWithDimension": "Mostrar o registo segmentado de visitas por este %s",
"RowActionTooltipTitle": "Abrir o registo segmentado de visitas",
"SegmentedVisitorLogTitle": "O registo de visitas mostrando as visitas onde %1$s é \"%2$s\"",
"OnClickPause": "%s está iniciado. Clique para pausar.",
"OnClickStart": "%s está parado. Clique para iniciar."
}
}

View File

@ -0,0 +1,33 @@
{
"Live": {
"AveragePageGenerationTime": "Fiecare pagină a avut, în medie %1$s pentru a încărca pentru acest vizitator.",
"CalculatedOverNPageViews": "Calculat folosind aceast vizitator trecut %1$s pagini văzute.",
"ClickToViewMoreAboutVisit": "Click pentru a vedea mai multe informații despre această vizită",
"ConvertedNGoals": "Convertit %s Goluri",
"FirstVisit": "Prima vizita",
"GoalType": "Tip",
"HideMap": "ascunde hartă",
"KeywordRankedOnSearchResultForThisVisitor": "Cuvinte cheie %1$s au fost clasate pe locul %2$s pe %3$s căutare pagina a rezultate pentru acest vizitator",
"LastHours": "Ultimele %s ore",
"LastMinutes": "Ultimele %s minute",
"LastVisit": "Ultima vizita",
"LoadMoreVisits": "Încărcați mai multe vizite",
"MorePagesNotDisplayed": "mai multe pagini de acest vizitator nu sunt afișate",
"NbVisitor": "1 vizitator",
"NbVisitors": "%s vizitatori",
"NextVisitor": "Urmatorul vizitator",
"NoMoreVisits": "Nu există mai multe vizite pentru acest vizitator.",
"PageRefreshed": "De cate ori aceasta pagina a fost vizualizata \/ reincarcata într-un rând.",
"PreviousVisitor": "Vizitatorul anterior",
"RealTimeVisitorCount": "Numărul vizitatori în timp real",
"Referrer_URL": "Referal URL",
"ShowMap": "Arata harta",
"SimpleRealTimeWidget_Message": "%1$s și %2$s în ultimele %3$s",
"ViewVisitorProfile": "Vezi profilul vizitatorului",
"VisitedPages": "Pagini vizitate",
"VisitorLogDocumentation": "Acest tabel arată cele mai recente vizite în intervalul de date selectat. Puteți vedea când a fost ultima vizita a unui vizitator a avut loc. %1$s În cazul în care intervalul de date include astăzi, puteți vedea vizitatorii dvs. în timp real! %2$s Datele afișate aici sunt mereu actualizate, indiferent cand si cât de des folosiți arhivarea cron.",
"VisitorProfile": "Profilul vizitator",
"VisitorsLastVisit": "Ultima vizită a acestui vizitator a avut loc cu %s zile în urmă.",
"VisitsFrom": "%1$s%2$s vizite%3$s de la"
}
}

View File

@ -0,0 +1,51 @@
{
"Live": {
"AveragePageGenerationTime": "В среднем требовалось %1$s у этого посетителя для полной загрузки страницы.",
"CalculatedOverNPageViews": "Рассчитано на основе этого посетителя с %1$s просмотром страниц(ы).",
"ClickToViewMoreAboutVisit": "Посмотреть более подробную информацию об этом визите",
"ClickToViewAllActions": "Нажмите здесь, чтобы показать все действия этой группы в деталях",
"ConvertedNGoals": "Целей достигнуто: %s",
"FirstVisit": "Первое посещение",
"GoalType": "Тип",
"HideMap": "скрыть карту",
"KeywordRankedOnSearchResultForThisVisitor": "Ключевое слово %1$s занимает %2$s место на %3$s странице поиска для этого посетителя",
"LastHours": "Последние %s часов",
"LastMinutes": "Последние %s минут",
"LastVisit": "Последнее посещение",
"LinkVisitorLog": "Показать детализированный журнал посещений",
"LoadMoreVisits": "Загрузить больше посетителей",
"LimitedSummary": "Информация в этом профиле суммирует последние %1$s посещений. Этот пользователь имеет больше посещений.",
"LimitedVisitsShown": "Показаны только последние %1$s посещений. Этот пользователь имеет больше посещений.",
"MorePagesNotDisplayed": "Больше страниц по этому посетителю не отображается.",
"NbVisitor": "1 посетитель",
"NbVisitors": "%s посетителей",
"NextVisitor": "Следующий посетитель",
"NoMoreVisits": "Больше нет посещений у этого посетителя.",
"PageRefreshed": "Сколько раз эта страница была просмотрена \/ обновлена несколько ряд подряд.",
"PluginDescription": "Показывает актуальный журнал посетителей и позволяет смотреть ваших посетителей в режиме реального времени на приборной панели виджетов. Плагин также позволяет просматривать профиль посетителя для каждого пользователя.",
"PreviousVisitor": "Предыдущий посетитель",
"RealTimeVisitors": "Посещения в реальном времени",
"RealTimeVisitorCount": "Счётчик посетителей в реальном времени",
"Referrer_URL": "URL источника",
"ShowMap": "показать карту",
"ActionsAndDuration": "%1$s действий за %2$s",
"SimpleRealTimeWidget_Message": "%1$s и %2$s за последние %3$s",
"ViewVisitorProfile": "Посмотреть профиль посетителя",
"VisitedPages": "Посещённые страницы",
"RevisitedPages": "Просмотры страниц более одного раза",
"ToggleActions": "Переключить видимость всех действий",
"TopVisitedPages": "Самые посещаемые страницы",
"VisitsLog": "Журнал посещений",
"VisitorLog": "Журнал посещений",
"VisitorLogDocumentation": "Эта таблица показывает последние посещения за выбранный период. Вы можете видеть последнее посещение пользователя при наведении мыши на дату посещения. %1$s Если период включает сегодняшний день, вы можете наблюдать за посетителями в реальном времени! %2$s Данные здесь всегда отображаются в режиме реального времени вне зависимости от того, как часто вы используете архивацию по крону.",
"VisitorProfile": "Профиль посетителя",
"VisitorsInRealTime": "Посещения в реальном времени",
"VisitorsLastVisit": "Последнее посещение этого пользователя было %s дней назад.",
"VisitsFrom": "%1$s%2$s визитов%3$s от",
"VisitSummary": "Провел в общей сложности %1$s%2$s на веб-сайте%3$s и просмотрел %4$s страниц%5$s за %6$s посещений%7$s.",
"VisitSummaryWithActionDetails": "Провел в общей сложности%1$s%2$s на веб-сайте%3$s и совершил %4$s действий%5$s (%6$s) за %7$s посещений%8$s.",
"RowActionTooltipTitle": "Открыть сегментированный журнал посещений",
"OnClickPause": "%s началось. Нажмите, чтобы приостановить.",
"OnClickStart": "%s остановлено. Нажмите, чтобы начать."
}
}

View File

@ -0,0 +1,22 @@
{
"Live": {
"ClickToViewMoreAboutVisit": "Klinite pre viac informáciío tejto návšteve.",
"FirstVisit": "Prvá návšteva",
"GoalType": "Typ",
"HideMap": "skryť mapu",
"LastHours": "Posledných %s hodín",
"LastMinutes": "Posledných %s minút",
"LastVisit": "Posledná návšteva",
"LoadMoreVisits": "Načítať viac návštev",
"NbVisitor": "1 návštevník",
"NbVisitors": "%s návštevníkov",
"NextVisitor": "Ďalší návštevník",
"PreviousVisitor": "Predchádzajúci návštevník",
"RealTimeVisitorCount": "Sledovanie návštev v reálnom čase",
"Referrer_URL": "Referenčné URL",
"ShowMap": "zobraziť mapu",
"SimpleRealTimeWidget_Message": "%1$s a %2$s v posledných %3$s",
"VisitedPages": "Navštívené stránky",
"VisitorProfile": "Profil užívateľa"
}
}

View File

@ -0,0 +1,10 @@
{
"Live": {
"GoalType": "Tip",
"LastHours": "Zadnjih %s ur",
"LastMinutes": "Zadnjih %s minut",
"NbVisitor": "1 obiskovalec",
"NbVisitors": "%s obiskovalcev",
"VisitorsLastVisit": "Zadnji obisk tega obiskovalce je bil pred %s dnevi."
}
}

View File

@ -0,0 +1,53 @@
{
"Live": {
"AveragePageGenerationTime": "Për këtë vizitor, çdo faqeje iu desh mesatarisht %1$s të ngarkohej.",
"CalculatedOverNPageViews": "E llogaritur duke përdorur %1$s parjet e fundit të faqeve nga ky vizitor.",
"ClickToViewMoreAboutVisit": "Klikoni që të shihni më tepër të dhëna rreth kësaj vizite",
"ClickToViewAllActions": "Klikoni për të parë hollësisht krejt veprimet e këtij grupi",
"ConvertedNGoals": "U shndërruan %s Objektiva",
"FirstVisit": "Vizita e parë",
"GoalType": "Lloj",
"HideMap": "fshihe hartën",
"KeywordRankedOnSearchResultForThisVisitor": "Për këtë vizitor, fjalëkyçi %1$s u radhit i %2$s te faqja e përfundimeve të kërkimit për %3$s",
"LastHours": "%s orët e fundit",
"LastMinutes": "%s minutat e fundit",
"LastVisit": "Vizita e fundit",
"LinkVisitorLog": "Shihni regjistër të hollësishëm vizitash",
"LoadMoreVisits": "Ngarko më tepër vizita",
"LimitedSummary": "Të dhënat në këtë profil përmbledhin %1$s vizitat e fundit. Ky përdorues ka bërë më tepër vizita gjithsej.",
"LimitedVisitsShown": "Shfaqen vetëm %1$s vizitat e fundit. Ky përdorues ka bërë më tepër vizita gjithsej.",
"MorePagesNotDisplayed": "faqe të tjera nga ky vizitor nuk janë shfaqur",
"NbVisitor": "1 vizitor",
"NbVisitors": "%s vizitorë",
"NextVisitor": "Vizitori pasues",
"NoMoreVisits": "Ska më vizita për këtë vizitor.",
"PageRefreshed": "Sa herë rresht është parë \/ rifreskuar kjo faqe.",
"PluginDescription": "Furnizon Regjistër Vizitorësh live dhe ju lejon të shihni vizitorët drejtpërsëdrejti, te widget-i real-time i pultit . Shtojca ju lejon gjithashtu të shihni profil Vizitori për cilindo përdorues.",
"PreviousVisitor": "Vizitori i mëparshëm",
"RealTimeVisitorCount": "Numërim Vizitorësh i Atypëratyshëm",
"Referrer_URL": "URL Sjellësi",
"ShowMap": "shfaq hartën",
"ActionsAndDuration": "%1$s veprime në %2$s",
"SimpleRealTimeWidget_Message": "%1$s dhe %2$s në %3$s e fundit",
"ViewVisitorProfile": "Shini profilin e vizitorit",
"VisitedPages": "Faqe të vizituara",
"RevisitedPages": "Faqe të para më shumë se një herë",
"ToggleActions": "Aktivizo\/çaktivizo dukshmërinë e krejt veprimeve",
"TopVisitedPages": "Faqet kryesuese të vizituara",
"VisitsLog": "Regjistër Vizitash",
"VisitorLog": "Regjistër Vizitash",
"VisitorLogDocumentation": "Kjo tabelë tregon vizitat e fundit brenda intervalit kohor të përzgjedhur. Se kur u bë vizita e fundit nga një vizitor, mund ta shihni duke kaluar kursorin përsipër datës së një vizite. %1$s Nëse intervali kohor e përfshin ditën e sotme, mund ti shihni vizitorët aty për aty! %2$s Të dhënat e shfaqura këtu janë përherë më të rejat, pavarësisht nëse e përdorni apo jo, dhe se sa shpesh, funksionin cron për arkivim.",
"VisitorLogNoDataMessagePurged": "Ka mundësi që të dhënat të jenë spastruar ngaqë fshirja e rregullt është aktive dhe data për këtë raport është më e vjetër se %s ditë. Këtë rregullim mund ta ndryshojë një superpërdorues, duke shkuar te Administrim => Privatësi.",
"VisitorProfile": "Profil vizitori",
"VisitorsLastVisit": "Vizita e fundit e këtij vizitori ndodhi %s ditë më parë.",
"VisitsFrom": "%1$s%2$s vizita%3$s nga",
"VisitSummary": "Shpenzoi gjithsej %1$s%2$s në sajtin%3$s, dhe pa %4$s faqe%5$s gjatë %6$s vizitash%7$s.",
"VisitSummaryWithActionDetails": "Shpenzoi gjithsej %1$s%2$s në sajtin%3$s, dhe kreu %4$s veprime%5$s (%6$s) gjatë %7$s vizitash%8$s.",
"RowActionTooltipDefault": "Shfaqe Regjistrin e Vizitave të ndarë nga ky rresht",
"RowActionTooltipWithDimension": "Shfaqe Regjistrin e Vizitave të ndarë nga ky %s",
"RowActionTooltipTitle": "Hap Regjistër Vizitash të segmentuar",
"SegmentedVisitorLogTitle": "Regjistri i Vizitave po shfaq vizita ku %1$s është \"%2$s\"",
"OnClickPause": "%s është nisur. Klikoni që të ndalet.",
"OnClickStart": "%s është ndalur. Klikoni që të niset."
}
}

View File

@ -0,0 +1,38 @@
{
"Live": {
"AveragePageGenerationTime": "Ovom korisniku je za svaku stranicu u proseku potrebno %1$s kako bi se učitala.",
"CalculatedOverNPageViews": "Izračunato na osnovu poslednjih %1$s prikaza stranica ovog korisnika",
"ClickToViewMoreAboutVisit": "Kliknite kako biste videli više informacija o ovoj poseti.",
"ConvertedNGoals": "Ispunjeno ciljeva: %s",
"FirstVisit": "Prva poseta",
"GoalType": "Tip",
"HideMap": "sakrij mapu",
"KeywordRankedOnSearchResultForThisVisitor": "Ključna reč %1$s je rangirana na mestu %2$s kao %3$s rezultat pretrage ovog posetioca.",
"LastHours": "Poslednjih %s sati",
"LastMinutes": "Poslednjih %s minuta",
"LastVisit": "Poslednja poseta",
"LoadMoreVisits": "Učitaj još poseta",
"MorePagesNotDisplayed": "više stranica ovog posetioca nisu prikazane",
"NbVisitor": "1 posetilac",
"NbVisitors": "%s posetilaca",
"NextVisitor": "Sledeći posetilac",
"NoMoreVisits": "Nema više poseta ovog posetioca.",
"PageRefreshed": "Broj prikaza ove stranice zaredom.",
"PluginDescription": "Omogućuje zapis poseta u realnom vremenu i pruža vam mogućnost da pratite vaše posetioce preko vidžeta. Dodatak takođe prikazuje profil posetioca za bilo kog korisnika.",
"PreviousVisitor": "Prethodni posetilac",
"RealTimeVisitorCount": "Brojač posetilaca u realnom vremenu",
"Referrer_URL": "Referenca",
"ShowMap": "prikaži mapu",
"SimpleRealTimeWidget_Message": "%1$s i %2$s u poslednjih %3$s.",
"ViewVisitorProfile": "Profil novog posetioca",
"VisitedPages": "Posećene stranice",
"VisitorLogDocumentation": "Ova tabela prikazuje poslednje posete unutar izabranog vremenskog opsega. Možete videti poslednju posetu pomeranjem miša preko datuma posete. %1$s Ako vremenski opseg obuhvata i današnji dan, možete videti vaše posetioce u realnom vremenu! %2$s Podaci ovde prikazani su uvek u realnom vremenu bez obzira na to koliko često koristite cron.",
"VisitorProfile": "Profil posetioca",
"VisitorsLastVisit": "Poslednja poseta je bila pre %s dana.",
"VisitsFrom": "%1$s%2$s poseta%3$s sa",
"VisitSummary": "Utrošeno ukupno %1$s%2$s na sajtu%3$s, prikazano %4$s stranica%5$s u %6$s poseta%7$s.",
"VisitSummaryWithActionDetails": "Utrošeno ukupno %1$s%2$s na sajtu%3$s, izvršeno %4$s akcija%5$s (%6$s) u %7$s poseta%8$s.",
"OnClickPause": "%s je pokrenut. Kliknite za pauzu.",
"OnClickStart": "%s je zaustavljen. Kliknite za start."
}
}

View File

@ -0,0 +1,45 @@
{
"Live": {
"AveragePageGenerationTime": "Varje sida tog i genomsnitt %1$s att ladda för besökaren.",
"CalculatedOverNPageViews": "Beräknat på denna besöakrens senaste %1$s sidvisningar.",
"ClickToViewMoreAboutVisit": "Klicka för mer information om det här besöket",
"ClickToViewAllActions": "Klicka för att se alla åtgärder i denna grupp i detalj",
"ConvertedNGoals": "Konverteringar %s Mål",
"FirstVisit": "Första besöket",
"GoalType": "Sort",
"HideMap": "Dölj mapp",
"KeywordRankedOnSearchResultForThisVisitor": "Nyckelordet %1$s rankades %2$s på %3$s i sökresultatet för besökaren",
"LastHours": "Senaste %s timmarna",
"LastMinutes": "Senaste %s minuterna",
"LastVisit": "Senaste besöket",
"LoadMoreVisits": "Ladda fler besökare",
"LimitedSummary": "Informationen i den här profilen sammanfattar de senaste %1$s besöken. Den här användaren hade mer besök totalt.",
"LimitedVisitsShown": "Endast de senaste %1$sbesöken visas. Den här användaren hade mer besök totalt.",
"MorePagesNotDisplayed": "fler sidor av den här besökaren visas inte",
"NbVisitor": "1 besökare",
"NbVisitors": "%s besökare",
"NextVisitor": "Nästa besökare",
"NoMoreVisits": "Det finns inga fler besök för den här besökaren.",
"PageRefreshed": "Antal gånger denna sida har besökts \/ uppdateras i rad.",
"PluginDescription": "Ger tillgång till Besöksloggen i realtid och låter dig hålla koll på dina besökare live i realtids instrumentpanelen. Tillägget låter dig också se en Besöksprofil för valfri användare.",
"PreviousVisitor": "Förgående besökare",
"RealTimeVisitorCount": "Besöksräknare i realtid",
"Referrer_URL": "Hänvisningsadress",
"ShowMap": "Visa mapp",
"ActionsAndDuration": "%1$s åtgärder i %2$s",
"SimpleRealTimeWidget_Message": "%1$s och %2$s dom senaste %3$s.",
"ViewVisitorProfile": "Ny besöksprofil",
"VisitedPages": "Besökta sidor",
"RevisitedPages": "Sidor visade fler än en gång",
"ToggleActions": "Växla synlighet för alla åtgärder",
"TopVisitedPages": "Mest besökta sidorna",
"VisitorLogDocumentation": "Denna tabell visar de senaste besök inom det valda datumintervallet. %1$s Om datumet inkluderar idag kan du se dina besökare i realtid! %2$s data som visas här är alltid live, oavsett om och hur ofta du använder cron-jobb för arkivering.",
"VisitorProfile": "Besöksprofil",
"VisitorsLastVisit": "Denna besökares senaste besök var %s dagar sedan.",
"VisitsFrom": "%1$s%2$s besökta %3$s från",
"VisitSummary": "Spenderade totalt %1$s%2$s på webbplatsen%3$s och kollade på %4$s sidor%5$s under %6$s besök%7$s.",
"VisitSummaryWithActionDetails": "Spenderade totalt %1$s%2$s på webbplatsen%3$s och genomförde %4$s händelser%5$s (%6$s) under %7$s besök%8$s.",
"OnClickPause": "%s är startad. Klicka för att pausa.",
"OnClickStart": "%s är stoppad. Klicka för att starta."
}
}

View File

@ -0,0 +1,9 @@
{
"Live": {
"GoalType": "வகை",
"LastHours": "கடைசி %s மணிநேரம்",
"LastMinutes": "கடைசி %s நிமிடங்கள்",
"NbVisitor": "1 வருகையாளர்",
"NbVisitors": "%s வருகையாளர்கள்"
}
}

View File

@ -0,0 +1,7 @@
{
"Live": {
"GoalType": "రకం",
"LastHours": "గత %s గంటలు",
"LastMinutes": "గత %s నిమిషాలు"
}
}

View File

@ -0,0 +1,10 @@
{
"Live": {
"GoalType": "รูปแบบ",
"KeywordRankedOnSearchResultForThisVisitor": "คำหลักที่ %1$s อยู่ในอันดับที่ %2$s บน %3$s หน้าผลการค้นหาสำหรับผู้เข้าชมวันนี้",
"LastHours": "%s ชั่วโมงที่ผ่านมา",
"LastMinutes": "%s นาทีที่ผ่านมา",
"Referrer_URL": "ที่มา URL",
"VisitorLogDocumentation": "ตารางนี้แสดงการเข้าชมล่าสุดภายในช่วงวันที่ที่เลือก %1$s หากช่วงวันที่ที่รวมถึงวันนี้คุณสามารถเห็นผู้เข้าชมของคุณเวลาจริง! %2$s ข้อมูลที่แสดงที่นี่อยู่เสมอโดยไม่คำนึงว่าและความถี่ที่คุณกำลังใช้ cron job"
}
}

View File

@ -0,0 +1,32 @@
{
"Live": {
"AveragePageGenerationTime": "Bawat pahina ay umaabot ng %1$s upang mag-load para sa bisita.",
"CalculatedOverNPageViews": "Kinakalkula gamit ang huling %1$s page view ng bisita na ito.",
"ClickToViewMoreAboutVisit": "Pindutin dito upang makita ang marami pang impormasyon tungkol sa pagbisita.",
"ConvertedNGoals": "Mga na convert %s na goal",
"FirstVisit": "Unang pagbisita",
"GoalType": "Uri",
"HideMap": "itago ang mapa",
"KeywordRankedOnSearchResultForThisVisitor": "Ang keyword na %1$s ay may ranggong %2$s sa %3$s pahina ng resulta.",
"LastHours": "Huling oras %s",
"LastMinutes": "Huling %s minuto",
"LastVisit": "Huling pagbisita",
"LoadMoreVisits": "Mag-load ng higit pang mga pagbisita",
"MorePagesNotDisplayed": "marami pang mga pahina ng bisitang ito ang hindi ipinapakita",
"NbVisitors": "mga bisita %s",
"NextVisitor": "Susunod na bisita",
"NoMoreVisits": "Wala nang bumisita para sa bisitang ito.",
"PageRefreshed": "Dami ng beses na binuksan ang pahinang ito \/ ni-refresh sa isang hilera.",
"PreviousVisitor": "nakaraang bisita",
"RealTimeVisitorCount": "Real Time na bilang ng mga bisita",
"Referrer_URL": "Referrer URL",
"ShowMap": "ipakita ang mapa",
"SimpleRealTimeWidget_Message": "%1$s at %2$s sa nakaraang %3$s",
"ViewVisitorProfile": "Tingnan ang profile ng bisita",
"VisitedPages": "Binisitang mga pahina",
"VisitorLogDocumentation": "Ang table na ito ay nagpapakita ng mga pinakabagong mga pagbisita sa loob ng napiling hanay ng petsa. Maaari mong makita kung kelan ang huling pag bisita ng iyong bisita sa pamamagitan ng pag hover sa petsa ng pag bisita. %1$s Kung ang sakop ng petsa ay kaasama ngayon makikita mo ang lahat ng iyong mga bisita real time! %2$s Ang datus ng pinapakita dito ay laging live hindi alintana at kung gaano kadalas mo ginagamit ang archiving cron-job.",
"VisitorProfile": "profile ng Bisita",
"VisitorsLastVisit": "Ang huling bisita ng bisitang ito ay %s araw na ang nakakalipas.",
"VisitsFrom": "%1$s%2$s pagbisita sa %3$s mula sa"
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "Bu ziyaretçi için her sayfanın yüklenmesi %1$s sürüyor.",
"CalculatedOverNPageViews": "Bu ziyaretçinin görüntülediği son %1$s sayfaya göre hesaplanmıştır.",
"ClickToViewMoreAboutVisit": "Bu ziyaret hakkında ayrıntılı bilgi almak için tıklayın",
"ClickToViewAllActions": "Bu grubun tüm işlem ayrıntılarını görüntülemek için tıklayın",
"ConvertedNGoals": "%s Hedef Tutturuldu",
"FirstVisit": "İlk ziyaret",
"GoalType": "Tür",
"HideMap": "haritayı gizle",
"KeywordRankedOnSearchResultForThisVisitor": "Bu ziyaretçi için arama sonuçları sayfasında %1$s anahtar sözcüğü %3$s üzerinde %2$s. sırada görüntüleniyor",
"LastHours": "Son %s saat",
"LastMinutes": "Son %s dakika",
"LastVisit": "Son ziyaret",
"LinkVisitorLog": "Ayrıntılı ziyaret kayıtlarını görüntüle",
"LoadMoreVisits": "Diğer ziyaretleri yükle",
"LimitedSummary": "Bu profildeki bilgiler son %1$s ziyareti içeriyor. Bu kullanıcının toplam ziyaret sayısı daha fazla.",
"LimitedVisitsShown": "Yalnız son %1$s ziyaret görüntüleniyor. Bu kullanıcının toplam ziyaret sayısı daha fazla.",
"MorePagesNotDisplayed": "sayfa daha var. Bu ziyaretçiye ait ve görüntülenmeyen",
"NbVisitor": "1 ziyaretçi",
"NbVisitors": "%s ziyaretçi",
"NextVisitor": "Sonraki ziyaretçi",
"NoMoreVisits": "Bu ziyaretçinin başka bir ziyareti yok.",
"PageRefreshed": "Bu sayfanın görüntülenme ve ardından yenilenme sayısı.",
"PluginDescription": "Ziyaretçi Günlüğünü tutar ve ziyaretçilerin gerçek zamanlı ve canlı olarak pano gerecinde izlenebilmesini sağlar. Uygulama eki ayrıca belirtilmiş bir kullanıcının ziyaretçi profilinin görüntülenebilmesini sağlar.",
"PreviousVisitor": "Önceki ziyaretçi",
"RealTimeVisitors": "Gerçek Zamanlı Ziyaretler",
"RealTimeVisitorCount": "Gerçek Zamanlı Ziyaretçi Sayısı",
"Referrer_URL": "Yönlendiren Adres",
"ShowMap": "haritayı görüntüle",
"ActionsAndDuration": "%1$s işlem %2$s içinde",
"SimpleRealTimeWidget_Message": "Son %3$s içinde %1$s ve %2$s",
"ViewVisitorProfile": "Ziyaretçi profilini görüntüle",
"VisitedPages": "Ziyaret edilmiş sayfalar",
"RevisitedPages": "Birden çok kez görüntülenen sayfalar",
"ToggleActions": "Tüm işlemlerin görünürlüğünü değiştir",
"TopVisitedPages": "En çok ziyaret edilen sayfalar",
"VisitsLog": "Ziyaret Kayıtları",
"VisitorLog": "Ziyaret Kayıtları",
"VisitorLogDocumentation": "Bu tabloda seçilmiş tarih aralığındaki son ziyaretler görüntülenir. Bir ziyaretçinin son ziyaretinin zamanını ziyaretin tarihi üzerine gelerek görebilirsiniz. %1$sBugünü de kapsayan tarih aralıklarında ziyaretçileri gerçek zamanlı olarak görebilirsiniz! %2$s. Burada görüntülenen veriler arşivleme zamanlanmış görevinin çalışma sıklığından bağımsız olarak her zaman canlıdır.",
"VisitorLogNoDataMessagePurged": "Veriler tamamen silinmiş görünüyor, çünkü eski ham verilerin düzenli olarak silinmesi seçeneği etkinleştirilmiş ve bu raporun tarihi %s günden eski. Bir Süper Kullanıcı Yönetim => Gizlilik bölümünden bu ayarı değiştirebilir.",
"VisitorProfile": "Ziyaretçi Profili",
"VisitorsInRealTime": "Gerçek Zamanlı Ziyaretler",
"VisitorsLastVisit": "Bu ziyaretçinin son ziyareti %s gün önceydi.",
"VisitsFrom": "Şuradan %1$s%2$s ziyaret %3$s",
"VisitSummary": "%3$s web sitesinde toplam %1$s%2$s zaman geçirdi ve %4$s %5$s sayfayı %6$s ziyaret ile görüntüledi%7$s.",
"VisitSummaryWithActionDetails": "%3$s web sitesinde toplam %1$s%2$s zaman geçirdi ve %4$s %5$s işlemi (%6$s) %7$sziyaret ile yaptı%8$s.",
"RowActionTooltipDefault": "Ziyaret Kayıtlarını bu satıra göre dilimleyerek görüntüle",
"RowActionTooltipWithDimension": "Ziyaret Kayıtlarını bu %s dilimlerinde görüntüle",
"RowActionTooltipTitle": "Dilimlere ayrılmış ziyaret kayıtlarını aç",
"SegmentedVisitorLogTitle": "%1$s değerinin \"%2$s\" olduğu ziyaret kayıtları görüntüleniyor",
"OnClickPause": "%s başlatıldı. Duraklatmak için tıklayın.",
"OnClickStart": "%s durduruldu. Başlatmak için tıklayın."
}
}

View File

@ -0,0 +1,39 @@
{
"Live": {
"AveragePageGenerationTime": "В середньому потрібно %1$s у цього відвідувача для повного завантаження сторінки.",
"CalculatedOverNPageViews": "Розраховано на основі цього відвідувача з %1$s переглядом сторінки(ок).",
"ClickToViewMoreAboutVisit": "Подивитися більш детальну інформацію про цей візит",
"ConvertedNGoals": "Цілей досягнуто: %s",
"FirstVisit": "Перше відвідування",
"GoalType": "Тип",
"HideMap": "приховати карту",
"KeywordRankedOnSearchResultForThisVisitor": "Ключове слово %1$s займає %2$s місце на %3$s сторінці пошуку для цього відвідувача",
"LastHours": "Останні %s годин",
"LastMinutes": "Останні %s хвилин",
"LastVisit": "Останнє відвідування",
"LoadMoreVisits": "Завантажити більше відвідувачів",
"MorePagesNotDisplayed": "Більше сторінок про цього відвідувача не відображається.",
"NbVisitor": "1 відвідувач",
"NbVisitors": "%s відвідувачів",
"NextVisitor": "Наступний відвідувач",
"NoMoreVisits": "Більше немає відвідувань у цього відвідувача.",
"PageRefreshed": "Скільки разів ця сторінка була переглянута \/ оновлена ​​кілька ряд поспіль.",
"PluginDescription": "Показує актуальний журнал відвідувачів та дозволяє дивитися ваших відвідувачів в режимі реального часу на приладовій панелі віджетів. Плагін також дозволяє переглядати профіль відвідувача даного користувача.",
"PreviousVisitor": "Попередній відвідувач",
"RealTimeVisitorCount": "Лічильник відвідувачів в реальному часі",
"Referrer_URL": "URL джерела",
"ShowMap": "показати карту",
"SimpleRealTimeWidget_Message": "%1$s і %2$s за останні %3$s",
"ViewVisitorProfile": "Переглянути профіль відвідувача",
"VisitedPages": "Відвідані сторінки",
"RevisitedPages": "Сторінки переглянуті більше одного разу",
"VisitorLogDocumentation": "Ця таблиця показує останні відвідування за обраний період. Ви можете бачити час останніх відвідин користувача при наведенні миші на дату відвідування. %1$s Якщо період включає сьогоднішній день, ви можете спостерігати за відвідувачами в реальному часі! %2$s Дані тут завжди відображаються в режимі реального часу незалежно від того, як часто ви використовуєте архівацію по крону.",
"VisitorProfile": "Профіль користувача",
"VisitorsLastVisit": "Останнє відвідування цього користувача було %s днів назад.",
"VisitsFrom": "%1$s%2$s візитів%3$s від",
"VisitSummary": "Провів в цілому %1$s%2$s на сайті%3$s, і переглянв %4$s сторінок%5$s в %6$s візитах%7$s.",
"VisitSummaryWithActionDetails": "Провів в цілому %1$s%2$s на сайті%3$s, і виконав %4$s дій%5$s (%6$s) в %7$s візитах%8$s.",
"OnClickPause": "%s запущено. Натисніть, щоб призупинити.",
"OnClickStart": "%s зупинено. Натисніть, щоб розпочати."
}
}

View File

@ -0,0 +1,33 @@
{
"Live": {
"AveragePageGenerationTime": "Mỗi trang mất trung bình %1$s để nạp cho khách truy cập này.",
"CalculatedOverNPageViews": "Việc tính toán sử dụng lượt xem trang %1$s cuối cùng của khách truy cập này.",
"ClickToViewMoreAboutVisit": "Click để xem thêm thông tin về lượt truy cập này",
"ConvertedNGoals": "%s Mục tiêu đã được chuyển đổi",
"FirstVisit": "Lượt truy cập đầu tiên",
"GoalType": "Kiểu",
"HideMap": "Ẩn bản đồ",
"KeywordRankedOnSearchResultForThisVisitor": "Từ khóa %1$s đã được xếp hạng %2$s trên %3$s trang kết quả tìm kiếm cho khách truy cập này",
"LastHours": "%s giờ trước",
"LastMinutes": "%s phút trước",
"LastVisit": "Lượt truy cập cuối cùng",
"LoadMoreVisits": "Tải thêm các lượt truy cập",
"MorePagesNotDisplayed": "Nhiều trang được truy cập bởi khách này không được hiển thị",
"NbVisitor": "1 khách truy cập",
"NbVisitors": "%s khách truy cập",
"NextVisitor": "Khách truy cập tiếp theo",
"NoMoreVisits": "Không có nhiều truy cập bởi khách này",
"PageRefreshed": "Số lần trang này được xem\/làm mới liên tiếp.",
"PreviousVisitor": "Khách truy cập trước",
"RealTimeVisitorCount": "Số lượt khách truy cập thời gian thực",
"Referrer_URL": "URL tham chiếu",
"ShowMap": "Hiện thị bản đồ",
"SimpleRealTimeWidget_Message": "%1$s và %2$s trong %3$s cuối cùng",
"ViewVisitorProfile": "Xem hồ sơ khách truy cập",
"VisitedPages": "Các trang đã truy cập",
"VisitorLogDocumentation": "Bảng này cho thấy lần truy cập mới nhất trong phạm vi ngày đã chọn. Bạn có thể thấy khi một lượt truy cập cuối của khách truy cập đã xảy ra bằng cách lướt qua ngày của một truy cập.%1$s Nếu phạm vi ngày bao gồm ngày hôm nay, bạn có thể thấy khách truy cập thời gian thực của bạn! %2$s Dữ liệu hiển thị ở đây là luôn luôn sống, bất kể lúc nào và cách bạn thường đang sử dụng công việc lưu trữ theo định kỳ.",
"VisitorProfile": "Hồ sơ cá nhân của khách",
"VisitorsLastVisit": "Lần truy cập trước của khách truy cập này là %s ngày trước.",
"VisitsFrom": "%1$s%2$s lượt truy cập %3$s từ"
}
}

View File

@ -0,0 +1,38 @@
{
"Live": {
"AveragePageGenerationTime": "这个访客的每个页面加载平均花 %1$s。",
"CalculatedOverNPageViews": "采用这个访客最后 %1$s 个访问页面统计。",
"ClickToViewMoreAboutVisit": "点击查看关于这次访问的详细信息。",
"ConvertedNGoals": "转化了 %s 个目标",
"FirstVisit": "首次访问",
"GoalType": "类型",
"HideMap": "隐藏地图",
"KeywordRankedOnSearchResultForThisVisitor": "这个访客的关键字 %1$s 排名 %2$s 于 %3$s 搜索结果页面。",
"LastHours": "最后%s小时",
"LastMinutes": "最后%s分钟",
"LastVisit": "最后访问",
"LoadMoreVisits": "查看更多访问",
"MorePagesNotDisplayed": "该访客访问的更多页面没有显示。",
"NbVisitor": "1 个访客",
"NbVisitors": "%s 个访客",
"NextVisitor": "下一个访问者",
"NoMoreVisits": "这个访客没有其它的访问了。",
"PageRefreshed": "这个页面被查看 \/ 刷新的次数。",
"PreviousVisitor": "前个访客",
"RealTimeVisitors": "实时访问",
"RealTimeVisitorCount": "实时访客计数",
"Referrer_URL": "来源网址",
"ShowMap": "显示地图",
"SimpleRealTimeWidget_Message": "%1$s 和 %2$s 在最近 %3$s。",
"ViewVisitorProfile": "查看访客资料",
"VisitedPages": "访问的页面",
"RevisitedPages": "被浏览超过一次的页面",
"VisitorLogDocumentation": "本表显示所选时间段内最新的访客资料,鼠标移到日期上可以查看上次访问时间,%1$s 如果时间段包含今天,您可以实时查看访客! %2$s 这里显示的数据总是实时的,无论是否使用定时处理任务。",
"VisitorProfile": "访客资料",
"VisitorsInRealTime": "实时访问",
"VisitorsLastVisit": "此访客上次访问是%s天前。",
"VisitsFrom": "%1$s%2$s 次访问%3$s 来自",
"OnClickPause": "%s已经开始。点击停止。",
"OnClickStart": "%s已经停止。点击开始。"
}
}

View File

@ -0,0 +1,55 @@
{
"Live": {
"AveragePageGenerationTime": "這個訪客平均花費 %1$s 載入網頁。",
"CalculatedOverNPageViews": "以這個訪客過去 %1$s 次網頁瀏覽來計算。",
"ClickToViewMoreAboutVisit": "點擊以查看這個訪問紀錄的詳細資訊",
"ClickToViewAllActions": "點擊查看這個群組裡的所有活動詳情",
"ConvertedNGoals": "轉換了 %s 個目標",
"FirstVisit": "首次訪問",
"GoalType": "類型",
"HideMap": "隱藏地圖",
"KeywordRankedOnSearchResultForThisVisitor": "這個訪客在 %3$s 搜尋結果頁中的關鍵字 %1$s 排名第 %2$s。",
"LastHours": "最近 %s 小時",
"LastMinutes": "最近 %s 分鐘",
"LastVisit": "最後訪問",
"LinkVisitorLog": "查看詳細訪客記錄",
"LoadMoreVisits": "載入更多訪客",
"LimitedSummary": "這份資料內的資訊概括過去 %1$s 次訪問。這個使用者擁有更多訪問次數。",
"LimitedVisitsShown": "只顯示過去 %1$s 次訪問。這個使用者擁有更多訪問次數。",
"MorePagesNotDisplayed": "更多此訪客的到達網頁未顯示",
"NbVisitor": "1 位訪客",
"NbVisitors": "%s 位訪客",
"NextVisitor": "下一位訪客",
"NoMoreVisits": "這個訪客沒有更多訪問紀錄了。",
"PageRefreshed": "這個網頁的連續查看\/重新整理次數。",
"PluginDescription": "提供即時訪客紀錄並讓你在展示板小工具中即時查看你的訪客。這個外掛也能讓你查看任何訪客資料。",
"PreviousVisitor": "上一位訪客",
"RealTimeVisitors": "即時訪客",
"RealTimeVisitorCount": "即時訪客數量",
"Referrer_URL": "參造連結網址",
"ShowMap": "顯示地圖",
"ActionsAndDuration": "%2$s內 %1$s 個活動數",
"SimpleRealTimeWidget_Message": "%1$s 和 %2$s 在過去 %3$s",
"ViewVisitorProfile": "查看訪客資料",
"VisitedPages": "到達網頁",
"RevisitedPages": "網頁瀏覽數超過一次",
"ToggleActions": "切換所有活動的顯示狀態",
"TopVisitedPages": "熱門訪問網頁",
"VisitsLog": "訪客紀錄",
"VisitorLog": "訪客紀錄",
"VisitorLogDocumentation": "這個表格顯示所選擇的時間範圍中最新的訪問。你可以將滑鼠移過訪問日期查看訪客最後訪問為何時。%1$s如果日期範圍包含今日你就可以即時查看訪客%2$s這裡顯示的資料不論是否和多常使用彙整工作排程永遠是即時的。",
"VisitorLogNoDataMessagePurged": "看起來資料已經被清除,因為定期清理舊訪客紀錄已啟用而這份報表的日期已經久於 %s 日。超級使用者可以在管理中心 => 隱私中變更這個設定。",
"VisitorProfile": "訪客資料",
"VisitorsInRealTime": "即時訪客資訊",
"VisitorsLastVisit": "此訪客曾於 %s 天前訪問過。",
"VisitsFrom": "%1$s%2$s 次訪問%3$s 來自",
"VisitSummary": "共停留了 %1$s%2$s 在網站上%3$s並訪問了 %4$s 個網頁%5$s在過去 %6$s 次%7$s次訪問。",
"VisitSummaryWithActionDetails": "共停留了 %1$s%2$s 在網站上%3$s並執行了 %4$s 個活動%5$s%6$s在過去 %7$s 次%8$s次訪問。",
"RowActionTooltipDefault": "以此列建立區隔顯示訪客紀錄",
"RowActionTooltipWithDimension": "以此%s建立區隔顯示訪客紀錄",
"RowActionTooltipTitle": "開啟已區隔的訪客紀錄",
"SegmentedVisitorLogTitle": "顯示 %1$s 為「%2$s」的訪客紀錄",
"OnClickPause": "%s 已開始。點擊暫停。",
"OnClickStart": "%s 已停止。點擊開始。"
}
}

View File

@ -0,0 +1,533 @@
#visitsLive {
text-align: left;
color: @theme-color-text-light;
.dataTable {
margin-bottom: -1px;
}
}
.theWidgetContent > h2:first-child {
color: @theme-color-headline-alternative !important;
.title {
color: @theme-color-headline-alternative !important;
}
}
.card {
#visitsLive {
margin-left: -20px;
margin-right: -20px;
}
}
#visitsLive .settings {
border-bottom: 1px solid @color-silver-l90;
}
#visitsLive .datetime, #visitsLive .country, #visitsLive .settings, #visitsLive .returning {
padding: 10px 5px 10px 12px;
}
#visitsLive .datetime {
background: @theme-color-background-base;
border-top: 1px solid #d3d1c5;
margin: 0;
line-height: 20px;
text-align: left;
}
#visitsLive .country {
background: @theme-color-background-base url(plugins/CoreHome/images/bullet1.png) no-repeat scroll 0 0;
}
#visitsLive .referrer {
display: block;
padding-top: 4px;
padding-bottom: 1px;
}
#visitsLive .pagesTitle {
display: block;
float: left;
}
#visitsLive .settings {
background: @theme-color-widget-background none repeat scroll 0 0;
}
#visitsLive .settings a {
text-decoration: none;
}
#visitsLive .returning {
background: #F9FAFA none repeat scroll 0 0;
}
#visitsLive .visits-live-launch-visitor-profile {
color: @theme-color-text;
line-height: 200%;
span {
display: block;
vertical-align: middle;
&.icon-visitor-profile {
display: inline;
font-size: 16px;
line-height: 16px;
vertical-align: middle;
}
}
.icon-visitor-profile {
font-size: 120%;
}
}
.visitsLiveFooter img {
vertical-align: middle;
}
.visitsLiveFooter {
line-height: 2.5em;
}
.dataTableVizVisitorLog table img {
margin: 0 3px 0 0;
}
.ui-dialog.ui-widget {
.dataTableVizVisitorLog {
.dataTableFeatures {
border-bottom: 0;
}
}
}
.visitsLiveFooter a.rightLink {
float: right;
padding-right: 20px;
}
#visitsLive .datetime a {
text-decoration: none;
}
ol.visitorLog {
list-style-type: none;
margin-left: 8px;
padding-left: 8px;
}
.truncated-text-line {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display:inline-block;
max-width:90%;
overflow: -moz-hidden-unscrollable;
}
ol.visitorLog > li {
margin-bottom: 7px;
line-height: 20px;
position: relative;
min-height: 25px;
&:before {
vertical-align: top;
background-color: #424242;
border: 5px solid #424242;
border-radius: 50%;
line-height: 0;
font-size: 0;
content: " ";
top: 10px;
position: relative;
box-shadow: 0 0 0 7px #fff;
left: -14px;
z-index: 2;
}
&:after {
content: " ";
border-left: 2px solid #d2d2d2;
position: absolute;
left: -10px;
height: 100%;
margin-top: 20px;
z-index: 1;
}
&:last-child:after {
border-left: none;
}
&.duplicate {
visibility: hidden;
line-height: 0;
min-height: 0;
height: 0;
margin: 0;
overflow: hidden;
padding: 0;
}
&.more {
list-style-type: none;
font-weight: bold;
.icon-info {
vertical-align: middle;
}
}
}
#visitsLive img {
vertical-align: middle;
height: 16px;
}
.visitorRank img {
vertical-align: text-bottom;
}
.iconPadding {
margin-left: 4px;
margin-right: 4px;
}
.visitorReferrer .visitorRank {
display: inline-block;
}
.visitorRank {
border: 1px solid #D8D8D8;
color: #474747;
border-radius: 3px;
padding: 3px 5px;
}
#visitsLive .visitorRank {
padding: 2px;
border: none;
margin-left: 5px;
}
#visitsLive .visitorType .visitorRank {
margin-left: 0;
}
.hash {
color: #BBB;
font-size: 9pt;
margin-right: 2px;
}
.repeat {
font-weight: bold;
display: block;
margin: 5px 5px 5px 0;
float: left;
background-color: #fff;
z-index: 3;
&.icon-refresh:before {
padding-right: 2px;
}
}
.dataTableVizVisitorLog hr {
background: none repeat scroll 0 0 transparent;
border: 0 none #000;
border-bottom: 1px solid #ccc;
color: #eee;
margin: 0 2em 0.5em;
padding: 0 0 0.5em;
}
.simple-realtime-visitor-widget {
text-align: center;
}
.simple-realtime-visitor-counter {
background-color: #F1F0EB;
border-radius: 10px;
display: inline-block;
margin: 2em 0 1em 0;
padding: 3em;
}
.simple-realtime-visitor-counter > div {
font-size: 4.0em;
color: @theme-color-text-light;
}
.simple-realtime-metric {
font-weight: bold;
color: #333;
}
.simple-realtime-elaboration {
margin: 1em 2em 1em 2em;
color: @theme-color-text-lighter;
display: inline-block;
}
ol.visitorLog p {
margin:0;
padding:0;
}
.dataTableVizVisitorLog {
.card {
padding: 15px 0;
font-size: 13px;
text-align: left;
a {
text-decoration: none !important;
color: @theme-color-link;
width: inherit;
}
}
.visitorLog > li > div {
width: 95%;
.segmentedVisitorLogPopover & {
width: 90%; // space in segmented visitor log isn't enough
}
}
.dataTableWrapper {
width:100%;
}
.widget & .card {
&:hover .visitor-log-visitor-profile-link {
display:inline;
}
}
}
.visitor-log-datetime {
display: block;
}
.visitor-log-ip-location img.flag {
border: 1px solid lightgray;
top: 2px;
position: relative;
}
.visitor-log-page-list {
position:relative;
margin-top: 7px;
}
a.visitor-log-visitor-profile-link {
z-index: 2;
position:absolute;
right: 15px;
top: 15px;
font-style:italic;
font-size:13px;
background-color: inherit !important;
.widget & {
display:none;
}
img {
margin-top: -2px;
margin-bottom: -3px;
}
@media print {
display: none;
}
}
.visitorLog {
> li > div {
display: inline-block;
width: 90%;
> * {
vertical-align: top;
}
}
}
.action-list-action-icon {
display: inline;
height: 18px;
position: absolute;
left: -18px;
background-color: #fff;
z-index: 3;
margin-top: 1px;
}
.action-list-url {
display: inline-block;
}
.visitorLogIcons {
position: relative;
display: block;
}
.visitorLogIconWithDetails .details {
display: none;
}
.visitorLogIcons>span>span>img {
margin: auto 5px auto 0;
}
.visitorLogIconWithDetails>img {
margin: auto 5px -2px 0;
height: 16px;
}
.visitorLogIconWithDetails.flag {
display: none;
}
.visitorLogIconWithDetails.flag>img {
border: 1px solid lightgray;
}
.visitorLogIcons>span.visitorRank>img {
margin: auto 0;
}
.visitorLogIcons {
.visitorDetails, .visitorType {
display: block;
margin-top: 4px;
}
}
.visitorType {
img {
max-height: 20px;
margin: auto 0;
}
}
.conversionCount {
color: #fff;
background-color: #4b0;
min-width: 17px;
height: 17px;
display: inline-block;
text-align: center;
font-weight: bold;
font-size: 10px;
line-height: 15px;
border-radius: 5px;
margin-left: -17px;
position: relative;
top: 3px;
border: 1px solid #fff;
padding: 0 2px;
#visitsLive & {
top: 10px;
}
}
.own-visitor-column {
.visitorLogIcons {
.visitorDetails {
margin-top: 0;
}
.visitorType {
margin-top: 8px;
}
}
}
.visitorReferrer {
clear:both;
padding-top: 1em;
* {
vertical-align: middle;
}
}
#visitsLive .visitorReferrer {
padding-top: 0;
}
.segmentedlog {
margin: 8px;
display: block;
}
#widgetLivewidget {
.visitorLogIcons {
&:before {
content: " ";
display: block;
}
display: inline-block;
}
.visitorLogIconWithDetails.flag {
display: inline;
}
.visitorDetails {
display: inline-block;
}
.visitorLogIconWithDetails {
margin-right: 5px;
}
.visitorType {
display: inline-block;
float: left;
margin-right: 10px;
}
}
@media only screen and (min-width: 800px) {
.card #visitsLive .visitorLogIcons:before {
content: none;
}
.card #visitsLive .referrer {
float: right;
}
}
@media only screen and (max-width: 600px) {
.own-visitor-column {
margin: 10px 0;
}
}
@media print{
.col.s12.m3{
width: 20%;
}
.row .col.s12.own-visitor-column{
width: 15%;
margin-top: 10px;
margin-bottom: 10px;
}
.col.s12.m7.column {
width:65%;
}
}

View File

@ -0,0 +1,440 @@
.visitor-profile-popup {
width: 1150px;
height: auto;
padding: 0;
> #Piwik_Popover {
padding: 0;
margin: 0;
overflow: visible;
}
> .ui-dialog-titlebar {
display: none;
}
}
.visitor-profile {
position: relative;
width: 1150px;
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.22);
text-align: left;
font-size: 13px;
line-height: 20px;
body .widget & {
width: auto;
box-shadow: none;
p {
margin: 0;
}
}
a {
color: #255792;
}
h1 {
line-height: 30px;
vertical-align: top;
font-size: 23px;
margin: 0 0 5px 0;
color: @theme-color-text;
}
p {
color: #5e5e5c;
body:not(.widgetized) .widget & {
padding-bottom: 0;
}
strong {
color: @theme-color-text;
font-weight: normal !important;
}
}
p.alert {
margin: 8px 20px 20px 0 !important;
font-size: 13px;
}
}
.visitor-profile-options {
z-index: 10;
position: absolute;
right: 6px;
height: 28px;
}
.visitor-profile-toggle-actions,
.visitor-profile-help,
.visitor-profile-close {
float: right;
text-decoration: none !important;
margin-right: 5px;
&:before {
color: #000;
background-color: #fff;
font-size: 16px;
line-height: 16px;
font-weight: 400;
font-family: matomo;
padding: 1px;
height: 18px;
display: block;
margin: 5px 0;
}
}
.visitor-profile-close {
margin-right: 0;
&:before {
padding: 4.5px;
content: "\e60a";
background-color: @color-red-piwik;
color: #fff;
border-radius: 3px;
font-size: 9px;
line-height: 9px;
}
.widget & {
display: none;
}
}
.visitor-profile-toggle-actions {
&:before {
content: "\e62b";
.minimized& {
content: "\e61c";
}
}
}
.visitor-profile-help {
&:before {
content: "\e61f";
}
}
.visitor-profile-info {
overflow: hidden;
}
.visitor-profile-visits-info,
.visitor-profile-overview {
display: inline-block;
vertical-align: top;
height: auto;
border: none;
box-sizing: content-box;
float: left;
body:not(.widgetized) .widget & {
width: 100%;
border: none;
margin: 0;
}
body.widgetized .widget & {
width: 50%;
box-sizing: border-box;
}
}
@media only screen and (max-width: 1000px) {
body.widgetized .widget {
.visitor-profile-visits-info,
.visitor-profile-overview {
width: 100%;
}
}
}
.visitor-profile-widget-link {
color: #5e5e5c;
}
.visitor-profile-overview {
margin: 0;
border-right: 1px solid #d1cec8;
padding: 22px 0 0 22px;
width: 553px;
body:not(.widgetized) .widget & {
padding: 0 10px;
}
}
.visitor-profile-visits-info {
margin: 28px 0 0 -1px;
border-left: 1px solid #d1cec8;
width: 574px;
}
.visitor-profile-header {
overflow: hidden;
font-size: 14px;
> div {
float: left;
}
.visitor-profile-avatar {
width: 149px;
height: 154px;
> img {
max-width: 122px;
height: 120px;
}
}
.visitor-profile-header-details {
width: 376px;
}
.visitor-profile-prev-visitor {
color: #7e7363;
display: none;
position: absolute;
right: 100%;
top: 0;
margin-right: 2px;
}
.visitor-profile-next-visitor {
color: #7e7363;
display: none;
}
&:hover {
.visitor-profile-next-visitor,
.visitor-profile-prev-visitor {
display: inline-block;
}
}
h1 {
display: inline-block;
word-wrap: break-word;
margin: 0;
max-width: 355px;
color: #0d0d0d;
}
}
.visitor-profile-headline {
position: relative;
line-height: 30px;
}
.visitor-profile-summary {
overflow: hidden;
padding: 5px 0 16px 0;
p {
margin: 6px 1em 0 0;
}
}
.visitor-profile-pages {
li {
display: block;
clear: both;
}
}
.visitor-profile-latest-visit {
padding-top: 6px;
.visitorLogIcons {
.visitorLogIconWithDetails {
display: block;
float: left;
width: 50%;
padding: 6px 0;
box-sizing: content-box;
height: 16px;
position: relative;
font-size: 13px;
img {
float: left;
margin-left: 2px;
}
&.flag img {
box-sizing: border-box;
margin-left: 0;
}
&:after {
content: attr(profile-header-text);
text-overflow: ellipsis;
display: block;
overflow: hidden;
white-space: nowrap;
position: absolute;
left: 26px;
}
}
.visitorType,
.visitorTypeIcon {
display: none;
}
}
}
.visitor-profile-id {
line-height: 24px;
font-size: 13px;
a {
color: inherit;
}
}
.visitor-profile-important-visits > div {
float: left;
width: 50%;
height: 100%;
}
.visitor-profile-devices img {
height: 16px;
float: left;
margin-right: 10px;
margin-top: 2px;
}
.visitor-profile-location {
.loadingPiwik {
padding: 0 0 0 4px;
border: 0;
}
img {
border: 1px solid lightgray;
box-sizing: content-box;
}
}
.visitor-profile-map {
padding: 10px 21px 13px 2px;
}
.visitor-profile-visit-title {
display: block;
font-size: 23px;
padding: 13px 15px;
border: none;
color: @theme-color-text;
cursor: pointer;
background-color: @color-silver-l95;
&:hover {
background-color: #bfbfbf;
}
.visitor-profile-date {
font-weight: normal;
float: right;
font-size: 13px;
margin-top: 4px;
}
}
.visitor-profile-visit-details-extended {
display: none;
padding: 10px 15px;
font-size: 13px;
line-height: 1.5em;
background-color: @color-silver-l95;
.visitor-log-datetime {
display: none;
}
}
.visitor-profile-visit-details {
padding: 8px 15px;
overflow: hidden;
.visitorLogIcons {
display: inline;
}
.visitorLogIconWithDetails {
margin-right: 5px;
}
.visitorType {
display: inline-block;
float: left;
margin-right: 15px;
}
.visitorDetails {
display: inline-block;
visibility: hidden;
}
&:hover .visitorDetails {
visibility: visible;
}
.visitorTypeIcon {
display: none;
}
}
.visitor-profile-visits-info {
position: relative;
}
.visitor-profile-show-actions {
float: right;
display: inline-block;
font-size: 13px;
line-height: 24px;
}
ol.visitor-profile-actions {
padding: 0 15px 0 23px;
li {
padding: 0 0 8px;
margin: 0;
p {
line-height: 15px;
}
}
}
.visitor-profile-more-info {
height: 18px;
text-align: center;
padding: 0 0 13px;
margin: 5px 0 15px 0;
.loadingPiwik {
padding: 0 0 0 4px;
}
}
.visitor-profile-no-visits {
color: #999;
font-size: 13px;
}

View File

@ -0,0 +1,37 @@
<li class="{% if action.goalName is defined %}goal{% else %}action{% endif %}"
title="{{ postEvent('Live.renderActionTooltip', action, visitInfo) }}">
<div>
{# Page view / Download / Outlink #}
{% if action.pageTitle|default(false) is not empty %}
<span class="truncated-text-line">{{ action.pageTitle|rawSafeDecoded }}</span>
{% endif %}
{% if action.siteSearchKeyword is defined %}
{% if action.type == 'search' %}
<img src='{{ action.iconSVG|default(action.icon) }}' title='{{ 'Actions_SubmenuSitesearch'|translate }}'
class="action-list-action-icon search">
{% endif %}
<span class="truncated-text-line">{{ action.siteSearchKeyword|rawSafeDecoded }}</span>
{% endif %}
{% if action.url is not empty %}
{% if action.iconSVG|default(action.icon) is not empty %}
<img src='{{ action.iconSVG|default(action.icon) }}' class="action-list-action-icon {{ action.type }}">
{% endif %}
{% if action.type == 'action' and action.pageTitle|default(false) is not empty %}<p>{% endif %}
{% if action.url|trim|lower starts with 'javascript:' or
action.url|trim|lower starts with 'vbscript:' or
action.url|trim|lower starts with 'data:' %}
{{ action.url }}
{% else %}
<a href="{{ action.url|safelink|e('html_attr') }}" rel="noreferrer noopener" target="_blank"
class="action-list-url truncated-text-line">
{{ action.url|replace({'http://': '', 'https://': ''}) }}
</a>
{% endif %}
{% if action.type == 'action' and action.pageTitle|default(false) is not empty %}</p>{% endif %}
{% elseif action.type != 'search' %}
<p>
<span>{{ 'General_NotDefined'|translate('Actions_ColumnPageURL'|translate) }}</span>
</p>
{% endif %}
</div>
</li>

View File

@ -0,0 +1,54 @@
<li class="action"
title="{{ postEvent('Live.renderActionTooltip', action, visitInfo) }}">
<div>
{# Ecommerce Abandoned Cart / Ecommerce Order #}
<img src="{{ action.iconSVG|default(action.icon) }}" class="action-list-action-icon"/>
{% if action.type == 'ecommerceOrder' %}
<strong>{{ 'Goals_EcommerceOrder'|translate }}</strong>
<span style='color:#666;'>({{ action.orderId }})</span>
{% else %}
<strong>{{ 'Goals_AbandonedCart'|translate }}</strong>
{# TODO: would be nice to have the icons Orders / Cart in the ecommerce log footer #}
{% endif %}
<p>
<span {% if not isWidget %}style='margin-left:22px;'{% endif %}>
{% if action.type == 'ecommerceOrder' %}
{# spacing is important for tooltip to look nice #}
{% set ecommerceOrderTooltip %}{{ 'General_ColumnRevenue'|translate }}: {{ action.revenue|money(visitInfo.idSite)|raw }}
{% if action.revenueSubTotal is not empty %} - {{ 'General_Subtotal'|translate }}: {{ action.revenueSubTotal|money(visitInfo.idSite)|raw }}{% endif %}
{% if action.revenueTax is not empty %} - {{ 'General_Tax'|translate }}: {{ action.revenueTax|money(visitInfo.idSite)|raw }}{% endif %}
{% if action.revenueShipping is not empty %} - {{ 'General_Shipping'|translate }}: {{ action.revenueShipping|money(visitInfo.idSite)|raw }}{% endif %}
{% if action.revenueDiscount is not empty %} - {{ 'General_Discount'|translate }}: {{ action.revenueDiscount|money(visitInfo.idSite)|raw }}{% endif %}
{% endset %}
<abbr title="{{ ecommerceOrderTooltip }}">{{ 'General_ColumnRevenue'|translate }}:
{% else %}
{% set revenueLeft %}{{ 'General_ColumnRevenue'|translate }}{% endset %}
{{ 'Goals_LeftInCart'|translate(revenueLeft) }}:
{% endif %}
<strong>{{ action.revenue|money(visitInfo.idSite)|raw }}</strong>
{% if action.type == 'ecommerceOrder' %}
</abbr>
{% endif %}, {{ 'General_Quantity'|translate }}: {{ action.items }}
{# Ecommerce items in Cart/Order #}
{% if action.itemDetails is not empty %}
<ul style='list-style:square;margin-left:{% if isWidget %}15{% else %}50{% endif %}px;'>
{% for product in action.itemDetails %}
<li>
{{ product.itemSKU }}{% if product.itemName is not empty %}: {{ product.itemName }}{% endif %}
{% if product.itemCategory is not empty %} ({{ product.itemCategory }}){% endif %}
,
{{ 'General_Quantity'|translate }}: {{ product.quantity }},
{{ 'General_Price'|translate }}: {{ product.price|money(visitInfo.idSite)|raw }}
</li>
{% endfor %}
</ul>
{% endif %}
</span>
</p>
</div>
</li>

View File

@ -0,0 +1,11 @@
<li class="action"
title="{{ postEvent('Live.renderActionTooltip', action, visitInfo) }}">
<div>
{# Goal conversion #}
<img src="{{ action.iconSVG|default(action.icon) }}" class="action-list-action-icon" />
<strong>{{ action.goalName }}</strong>
{% if action.revenue > 0 %}, {{ 'General_ColumnRevenue'|translate }}:
<strong>{{ action.revenue|money(visitInfo.idSite)|raw }}</strong>
{% endif %}
</div>
</li>

Some files were not shown because too many files have changed in this diff Show More