update Piwik to version 2.16 (fixes #91)

This commit is contained in:
oliver 2016-04-10 18:55:57 +02:00
commit d885a4baa9
5833 changed files with 418860 additions and 226988 deletions

View file

@ -0,0 +1,74 @@
<?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\Contents;
use Piwik\Archive;
use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Metrics;
use Piwik\Piwik;
use Piwik\Plugins\Contents\Archiver;
/**
* API for plugin Contents
*
* @method static \Piwik\Plugins\Contents\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
public function getContentNames($idSite, $period, $date, $segment = false, $idSubtable = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, false, $idSubtable);
}
public function getContentPieces($idSite, $period, $date, $segment = false, $idSubtable = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, false, $idSubtable);
}
private function getDataTable($name, $idSite, $period, $date, $segment, $expanded, $idSubtable)
{
Piwik::checkUserHasViewAccess($idSite);
$recordName = Dimensions::getRecordNameForAction($name);
$dataTable = Archive::getDataTableFromArchive($recordName, $idSite, $period, $date, $segment, $expanded, $idSubtable);
if (empty($idSubtable)) {
$dataTable->filter('AddSegmentValue', array(function ($label) {
if ($label === Archiver::CONTENT_PIECE_NOT_SET) {
return false;
}
return $label;
}));
}
$this->filterDataTable($dataTable);
return $dataTable;
}
/**
* @param DataTable $dataTable
*/
private function filterDataTable($dataTable)
{
$dataTable->queueFilter('ReplaceColumnNames');
$dataTable->queueFilter('ReplaceSummaryRowLabel');
$dataTable->filter(function (DataTable $table) {
$row = $table->getRowFromLabel(Archiver::CONTENT_PIECE_NOT_SET);
if ($row) {
$row->setColumn('label', Piwik::translate('General_NotDefined', Piwik::translate('Contents_ContentPiece')));
}
foreach ($table->getRows() as $row) {
if ($row->getMetadata('contentTarget') === Archiver::CONTENT_TARGET_NOT_SET) {
$row->setMetadata('contentTarget', '');
}
}
});
}
}

View file

@ -0,0 +1,54 @@
<?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\Contents\Actions;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker;
/**
* A content is composed of a name, an actual piece of content, and optionally a target.
*/
class ActionContent extends Action
{
public function __construct(Request $request)
{
parent::__construct(Action::TYPE_CONTENT, $request);
$url = $request->getParam('url');
$this->setActionUrl($url);
}
public static function shouldHandle(Request $request)
{
$name = $request->getParam('c_n');
return !empty($name);
}
protected function getActionsToLookup()
{
return array(
'idaction_url' => array($this->getActionUrl(), $this->getActionType())
);
}
// Do not track this Event URL as Entry/Exit Page URL (leave the existing entry/exit)
public function getIdActionUrlForEntryAndExitIds()
{
return false;
}
// Do not track this Event Name as Entry/Exit Page Title (leave the existing entry/exit)
public function getIdActionNameForEntryAndExitIds()
{
return false;
}
}

View file

@ -0,0 +1,320 @@
<?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\Contents;
use Piwik\DataTable;
use Piwik\Metrics;
use Piwik\Plugins\Actions\ArchivingHelper;
use Piwik\RankingQuery;
/**
* Processing reports for Contents
*/
class Archiver extends \Piwik\Plugin\Archiver
{
const CONTENTS_PIECE_NAME_RECORD_NAME = 'Contents_piece_name';
const CONTENTS_NAME_PIECE_RECORD_NAME = 'Contents_name_piece';
const CONTENT_TARGET_NOT_SET = 'Piwik_ContentTargetNotSet';
const CONTENT_PIECE_NOT_SET = 'Piwik_ContentPieceNotSet';
/**
* @var DataArray[]
*/
protected $arrays = array();
protected $metadata = array();
public function __construct($processor)
{
parent::__construct($processor);
$this->columnToSortByBeforeTruncation = Metrics::INDEX_NB_VISITS;
$this->maximumRowsInDataTable = ArchivingHelper::$maximumRowsInDataTableLevelZero;
$this->maximumRowsInSubDataTable = ArchivingHelper::$maximumRowsInSubDataTable;
}
private function getRecordToDimensions()
{
return array(
self::CONTENTS_PIECE_NAME_RECORD_NAME => array('contentPiece', 'contentName'),
self::CONTENTS_NAME_PIECE_RECORD_NAME => array('contentName', 'contentPiece')
);
}
public function aggregateMultipleReports()
{
$dataTableToSum = $this->getRecordNames();
$columnsAggregationOperation = null;
$this->getProcessor()->aggregateDataTableRecords(
$dataTableToSum,
$this->maximumRowsInDataTable,
$this->maximumRowsInSubDataTable,
$this->columnToSortByBeforeTruncation,
$columnsAggregationOperation,
$columnsToRenameAfterAggregation = null,
$countRowsRecursive = array());
}
private function getRecordNames()
{
$mapping = $this->getRecordToDimensions();
return array_keys($mapping);
}
public function aggregateDayReport()
{
$this->aggregateDayImpressions();
$this->aggregateDayInteractions();
$this->insertDayReports();
}
private function aggregateDayImpressions()
{
$select = "
log_action_content_piece.name as contentPiece,
log_action_content_target.name as contentTarget,
log_action_content_name.name as contentName,
count(distinct log_link_visit_action.idvisit) as `" . Metrics::INDEX_NB_VISITS . "`,
count(distinct log_link_visit_action.idvisitor) as `" . Metrics::INDEX_NB_UNIQ_VISITORS . "`,
count(*) as `" . Metrics::INDEX_CONTENT_NB_IMPRESSIONS . "`
";
$from = array(
"log_link_visit_action",
array(
"table" => "log_action",
"tableAlias" => "log_action_content_piece",
"joinOn" => "log_link_visit_action.idaction_content_piece = log_action_content_piece.idaction"
),
array(
"table" => "log_action",
"tableAlias" => "log_action_content_target",
"joinOn" => "log_link_visit_action.idaction_content_target = log_action_content_target.idaction"
),
array(
"table" => "log_action",
"tableAlias" => "log_action_content_name",
"joinOn" => "log_link_visit_action.idaction_content_name = log_action_content_name.idaction"
)
);
$where = "log_link_visit_action.server_time >= ?
AND log_link_visit_action.server_time <= ?
AND log_link_visit_action.idsite = ?
AND log_link_visit_action.idaction_content_name IS NOT NULL
AND log_link_visit_action.idaction_content_interaction IS NULL";
$groupBy = "log_action_content_piece.idaction,
log_action_content_target.idaction,
log_action_content_name.idaction";
$orderBy = "`" . Metrics::INDEX_NB_VISITS . "` DESC";
$rankingQueryLimit = ArchivingHelper::getRankingQueryLimit();
$rankingQuery = null;
if ($rankingQueryLimit > 0) {
$rankingQuery = new RankingQuery($rankingQueryLimit);
$rankingQuery->setOthersLabel(DataTable::LABEL_SUMMARY_ROW);
$rankingQuery->addLabelColumn(array('contentPiece', 'contentTarget', 'contentName'));
$rankingQuery->addColumn(array(Metrics::INDEX_NB_UNIQ_VISITORS));
$rankingQuery->addColumn(array(Metrics::INDEX_CONTENT_NB_IMPRESSIONS, Metrics::INDEX_NB_VISITS), 'sum');
}
$resultSet = $this->archiveDayQueryProcess($select, $from, $where, $groupBy, $orderBy, $rankingQuery);
while ($row = $resultSet->fetch()) {
$this->aggregateImpressionRow($row);
}
}
private function aggregateDayInteractions()
{
$select = "
log_action_content_name.name as contentName,
log_action_content_interaction.name as contentInteraction,
log_action_content_piece.name as contentPiece,
count(*) as `" . Metrics::INDEX_CONTENT_NB_INTERACTIONS . "`
";
$from = array(
"log_link_visit_action",
array(
"table" => "log_action",
"tableAlias" => "log_action_content_piece",
"joinOn" => "log_link_visit_action.idaction_content_piece = log_action_content_piece.idaction"
),
array(
"table" => "log_action",
"tableAlias" => "log_action_content_interaction",
"joinOn" => "log_link_visit_action.idaction_content_interaction = log_action_content_interaction.idaction"
),
array(
"table" => "log_action",
"tableAlias" => "log_action_content_name",
"joinOn" => "log_link_visit_action.idaction_content_name = log_action_content_name.idaction"
)
);
$where = "log_link_visit_action.server_time >= ?
AND log_link_visit_action.server_time <= ?
AND log_link_visit_action.idsite = ?
AND log_link_visit_action.idaction_content_name IS NOT NULL
AND log_link_visit_action.idaction_content_interaction IS NOT NULL";
$groupBy = "log_action_content_piece.idaction,
log_action_content_interaction.idaction,
log_action_content_name.idaction";
$orderBy = "`" . Metrics::INDEX_CONTENT_NB_INTERACTIONS . "` DESC";
$rankingQueryLimit = ArchivingHelper::getRankingQueryLimit();
$rankingQuery = null;
if ($rankingQueryLimit > 0) {
$rankingQuery = new RankingQuery($rankingQueryLimit);
$rankingQuery->setOthersLabel(DataTable::LABEL_SUMMARY_ROW);
$rankingQuery->addLabelColumn(array('contentPiece', 'contentInteraction', 'contentName'));
$rankingQuery->addColumn(array(Metrics::INDEX_CONTENT_NB_INTERACTIONS), 'sum');
}
$resultSet = $this->archiveDayQueryProcess($select, $from, $where, $groupBy, $orderBy, $rankingQuery);
while ($row = $resultSet->fetch()) {
$this->aggregateInteractionRow($row);
}
}
private function archiveDayQueryProcess($select, $from, $where, $groupBy, $orderBy, RankingQuery $rankingQuery)
{
// get query with segmentation
$query = $this->getLogAggregator()->generateQuery($select, $from, $where, $groupBy, $orderBy);
// apply ranking query
if ($rankingQuery) {
$query['sql'] = $rankingQuery->generateRankingQuery($query['sql']);
}
// get result
$resultSet = $this->getLogAggregator()->getDb()->query($query['sql'], $query['bind']);
if ($resultSet === false) {
return;
}
return $resultSet;
}
/**
* Records the daily datatables
*/
private function insertDayReports()
{
foreach ($this->arrays as $recordName => $dataArray) {
$dataTable = $dataArray->asDataTable();
foreach ($dataTable->getRows() as $row) {
$label = $row->getColumn('label');
if (!empty($this->metadata[$label])) {
foreach ($this->metadata[$label] as $name => $value) {
$row->addMetadata($name, $value);
}
}
}
$blob = $dataTable->getSerialized(
$this->maximumRowsInDataTable,
$this->maximumRowsInSubDataTable,
$this->columnToSortByBeforeTruncation);
$this->getProcessor()->insertBlobRecord($recordName, $blob);
}
}
/**
* @param string $name
* @return DataArray
*/
private function getDataArray($name)
{
if (empty($this->arrays[$name])) {
$this->arrays[$name] = new DataArray();
}
return $this->arrays[$name];
}
private function aggregateImpressionRow($row)
{
foreach ($this->getRecordToDimensions() as $record => $dimensions) {
$dataArray = $this->getDataArray($record);
$mainDimension = $dimensions[0];
$mainLabel = $row[$mainDimension];
// content piece is optional
if ($mainDimension == 'contentPiece'
&& empty($mainLabel)) {
$mainLabel = self::CONTENT_PIECE_NOT_SET;
}
$dataArray->sumMetricsImpressions($mainLabel, $row);
$this->rememberMetadataForRow($row, $mainLabel);
$subDimension = $dimensions[1];
$subLabel = $row[$subDimension];
if (empty($subLabel)) {
continue;
}
// content piece is optional
if ($subDimension == 'contentPiece'
&& empty($subLabel)) {
$subLabel = self::CONTENT_PIECE_NOT_SET;
}
$dataArray->sumMetricsContentsImpressionPivot($mainLabel, $subLabel, $row);
}
}
private function aggregateInteractionRow($row)
{
foreach ($this->getRecordToDimensions() as $record => $dimensions) {
$dataArray = $this->getDataArray($record);
$mainDimension = $dimensions[0];
$mainLabel = $row[$mainDimension];
$dataArray->sumMetricsInteractions($mainLabel, $row);
$subDimension = $dimensions[1];
$subLabel = $row[$subDimension];
if (empty($subLabel)) {
continue;
}
$dataArray->sumMetricsContentsInteractionPivot($mainLabel, $subLabel, $row);
}
}
private function rememberMetadataForRow($row, $mainLabel)
{
$this->metadata[$mainLabel] = array();
$target = $row['contentTarget'];
if (empty($target)) {
$target = Archiver::CONTENT_TARGET_NOT_SET;
}
// there can be many different targets
$this->metadata[$mainLabel]['contentTarget'] = $target;
}
}

View file

@ -0,0 +1,57 @@
<?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\Contents\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugins\Actions\Segment;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
class ContentInteraction extends ActionDimension
{
protected $columnName = 'idaction_content_interaction';
protected $columnType = 'INTEGER(10) UNSIGNED DEFAULT NULL';
protected function configureSegments()
{
$segment = new Segment();
$segment->setSegment('contentInteraction');
$segment->setName('Contents_Interaction');
$segment->setAcceptedValues('The type of interaction with the content. For instance "click" or "submit".');
$this->addSegment($segment);
}
public function getName()
{
return Piwik::translate('Contents_Interaction');
}
public function getActionId()
{
return Action::TYPE_CONTENT_INTERACTION;
}
public function onLookupAction(Request $request, Action $action)
{
$interaction = $request->getParam('c_i');
if (empty($interaction)) {
return false;
}
$interaction = trim($interaction);
if (strlen($interaction) > 0) {
return $interaction;
}
return false;
}
}

View file

@ -0,0 +1,57 @@
<?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\Contents\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugins\Actions\Segment;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
class ContentName extends ActionDimension
{
protected $columnName = 'idaction_content_name';
protected $columnType = 'INTEGER(10) UNSIGNED DEFAULT NULL';
protected function configureSegments()
{
$segment = new Segment();
$segment->setSegment('contentName');
$segment->setName('Contents_ContentName');
$segment->setAcceptedValues('The name of a content block, for instance "Ad Sale"');
$this->addSegment($segment);
}
public function getName()
{
return Piwik::translate('Contents_ContentName');
}
public function getActionId()
{
return Action::TYPE_CONTENT_NAME;
}
public function onLookupAction(Request $request, Action $action)
{
$contentName = $request->getParam('c_n');
if (empty($contentName)) {
return false;
}
$contentName = trim($contentName);
if (strlen($contentName) > 0) {
return $contentName;
}
return false;
}
}

View file

@ -0,0 +1,57 @@
<?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\Contents\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugins\Actions\Segment;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
class ContentPiece extends ActionDimension
{
protected $columnName = 'idaction_content_piece';
protected $columnType = 'INTEGER(10) UNSIGNED DEFAULT NULL';
protected function configureSegments()
{
$segment = new Segment();
$segment->setSegment('contentPiece');
$segment->setName('Contents_ContentPiece');
$segment->setAcceptedValues('The actual content. For instance "ad.jpg" or "My text ad"');
$this->addSegment($segment);
}
public function getName()
{
return Piwik::translate('Contents_ContentPiece');
}
public function getActionId()
{
return Action::TYPE_CONTENT_PIECE;
}
public function onLookupAction(Request $request, Action $action)
{
$contentPiece = $request->getParam('c_p');
if (empty($contentPiece)) {
return false;
}
$contentPiece = trim($contentPiece);
if (strlen($contentPiece) > 0) {
return $contentPiece;
}
return false;
}
}

View file

@ -0,0 +1,52 @@
<?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\Contents\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugins\Actions\Segment;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
class ContentTarget extends ActionDimension
{
protected $columnName = 'idaction_content_target';
protected $columnType = 'INTEGER(10) UNSIGNED DEFAULT NULL';
protected function configureSegments()
{
$segment = new Segment();
$segment->setSegment('contentTarget');
$segment->setName('Contents_ContentTarget');
$segment->setAcceptedValues('For instance the URL of a landing page: "http://landingpage.example.com"');
$this->addSegment($segment);
}
public function getName()
{
return Piwik::translate('Contents_ContentTarget');
}
public function getActionId()
{
return Action::TYPE_CONTENT_TARGET;
}
public function onLookupAction(Request $request, Action $action)
{
$contentTarget = $request->getParam('c_t');
$contentTarget = trim($contentTarget);
if (strlen($contentTarget) > 0) {
return $contentTarget;
}
return false;
}
}

View file

@ -0,0 +1,57 @@
<?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\Contents\Columns\Metrics;
use Piwik\DataTable\Row;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\ProcessedMetric;
/**
* The content interaction rate. Calculated as:
*
* nb_interactions / nb_impressions
*
* nb_interactions & nb_impressions are calculated by the Contents archiver.
*/
class InteractionRate extends ProcessedMetric
{
public function getName()
{
return 'interaction_rate';
}
public function getTranslatedName()
{
return Piwik::translate('Contents_InteractionRate');
}
public function getDocumentation()
{
return Piwik::translate('Contents_InteractionRateMetricDocumentation');
}
public function compute(Row $row)
{
$interactions = $this->getMetric($row, 'nb_interactions');
$impressions = $this->getMetric($row, 'nb_impressions');
return Piwik::getQuotientSafe($interactions, $impressions, $precision = 4);
}
public function format($value, Formatter $formatter)
{
return $formatter->getPrettyPercentFromQuotient($value);
}
public function getDependentMetrics()
{
return array('nb_interactions', 'nb_impressions');
}
}

View file

@ -0,0 +1,50 @@
<?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\Contents;
use Piwik\Piwik;
class Contents extends \Piwik\Plugin
{
/**
* @see Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
return array(
'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
'Metrics.getDefaultMetricDocumentationTranslations' => 'addMetricDocumentationTranslations',
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
);
}
public function addMetricTranslations(&$translations)
{
$translations['nb_impressions'] = 'Contents_Impressions';
$translations['nb_interactions'] = 'Contents_Interactions';
$translations['interaction_rate'] = 'Contents_InteractionRate';
}
public function getJsFiles(&$jsFiles)
{
$jsFiles[] = "plugins/Contents/javascripts/contentsDataTable.js";
}
public function getStylesheetFiles(&$stylesheets)
{
$stylesheets[] = "plugins/Contents/stylesheets/datatable.less";
}
public function addMetricDocumentationTranslations(&$translations)
{
$translations['nb_impressions'] = Piwik::translate('Contents_ImpressionsMetricDocumentation');
$translations['nb_interactions'] = Piwik::translate('Contents_InteractionsMetricDocumentation');
}
}

View file

@ -0,0 +1,51 @@
<?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\Contents;
use Piwik\Plugin\Report;
use Piwik\View;
class Controller extends \Piwik\Plugin\Controller
{
public function index()
{
$reportsView = new View\ReportsByDimension('Contents');
/** @var \Piwik\Plugin\Report[] $reports */
$contentNames = Report::factory($this->pluginName, 'getContentNames');
$contentPieces = Report::factory($this->pluginName, 'getContentPieces');
$reports = array($contentNames, $contentPieces);
foreach($reports as $report) {
$reportsView->addReport(
$report->getCategory(),
$report->getName(),
'Contents.' . Report::PREFIX_ACTION_IN_MENU . ucfirst($report->getAction())
);
}
return $reportsView->render();
}
public function menuGetContentNames()
{
$report = Report::factory($this->pluginName, 'getContentNames');
return View::singleReport($report->getName(), $report->render());
}
public function menuGetContentPieces()
{
$report = Report::factory($this->pluginName, 'getContentPieces');
return View::singleReport($report->getName(), $report->render());
}
}

View file

@ -0,0 +1,76 @@
<?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\Contents;
use Piwik\Metrics;
/**
* The DataArray is a data structure used to aggregate datasets,
* ie. sum arrays made of rows made of columns,
* data from the logs is stored in a DataArray before being converted in a DataTable
*
*/
class DataArray extends \Piwik\DataArray
{
public function sumMetricsImpressions($label, $row)
{
if (!isset($this->data[$label])) {
$this->data[$label] = self::makeEmptyContentsRow();
}
$this->doSumContentsImpressionMetrics($row, $this->data[$label]);
}
public function sumMetricsInteractions($label, $row)
{
if (!isset($this->data[$label])) {
return; // do igonre interactions that do not have an impression
}
$this->doSumContentsInteractionMetrics($row, $this->data[$label]);
}
protected static function makeEmptyContentsRow()
{
return array(
Metrics::INDEX_NB_UNIQ_VISITORS => 0,
Metrics::INDEX_NB_VISITS => 0,
Metrics::INDEX_CONTENT_NB_IMPRESSIONS => 0,
Metrics::INDEX_CONTENT_NB_INTERACTIONS => 0
);
}
protected function doSumContentsImpressionMetrics($newRowToAdd, &$oldRowToUpdate)
{
$oldRowToUpdate[Metrics::INDEX_NB_VISITS] += $newRowToAdd[Metrics::INDEX_NB_VISITS];
$oldRowToUpdate[Metrics::INDEX_NB_UNIQ_VISITORS] += $newRowToAdd[Metrics::INDEX_NB_UNIQ_VISITORS];
$oldRowToUpdate[Metrics::INDEX_CONTENT_NB_IMPRESSIONS] += $newRowToAdd[Metrics::INDEX_CONTENT_NB_IMPRESSIONS];
}
protected function doSumContentsInteractionMetrics($newRowToAdd, &$oldRowToUpdate)
{
$oldRowToUpdate[Metrics::INDEX_CONTENT_NB_INTERACTIONS] += $newRowToAdd[Metrics::INDEX_CONTENT_NB_INTERACTIONS];
}
public function sumMetricsContentsImpressionPivot($parentLabel, $label, $row)
{
if (!isset($this->dataTwoLevels[$parentLabel][$label])) {
$this->dataTwoLevels[$parentLabel][$label] = $this->makeEmptyContentsRow();
}
$this->doSumContentsImpressionMetrics($row, $this->dataTwoLevels[$parentLabel][$label]);
}
public function sumMetricsContentsInteractionPivot($parentLabel, $label, $row)
{
if (!isset($this->dataTwoLevels[$parentLabel][$label])) {
return; // do igonre interactions that do not have an impression
}
$this->doSumContentsInteractionMetrics($row, $this->dataTwoLevels[$parentLabel][$label]);
}
}

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\Contents;
class Dimensions
{
public static function getRecordNameForAction($apiMethod)
{
$apiToRecord = array(
'getContentNames' => Archiver::CONTENTS_NAME_PIECE_RECORD_NAME,
'getContentPieces' => Archiver::CONTENTS_PIECE_NAME_RECORD_NAME
);
return $apiToRecord[$apiMethod];
}
public static function getSubtableLabelForApiMethod($apiMethod)
{
$labelToMethod = array(
'getContentNames' => 'Contents_ContentPiece',
'getContentPieces' => 'Contents_ContentName'
);
return $labelToMethod[$apiMethod];
}
}

View file

@ -0,0 +1,24 @@
<?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\Contents;
use Piwik\Menu\MenuReporting;
/**
* This class allows you to add, remove or rename menu items.
* To configure a menu (such as Admin Menu, Reporting Menu, User Menu...) simply call the corresponding methods as
* described in the API-Reference http://developer.piwik.org/api-reference/Piwik/Menu/MenuAbstract
*/
class Menu extends \Piwik\Plugin\Menu
{
public function configureReportingMenu(MenuReporting $menu)
{
$menu->addActionsItem('Contents_Contents', array('module' => 'Contents', 'action' => 'index'), $orderId = 40);
}
}

View file

@ -0,0 +1,18 @@
# Piwik Contents Plugin
## Description
Add your plugin description here.
## FAQ
__My question?__
My answer
## Changelog
Here goes the changelog text.
## Support
Please direct any feedback to ...

View file

@ -0,0 +1,60 @@
<?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\Contents\Reports;
use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\Contents\Dimensions;
abstract class Base extends Report
{
protected function init()
{
$this->category = 'General_Actions';
}
/**
* Here you can configure how your report should be displayed. For instance whether your report supports a search
* etc. You can also change the default request config. For instance change how many rows are displayed by default.
*
* @param ViewDataTable $view
*/
public function configureView(ViewDataTable $view)
{
$view->config->datatable_js_type = 'ContentsDataTable';
$view->config->datatable_css_class = 'ContentsDataTable';
if (!empty($this->dimension)) {
$view->config->addTranslations(array('label' => $this->dimension->getName()));
}
$view->config->columns_to_display = array_merge(
array('label'),
array_keys($this->getMetrics()),
array_keys($this->getProcessedMetrics())
);
$view->requestConfig->filter_sort_column = 'nb_impressions';
if ($this->hasSubtableId()) {
$apiMethod = $view->requestConfig->getApiMethodToRequest();
$label = Dimensions::getSubtableLabelForApiMethod($apiMethod);
$view->config->addTranslation('label', Piwik::translate($label));
}
}
private function hasSubtableId()
{
$subtable = Common::getRequestVar('idSubtable', false, 'integer');
return !empty($subtable);
}
}

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\Contents\Reports;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugins\Contents\Columns\ContentName;
use Piwik\Plugins\Contents\Columns\Metrics\InteractionRate;
use Piwik\View;
/**
* This class defines a new report.
*
* See {@link http://developer.piwik.org/api-reference/Piwik/Plugin/Report} for more information.
*/
class GetContentNames extends Base
{
protected function init()
{
parent::init();
$this->name = Piwik::translate('Contents_ContentName');
$this->dimension = null;
// TODO $this->documentation = Piwik::translate('ContentsDocumentation');
$this->dimension = new ContentName();
$this->order = 35;
$this->actionToLoadSubTables = 'getContentNames';
$this->widgetTitle = 'Contents_ContentName';
$this->metrics = array('nb_impressions', 'nb_interactions');
$this->processedMetrics = array(new InteractionRate());
}
}

View file

@ -0,0 +1,40 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\Contents\Reports;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugins\Contents\Columns\ContentPiece;
use Piwik\Plugins\Contents\Columns\Metrics\InteractionRate;
use Piwik\View;
/**
* This class defines a new report.
*
* See {@link http://developer.piwik.org/api-reference/Piwik/Plugin/Report} for more information.
*/
class GetContentPieces extends Base
{
protected function init()
{
parent::init();
$this->name = Piwik::translate('Contents_ContentPiece');
$this->dimension = null;
// TODO $this->documentation = Piwik::translate('ContentsDocumentation');
$this->dimension = new ContentPiece();
$this->order = 36;
$this->actionToLoadSubTables = 'getContentPieces';
$this->widgetTitle = 'Contents_ContentPiece';
$this->metrics = array('nb_impressions', 'nb_interactions');
$this->processedMetrics = array(new InteractionRate());
}
}

View file

@ -0,0 +1,52 @@
/*!
* Piwik - free/libre analytics platform
*
* @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;
/**
* UI control that handles extra functionality for Actions datatables.
*
* @constructor
*/
exports.ContentsDataTable = function (element) {
DataTable.call(this, element);
};
$.extend(exports.ContentsDataTable.prototype, dataTablePrototype, {
//see dataTable::bindEventsAndApplyStyle
_init: function (domElem) {
domElem.find('table > tbody > tr').each(function (index, tr) {
var $tr = $(tr);
var $td = $tr.find('.label .value');
var text = $td.text().trim();
if (text.search('^https?:\/\/[^\/]+') !== -1) {
if (text.match(/(.jpg|.gif|.png|.svg)$/)) {
if (window.encodeURI) {
text = window.encodeURI(text);
}
$td.tooltip({
track: true,
items: 'span',
content: '<p><img style="max-width: 150px;max-height:150px;" src="' + text + '"/><br />' + text + '</p>',
tooltipClass: 'rowActionTooltip',
show: false,
hide: false
});
}
}
});
}
});
})(jQuery, require);

View file

@ -0,0 +1,9 @@
{
"Contents": {
"Impressions": "طباعة",
"Interaction": "المعاملة",
"InteractionRate": "نسبة المشاركة",
"ContentPiece": "جزء من المحتوى",
"Contents": "عنوان المحتوى"
}
}

View file

@ -0,0 +1,11 @@
{
"Contents": {
"Impressions": "Импресии",
"Interactions": "Взаимодействия",
"Interaction": "Взаимодействие",
"InteractionRate": "Честота на взаимодействие",
"ContentName": "Име на съдържанието",
"ContentTarget": "Целево съдържание",
"Contents": "Съдържание"
}
}

View file

@ -0,0 +1,6 @@
{
"Contents": {
"ContentName": "Nom del contingut",
"Contents": "Continguts"
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "Sledování obsahu a bannerů vám umožňuje sledovat efektivitu (zobrazení, kliky...) libovolného obsahu (bannerová reklama, obrázek, vlastně cokoliv) na vašich stránkách.",
"Impressions": "Dojmy",
"Interactions": "Interakce",
"Interaction": "Interakce",
"InteractionRate": "Rychlost interakcí",
"ContentName": "Jméno obsahu",
"ContentPiece": "Část obsahu",
"ContentTarget": "Cíl obsahu",
"Contents": "Obsah",
"InteractionsMetricDocumentation": "Kolikrát bylo s blokem obsahu interagováno (t. j. kliknuto na banner nebo reklamu).",
"ImpressionsMetricDocumentation": "Počet zobrazení banneru nebo reklamy na stránkách.",
"InteractionRateMetricDocumentation": "Poměr impresí obsahu k interakcím."
}
}

View file

@ -0,0 +1,12 @@
{
"Contents": {
"Impressions": "Indtryk",
"Interactions": "Interaktioner",
"Interaction": "Interaktion",
"InteractionRate": "Interaktionsfrekvens",
"ContentName": "Indholdsnavn",
"ContentPiece": "Indholdsstykke",
"ContentTarget": "Indholdsmål",
"Contents": "Indhold"
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "Content und Banner Tracking gibt Ihnen die Möglichkeit die Performance (Ansichten, Klicks, CTR) von einem beliebigen Stück Content (Banner-Werbung, Bild, beliebiges Element) auf Ihrer Seite zu messen.",
"Impressions": "Impressionen",
"Interactions": "Interaktionen",
"Interaction": "Interaktion",
"InteractionRate": "Interaktionsrate",
"ContentName": "Inhaltsname",
"ContentPiece": "Inhaltsteil",
"ContentTarget": "Inhaltsziel",
"Contents": "Inhalte",
"InteractionsMetricDocumentation": "Die Anzahl, wie häufig mit einem Inhalt interagiert wurde (z.B. durch einen Klick auf ein Banner oder eine Anzeige).",
"ImpressionsMetricDocumentation": "Die Anzahl, wie häufig ein Inhalt, z.b. ein Banner oder eine Anzeige, auf der Seite angezeigt wurden.",
"InteractionRateMetricDocumentation": "Verhältnis zwischen Impressionen des Inhalts und Interaktionen."
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "Η παρακολούθηση περιεχομένου και εικόνων επιτρέπει να μετράτε την απόδοση (επισκέψεις, κλικ, CTR) οποιουδήποτε είδους περιεχομένου των σελίδων σας (εικόνες διαφημίσεων, εικόνες, οποιαδήποτε αντικείμενα).",
"Impressions": "Αποτυπώσεις",
"Interactions": "Αλληλεπιδράσεις",
"Interaction": "Αλληλεπίδραση",
"InteractionRate": "Ρυθμός αλληλεπίδρασης",
"ContentName": "Όνομα Περιεχομένου",
"ContentPiece": "Κομμάτι Περιεχομένου",
"ContentTarget": "Στόχος Περιεχομένου",
"Contents": "Περιεχόμενα",
"InteractionsMetricDocumentation": "Ο αριθμός αλληλεπιδράσεων σε ένα μπλοκ περιεχομένου (πχ. ένα 'κλικ' σε μια εικόνα ή διαφήμιση).",
"ImpressionsMetricDocumentation": "Ο αριθμός εμφανίσεων σε μια σελίδα ενός μπλοκ περιεχομένου, όπως μια εικόνα ή διαφήμιση.",
"InteractionRateMetricDocumentation": "Ο λόγος Εμφανίσεων περιεχομένου προς Αλληλεπιδράσεις."
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "Content and banner tracking lets you measure the performance (views, clicks, CTR) of any piece of content on your pages (Banner ad, image, any item).",
"Impressions": "Impressions",
"Interactions": "Interactions",
"Interaction": "Interaction",
"InteractionRate": "Interaction Rate",
"ContentName": "Content Name",
"ContentPiece": "Content Piece",
"ContentTarget": "Content Target",
"Contents": "Contents",
"InteractionsMetricDocumentation": "The number of times a content block was interacted with (eg, a 'click' on a banner or ad).",
"ImpressionsMetricDocumentation": "The number of times a content block, such as a banner or an ad, was displayed on a page.",
"InteractionRateMetricDocumentation": "The ratio of content impressions to interactions."
}
}

View file

@ -0,0 +1,13 @@
{
"Contents": {
"PluginDescription": "El contenido y el seguimiento de anuncios le permite medir el rendimiento (visitas, clics, CTR) de cualquier pieza de contenido en sus páginas (anuncios publicitarios, imágenes, cualquier elemento).",
"Impressions": "Impresiones",
"Interactions": "Interacciones",
"Interaction": "Interacción",
"InteractionRate": "Nivel de interacción",
"ContentName": "Nombre del contenido",
"ContentPiece": "Pieza de contenido",
"ContentTarget": "Objetivo del contenido",
"Contents": "Contenidos"
}
}

View file

@ -0,0 +1,9 @@
{
"Contents": {
"Interactions": "Koostoime",
"InteractionRate": "Koostoime mõju",
"ContentName": "Sisu nimi",
"ContentPiece": "Sisu tükk",
"Contents": "Sisud"
}
}

View file

@ -0,0 +1,12 @@
{
"Contents": {
"Impressions": "Näkymät",
"Interactions": "Interaktiot",
"Interaction": "Interaktio",
"InteractionRate": "Interaktioiden määrä",
"ContentName": "Sisällön nimi",
"ContentPiece": "Sisällön osa",
"ContentTarget": "Sisällön kohde",
"Contents": "Sisällöt"
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "Le suivi de contenu et de bannière vous permet de mesurer la performance (vues, clics, CTR) de chaque partie du contenu de vos pages (bannière de pub, image, tout élément).",
"Impressions": "Impressions",
"Interactions": "Interactions",
"Interaction": "Interaction",
"InteractionRate": "Taux d'interaction",
"ContentName": "Nom du contenu",
"ContentPiece": "Partie du contenu",
"ContentTarget": "Cible du contenu",
"Contents": "Contenus",
"InteractionsMetricDocumentation": "Nombre de fois où un bloc de contenu a subi une interaction (ex un click sur une bannière ou sur une publicité).",
"ImpressionsMetricDocumentation": "Le nombre de fois qu'un bloc de contenu tel qu'une bannière ou une publicité a été affiché sur la page.",
"InteractionRateMetricDocumentation": "Le ratio entre les impressions de contenu et les interactions."
}
}

View file

@ -0,0 +1,9 @@
{
"Contents": {
"Impressions": "Impresións",
"Interactions": "Interaccións",
"Interaction": "Interacción",
"ContentName": "Nome do contido",
"Contents": "Contido"
}
}

View file

@ -0,0 +1,13 @@
{
"Contents": {
"PluginDescription": "सामग्री और बैनर पर नज़र रखने से आप किसी भी अपने पृष्ठों पर सामग्री का टुकड़ा (बैनर विज्ञापन, छवि, किसी भी आइटम) का प्रदर्शन (विचारों, क्लिक, CTR) को मापने की सुविधा देता है।",
"Impressions": "छापे",
"Interactions": "सहभागिता",
"Interaction": "इंटरेक्शन",
"InteractionRate": "सहभागिता दर",
"ContentName": "सामग्री का नाम",
"ContentPiece": "सामग्री टुकड़ा",
"ContentTarget": "सामग्री को लक्षित",
"Contents": "अंतर्वस्तु"
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "Il tracciamento di contenuto e banner ti consente di misurare le prestazioni (visite, clicks, CTR) di ciascuna porzione di contenuto delle tue pagine (Banner ad, immagini, ogni elemento).",
"Impressions": "Impressioni",
"Interactions": "Interazioni",
"Interaction": "Interazione",
"InteractionRate": "Rapporto di Interazioni",
"ContentName": "Nome Contenuto",
"ContentPiece": "Pezzo del Contenuto",
"ContentTarget": "Obiettivo del Contenuto",
"Contents": "Contenuti",
"InteractionsMetricDocumentation": "Numero di volte in cui si è interagito con un blocco di contenuto (es. un 'click' su un banner o una inserzione).",
"ImpressionsMetricDocumentation": "Numero di volte in cui un blocco di contenuto, come un banner o una inserzione, è stato mostrato in una pagina.",
"InteractionRateMetricDocumentation": "Rapporto tra impressioni contenuto e interazioni."
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "コンテンツやバナーの追跡では、ページのコンテンツの任意の部分(バナー広告、イメージ、任意項目) のパフォーマンス(ビュー、クリック数、CTR )を測定できます。",
"Impressions": "インプレッション",
"Interactions": "インタラクション",
"Interaction": "インタラクション",
"InteractionRate": "インタラクション率",
"ContentName": "コンテンツ名",
"ContentPiece": "コンテンツ要素",
"ContentTarget": "コンテンツターゲット",
"Contents": "内容",
"InteractionsMetricDocumentation": "( 例えば、バナーや広告を「クリック」というような ) 相互作用をコンテンツブロックが受けた回数。",
"ImpressionsMetricDocumentation": "広告やバナーなどのコンテンツブロックがページに表示された回数。",
"InteractionRateMetricDocumentation": "相互作用に対するコンテンツの表示回数の比率。"
}
}

View file

@ -0,0 +1,11 @@
{
"Contents": {
"Interactions": "상호 작용들",
"Interaction": "상호 작용",
"InteractionRate": "상호 작용 비율",
"ContentName": "콘텐츠 이름",
"ContentPiece": "콘텐츠 조각",
"ContentTarget": "콘텐츠 목표",
"Contents": "콘텐츠"
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "Innholds- og bannersporing lar deg måle ytelsen (visninger, klikk, CTR) til deler av innholdet på dine sider (banner-annonser, bilder, eller hva som helst).",
"Impressions": "Visninger",
"Interactions": "Interaksjoner",
"Interaction": "Interaksjon",
"InteractionRate": "Interaksjonsrate",
"ContentName": "Innholdsnavn",
"ContentPiece": "Innholdsdel",
"ContentTarget": "Innholdsmål",
"Contents": "Innhold",
"InteractionsMetricDocumentation": "Antall ganger en innholdsdel ble interagert med (f.eks. et klikk på en banner eller annonse).",
"ImpressionsMetricDocumentation": "Antall ganger en innholdsdel, som en banner eller annonse, ble vist på en side.",
"InteractionRateMetricDocumentation": "Ratioen mellom visninger og interaksjoner."
}
}

View file

@ -0,0 +1,13 @@
{
"Contents": {
"PluginDescription": "Met content en banner tracking meet je de prestaties (bezoeken, kliks, CTR) van elk stuk content op je website pagina (Banner ad, plaatje)",
"Impressions": "Impressies",
"Interactions": "Interacties",
"Interaction": "Interactie",
"InteractionRate": "Interactie aantal",
"ContentName": "Content naam",
"ContentPiece": "Content onderdeel",
"ContentTarget": "Content doel",
"Contents": "Inhoudsopgave"
}
}

View file

@ -0,0 +1,7 @@
{
"Contents": {
"Interactions": "Interakcje",
"ContentName": "Nazwa treści",
"Contents": "Treść"
}
}

View file

@ -0,0 +1,16 @@
{
"Contents": {
"PluginDescription": "O rastreamento de conteúdo e banner permite que meça o desempenho (visualizações, cliques, CTR) de qualquer parte do conteúdo em suas páginas (Banner de anúncio, imagem, qualquer item).",
"Impressions": "Impressões",
"Interactions": "Interações",
"Interaction": "Interação",
"InteractionRate": "Taxa de interação",
"ContentName": "Nome do conteúdo",
"ContentPiece": "Parte do conteúdo",
"ContentTarget": "Destino do conteúdo",
"Contents": "Conteúdos",
"InteractionsMetricDocumentation": "O número de vezes que interagiram com um bloco de conteúdo (e.g., um 'clique' em um banner ou anúncio).",
"ImpressionsMetricDocumentation": "O número de vezes que um bloco de conteúdo, como um banner ou um anúncio, foi exibido em uma página.",
"InteractionRateMetricDocumentation": "A proporção de impressões de conteúdo para interações."
}
}

View file

@ -0,0 +1,9 @@
{
"Contents": {
"Impressions": "Impressões",
"Interactions": "Interações",
"Interaction": "Interação",
"ContentTarget": "Conteúdo de Destino",
"Contents": "Conteúdos"
}
}

View file

@ -0,0 +1,7 @@
{
"Contents": {
"Interactions": "Interactiuni",
"Interaction": "Interactiune",
"ContentName": "Nume Continut"
}
}

View file

@ -0,0 +1,12 @@
{
"Contents": {
"Impressions": "Показы",
"Interactions": "Взаимодествия",
"Interaction": "Взаимодествие",
"InteractionRate": "Коэффициент взаимодествия",
"ContentName": "Название публикации",
"ContentPiece": "Часть публикации",
"ContentTarget": "Цель публикации",
"Contents": "Публикации"
}
}

View file

@ -0,0 +1,12 @@
{
"Contents": {
"Impressions": "Ogledi",
"Interactions": "Interakcije",
"Interaction": "Interakcija",
"InteractionRate": "Stopnja interakcij",
"ContentName": "Ime vsebine",
"ContentPiece": "Del vsebine",
"ContentTarget": "Cilj vsebine",
"Contents": "Vsebine"
}
}

View file

@ -0,0 +1,13 @@
{
"Contents": {
"PluginDescription": "Gjurmimi i lëndës dhe i banerave ju lejon të matni punimin (parje, klikime, CTR) të çfarëdo pjese të lëndës në faqet tuaja (Banner ad, figurë, çfarëdo objekti).",
"Impressions": "Përshtypje",
"Interactions": "Ndërveprime",
"Interaction": "Ndërveprim",
"InteractionRate": "Shkallë Ndërveprimi",
"ContentName": "Emër Lënde",
"ContentPiece": "Copëz Lënde",
"ContentTarget": "Lëndë e Synuar",
"Contents": "Lëndë"
}
}

View file

@ -0,0 +1,13 @@
{
"Contents": {
"PluginDescription": "Praćenje sadržaja i banera vam omogućuje merenje performansi (prikaza, klikova, CTR) bilo kog dela sadržaja vaših stranica (reklama, slika itd.).",
"Impressions": "Prikazi",
"Interactions": "Interakcije",
"Interaction": "Interakcija",
"InteractionRate": "Odnos interakcija",
"ContentName": "Naziv sadržaja",
"ContentPiece": "Sadržaj",
"ContentTarget": "Cilj sadržaja",
"Contents": "Sadržaji"
}
}

View file

@ -0,0 +1,13 @@
{
"Contents": {
"PluginDescription": "Innehålls- och bannertracking ger dig möjlighet att mäta prestanda (visningar, klick, CTR) för alla typer av innehåll på dina sidor (bannerannonser, bilder mm).",
"Impressions": "Visningar",
"Interactions": "Interaktioner",
"Interaction": "Interaktion",
"InteractionRate": "Andel interaktioner",
"ContentName": "Namn på innehåll",
"ContentPiece": "Innehållsdel",
"ContentTarget": "Innehållsmål",
"Contents": "Innehåll"
}
}

View file

@ -0,0 +1,12 @@
{
"Contents": {
"Impressions": "எண்ண ஓட்டம்",
"Interactions": "உரையாடல்கள்",
"Interaction": "உரையாடல்",
"InteractionRate": "உரையாடல் வீதம்",
"ContentName": "உள்ளடக்கத்தின் பெயர்",
"ContentPiece": "உள்ளடக்கக் கூறு",
"ContentTarget": "உள்ளடக்க இலக்கு",
"Contents": "உள்ளடக்கம்"
}
}

View file

@ -0,0 +1,12 @@
{
"Contents": {
"Impressions": "Mga Impresyon",
"Interactions": "Mga Pakikipag-ugnayan",
"Interaction": "Pakikipag-ugnayan",
"InteractionRate": "Rate ng Pakikipag-ugnayan",
"ContentName": "Pangalan ng Nilalaman",
"ContentPiece": "Piraso ng Nilalaman",
"ContentTarget": "Target ng Nilalaman",
"Contents": "Mga Nilalaman"
}
}

View file

@ -0,0 +1,12 @@
{
"Contents": {
"Impressions": "Gösterimler",
"Interactions": "Etkileşimler",
"Interaction": "Etkileşim",
"InteractionRate": "Etkileşim Oranı",
"ContentName": "İçerik İsmi",
"ContentPiece": "İçerik Parçası",
"ContentTarget": "İçerik Hedefi",
"Contents": "İçerikler"
}
}

View file

@ -0,0 +1,13 @@
{
"Contents": {
"PluginDescription": "Chức năng theo dõi nội dung và banner cho phép bạn đánh giá được hiệu quả (lượt xem, click, CTR) của bất kỳ trang web nào.",
"Impressions": "Lượt hiển thị cho người dùng",
"Interactions": "Tương tác",
"Interaction": "Tương tác",
"InteractionRate": "Tỷ lệ tương tác",
"ContentName": "Tên nội dung",
"ContentPiece": "Thành phần nội dung",
"ContentTarget": "Đối tượng nội dung",
"Contents": "Nội dung"
}
}

View file

@ -0,0 +1,3 @@
#content:not(.admin) .ContentsDataTable > .dataTableWrapper {
width: 750px;
}