Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/API/DocumentationGenerator.php2
-rw-r--r--core/API/Request.php17
-rw-r--r--core/Access.php13
-rw-r--r--core/AssetManager.php1
-rw-r--r--core/Config.php9
-rw-r--r--core/Controller.php33
-rw-r--r--core/DataTable.php3
-rw-r--r--core/DataTable/Map.php14
-rw-r--r--core/JqplotDataGenerator/Evolution.php2
-rw-r--r--core/Piwik.php4
-rw-r--r--core/Plugin/MetadataLoader.php51
-rw-r--r--core/Twig.php10
-rw-r--r--core/ViewDataTable.php285
-rw-r--r--core/ViewDataTable/Cloud.php73
-rw-r--r--core/ViewDataTable/GenerateGraphHTML.php77
-rw-r--r--core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php13
-rw-r--r--core/ViewDataTable/GenerateGraphHTML/ChartPie.php3
-rw-r--r--core/ViewDataTable/GenerateGraphHTML/ChartVerticalBar.php2
-rw-r--r--core/ViewDataTable/HtmlTable.php17
-rw-r--r--core/ViewDataTable/HtmlTable/AllColumns.php3
-rw-r--r--core/ViewDataTable/HtmlTable/Goals.php13
-rw-r--r--core/ViewDataTable/Properties.php179
-rw-r--r--core/ViewDataTable/Sparkline.php2
-rw-r--r--core/Visualization/Chart.php4
-rw-r--r--core/Visualization/Chart/Evolution.php12
-rw-r--r--core/Visualization/Chart/Pie.php4
-rw-r--r--core/Visualization/Chart/VerticalBar.php5
-rw-r--r--core/Visualization/Cloud.php44
-rw-r--r--core/Visualization/HtmlTable.php30
-rw-r--r--core/Visualization/JqplotGraph.php43
-rw-r--r--core/Visualization/Sparkline.php32
-rw-r--r--core/testMinimumPhpVersion.php2
-rw-r--r--js/piwik.js2
-rw-r--r--lang/ca.php16
-rw-r--r--lang/cs.php1
-rw-r--r--lang/da.php6
-rw-r--r--lang/de.php7
-rw-r--r--lang/el.php189
-rw-r--r--lang/es.php16
-rw-r--r--lang/fr.php21
-rw-r--r--lang/hi.php165
-rw-r--r--lang/id.php14
-rw-r--r--lang/ja.php41
-rw-r--r--lang/ko.php16
-rw-r--r--lang/sl.php2
-rw-r--r--lang/sr.php82
-rw-r--r--lang/sv.php87
-rw-r--r--lang/ta.php1
-rw-r--r--lang/te.php2
-rw-r--r--lang/tr.php5
-rw-r--r--lang/zh-cn.php16
-rw-r--r--lang/zh-tw.php5
-rw-r--r--misc/updateLanguageFiles.sh133
-rw-r--r--piwik.js4
-rw-r--r--plugins/Actions/Actions.php34
-rw-r--r--plugins/CoreHome/Controller.php20
-rw-r--r--plugins/CoreHome/CoreHome.php2
-rw-r--r--plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php4
-rw-r--r--plugins/CoreHome/DataTableRowAction/RowEvolution.php49
-rw-r--r--plugins/CoreHome/javascripts/color_manager.js132
-rw-r--r--plugins/CoreHome/javascripts/datatable.js2
-rw-r--r--plugins/CoreHome/javascripts/datatable_manager.js2
-rw-r--r--plugins/CoreHome/javascripts/datatable_rowactions.js1
-rw-r--r--plugins/CoreHome/javascripts/jqplot.js150
-rw-r--r--plugins/CoreHome/javascripts/sparkline.js47
-rw-r--r--plugins/CoreHome/stylesheets/cloud.less105
-rw-r--r--plugins/CoreHome/stylesheets/color_manager.css3
-rw-r--r--plugins/CoreHome/stylesheets/dataTable.less17
-rw-r--r--plugins/CoreHome/templates/_dataTable.twig30
-rw-r--r--plugins/CoreHome/templates/_dataTableActions_subDataTable.twig6
-rw-r--r--plugins/CoreHome/templates/_dataTableCell.twig2
-rw-r--r--plugins/CoreHome/templates/_dataTableCloud.twig34
-rw-r--r--plugins/CoreHome/templates/_dataTableFooter.twig10
-rw-r--r--plugins/CoreHome/templates/_dataTableGraph.twig40
-rw-r--r--plugins/CoreHome/templates/_dataTableHead.twig10
-rw-r--r--plugins/CoreHome/templates/_dataTableViz_htmlTable.twig27
-rw-r--r--plugins/CoreHome/templates/_dataTableViz_jqplotGraph.twig10
-rw-r--r--plugins/CoreHome/templates/_dataTableViz_tagCloud.twig18
-rw-r--r--plugins/CoreHome/templates/getMultiRowEvolutionPopover.twig7
-rw-r--r--plugins/CoreHome/templates/getRowEvolutionPopover.twig13
-rw-r--r--plugins/CustomVariables/Controller.php31
-rw-r--r--plugins/CustomVariables/CustomVariables.php51
-rw-r--r--plugins/DBStats/Controller.php215
-rw-r--r--plugins/DBStats/DBStats.php284
-rw-r--r--plugins/DevicesDetection/Controller.php84
-rw-r--r--plugins/DevicesDetection/DevicesDetection.php115
-rw-r--r--plugins/ExampleUI/API.php3
-rw-r--r--plugins/ExampleUI/Controller.php123
-rw-r--r--plugins/Goals/Controller.php12
-rw-r--r--plugins/Goals/Goals.php18
-rw-r--r--plugins/Live/Controller.php53
-rw-r--r--plugins/Live/Live.php32
-rw-r--r--plugins/Live/templates/getVisitorLog.twig6
-rw-r--r--plugins/Provider/Controller.php18
-rw-r--r--plugins/Provider/Provider.php24
-rw-r--r--plugins/Referers/Controller.php259
-rw-r--r--plugins/Referers/Referers.php221
-rw-r--r--plugins/Transitions/javascripts/transitions.js62
-rw-r--r--plugins/UserCountry/Controller.php126
-rw-r--r--plugins/UserCountry/UserCountry.php122
-rw-r--r--plugins/UserCountryMap/Controller.php4
-rw-r--r--plugins/UserSettings/Archiver.php7
-rw-r--r--plugins/UserSettings/Controller.php22
-rw-r--r--plugins/UserSettings/UserSettings.php152
-rw-r--r--plugins/VisitFrequency/templates/index.twig2
-rw-r--r--plugins/VisitTime/Controller.php6
-rw-r--r--plugins/VisitTime/VisitTime.php70
-rw-r--r--plugins/VisitorInterest/Controller.php60
-rw-r--r--plugins/VisitorInterest/VisitorInterest.php87
-rw-r--r--plugins/VisitsSummary/Controller.php2
-rw-r--r--plugins/VisitsSummary/templates/index.twig2
-rw-r--r--plugins/Zeitgeist/colors.piwik.json3
-rw-r--r--plugins/Zeitgeist/stylesheets/base.less8
-rw-r--r--plugins/Zeitgeist/stylesheets/general/_misc.less7
-rw-r--r--plugins/Zeitgeist/stylesheets/general/_utils.less8
-rw-r--r--plugins/Zeitgeist/stylesheets/ui/_dataTable.less3
-rw-r--r--plugins/Zeitgeist/stylesheets/ui/_jqplot.less150
-rw-r--r--plugins/Zeitgeist/stylesheets/ui/_sparkline.less26
-rw-r--r--plugins/Zeitgeist/stylesheets/ui/_transitions.less98
-rw-r--r--tests/PHPUnit/Core/AccessTest.php6
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml8
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml8
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml8
-rw-r--r--tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitorInterest.getNumberOfVisitsByDaysSinceLast_firstSite_lastN__API.getProcessedReport_day.xml18
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml26
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml16
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml20
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml16
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml18
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml8
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml12
-rwxr-xr-xtests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml8
-rw-r--r--tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_month.original.html40
-rw-r--r--tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__PDFReports.generateReport_month.original.html38
-rw-r--r--tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_month.original.pdfbin475182 -> 475176 bytes
-rw-r--r--tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_week.original.html36
-rw-r--r--tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__PDFReports.generateReport_week.original.html34
-rw-r--r--tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_week.original.pdfbin494179 -> 494173 bytes
-rw-r--r--tests/PHPUnit/TestingEnvironment.php26
-rw-r--r--tests/PHPUnit/UI/UIIntegrationTest.php2
-rw-r--r--tests/PHPUnit/proxy/archive.php10
-rw-r--r--tests/PHPUnit/proxy/index.php9
-rw-r--r--tests/README.md8
-rwxr-xr-xtests/lib/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php4
144 files changed, 3511 insertions, 2052 deletions
diff --git a/core/API/DocumentationGenerator.php b/core/API/DocumentationGenerator.php
index a6766f4e52..f846fc0c3e 100644
--- a/core/API/DocumentationGenerator.php
+++ b/core/API/DocumentationGenerator.php
@@ -105,7 +105,7 @@ class DocumentationGenerator
$str .= '</small>';
$str .= "</div>\n";
}
- $str .= '<div style="margin:15px;"><a href="#topApiRef" style="color:#95AECB">↑ Back to top</a></div>';
+ $str .= '<div style="margin:15px;"><a href="#topApiRef">↑ Back to top</a></div>';
}
$str = "<h2 id='topApiRef' name='topApiRef'>Quick access to APIs</h2>
diff --git a/core/API/Request.php b/core/API/Request.php
index 168da13ac3..b4af213ce6 100644
--- a/core/API/Request.php
+++ b/core/API/Request.php
@@ -251,4 +251,21 @@ class Request
return Url::getCurrentQueryStringWithParametersModified($params);
}
+
+ /**
+ * @return array|bool
+ */
+ static public function getRawSegmentFromRequest()
+ {
+ // we need the URL encoded segment parameter, we fetch it from _SERVER['QUERY_STRING'] instead of default URL decoded _GET
+ $segmentRaw = false;
+ $segment = Piwik_Common::getRequestVar('segment', '', 'string');
+ if (!empty($segment)) {
+ $request = Piwik_API_Request::getRequestParametersGET();
+ if(!empty($request['segment'])) {
+ $segmentRaw = $request['segment'];
+ }
+ }
+ return $segmentRaw;
+ }
}
diff --git a/core/Access.php b/core/Access.php
index a5daa13578..7c0d265024 100644
--- a/core/Access.php
+++ b/core/Access.php
@@ -52,9 +52,7 @@ class Access
if (self::$instance == null) {
self::$instance = new self;
- if (!empty($GLOBALS['PIWIK_ACCESS_IS_SUPERUSER'])) {
- self::$instance->setSuperUser(true);
- }
+ Piwik_PostTestEvent('Access.createAccessSingleton', array(self::$instance));
}
return self::$instance;
}
@@ -219,12 +217,9 @@ class Access
$allSitesId = array();
}
$this->idsitesByAccess['superuser'] = $allSitesId;
-
- if (isset($GLOBALS['PIWIK_ACCESS_SUPERUSER_LOGIN'])) {
- $this->login = $GLOBALS['PIWIK_ACCESS_SUPERUSER_LOGIN'];
- } else {
- $this->login = Config::getInstance()->superuser['login'];
- }
+ $this->login = Config::getInstance()->superuser['login'];
+
+ Piwik_PostTestEvent('Access.loadingSuperUserAccess', array(&$this->idsitesByAccess, &$this->login));
return true;
}
diff --git a/core/AssetManager.php b/core/AssetManager.php
index 3f701e02b7..041ae5e86c 100644
--- a/core/AssetManager.php
+++ b/core/AssetManager.php
@@ -263,6 +263,7 @@ class AssetManager
{
$priorityCssOrdered = array(
'libs/',
+ 'plugins/CoreHome/stylesheets/color_manager.css', // must be before other Piwik stylesheets
'plugins/Zeitgeist/stylesheets/base.less',
'plugins/Zeitgeist/stylesheets/',
'plugins/',
diff --git a/core/Config.php b/core/Config.php
index 542b518a6f..b467881ead 100644
--- a/core/Config.php
+++ b/core/Config.php
@@ -12,6 +12,8 @@
namespace Piwik;
use Exception;
+require_once PIWIK_INCLUDE_PATH . '/core/EventDispatcher.php';
+
/**
* For general performance (and specifically, the Tracker), we use deferred (lazy) initialization
* and cache sections. We also avoid any dependency on Zend Framework's Zend_Config.
@@ -54,12 +56,9 @@ class Config
{
if (self::$instance == null) {
self::$instance = new self;
+ self::$instance->init();
- if (empty($GLOBALS['PIWIK_CONFIG_TEST_ENVIRONMENT'])) {
- self::$instance->init();
- } else {
- self::$instance->setTestEnvironment();
- }
+ Piwik_PostTestEvent('Config.createConfigSingleton', array(self::$instance));
}
return self::$instance;
}
diff --git a/core/Controller.php b/core/Controller.php
index 2649339ab1..612b324006 100644
--- a/core/Controller.php
+++ b/core/Controller.php
@@ -211,14 +211,6 @@ abstract class Controller
protected function getLastUnitGraphAcrossPlugins($currentModuleName, $currentControllerAction,
$columnsToDisplay, $selectableColumns = array(), $reportDocumentation = false, $apiMethod = 'API.get')
{
- // back up and manipulate the columns parameter
- $backupColumns = false;
- if (isset($_GET['columns'])) {
- $backupColumns = $_GET['columns'];
- }
-
- $_GET['columns'] = implode(',', $columnsToDisplay);
-
// load translations from meta data
$idSite = Common::getRequestVar('idSite');
$period = Common::getRequestVar('period');
@@ -239,23 +231,15 @@ abstract class Controller
// initialize the graph and load the data
$view = $this->getLastUnitGraph($currentModuleName, $currentControllerAction, $apiMethod);
- $view->setColumnsToDisplay($columnsToDisplay);
- $view->setSelectableColumns($selectableColumns);
- $view->setColumnsTranslations($translations);
+ $view->columns_to_display = $columnsToDisplay;
+ $view->selectable_columns = array_merge($view->selectable_columns, $selectableColumns);
+ $view->translations += $translations;
if ($reportDocumentation) {
- $view->setReportDocumentation($reportDocumentation);
+ $view->documentation = $reportDocumentation;
}
$view->main();
-
- // restore the columns parameter
- if ($backupColumns !== false) {
- $_GET['columns'] = $backupColumns;
- } else {
- unset($_GET['columns']);
- }
-
return $view;
}
@@ -831,12 +815,13 @@ abstract class Controller
$titleEvolutionPercent = $evolutionPercent;
if ($evolutionPercent < 0) {
- $color = "#e02a3b"; //red
+ $class = "negative-evolution";
$img = "arrow_down.png";
} else if ($evolutionPercent == 0) {
+ $class = "neutral-evolution";
$img = "stop.png";
} else {
- $color = "green";
+ $class = "positive-evolution";
$img = "arrow_up.png";
$titleEvolutionPercent = '+' . $titleEvolutionPercent;
}
@@ -852,8 +837,8 @@ abstract class Controller
$result = '<span class="metricEvolution" title="' . $title
. '"><img style="padding-right:4px" src="plugins/MultiSites/images/' . $img . '"/><strong';
- if (isset($color)) {
- $result .= ' style="color:' . $color . '"';
+ if (isset($class)) {
+ $result .= ' class="' . $class . '"';
}
$result .= '>' . $evolutionPercent . '</strong></span>';
diff --git a/core/DataTable.php b/core/DataTable.php
index a1dd872ec5..74d466cf5b 100644
--- a/core/DataTable.php
+++ b/core/DataTable.php
@@ -380,7 +380,8 @@ class DataTable
public function filter($className, $parameters = array())
{
if ($className instanceof Closure) {
- $className($this);
+ array_unshift($parameters, $this);
+ call_user_func_array($className, $parameters);
return;
}
diff --git a/core/DataTable/Map.php b/core/DataTable/Map.php
index 443e741f2c..538e824b7a 100644
--- a/core/DataTable/Map.php
+++ b/core/DataTable/Map.php
@@ -408,4 +408,18 @@ class Map
return array_values($data);
}
+ /**
+ * @see Piwik_DataTable::getColumns()
+ *
+ * @return array
+ */
+ public function getColumns()
+ {
+ foreach ($this->getArray() as $childTable) {
+ if ($childTable->getRowsCount() > 0) {
+ return $childTable->getColumns();
+ }
+ }
+ return array();
+ }
}
diff --git a/core/JqplotDataGenerator/Evolution.php b/core/JqplotDataGenerator/Evolution.php
index 218b0da890..3a36978593 100644
--- a/core/JqplotDataGenerator/Evolution.php
+++ b/core/JqplotDataGenerator/Evolution.php
@@ -119,7 +119,7 @@ class Evolution extends JqplotDataGenerator
'idSite' => $idSite,
'period' => $period->getLabel(),
'date' => $dateInUrl->toString(),
- 'segment' => ViewDataTable::getRawSegmentFromRequest()
+ 'segment' => \Piwik\API\Request::getRawSegmentFromRequest()
);
$hash = '';
if (!empty($queryStringAsHash)) {
diff --git a/core/Piwik.php b/core/Piwik.php
index 3b656fbcc3..7f0a25e51d 100644
--- a/core/Piwik.php
+++ b/core/Piwik.php
@@ -383,10 +383,10 @@ class Piwik
}
if (($aDirs = \_glob("$sDir/*", GLOB_ONLYDIR)) != false) {
foreach ($aDirs as $sSubDir) {
- // avoid infinite recursion of symlink'ed directories
- if(strpos($sSubDir, "tests/PHPUnit/proxy/tests/PHPUnit/proxy") !== false) {
+ if (is_link($sSubDir)) {
continue;
}
+
$aSubFiles = self::globr($sSubDir, $sPattern, $nFlags);
$aFiles = array_merge($aFiles, $aSubFiles);
}
diff --git a/core/Plugin/MetadataLoader.php b/core/Plugin/MetadataLoader.php
index 5400fde01d..e0f198a505 100644
--- a/core/Plugin/MetadataLoader.php
+++ b/core/Plugin/MetadataLoader.php
@@ -22,16 +22,11 @@ require_once PIWIK_INCLUDE_PATH . '/core/Version.php';
/**
* Loads plugin metadata found in the following files:
* - plugin.piwik.json
- * - colors.piwik.json
*/
class MetadataLoader
{
const PLUGIN_JSON_FILENAME = 'plugin.piwik.json';
- const COLORS_JSON_FILENAME = 'colors.piwik.json';
-
- const SHORT_COLOR_LENGTH = 4;
- const LONG_COLOR_LENGTH = 7;
-
+
/**
* The name of the plugin whose metadata will be loaded.
*
@@ -58,8 +53,7 @@ class MetadataLoader
{
return array_merge(
$this->getDefaultPluginInformation(),
- $this->loadPluginInfoJson(),
- $this->loadPluginColorsJson()
+ $this->loadPluginInfoJson()
);
}
@@ -84,47 +78,6 @@ class MetadataLoader
return $this->loadJsonMetadata($path);
}
- private function loadPluginColorsJson()
- {
- $path = \Piwik\PluginsManager::getPluginsDirectory() . $this->pluginName . '/' . self::COLORS_JSON_FILENAME;
- $info = $this->loadJsonMetadata($path);
- $info = $this->cleanAndValidatePluginColorsJson($path, $info);
- return $info;
- }
-
- private function cleanAndValidatePluginColorsJson($path, $info)
- {
- // check that if "colors" exists, it is an array
- $colors = isset($info["colors"]) ? $info["colors"] : array();
- if (!is_array($colors)) {
- throw new Exception("The 'colors' value in '$path' must be an object mapping names with colors.");
- }
-
- // validate each color
- foreach ($colors as $color) {
- if (!$this->isStringColorValid($color)) {
- throw new Exception("Invalid color string '$color' in '$path'.");
- }
- }
-
- return array("colors" => $colors); // make sure only 'colors' element is loaded
- }
-
- private function isStringColorValid($color)
- {
- if (strlen($color) !== self::SHORT_COLOR_LENGTH
- && strlen($color) !== self::LONG_COLOR_LENGTH
- ) {
- return false;
- }
-
- if ($color[0] !== '#') {
- return false;
- }
-
- return ctype_xdigit(substr($color, 1)); // check if other digits are hex
- }
-
private function loadJsonMetadata($path)
{
if (!file_exists($path)) {
diff --git a/core/Twig.php b/core/Twig.php
index ea5e23d9f5..c00fc2a23d 100644
--- a/core/Twig.php
+++ b/core/Twig.php
@@ -32,6 +32,9 @@ use Twig_SimpleFunction;
*/
class Twig
{
+ const SPARKLINE_TEMPLATE = '<img class="sparkline" alt="" data-src="%s" width="%d" height="%d" />
+ <script type="text/javascript">$(document).ready(function () { piwik.initSparklines(); });</script>';
+
/**
* @var Twig_Environment
*/
@@ -104,10 +107,9 @@ class Twig
protected function addFunction_sparkline()
{
$sparklineFunction = new Twig_SimpleFunction('sparkline', function ($src) {
- $graph = new Piwik_Visualization_Sparkline();
- $width = $graph->getWidth();
- $height = $graph->getHeight();
- return sprintf('<img class="sparkline" alt="" src="%s" width="%d" height="%d" />', $src, $width, $height);
+ $width = Piwik_Visualization_Sparkline::DEFAULT_WIDTH;
+ $height = Piwik_Visualization_Sparkline::DEFAULT_HEIGHT;
+ return sprintf(Piwik_Twig::SPARKLINE_TEMPLATE, $src, $width, $height);
}, array('is_safe' => array('html')));
$this->twig->addFunction($sparklineFunction);
}
diff --git a/core/ViewDataTable.php b/core/ViewDataTable.php
index d1ec61db90..2e0e591ed1 100644
--- a/core/ViewDataTable.php
+++ b/core/ViewDataTable.php
@@ -48,6 +48,7 @@ use Piwik\Site;
* }
* </pre>
*
+ * @see Piwik_ViewDataTable_Properties for core DataTable display properties.
* @see factory() for all the available output (cloud tags, html table, pie chart, vertical bar chart)
* @package Piwik
* @subpackage ViewDataTable
@@ -55,12 +56,11 @@ use Piwik\Site;
abstract class ViewDataTable
{
/**
- * Template file that will be loaded for this view.
- * Usually set in the Piwik_ViewDataTable_*
- *
- * @var string eg. 'CoreHome/templates/cloud.twig'
+ * Cache for getAllReportDisplayProperties result.
+ *
+ * @var array
*/
- protected $dataTableTemplate = null;
+ public static $reportPropertiesCache = null;
/**
* Flag used to make sure the main() is only executed once
@@ -118,12 +118,6 @@ abstract class ViewDataTable
protected $currentControllerName;
/**
- * @see init()
- * @var string
- */
- protected $controllerActionCalledWhenRequestSubTable = null;
-
- /**
* This view should be an implementation of the Interface Piwik_View_Interface
* The $view object should be created in the main() method.
*
@@ -132,25 +126,18 @@ abstract class ViewDataTable
protected $view = null;
/**
- * Documentation for the report.
- * Received from the Plugin API, used for inline help.
- *
- * @var array
- */
- protected $documentation = false;
-
- /**
* Default constructor.
*/
public function __construct()
{
+ $this->viewProperties['datatable_template'] = '@CoreHome/_dataTable';
$this->viewProperties['show_goals'] = false;
$this->viewProperties['show_ecommerce'] = false;
$this->viewProperties['show_search'] = true;
$this->viewProperties['show_table'] = true;
$this->viewProperties['show_table_all_columns'] = true;
$this->viewProperties['show_all_views_icons'] = true;
- $this->viewProperties['hide_all_views_icons'] = false;
+ $this->viewProperties['show_active_view_icon'] = true;
$this->viewProperties['hide_annotations_view'] = true;
$this->viewProperties['show_bar_chart'] = true;
$this->viewProperties['show_pie_chart'] = true;
@@ -186,6 +173,10 @@ abstract class ViewDataTable
Metrics::getDefaultProcessedMetrics()
);
$this->viewProperties['request_parameters_to_modify'] = array();
+ $this->viewProperties['documentation'] = false;
+ $this->viewProperties['subtable_controller_action'] = false;
+ $this->viewProperties['datatable_css_class'] = $this->getDefaultDataTableCssClass();
+ $this->viewProperties['selectable_columns'] = array(); // TODO: only valid for graphs... shouldn't be here.
$this->viewProperties['columns_to_display'] = array();
$columns = Common::getRequestVar('columns', false);
@@ -196,6 +187,37 @@ abstract class ViewDataTable
}
/**
+ * Gets a view property by reference.
+ *
+ * @param string $name A valid view property name. @see Piwik_ViewDataTable_Properties for all
+ * valid view properties.
+ * @return mixed
+ * @throws Exception if the property name is invalid.
+ */
+ public function &__get($name)
+ {
+ Piwik_ViewDataTable_Properties::checkValidPropertyName($name);
+
+ return $this->viewProperties[$name];
+ }
+
+ /**
+ * Sets a view property.
+ *
+ * @param string $name A valid view property name. @see Piwik_ViewDataTable_Properties for all
+ * valid view properties.
+ * @param mixed $value
+ * @return mixed Returns $value.
+ * @throws Exception if the property name is invalid.
+ */
+ public function __set($name, $value)
+ {
+ Piwik_ViewDataTable_Properties::checkValidPropertyName($name);
+
+ return $this->viewProperties[$name] = $value;
+ }
+
+ /**
* Method to be implemented by the ViewDataTable_*.
* This method should create and initialize a $this->view object @see Piwik_View_Interface
*
@@ -218,16 +240,21 @@ abstract class ViewDataTable
* If force is set to true, a ViewDataTable of the $defaultType will be returned in all cases.
*
* @param string $defaultType Any of these: table, cloud, graphPie, graphVerticalBar, graphEvolution, sparkline, generateDataChart*
- * @param string|bool $action
- * @return \Piwik\ViewDataTable
+ * @param string|bool $apiAction
+ * @param string|bool $controllerAction
+ * @return Piwik_ViewDataTable
*/
- static public function factory($defaultType = null, $action = false)
+ static public function factory($defaultType = null, $apiAction = false, $controllerAction = false)
{
- if ($action !== false) {
- $defaultProperties = self::getDefaultPropertiesForReport($action);
+ if ($apiAction !== false) {
+ $defaultProperties = self::getDefaultPropertiesForReport($apiAction);
if (isset($defaultProperties['default_view_type'])) {
$defaultType = $defaultProperties['default_view_type'];
}
+
+ if ($controllerAction === false) {
+ $controllerAction = $apiAction;
+ }
}
if ($defaultType === null) {
@@ -269,16 +296,16 @@ abstract class ViewDataTable
$result = new Piwik_ViewDataTable_HtmlTable();
break;
}
-
- if ($action !== false) {
- list($plugin, $controllerAction) = explode('.', $action);
-
+
+ if ($apiAction !== false) {
+ list($plugin, $controllerAction) = explode('.', $controllerAction);
+
$subtableAction = $controllerAction;
if (isset($defaultProperties['subtable_action'])) {
$subtableAction = $defaultProperties['subtable_action'];
}
-
- $result->init($plugin, $controllerAction, $action, $subtableAction, $defaultProperties);
+
+ $result->init($plugin, $controllerAction, $apiAction, $subtableAction, $defaultProperties);
}
return $result;
@@ -296,7 +323,7 @@ abstract class ViewDataTable
'show_table',
'show_table_all_columns',
'show_all_views_icons',
- 'hide_all_views_icons',
+ 'show_active_view_icon',
'hide_annotations_view',
'show_barchart',
'show_piechart',
@@ -362,9 +389,9 @@ abstract class ViewDataTable
{
$this->currentControllerName = $currentControllerName;
$this->currentControllerAction = $currentControllerAction;
- $this->controllerActionCalledWhenRequestSubTable = $controllerActionCalledWhenRequestSubTable;
+ $this->viewProperties['subtable_controller_action'] = $controllerActionCalledWhenRequestSubTable;
$this->idSubtable = Common::getRequestVar('idSubtable', false, 'int');
-
+
foreach ($defaultProperties as $name => $value) {
$this->setViewProperty($name, $value);
}
@@ -395,6 +422,8 @@ abstract class ViewDataTable
$function = $this->viewProperties['filter_excludelowpop_value'];
$this->viewProperties['filter_excludelowpop_value'] = $function();
}
+
+ $this->loadDocumentation();
}
/**
@@ -403,11 +432,13 @@ abstract class ViewDataTable
* eg. 'CoreHome/templates/cloud'
* But some users may want to force this template to some other value
*
+ * TODO: after visualization refactor, should remove this.
+ *
* @param string $tpl eg .'@MyPlugin/templateToUse'
*/
public function setTemplate($tpl)
{
- $this->dataTableTemplate = $tpl;
+ $this->viewProperties['datatable_template'] = $tpl;
}
/**
@@ -443,7 +474,7 @@ abstract class ViewDataTable
public function getControllerActionCalledWhenRequestSubTable()
{
- return $this->controllerActionCalledWhenRequestSubTable;
+ return $this->viewProperties['subtable_controller_action'];
}
/**
@@ -483,13 +514,26 @@ abstract class ViewDataTable
*/
private static function getDefaultPropertiesForReport($apiAction)
{
- $properties = array();
- Piwik_PostEvent('ViewDataTable.getReportDisplayProperties', array(&$properties, $apiAction));
-
- return $properties;
+ $reportDisplayProperties = self::getAllReportDisplayProperties();
+ return isset($reportDisplayProperties[$apiAction]) ? $reportDisplayProperties[$apiAction] : array();
}
/**
+ * Returns the list of display properties for all available reports.
+ *
+ * @return array
+ */
+ private static function getAllReportDisplayProperties()
+ {
+ if (self::$reportPropertiesCache === null) {
+ self::$reportPropertiesCache = array();
+ Piwik_PostEvent('ViewDataTable.getReportDisplayProperties', array(&self::$reportPropertiesCache));
+ }
+
+ return self::$reportPropertiesCache;
+ }
+
+ /**
* Sets a view property by name. This function handles special view properties
* like 'translations' & 'relatedReports' that store arrays.
*
@@ -570,6 +614,38 @@ abstract class ViewDataTable
if (empty($this->dataTable)) {
return false;
}
+
+ // default columns_to_display to label, nb_uniq_visitors/nb_visits if those columns exist in the
+ // dataset. otherwise, default to all columns in dataset.
+ $columns = $this->dataTable->getColumns();
+ if (empty($this->viewProperties['columns_to_display'])) {
+ if ($this->dataTableColumnsContains($columns, array('nb_visits', 'nb_uniq_visitors'))) {
+ $columnsToDisplay = array('label');
+
+ // if unique visitors data is available, show it, otherwise just visits
+ if ($this->dataTableColumnsContains($columns, 'nb_uniq_visitors')) {
+ $columnsToDisplay[] = 'nb_uniq_visitors';
+ } else {
+ $columnsToDisplay[] = 'nb_visits';
+ }
+ } else {
+ $columnsToDisplay = $columns;
+ }
+
+ $this->viewProperties['columns_to_display'] = array_filter($columnsToDisplay);
+ }
+
+ $this->removeEmptyColumnsFromDisplay();
+
+ // default sort order to visits/visitors data
+ if (empty($this->viewProperties['filter_sort_column'])) {
+ if ($this->dataTableColumnsContains($columns, 'nb_uniq_visitors')) {
+ $this->viewProperties['filter_sort_column'] = 'nb_uniq_visitors';
+ } else {
+ $this->viewProperties['filter_sort_column'] = 'nb_visits';
+ }
+ $this->viewProperties['filter_sort_order'] = 'desc';
+ }
// deal w/ table metadata
if ($this->dataTable instanceof DataTable) {
@@ -584,7 +660,12 @@ abstract class ViewDataTable
// First, filters that delete rows
foreach ($this->queuedFiltersPriority as $filter) {
$filterName = $filter[0];
+
$filterParameters = $filter[1];
+ if ($filterName instanceof Closure) {
+ $filterParameters[] = $this;
+ }
+
$this->dataTable->filter($filterName, $filterParameters);
}
@@ -606,28 +687,13 @@ abstract class ViewDataTable
// do not affect the number of rows)
foreach ($this->queuedFilters as $filter) {
$filterName = $filter[0];
+
$filterParameters = $filter[1];
- $this->dataTable->filter($filterName, $filterParameters);
- }
- }
-
- // default columns_to_display to label, nb_uniq_visitors/nb_visits if those columns exist in the
- // dataset
- if ($this->dataTable instanceof DataTable) {
- $columns = $this->dataTable->getColumns();
- if (empty($this->viewProperties['columns_to_display'])
- && $this->dataTableColumnsContains($columns, array('nb_visits', 'nb_uniq_visitors'))
- ) {
- $columnsToDisplay = array('label');
-
- // if unique visitors data is available, show it, otherwise just visits
- if ($this->dataTableColumnsContains($columns, 'nb_uniq_visitors')) {
- $columnsToDisplay[] = 'nb_uniq_visitors';
- } else {
- $columnsToDisplay[] = 'nb_visits';
+ if ($filterName instanceof Closure) {
+ $filterParameters[] = $this;
}
-
- $this->viewProperties['columns_to_display'] = $columnsToDisplay;
+
+ $this->dataTable->filter($filterName, $filterParameters);
}
}
@@ -721,9 +787,9 @@ abstract class ViewDataTable
$requestArray[$varToSet] = $value;
}
}
-
- $segment = $this->getRawSegmentFromRequest();
- if (!empty($segment)) {
+
+ $segment = \Piwik\API\Request::getRawSegmentFromRequest();
+ if(!empty($segment)) {
$requestArray['segment'] = $segment;
}
@@ -733,23 +799,6 @@ abstract class ViewDataTable
}
/**
- * @return array|bool
- */
- static public function getRawSegmentFromRequest()
- {
- // we need the URL encoded segment parameter, we fetch it from _SERVER['QUERY_STRING'] instead of default URL decoded _GET
- $segmentRaw = false;
- $segment = Common::getRequestVar('segment', '', 'string');
- if (!empty($segment)) {
- $request = Piwik_API_Request::getRequestParametersGET();
- if (!empty($request['segment'])) {
- $segmentRaw = $request['segment'];
- }
- }
- return $segmentRaw;
- }
-
- /**
* For convenience, the client code can call methods that are defined in a specific children class
* without testing the children class type, which would trigger an error with a different children class.
*
@@ -855,7 +904,7 @@ abstract class ViewDataTable
if (!isset($javascriptVariablesToSet['viewDataTable'])) {
$javascriptVariablesToSet['viewDataTable'] = $this->getViewDataTableId();
}
- $javascriptVariablesToSet['controllerActionCalledWhenRequestSubTable'] = $this->controllerActionCalledWhenRequestSubTable;
+ $javascriptVariablesToSet['controllerActionCalledWhenRequestSubTable'] = $this->viewProperties['subtable_controller_action'];
if ($this->dataTable &&
// Set doesn't have the method
@@ -886,8 +935,8 @@ abstract class ViewDataTable
}
}
- $rawSegment = $this->getRawSegmentFromRequest();
- if (!empty($rawSegment)) {
+ $rawSegment = \Piwik\API\Request::getRawSegmentFromRequest();
+ if(!empty($rawSegment)) {
$javascriptVariablesToSet['segment'] = $rawSegment;
}
@@ -1057,7 +1106,7 @@ abstract class ViewDataTable
public function hideAllViewsIcons()
{
$this->viewProperties['show_all_views_icons'] = false;
- $this->viewProperties['hide_all_views_icons'] = true;
+ $this->viewProperties['show_active_view_icon'] = false;
}
/**
@@ -1283,7 +1332,7 @@ abstract class ViewDataTable
*/
public function setReportDocumentation($documentation)
{
- $this->documentation = $documentation;
+ $this->viewProperties['documentation'] = $documentation;
}
/**
@@ -1292,11 +1341,7 @@ abstract class ViewDataTable
*/
public function getReportDocumentation()
{
- if ($this->documentation === false) {
- $this->loadDocumentation();
- }
-
- return $this->documentation;
+ return $this->viewProperties['documentation'];
}
/** Load documentation from the API */
@@ -1312,7 +1357,7 @@ abstract class ViewDataTable
}
if (isset($report['documentation'])) {
- $this->documentation = $report['documentation'];
+ $this->viewProperties['documentation'] = $report['documentation'];
}
}
@@ -1587,17 +1632,16 @@ abstract class ViewDataTable
* @param bool $fetch If true, the result is returned, if false it is echo'd.
* @return string|null See $fetch.
*/
- static public function render($pluginName, $apiAction, $fetch = true)
+ static public function renderReport($pluginName, $apiAction, $fetch = true)
{
$apiClassName = 'Piwik_' . $pluginName . '_API';
if (!method_exists($apiClassName::getInstance(), $apiAction)) {
throw new Exception("Invalid action name '$apiAction' for '$pluginName' plugin.");
}
-
- $view = self::factory(null, $pluginName . '.' . $apiAction);
- $view->main();
- $rendered = $view->getView()->render();
-
+
+ $view = self::factory(null, $pluginName.'.'.$apiAction);
+ $rendered = $view->render();
+
if ($fetch) {
return $rendered;
} else {
@@ -1606,6 +1650,17 @@ abstract class ViewDataTable
}
/**
+ * Convenience function. Calls main() & renders the view that gets built.
+ *
+ * @return string The result of rendering.
+ */
+ public function render()
+ {
+ $this->main();
+ return $this->getView()->render();
+ }
+
+ /**
* Returns whether the DataTable result will have to be expanded for the
* current request before rendering.
*
@@ -1628,7 +1683,7 @@ abstract class ViewDataTable
* @param array|string $columnsToCheckFor eg, array('nb_visits', 'nb_uniq_visitors')
* @return bool
*/
- private function dataTableColumnsContains($columns, $columnsToCheckFor)
+ protected function dataTableColumnsContains($columns, $columnsToCheckFor)
{
if (!is_array($columnsToCheckFor)) {
$columnsToCheckFor = array($columnsToCheckFor);
@@ -1645,7 +1700,41 @@ abstract class ViewDataTable
}
}
}
+
+ return false;
+ }
+
+ protected function buildView($visualization, $template = false)
+ {
+ if ($template === false) {
+ $template = $this->viewProperties['datatable_template'];
+ }
+
+ $view = new Piwik_View($template);
+
+ if (!empty($this->loadingError)) {
+ $view->error = $this->loadingError;
+ }
+ $view->visualization = $visualization;
+
+ if (!$this->dataTable === null) {
+ $view->dataTable = null;
+ } else {
+ $view->dataTable = $this->dataTable;
+
+ // if it's likely that the report data for this data table has been purged,
+ // set whether we should display a message to that effect.
+ $view->showReportDataWasPurgedMessage = $this->hasReportBeenPurged();
+ $view->deleteReportsOlderThan = Piwik_GetOption('delete_reports_older_than');
+ }
+ $view->javascriptVariablesToSet = $this->getJavascriptVariablesToSet();
+ $view->properties = $this->getViewProperties();
+ return $view;
+ }
+
+ public function getDefaultDataTableCssClass()
+ {
return false;
}
}
diff --git a/core/ViewDataTable/Cloud.php b/core/ViewDataTable/Cloud.php
index cf3d756089..900b95f0a4 100644
--- a/core/ViewDataTable/Cloud.php
+++ b/core/ViewDataTable/Cloud.php
@@ -20,11 +20,9 @@ use Piwik\View;
*/
class Piwik_ViewDataTable_Cloud extends ViewDataTable
{
- protected $displayLogoInsteadOfLabel = false;
-
public function setDisplayLogoInTagCloud($bool)
{
- $this->displayLogoInsteadOfLabel = $bool;
+ $this->viewProperties['display_logo_instead_of_label'] = $bool;
}
protected function getViewDataTableId()
@@ -35,10 +33,10 @@ class Piwik_ViewDataTable_Cloud extends ViewDataTable
public function __construct()
{
parent::__construct();
-
- $this->dataTableTemplate = '@CoreHome/_dataTableCloud';
+
$this->disableOffsetInformation();
$this->disableExcludeLowPopulation();
+ $this->viewProperties['display_logo_instead_of_label'] = false;
}
/**
@@ -53,71 +51,18 @@ class Piwik_ViewDataTable_Cloud extends ViewDataTable
}
$this->mainAlreadyExecuted = true;
- $this->isDataAvailable = true;
try {
$this->loadDataTableFromAPI();
} catch (Exception $e) {
- $this->isDataAvailable = false;
- }
- $this->checkStandardDataTable();
- $this->view = $this->buildView();
- }
+ Piwik::log("Failed to get data from API: " . $e->getMessage());
- /**
- * Returns the name of the first numeric column to be displayed
- * (second column to be displayed will be returned, as first is always label)
- *
- * @return string
- */
- public function getColumnToDisplay()
- {
- $columns = parent::getColumnsToDisplay();
- // not label, but the first numeric column
- return $columns[1];
- }
-
- protected function buildView()
- {
- $view = new View($this->dataTableTemplate);
- if (!$this->isDataAvailable) {
- $view->cloudValues = array();
- } else {
- $columnToDisplay = $this->getColumnToDisplay();
- $columnTranslation = $this->getColumnTranslation($columnToDisplay);
- $values = $this->dataTable->getColumn($columnToDisplay);
- $labels = $this->dataTable->getColumn('label');
- $labelMetadata = array();
- foreach ($this->dataTable->getRows() as $row) {
- $logo = false;
- if ($this->displayLogoInsteadOfLabel) {
- $logo = $row->getMetadata('logo');
- }
- $labelMetadata[$row->getColumn('label')] = array(
- 'logo' => $logo,
- 'url' => $row->getMetadata('url'),
- );
- }
- $cloud = new Piwik_Visualization_Cloud();
- foreach ($labels as $i => $label) {
- $cloud->addWord($label, $values[$i]);
- }
- $cloudValues = $cloud->render('array');
- foreach ($cloudValues as &$value) {
- $value['logoWidth'] = round(max(16, $value['percent']));
- }
- $view->columnTranslation = $columnTranslation;
- $view->labelMetadata = $labelMetadata;
- $view->cloudValues = $cloudValues;
+ $this->loadingError = array('message' => $e->getMessage());
}
- $view->javascriptVariablesToSet = $this->getJavascriptVariablesToSet();
- $view->properties = $this->getViewProperties();
- $view->reportDocumentation = $this->getReportDocumentation();
- // if it's likely that the report data for this data table has been purged,
- // set whether we should display a message to that effect.
- $view->showReportDataWasPurgedMessage = $this->hasReportBeenPurged();
- $view->deleteReportsOlderThan = Piwik_GetOption('delete_reports_older_than');
+ $this->checkStandardDataTable();
+ $this->postDataTableLoadedFromAPI();
- return $view;
+ $visualization = new Piwik_Visualization_Cloud();
+ $this->view = $this->buildView($visualization);
}
}
diff --git a/core/ViewDataTable/GenerateGraphHTML.php b/core/ViewDataTable/GenerateGraphHTML.php
index 4bdadbc791..da236c85bd 100644
--- a/core/ViewDataTable/GenerateGraphHTML.php
+++ b/core/ViewDataTable/GenerateGraphHTML.php
@@ -24,15 +24,14 @@ use Piwik\View;
*/
abstract class Piwik_ViewDataTable_GenerateGraphHTML extends ViewDataTable
{
- protected $width = '100%';
- protected $height = 250;
+ const DEFAULT_GRAPH_HEIGHT = 250;
+
protected $graphType;
public function __construct()
{
parent::__construct();
- $this->dataTableTemplate = '@CoreHome/_dataTableGraph';
$this->disableOffsetInformationAndPaginationControls();
$this->disableExcludeLowPopulation();
$this->disableSearchBox();
@@ -47,6 +46,8 @@ abstract class Piwik_ViewDataTable_GenerateGraphHTML extends ViewDataTable
$this->viewProperties['row_picker_mach_rows_by'] = false;
$this->viewProperties['row_picker_visible_rows'] = array();
$this->viewProperties['selectable_columns'] = array();
+ $this->viewProperties['graph_width'] = '100%';
+ $this->viewProperties['graph_height'] = self::DEFAULT_GRAPH_HEIGHT.'px';
}
/**
@@ -136,13 +137,17 @@ abstract class Piwik_ViewDataTable_GenerateGraphHTML extends ViewDataTable
}
// selectable columns
- if ($this->graphType != 'evolution') {
+ if ($this->viewProperties['graph_type'] != 'evolution') {
$selectableColumns = array('nb_visits', 'nb_actions');
if (Common::getRequestVar('period', false) == 'day') {
$selectableColumns[] = 'nb_uniq_visitors';
}
$this->viewProperties['selectable_columns'] = $selectableColumns;
}
+
+ if ($this->viewProperties['show_goals']) {
+ $this->enableShowGoals();
+ }
}
public function enableShowExportAsImageIcon()
@@ -152,8 +157,8 @@ abstract class Piwik_ViewDataTable_GenerateGraphHTML extends ViewDataTable
public function addRowEvolutionSeriesToggle($initiallyShowAllMetrics)
{
- $this->viewProperties['externalSeriesToggle'] = 'RowEvolutionSeriesToggle';
- $this->viewProperties['externalSeriesToggleShowAll'] = $initiallyShowAllMetrics;
+ $this->viewProperties['external_series_toggle'] = 'RowEvolutionSeriesToggle';
+ $this->viewProperties['external_series_toggle_show_all'] = $initiallyShowAllMetrics;
}
/**
@@ -222,9 +227,17 @@ abstract class Piwik_ViewDataTable_GenerateGraphHTML extends ViewDataTable
// will be done on the table before the labels are enhanced (see ReplaceColumnNames)
$this->disableQueuedFilters();
- // throws exception if no view access
- $this->loadDataTableFromAPI();
- if ($this->graphType != 'evolution') {
+ try {
+ $this->loadDataTableFromAPI();
+ } catch (Piwik_Access_NoAccessException $e) {
+ throw $e;
+ } catch (Exception $e) {
+ Piwik::log("Failed to get data from API: " . $e->getMessage());
+
+ $this->loadingError = array('message' => $e->getMessage());
+ }
+
+ if ($this->viewProperties['graph_type'] != 'evolution') {
$this->checkStandardDataTable();
}
$this->postDataTableLoadedFromAPI();
@@ -233,50 +246,12 @@ abstract class Piwik_ViewDataTable_GenerateGraphHTML extends ViewDataTable
$this->viewProperties['disable_generic_filters'] = false;
$this->viewProperties['disable_queued_filters'] = false;
- $this->view = $this->buildView();
+ $visualization = new Piwik_Visualization_JqplotGraph();
+ $this->view = $this->buildView($visualization);
}
-
- protected function buildView()
- {
- // access control
- $idSite = Common::getRequestVar('idSite', 1, 'int');
- Request::reloadAuthUsingTokenAuth();
- if (!Piwik::isUserHasViewAccess($idSite)) {
- throw new Exception(Piwik_TranslateException('General_ExceptionPrivilegeAccessWebsite', array("'view'", $idSite)));
- }
-
- // collect data
- $this->graphData = $this->getGraphData($this->dataTable);
- // build view
- $view = new View($this->dataTableTemplate);
-
- $view->width = $this->width;
- $view->height = $this->height;
- $view->graphType = $this->graphType;
-
- $view->data = $this->graphData;
- $view->isDataAvailable = strpos($this->graphData, '"series":[]') === false;
-
- $view->javascriptVariablesToSet = $this->getJavascriptVariablesToSet();
- $view->properties = $this->getViewProperties();
-
- $view->reportDocumentation = $this->getReportDocumentation();
-
- // if it's likely that the report data for this data table has been purged,
- // set whether we should display a message to that effect.
- $view->showReportDataWasPurgedMessage = $this->hasReportBeenPurged();
- $view->deleteReportsOlderThan = Piwik_GetOption('delete_reports_older_than');
-
- return $view;
- }
-
- protected function getGraphData($dataTable)
+ public function getDefaultDataTableCssClass()
{
- $properties = array_merge($this->viewProperties, $this->viewProperties['request_parameters_to_modify']);
- $dataGenerator = JqplotDataGenerator::factory($this->graphType, $properties);
-
- $jsonData = $dataGenerator->generate($dataTable);
- return str_replace(array("\r", "\n"), '', $jsonData);
+ return 'dataTableGraph';
}
}
diff --git a/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php b/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php
index 13b9047644..32a3364ada 100644
--- a/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php
+++ b/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php
@@ -20,10 +20,9 @@ use Piwik\Site;
* @package Piwik
* @subpackage ViewDataTable
*/
-
class Piwik_ViewDataTable_GenerateGraphHTML_ChartEvolution extends Piwik_ViewDataTable_GenerateGraphHTML
{
- protected $height = 170;
+ const GRAPH_HEIGHT = 170;
/**
* The value of the date query parameter (or a default value) before it is turned
@@ -37,7 +36,8 @@ class Piwik_ViewDataTable_GenerateGraphHTML_ChartEvolution extends Piwik_ViewDat
public function __construct()
{
parent::__construct();
- $this->graphType = 'evolution';
+ $this->viewProperties['graph_type'] = 'evolution';
+ $this->viewProperties['graph_height'] = self::GRAPH_HEIGHT.'px';
}
protected function getViewDataTableId()
@@ -50,7 +50,7 @@ class Piwik_ViewDataTable_GenerateGraphHTML_ChartEvolution extends Piwik_ViewDat
return 'generateDataChartEvolution';
}
- function init($currentControllerName,
+ public function init($currentControllerName,
$currentControllerAction,
$apiMethodToRequestDataTable,
$controllerActionCalledWhenRequestSubTable = null,
@@ -194,4 +194,9 @@ class Piwik_ViewDataTable_GenerateGraphHTML_ChartEvolution extends Piwik_ViewDat
return parent::getRequestArray();
}
+
+ public function getDefaultDataTableCssClass()
+ {
+ return 'dataTableEvolutionGraph';
+ }
}
diff --git a/core/ViewDataTable/GenerateGraphHTML/ChartPie.php b/core/ViewDataTable/GenerateGraphHTML/ChartPie.php
index c2acd2ea12..5943086709 100644
--- a/core/ViewDataTable/GenerateGraphHTML/ChartPie.php
+++ b/core/ViewDataTable/GenerateGraphHTML/ChartPie.php
@@ -15,13 +15,12 @@
* @package Piwik
* @subpackage ViewDataTable
*/
-
class Piwik_ViewDataTable_GenerateGraphHTML_ChartPie extends Piwik_ViewDataTable_GenerateGraphHTML
{
public function __construct()
{
parent::__construct();
- $this->graphType = 'pie';
+ $this->viewProperties['graph_type'] = 'pie';
$this->viewProperties['graph_limit'] = 6;
$this->viewProperties['allow_multi_select_series_picker'] = false;
}
diff --git a/core/ViewDataTable/GenerateGraphHTML/ChartVerticalBar.php b/core/ViewDataTable/GenerateGraphHTML/ChartVerticalBar.php
index dfbaff4f63..6c6e633ba7 100644
--- a/core/ViewDataTable/GenerateGraphHTML/ChartVerticalBar.php
+++ b/core/ViewDataTable/GenerateGraphHTML/ChartVerticalBar.php
@@ -22,7 +22,7 @@ class Piwik_ViewDataTable_GenerateGraphHTML_ChartVerticalBar extends Piwik_ViewD
public function __construct()
{
parent::__construct();
- $this->graphType = 'bar';
+ $this->viewProperties['graph_type'] = 'bar';
$this->viewProperties['graph_limit'] = 6;
}
diff --git a/core/ViewDataTable/HtmlTable.php b/core/ViewDataTable/HtmlTable.php
index cd5443a3e0..527e458c2f 100644
--- a/core/ViewDataTable/HtmlTable.php
+++ b/core/ViewDataTable/HtmlTable.php
@@ -36,17 +36,14 @@ class Piwik_ViewDataTable_HtmlTable extends ViewDataTable
{
parent::__construct();
- $this->dataTableTemplate = '@CoreHome/_dataTable';
$this->viewProperties['enable_sort'] = '1';
$this->viewProperties['disable_row_evolution'] = false;
$this->viewProperties['disable_row_actions'] = false;
- $this->setSortedColumn('nb_visits', 'desc');
$this->setLimit(Config::getInstance()->General['datatable_default_limit']);
$this->handleLowPopulation();
$this->setSubtableTemplate("@CoreHome/_dataTable.twig");
$this->viewProperties['datatable_js_type'] = 'dataTable';
- $this->viewProperties['datatable_css_class'] = $this->getDefaultDataTableCssClass();
}
public function getJavaScriptProperties()
@@ -73,7 +70,6 @@ class Piwik_ViewDataTable_HtmlTable extends ViewDataTable
}
$this->mainAlreadyExecuted = true;
- $this->isDataAvailable = true;
try {
$this->loadDataTableFromAPI();
} catch (\Piwik\NoAccessException $e) {
@@ -81,12 +77,13 @@ class Piwik_ViewDataTable_HtmlTable extends ViewDataTable
} catch (Exception $e) {
Piwik::log("Failed to get data from API: " . $e->getMessage());
- $this->isDataAvailable = false;
$this->loadingError = array('message' => $e->getMessage());
}
$this->postDataTableLoadedFromAPI();
- $this->view = $this->buildView();
+
+ $template = $this->idSubtable ? $this->viewProperties['subtable_template'] : $this->viewProperties['datatable_template'];
+ $this->view = $this->buildView(new Piwik_Visualization_HtmlTable(), $template);
}
public function getDefaultDataTableCssClass()
@@ -115,12 +112,12 @@ class Piwik_ViewDataTable_HtmlTable extends ViewDataTable
}
/**
- * @return View with all data set
+ * @return Piwik_View with all data set
*/
protected function buildView()
{
$template = $this->idSubtable ? $this->viewProperties['subtable_template'] : $this->dataTableTemplate;
- $view = new View($template);
+ $view = new Piwik_View($template);
if (!empty($this->loadingError)) {
$view->error = $this->loadingError;
@@ -171,13 +168,13 @@ class Piwik_ViewDataTable_HtmlTable extends ViewDataTable
}
/**
- * Returns friendly php array from the DataTable
+ * Returns friendly php array from the Piwik_DataTable
* @see Piwik_DataTable_Renderer_Php
* @return array
*/
protected function getPHPArrayFromDataTable()
{
- $renderer = Renderer::factory('php');
+ $renderer = Piwik_DataTable_Renderer::factory('php');
$renderer->setTable($this->dataTable);
$renderer->setSerialize(false);
// we get the php array from the datatable but conserving the original datatable format,
diff --git a/core/ViewDataTable/HtmlTable/AllColumns.php b/core/ViewDataTable/HtmlTable/AllColumns.php
index 87ed0412a4..b2f5305efa 100644
--- a/core/ViewDataTable/HtmlTable/AllColumns.php
+++ b/core/ViewDataTable/HtmlTable/AllColumns.php
@@ -39,9 +39,8 @@ class Piwik_ViewDataTable_HtmlTable_AllColumns extends Piwik_ViewDataTable_HtmlT
$valid = parent::postDataTableLoadedFromAPI();
if (!$valid) return false;
- Controller::setPeriodVariablesView($this);
$columnUniqueVisitors = false;
- if ($this->period == 'day') {
+ if ($this->dataTableColumnsContains($this->dataTable->getColumns(), 'nb_uniq_visitors')) {
$columnUniqueVisitors = 'nb_uniq_visitors';
}
diff --git a/core/ViewDataTable/HtmlTable/Goals.php b/core/ViewDataTable/HtmlTable/Goals.php
index fc1fa842e7..8b575a0f2f 100644
--- a/core/ViewDataTable/HtmlTable/Goals.php
+++ b/core/ViewDataTable/HtmlTable/Goals.php
@@ -19,6 +19,9 @@ use Piwik\Site;
*/
class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable
{
+ private $processOnlyIdGoal = null;
+ private $isEcommerce = false;
+
protected function getViewDataTableId()
{
return 'tableGoals';
@@ -26,8 +29,12 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable
public function main()
{
- $this->idSite = Common::getRequestVar('idSite', null, 'int');
- $this->processOnlyIdGoal = Common::getRequestVar('idGoal', AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW, 'string');
+ if (!empty($this->viewProperties['disable_subtable_when_show_goals'])) {
+ $this->viewProperties['subtable_controller_action'] = null;
+ }
+
+ $this->idSite = Piwik_Common::getRequestVar('idSite', null, 'int');
+ $this->processOnlyIdGoal = Piwik_Common::getRequestVar('idGoal', Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW, 'string');
$this->isEcommerce = $this->processOnlyIdGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER;
$this->viewProperties['show_exclude_low_population'] = true;
$this->viewProperties['show_goals'] = true;
@@ -100,7 +107,7 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable
public function disableSubTableWhenShowGoals()
{
- $this->controllerActionCalledWhenRequestSubTable = null;
+ $this->viewProperties['subtable_controller_action'] = null;
}
public function setColumnsToDisplay($columnsNames)
diff --git a/core/ViewDataTable/Properties.php b/core/ViewDataTable/Properties.php
new file mode 100644
index 0000000000..8813a8889f
--- /dev/null
+++ b/core/ViewDataTable/Properties.php
@@ -0,0 +1,179 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ * @category Piwik
+ * @package Piwik
+ */
+
+/**
+ * Contains the list of all core DataTable display properties for use with ViewDataTable.
+ *
+ * @see Piwik_ViewDataTable for more info.
+ *
+ * TODO: change the names of properties to match the const names where appropriate.
+ */
+class Piwik_ViewDataTable_Properties
+{
+ /**
+ * This property determines which Twig template to use when rendering a ViewDataTable.
+ *
+ * TODO: shouldn't have this property. should only use visualization classes.
+ */
+ const DATATABLE_TEMPLATE = 'datatable_template';
+
+ /**
+ * Controls whether the goals footer icon is shown.
+ */
+ const SHOW_GOALS = 'show_goals';
+
+ /**
+ * Array property mapping DataTable column names with their internationalized names.
+ */
+ const COLUMN_NAME_TRANSLATIONS = 'translations';
+
+ /**
+ * Controls which column to sort the DataTable by before truncating and displaying.
+ */
+ const SORTED_COLUMN = 'filter_sort_column';
+
+ /**
+ * Controls the sort order. Either 'asc' or 'desc'.
+ *
+ * @see self::SORTED_COLUMN
+ */
+ const SORT_ORDER = 'filter_sort_order';
+
+ /**
+ * The limit used when rendering a jqPlot graph.
+ *
+ * TODO: either replace w/ filter_limit, or make it a visualization property.
+ */
+ const GRAPH_LIMIT = 'graph_limit';
+
+ /**
+ * The number of items to truncate the data set to before rendering the DataTable view.
+ */
+ const LIMIT = 'filter_limit';
+
+ /**
+ * Controls whether the 'Exclude Low Population' option (visible in the popup that displays after
+ * clicking the 'cog' icon) is shown.
+ */
+ const SHOW_EXCLUDE_LOW_POPULATION = 'show_exclude_low_population';
+
+ /**
+ * Controls whether the 'All Columns' footer icon is shown.
+ */
+ const SHOW_ALL_TABLES_VIEW = 'show_table_all_columns';
+
+ /**
+ * Controls whether the Row Evolution datatable row action icon is shown.
+ */
+ const DISABLE_ROW_EVOLUTION = 'disable_row_evolution';
+
+ /**
+ * The unit to display in jqPlot graphs.
+ *
+ * TODO: Either this should be a visualization property, or should be named something different.
+ */
+ const Y_AXIS_UNIT = 'y_axis_unit';
+
+ /**
+ * Controls whether the entire view footer is shown.
+ */
+ const SHOW_FOOTER = 'show_footer';
+
+ /**
+ * Controls whether the row that contains all footer icons & the limit selector is shown.
+ */
+ const SHOW_FOOTER_ICONS = 'show_footer_icons';
+
+ /**
+ * Array property that determines which columns will be shown. Columns not in this array
+ * should not appear in ViewDataTable visualizations.
+ *
+ * Example: array('label', 'nb_visits', 'nb_uniq_visitors')
+ */
+ const COLUMNS_TO_DISPLAY = 'columns_to_display';
+
+ /**
+ * Whether to display the logo assocatied with a DataTable row (stored as 'logo' row metadata)
+ * isntead of the label in Tag Clouds.
+ */
+ const DISPLAY_LOGO_INSTEAD_OF_LABEL = 'display_logo_instead_of_label';
+
+ /**
+ * Controls whether the footer icons that change the ViewDataTable type of a view are shown
+ * or not.
+ */
+ const SHOW_ALL_VIEW_ICONS = 'show_all_views_icons';
+
+ /**
+ * Controls whether to display a tiny upside-down caret over the currently active view icon.
+ */
+ const SHOW_ACTIVE_VIEW_ICON = 'show_active_view_icon';
+
+ /**
+ * TODO: this property is specific ONLY to the row evolution popup. Need to move it.
+ */
+ const EXTERNAL_SERIES_TOGGLE = 'external_series_toggle';
+
+ /**
+ * TODO: this property is specific ONLY to the row evolution popup. Need to move it.
+ */
+ const EXTERNAL_SERIES_TOGGLE_SHOW_ALL = 'external_series_toggle_show_all';
+
+ /**
+ * Controls whether a report's related reports are listed with the view or not.
+ */
+ const SHOW_RELATED_REPORTS = 'show_related_reports';
+
+ /**
+ * Array property that contains the names of columns that can be selected in the Series Picker.
+ *
+ * TODO: this is only applicable to graph views. move this.
+ */
+ const SELECTABLE_COLUMNS = 'selectable_columns';
+
+ /**
+ * Contains the documentation for a report.
+ */
+ const REPORT_DOCUMENTATION = 'documentation';
+
+ /**
+ * Returns the set of all valid ViewDataTable properties. The result is an array with property
+ * name as a key. Values of the array are undefined.
+ *
+ * @return array
+ */
+ public static function getAllProperties()
+ {
+ static $propertiesCache = null;
+
+ if ($propertiesCache === null) {
+ $klass = new ReflectionClass(__CLASS__);
+ $propertiesCache = array_flip($klass->getConstants());
+ }
+
+ return $propertiesCache;
+ }
+
+ /**
+ * Checks if a property is a valid ViewDataTable property, and if not, throws an exception.
+ *
+ * @param string $name The property name.
+ * @throws Exception
+ */
+ public static function checkValidPropertyName($name)
+ {
+ $properties = self::getAllProperties();
+ if (!isset($properties[$name])) {
+ throw new Exception("Invalid ViewDataTable display property '$name'. Is this a visualization property? "
+ . "If so, set it with \$view->visualization_properties->$name = ...");
+ }
+ }
+} \ No newline at end of file
diff --git a/core/ViewDataTable/Sparkline.php b/core/ViewDataTable/Sparkline.php
index 6611bc4441..a5d6a58479 100644
--- a/core/ViewDataTable/Sparkline.php
+++ b/core/ViewDataTable/Sparkline.php
@@ -46,10 +46,8 @@ class Piwik_ViewDataTable_Sparkline extends ViewDataTable
$_GET['period'] = $period;
$values = $this->getValuesFromDataTable($this->dataTable);
- $this->isDataAvailable = true;
if (empty($values)) {
$values = array_fill(0, 30, 0);
- $this->isDataAvailable = false;
}
$graph = new Piwik_Visualization_Sparkline();
diff --git a/core/Visualization/Chart.php b/core/Visualization/Chart.php
index cee6b08ab7..04db6d312d 100644
--- a/core/Visualization/Chart.php
+++ b/core/Visualization/Chart.php
@@ -26,7 +26,6 @@ abstract class Piwik_Visualization_Chart implements Piwik_View_Interface
protected $data = array();
protected $axes = array();
protected $tooltip = array();
- protected $seriesColors = array('#000000');
protected $seriesPicker = array();
// other attributes (not directly used for jqplot)
@@ -159,8 +158,7 @@ abstract class Piwik_Visualization_Chart implements Piwik_View_Interface
$data = array(
'params' => array(
'axes' => &$this->axes,
- 'series' => &$this->series,
- 'seriesColors' => &$this->seriesColors
+ 'series' => &$this->series
),
'data' => &$this->data,
'tooltip' => &$this->tooltip,
diff --git a/core/Visualization/Chart/Evolution.php b/core/Visualization/Chart/Evolution.php
index e8e82527cf..db00d00bce 100644
--- a/core/Visualization/Chart/Evolution.php
+++ b/core/Visualization/Chart/Evolution.php
@@ -17,9 +17,7 @@
*/
class Piwik_Visualization_Chart_Evolution extends Piwik_Visualization_Chart
{
-
- protected $seriesColors = array('#5170AE', '#F29007', '#CC3399', '#9933CC', '#80a033',
- '#246AD2', '#FD16EA', '#49C100');
+ const SERIES_COLOR_COUNT = 8;
public function customizeChartProperties()
{
@@ -34,14 +32,8 @@ class Piwik_Visualization_Chart_Evolution extends Piwik_Visualization_Chart
}
}
- public function getSeriesColors()
- {
- return $this->seriesColors;
- }
-
public function setSelectableRows($selectableRows)
{
$this->seriesPicker['selectableRows'] = $selectableRows;
}
-
-}
+} \ No newline at end of file
diff --git a/core/Visualization/Chart/Pie.php b/core/Visualization/Chart/Pie.php
index f37b079ddc..cd0e137ebf 100644
--- a/core/Visualization/Chart/Pie.php
+++ b/core/Visualization/Chart/Pie.php
@@ -17,10 +17,6 @@
*/
class Piwik_Visualization_Chart_Pie extends Piwik_Visualization_Chart
{
-
- protected $seriesColors = array('#59727F', '#7DAAC0', '#7F7259', '#C09E7D', '#9BB39B',
- '#B1D8B3', '#B39BA7', '#D8B1C5', '#A5A5A5');
-
function customizeChartProperties()
{
if (count($this->data) == 0) {
diff --git a/core/Visualization/Chart/VerticalBar.php b/core/Visualization/Chart/VerticalBar.php
index 89fe7fb9a1..dab4a8ef16 100644
--- a/core/Visualization/Chart/VerticalBar.php
+++ b/core/Visualization/Chart/VerticalBar.php
@@ -17,10 +17,6 @@
*/
class Piwik_Visualization_Chart_VerticalBar extends Piwik_Visualization_Chart
{
-
- protected $seriesColors = array('#5170AE', '#F3A010', '#CC3399', '#9933CC', '#80a033',
- '#246AD2', '#FD16EA', '#49C100');
-
public function customizeChartProperties()
{
parent::customizeChartProperties();
@@ -42,5 +38,4 @@ class Piwik_Visualization_Chart_VerticalBar extends Piwik_Visualization_Chart
}
}
}
-
}
diff --git a/core/Visualization/Cloud.php b/core/Visualization/Cloud.php
index 781973340c..0d2d63e0a7 100644
--- a/core/Visualization/Cloud.php
+++ b/core/Visualization/Cloud.php
@@ -19,7 +19,7 @@ use Piwik\Common;
* @package Piwik
* @subpackage Piwik_Visualization
*/
-class Piwik_Visualization_Cloud implements Piwik_View_Interface
+class Piwik_Visualization_Cloud
{
/** Used by integration tests to make sure output is consistent. */
public static $debugDisableShuffle = false;
@@ -33,7 +33,7 @@ class Piwik_Visualization_Cloud implements Piwik_View_Interface
* @param int $value
* @return string
*/
- function addWord($word, $value = 1)
+ public function addWord($word, $value = 1)
{
if (isset($this->wordsArray[$word])) {
$this->wordsArray[$word] += $value;
@@ -42,7 +42,45 @@ class Piwik_Visualization_Cloud implements Piwik_View_Interface
}
}
- public function render()
+ /**
+ * Renders this visualization.
+ *
+ * @param Piwik_DataTable $dataTable
+ */
+ public function render($dataTable, $properties)
+ {
+ $view = new Piwik_View("@CoreHome/_dataTableViz_tagCloud.twig");
+ $view->properties = $properties;
+
+ $columnToDisplay = $properties['columns_to_display'][1];
+
+ $labelMetadata = array();
+ foreach ($dataTable->getRows() as $row) {
+ $logo = false;
+ if ($properties['display_logo_instead_of_label']) {
+ $logo = $row->getMetadata('logo');
+ }
+
+ $label = $row->getColumn('label');
+
+ $labelMetadata[$label] = array(
+ 'logo' => $logo,
+ 'url' => $row->getMetadata('url'),
+ );
+
+ $this->addWord($label, $row->getColumn($columnToDisplay));
+ }
+ $cloudValues = $this->getCloudValues();
+ foreach ($cloudValues as &$value) {
+ $value['logoWidth'] = round(max(16, $value['percent']));
+ }
+ $view->labelMetadata = $labelMetadata;
+ $view->cloudValues = $cloudValues;
+
+ return $view->render();
+ }
+
+ private function getCloudValues()
{
$this->shuffleCloud();
$return = array();
diff --git a/core/Visualization/HtmlTable.php b/core/Visualization/HtmlTable.php
new file mode 100644
index 0000000000..c35c76f5f3
--- /dev/null
+++ b/core/Visualization/HtmlTable.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ * @category Piwik
+ * @package Piwik
+ */
+
+/**
+ * DataTable visualization that shows DataTable data in an HTML table.
+ */
+class Piwik_Visualization_HtmlTable
+{
+ /**
+ * Renders this visualization.
+ *
+ * @param Piwik_DataTable $dataTable
+ * @param array $properties View Properties.
+ */
+ public function render($dataTable, $properties)
+ {
+ $view = new Piwik_View("@CoreHome/_dataTableViz_htmlTable.twig");
+ $view->properties = $properties;
+ $view->dataTable = $dataTable;
+ return $view->render();
+ }
+} \ No newline at end of file
diff --git a/core/Visualization/JqplotGraph.php b/core/Visualization/JqplotGraph.php
new file mode 100644
index 0000000000..4a213ae39b
--- /dev/null
+++ b/core/Visualization/JqplotGraph.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ * @category Piwik
+ * @package Piwik
+ */
+
+/**
+ * DataTable visualization that displays DataTable data in a JQPlot graph.
+ */
+class Piwik_Visualization_JqplotGraph
+{
+ /**
+ * Renders this visualization.
+ *
+ * @param Piwik_DataTable $dataTable
+ * @param array $properties View Properties.
+ */
+ public function render($dataTable, $properties)
+ {
+ $view = new Piwik_View("@CoreHome/_dataTableViz_jqplotGraph.twig");
+ $view->properties = $properties;
+ $view->dataTable = $dataTable;
+ $view->data = $this->getGraphData($dataTable, $properties);
+ return $view->render();
+ }
+
+ /**
+ * Generats JQPlot graph data for a DataTable.
+ */
+ private function getGraphData($dataTable, $properties)
+ {
+ $properties = array_merge($properties, $properties['request_parameters_to_modify']);
+ $dataGenerator = Piwik_JqplotDataGenerator::factory($properties['graph_type'], $properties);
+
+ $jsonData = $dataGenerator->generate($dataTable);
+ return str_replace(array("\r", "\n"), '', $jsonData);
+ }
+} \ No newline at end of file
diff --git a/core/Visualization/Sparkline.php b/core/Visualization/Sparkline.php
index 5ea0ca1571..e7165fbb15 100644
--- a/core/Visualization/Sparkline.php
+++ b/core/Visualization/Sparkline.php
@@ -24,23 +24,28 @@ require_once PIWIK_INCLUDE_PATH . '/libs/sparkline/lib/Sparkline_Line.php';
*/
class Piwik_Visualization_Sparkline implements Piwik_View_Interface
{
+ const DEFAULT_WIDTH = 100;
+ const DEFAULT_HEIGHT = 25;
+
+ private static $colorNames = array('lineColor', 'red', 'blue', 'green');
+
/**
* Width of the sparkline
* @var int
*/
- protected $_width = 100;
+ protected $_width = self::DEFAULT_WIDTH;
/**
* Height of sparkline
* @var int
*/
- protected $_height = 25;
+ protected $_height = self::DEFAULT_HEIGHT;
/**
* Array with format: array( x, y, z, ... )
* @param array $data
*/
- function setValues($data)
+ public function setValues($data)
{
$this->values = $data;
}
@@ -91,16 +96,13 @@ class Piwik_Visualization_Sparkline implements Piwik_View_Interface
return $this->_height;
}
- function main()
+ public function main()
{
$width = $this->getWidth();
$height = $this->getHeight();
$sparkline = new Sparkline_Line();
- $sparkline->SetColor('lineColor', 22, 44, 74); // dark blue
- $sparkline->SetColorHtml('red', '#FF7F7F');
- $sparkline->SetColorHtml('blue', '#55AAFF');
- $sparkline->SetColorHtml('green', '#75BF7C');
+ $this->setSparklineColors($sparkline);
$min = $max = $last = null;
$i = 0;
@@ -137,8 +139,20 @@ class Piwik_Visualization_Sparkline implements Piwik_View_Interface
$this->sparkline = $sparkline;
}
- function render()
+ public function render()
{
$this->sparkline->Output();
}
+
+ private function setSparklineColors($sparkline)
+ {
+ $colors = Piwik_Common::getRequestVar('colors', false, 'json');
+ if (!empty($colors)) {
+ foreach (self::$colorNames as $name) {
+ if (!empty($colors[$name])) {
+ $sparkline->SetColorHtml($name, $colors[$name]);
+ }
+ }
+ }
+ }
}
diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php
index e44c39ea1e..845ba6002a 100644
--- a/core/testMinimumPhpVersion.php
+++ b/core/testMinimumPhpVersion.php
@@ -79,7 +79,7 @@ if (!function_exists('Piwik_ExitWithMessage')) {
{
@header('Content-Type: text/html; charset=utf-8');
if ($optionalTrace) {
- $optionalTrace = '<span style="color:#888888">Backtrace:<br /><pre>' . $optionalTrace . '</pre></span>';
+ $optionalTrace = '<span class="exception-backtrace">Backtrace:<br /><pre>' . $optionalTrace . '</pre></span>';
}
if ($optionalLinks) {
$optionalLinks = '<ul>
diff --git a/js/piwik.js b/js/piwik.js
index b3691bc444..62114d5195 100644
--- a/js/piwik.js
+++ b/js/piwik.js
@@ -1093,7 +1093,7 @@ if (typeof Piwik !== 'object') {
configTitle = documentAlias.title,
// Extensions to be treated as download links
- configDownloadExtensions = '7z|aac|ar[cj]|as[fx]|avi|bin|csv|deb|dmg|docx?|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|ms[ip]|od[bfgpst]|og[gv]|pdf|phps|png|pptx?|qtm?|ra[mr]?|rpm|sea|sit|tar|t?bz2?|tgz|torrent|txt|wav|wm[av]|wpd||xlsx?|xml|z|zip',
+ configDownloadExtensions = '7z|aac|apk|ar[cj]|as[fx]|avi|bin|csv|deb|dmg|docx?|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|ms[ip]|od[bfgpst]|og[gv]|pdf|phps|png|pptx?|qtm?|ra[mr]?|rpm|sea|sit|tar|t?bz2?|tgz|torrent|txt|wav|wm[av]|wpd||xlsx?|xml|z|zip',
// Hosts or alias(es) to not treat as outlinks
configHostsAlias = [domainAlias],
diff --git a/lang/ca.php b/lang/ca.php
index c6228bfc4d..7487155b1c 100644
--- a/lang/ca.php
+++ b/lang/ca.php
@@ -1018,14 +1018,14 @@ $translations = array(
'Login_InvalidNonceOrHeadersOrReferer' => 'El formulari de seguretat ha fallat. Sisuplau recarregeu el formaulari i reviseu que teniu les cookies activades. Si feu servir un proxy, heu de %s configurar el Piwik per a que accepti la capcelera del proxy %s que conté la capçalera del host. També reviseu que el la vostra capçalera de referent s\'envia correctament.',
'Login_InvalidOrExpiredToken' => 'El codi és invàlid o ha caducat',
'Login_MailTopicPasswordChange' => 'Confirmeu el canvi de contrasenya',
- 'Login_MailPasswordChangeBody' => 'Hola %1$s,
-
-S\'ha rebut una petició per restablir la contrasenya de %2$s. Per confirmar aquest canvi de contrasenya (per a que pogueu entrar amb les noves credencials), visiteu el següent enllaç:
-
-%3$s
-
-Nota: aquest enllaç caduca en 24 hores.
-
+ 'Login_MailPasswordChangeBody' => 'Hola %1$s,
+
+S\'ha rebut una petició per restablir la contrasenya de %2$s. Per confirmar aquest canvi de contrasenya (per a que pogueu entrar amb les noves credencials), visiteu el següent enllaç:
+
+%3$s
+
+Nota: aquest enllaç caduca en 24 hores.
+
Us donem les gràcies per utiltizar el Piwik!',
'Login_ConfirmationLinkSent' => 'S\'ha enviat un enllaç de confirmació a la vostra bústia d\'entrada. Reviseu el vostre correu electrònic i visiteu l\'enllaç per autoritzar la sol·licitud de canvi de password.',
'Login_PasswordChanged' => 'S\'ha canviat la vostra contrasenya',
diff --git a/lang/cs.php b/lang/cs.php
index e7d681d0fb..e9dfb0e998 100644
--- a/lang/cs.php
+++ b/lang/cs.php
@@ -372,6 +372,7 @@ $translations = array(
'Actions_ColumnSearchesDocumentation' => 'Počet uživatelů, kteří hledali tyto klíčová slova ve vyhledavači na Vašich stránkách.',
'Actions_ColumnSearchExits' => '% Nalezených výstupů',
'Actions_ColumnPagesPerSearch' => 'Stránka hledaných výsledků',
+ 'Actions_AvgGenerationTimeTooltip' => 'Průměr dle %s přístupů %s mezi %s a %s',
'AnonymizeIP_PluginDescription' => 'Skryje poslední byte IP adresy návštěvníka, aby souhlasila se zákony vaší země.',
'API_PluginDescription' => 'Všechna data v Piwiku jsou dostupná přes jednoduchá API. Tento zásuvný modul je vstupním bodem pro webovou službu, kterou můžete volat abyste získali data ve formátech xml, json, php, csv, atd.',
'API_QuickDocumentationTitle' => 'Rychlá dokumentace API',
diff --git a/lang/da.php b/lang/da.php
index c01035f3e6..5fde22def8 100644
--- a/lang/da.php
+++ b/lang/da.php
@@ -709,9 +709,13 @@ $translations = array(
'CoreHome_MakeOneTimeDonation' => 'Foretag engangsdonation, i stedet.',
'CorePluginsAdmin_PluginDescription' => 'Programudvidelses administration.',
'CorePluginsAdmin_Plugins' => 'Udvidelsesmoduler',
+ 'CorePluginsAdmin_Themes' => 'Temaer',
'CorePluginsAdmin_PluginsManagement' => 'Udvidelsesmodul administration',
+ 'CorePluginsAdmin_ThemesManagement' => 'Håndtere temaer',
'CorePluginsAdmin_MainDescription' => 'Udvidelsesmoduler udvider funktionaliteten i Piwik. Når et udvidelsesmodul er installeret, kan det aktiveres eller deaktiveres her.',
+ 'CorePluginsAdmin_ThemesDescription' => 'Temaer kan ændre udseendet af Piwik brugergrænsefladen,og giver en helt ny visuel oplevelse af dine analytiske rapporter.',
'CorePluginsAdmin_Plugin' => 'Udvidelsesmodul',
+ 'CorePluginsAdmin_Theme' => 'Tema',
'CorePluginsAdmin_Version' => 'Version',
'CorePluginsAdmin_Status' => 'Status',
'CorePluginsAdmin_Action' => 'Handling',
@@ -723,6 +727,8 @@ $translations = array(
'CorePluginsAdmin_Inactive' => 'Inaktiv',
'CorePluginsAdmin_Deactivate' => 'Deaktiver',
'CorePluginsAdmin_Activate' => 'Aktiver',
+ 'CorePluginsAdmin_MenuPlatform' => 'Platform',
+ 'CorePluginsAdmin_MenuExtend' => 'Udvid',
'CorePluginsAdmin_PluginCannotBeFound' => 'Dette udvidelsesmodul kan ikke findes!',
'CoreUpdater_PluginDescription' => 'Piwik ajourføringsmekanisme',
'CoreUpdater_UpdateTitle' => 'Opdatering',
diff --git a/lang/de.php b/lang/de.php
index 39bca32ddd..48676110a5 100644
--- a/lang/de.php
+++ b/lang/de.php
@@ -456,7 +456,7 @@ $translations = array(
'Actions_SiteSearchCategories2' => 'Onlineshops haben beispielsweise meist eine Kategorieauswahl, mit der Besucher ihre Suche auf eine bestimmte Produktkategorie einschränken können.',
'Actions_SiteSearchKeywordsNoResultDocumentation' => 'Dieser Bericht zeigt die Suchbegriffe an, welche keine Ergebnisse hatten. Diese Begriffe können in bestehende Seiten eingebaut werden, um es den Besuchern zu erleichtern, die Inhalte zu finden.',
'Actions_SiteSearchFollowingPagesDoc' => 'Wenn Besucher die interne Suche verwenden, suchen sie meist nach einer bestimmten Seite, bzw. einem bestimmen Inhalt. In diesem Bericht wird angezeigt, welche Seiten am häufigsten von den Suchergebnissen aus besucht wurden. In anderen Worten sind dies die Seiten, nach denen Besucher am häufigsten gesucht haben, nachdem sie sich bereits auf der Webseite befanden.',
- 'Actions_AvgGenerationTimeTooltip' => 'Durchschnitt basierend auf %s Aufruf(en) %s Zwischen %s und %s',
+ 'Actions_AvgGenerationTimeTooltip' => 'Durchschnitt basierend auf %s Aufruf(en) %s zwischen %s und %s',
'AnonymizeIP_PluginDescription' => 'Um den Datenschutzbestimmungen Ihres Landes gerecht zu werden, können Sie mit diesem Plugin die letzten Bytes der IP-Adresse Ihrer Besucher anonymisieren.',
'API_PluginDescription' => 'Alle Daten sind über eine einfache API verfügbar. Dieses Plugin ist der Webservice, den Sie nutzen können, um Ihre Webanalyse-Daten in XML, JSON, PHP, CSV, etc. zu exportieren.',
'API_QuickDocumentationTitle' => 'API-Kurzdokumentation',
@@ -464,7 +464,7 @@ $translations = array(
'API_MoreInformation' => 'Für weitere Informationen über die Piwik-APIs lesen Sie bitte %s Einführung in die Piwik-API %s und die %s Piwik API Referenz %s.',
'API_UserAuthentication' => 'Benutzerauthentifizierung',
'API_UsingTokenAuth' => 'Wenn Sie %s Daten mit einem Script, einem Crontab, etc. abrufen wollen, %s müssen Sie den Parameter %s an die URLs anhängen, deren API-Aufrufe eine Authentifizierung benötigen.',
- 'API_KeepTokenSecret' => 'Der token_auth ist so geheim wie Ihr Login und Password, %s teilen Sie es niemandem mit%s!',
+ 'API_KeepTokenSecret' => 'Der token_auth ist so geheim wie Ihr Login und Passwort, %s teilen Sie es niemandem mit%s!',
'API_LoadedAPIs' => '%s APIs erfolgreich geladen',
'API_TopLinkTooltip' => 'Greife auf die Webanalytikdaten über eine einfache API mit json, xml, usw. zu.',
'CoreAdminHome_PluginDescription' => 'Piwik Administration',
@@ -723,6 +723,7 @@ $translations = array(
'CorePluginsAdmin_Inactive' => 'Inaktiv',
'CorePluginsAdmin_Deactivate' => 'Deaktivieren',
'CorePluginsAdmin_Activate' => 'Aktivieren',
+ 'CorePluginsAdmin_MenuExtend' => 'Erweitern',
'CorePluginsAdmin_PluginCannotBeFound' => 'Plugin konnte nicht gefunden werden!',
'CoreUpdater_PluginDescription' => 'Piwik-Aktualisierung',
'CoreUpdater_UpdateTitle' => 'Aktualisierung',
@@ -1278,7 +1279,7 @@ $translations = array(
'Referers_WidgetSocials' => 'Liste Sozialer Netzwerke',
'Referers_WidgetSearchEngines' => 'Beste Suchmaschinen',
'Referers_WidgetOverview' => 'Übersicht',
- 'Referers_SocialFooterMessage' => 'Dies ist eine Teilansicht des Berichtes von links. Er filtert andere Webseiten heraus, so dass Sie die Verweise von Sozialen Netzerken direkt vergleichen können.',
+ 'Referers_SocialFooterMessage' => 'Dies ist eine Teilansicht des Berichtes von links. Er filtert andere Webseiten heraus, so dass Sie die Verweise von Sozialen Netzwerken direkt vergleichen können.',
'Referers_WidgetGetAll' => 'Alle Verweise',
'Referers_ViewReferrersBy' => 'Verweise anhand %s ansehen',
'Referers_ViewAllReferrers' => 'Alle Verweise ansehen',
diff --git a/lang/el.php b/lang/el.php
index 5c83e80f61..46f97ddade 100644
--- a/lang/el.php
+++ b/lang/el.php
@@ -42,12 +42,16 @@ $translations = array(
'General_Close' => 'Κλείσιμο',
'General_Cancel' => 'Άκυρο',
'General_OrCancel' => 'ή %s Άκυρο %s',
+ 'General_And' => 'και',
'General_Logout' => 'Αποσύνδεση',
'General_Username' => 'Όνομα χρήστη',
'General_Description' => 'Περιγραφή',
'General_Done' => 'Ολοκληρώθηκε',
'General_PoweredBy' => 'Υποστηρίζεται από',
+ 'General_MetricsToPlot_js' => 'Μετρικές για γραφική απεικόνιση',
'General_RowsToDisplay' => 'Εγγραφές για προβολή',
+ 'General_MetricToPlot_js' => 'Μετρική για γραφική απεικόνιση',
+ 'General_RecordsToPlot_js' => 'Εγγραφές για γραφική απεικόνιση',
'General_Name' => 'Ονομασία',
'General_Value' => 'Τιμή',
'General_Total' => 'Σύνολο',
@@ -82,6 +86,8 @@ $translations = array(
'General_NumberOfVisits' => 'Αριθμός επισκέψεων',
'General_VisitConvertedGoal' => 'Επίσκεψη που εκπλήρωσε τουλάχιστον ένα Στόχο',
'General_VisitConvertedGoalId' => 'Η επίσκεψη μετέτρεψε μια συγκεκριμένη Ταυτότητα Στόχου',
+ 'General_EcommerceVisitStatusDesc' => 'Επισκεφθείτε την κατάσταση του Ecommerce στο τέλος της επίσκεψης',
+ 'General_EcommerceVisitStatusEg' => 'Για παράδειγμα, για να επιλεγούν όλες τις επισκέψεις που έκαναν μια παραγγελία Ecommerce, η αίτηση API θα πρέπει να περιέχει το %s',
'General_VisitConvertedNGoals' => 'Η Επίσκεψη μετέτρεψε %s Στόχους',
'General_NewVisitor' => 'Νέος Επισκέπτης',
'General_NewVisits' => 'Νέες επισκέψεις',
@@ -175,6 +181,9 @@ $translations = array(
'General_ColumnAverageTimeOnPage' => 'Μέσος χρόνος στη σελίδα',
'General_TimeOnPage' => 'Χρόνος στη σελίδα',
'General_ColumnAverageTimeOnPageDocumentation' => 'Ο μέσος χρόνος που ξοδεύουν οι επισκέπτες σε αυτή τη σελίδα (μόνο η σελίδα, όχι ολόκληρη η ιστοσελίδα).',
+ 'General_ColumnGenerationTime' => 'Χρόνος δημιουργίας',
+ 'General_ColumnAverageGenerationTime' => 'Μέσος όρος χρόνου δημιουργίας',
+ 'General_ColumnAverageGenerationTimeDocumentation' => 'Ο μέσος χρόνος που χρειάστηκε για να δημιουργηθεί η σελίδα. Η μετρική περιλαμβάνει το χρόνο που χρειάστηκε ο διακομιστής για να δημιουργήσει τη σελίδα, συν το χρόνο που χρειάστηκε ο επισκέπτης για να λάβει την απάντηση από το διακομιστή. Μια χαμηλότερη τιμή για το \'Μέσο χρόνο δημιουργίας\' σημαίνει ένα πιο γρήγορο ιστοτόπο για τους επισκέπτες σας!',
'General_ColumnValuePerVisit' => 'Τιμή ανά Επίσκεψη',
'General_ColumnVisitsWithConversions' => 'Επισκέψεις με Μετατροπές',
'General_VisitsWith' => 'Επισκέψεις με %s',
@@ -191,7 +200,7 @@ $translations = array(
'General_GeneralSettings' => 'Γενικές Ρυθμίσεις',
'General_AllowPiwikArchivingToTriggerBrowser' => 'Επιτρέπετε η ενεργοποίηση της αρχειοθέτησης του Piwik όταν προβάλλονται αναφορές από τον φυλλομετρητή',
'General_ArchivingInlineHelp' => 'Για μεσαίας ή μεγάλης επισκεψιμότητας ιστοσελίδες, προτείνεται να απενεργοποιήσετε την αρχειοθέτηση από τον φυλλομετρητή. Αντί για αυτό, σας προτείνουμε να εγκαταστήσετε μια εργασία cron για να δημιουργείτε αναφορές Piwik κάθε ώρα.',
- 'General_ArchivingTriggerDescription' => 'Προτείνετε για μεγάλες εγκαταστάσεις του Piwik. Χρειάζεται να %sεγκαταστήσετε μια εργασία cron%s για να δημιουργείτε τις αναφορές αυτόματα.',
+ 'General_ArchivingTriggerDescription' => 'Συνιστάται για μεγάλες εγκαταστάσεις του Piwik. Χρειάζεται να %sεγκαταστήσετε μια εργασία cron%s για να δημιουργείτε τις αναφορές αυτόματα.',
'General_SeeTheOfficialDocumentationForMoreInformation' => 'Δείτε την %sεπίσημη τεκμηρίωση%s για περισσότερες πληροφορίες.',
'General_ReportsContainingTodayWillBeProcessedAtMostEvery' => 'Οι σημερινές αναφορές (ή όποιο άλλο Χρονικό Εύρος που περιέχει τη σημερινή μέρα θα προωθείται το πολύ κάθε',
'General_NSeconds' => '%s δευτερόλεπτα',
@@ -199,13 +208,14 @@ $translations = array(
'General_MediumToHighTrafficItIsRecommendedTo' => 'Για μεσαίας ή μεγάλης επισκεψιμότητας ιστοσελίδες, προτείνεται να δημιουργείτε αναφορές για σήμερα στο περισσότερο κάθε μισή ώρα (%s δευτερόλεπτα) ή κάθε ώρα (%s δευτερόλεπτα).',
'General_RequiresFlash' => 'Η προβολή Γραφικών στο Piwik προϋποθέτει Flash',
'General_GraphHelp' => 'Περισσότερες πληροφορίες για την προβολή γραφικών στο Piwik.',
+ 'General_NoDataForGraph_js' => 'Δεν υπάρχουν δεδομένα για αυτό το γράφημα.',
'General_DataForThisGraphHasBeenPurged' => 'Τα δεδομένα αυτού του γραφήματος είναι πάνω από %s μηνών και εκκαθαρίστηκαν.',
'General_NoDataForTagCloud' => 'Ανεπαρκή δεδομένα για σύννεφο λέξεων.',
'General_DataForThisTagCloudHasBeenPurged' => 'Τα δεδομένα αυτού του σύννεφου ετικετών είναι πάνω από %s μηνών και εκκαθαρίστηκαν.',
'General_DisplaySimpleTable' => 'Προβολή απλού πίνακα',
'General_DisplayTableWithMoreMetrics' => 'Προβολή πίνακα με περισσότερα μετρήσιμα',
'General_DisplayTableWithGoalMetrics' => 'Προβολή πίνακα με μετρήσιμα Στόχων',
- 'General_PiwikIsACollaborativeProjectYouCanContributeAndDonate' => '%1$s Το Piwik %2$s είναι ένα πρόγραμμα συνεργασίας. %3$s Αν σας αρέσει το Piwik, μπορείτε να βοηθήσετε: ανακαλύψτε πως %4$s Να συμμετάσχετε στο Piwik%5$s, ή%6$s %7$sκάντε μια δωρεά%8$s για να βοηθήσετε το Piwik 2.0!',
+ 'General_PiwikIsACollaborativeProjectYouCanContributeAndDonate' => '%1$s Το Piwik %2$s είναι ένα πρόγραμμα συνεργασίας. %3$s Αν σας αρέσει το Piwik, μπορείτε να βοηθήσετε: ανακαλύψτε πως %4$s να συμμετάσχετε στο Piwik%5$s, ή%6$s %7$sκάντε μια δωρεά%8$s για να βοηθήσετε το Piwik 2.0!',
'General_YouAreViewingDemoShortMessage' => 'Τώρα βλέπετε τη δοκιμή του Piwik',
'General_YouAreCurrentlyUsing' => 'Χρησιμοποιείτε την έκδοση %s του Piwik.',
'General_DownloadFullVersion' => '%1$sΛήψη%2$s της πλήρους έκδοσης! Δείτε %3$s',
@@ -259,6 +269,10 @@ $translations = array(
'General_Daily' => 'Ημερησίως',
'General_Weekly' => 'Εβδομαδιαίως',
'General_Monthly' => 'Μηνιαίως',
+ 'General_DailyReport' => 'ημερήσια',
+ 'General_WeeklyReport' => 'εβδομαδιαία',
+ 'General_MonthlyReport' => 'μηνιαία',
+ 'General_YearlyReport' => 'ετήσια',
'General_DailyReports' => 'Ημερήσιες αναφορές',
'General_WeeklyReports' => 'Εβδομαδιαίες αναφορές',
'General_MonthlyReports' => 'Μηνιαίες αναφορές',
@@ -330,9 +344,12 @@ $translations = array(
'General_Metadata' => 'Μεταδεδομένα',
'General_OneVisit' => '1 επίσκεψη',
'General_NVisits' => '%s επισκέψεις',
+ 'General_OneAction' => '1 δραστηριότητα',
'General_EvolutionSummaryGeneric' => '%1$s στο %2$s σε σύγκριση με το %3$s στο %4$s. Εξέλιξη: %5$s',
'General_OneDay' => '1 ημέρα',
'General_NDays' => '%s ημέρες',
+ 'General_OneMinute' => '1 λεπτό',
+ 'General_NMinutes' => '%s λεπτά',
'General_MainMetrics' => 'Βασικές μετρήσεις',
'General_Mobile' => 'Κινητό',
'General_Desktop' => 'Επιτραπέζιο',
@@ -359,6 +376,19 @@ $translations = array(
'General_MoreDetails' => 'Περισσότερες λεπτομέρειες',
'General_Source' => 'Προέλευση',
'General_Options' => 'Επιλογές',
+ 'General_Matches' => 'Ταιριάζει',
+ 'General_OperationEquals' => 'Ισούται',
+ 'General_OperationNotEquals' => 'Δεν ισούται',
+ 'General_OperationAtMost' => 'Το πολύ',
+ 'General_OperationAtLeast' => 'Τουλάχιστον',
+ 'General_OperationLessThan' => 'Μικρότερο από',
+ 'General_OperationGreaterThan' => 'Μεγαλύτερο από',
+ 'General_OperationContains' => 'Περιέχει',
+ 'General_OperationDoesNotContain' => 'Δεν περιέχει',
+ 'General_OperationIs' => 'Είναι',
+ 'General_OperationIsNot' => 'Δεν είναι',
+ 'General_DefaultAppended' => '(εξ\' ορισμού)',
+ 'General_SearchNoResults' => 'Δεν υπάρχουν αποτελέσματα.',
'General_ReadThisToLearnMore' => '%1$sΔιαβάστε αυτό για να μάθετε περισσότερα.%2$s',
'Actions_PluginDescription' => 'Αναφέρει για τις προβολές σελίδων, οι εξωτερικοί σύνδεσμοι και οι λήψεις. Η ανίχνευση των εξωτερικών συνδέσμων και των λήψεων είναι αυτόματη!',
'Actions_Actions' => 'Δραστηριότητες',
@@ -400,6 +430,7 @@ $translations = array(
'Actions_ColumnSearchCategory' => 'Κατηγορία Αναζήτησης',
'Actions_ColumnSearchResultsCount' => 'Μετρητής Αποτελεσμάτων Αναζήτησης',
'Actions_ColumnSearchKeyword' => 'Λέξη-κλειδί',
+ 'Actions_SiteSearchKeyword' => 'Λέξη κλειδί (Αναζήτηση ιστοτόπου)',
'Actions_ColumnClickedURL' => 'URL επιλογής',
'Actions_ColumnDownloadURL' => 'URL λήψης',
'Actions_ColumnEntryPageURL' => 'URL Σελίδας Εισαγωγής',
@@ -437,14 +468,14 @@ $translations = array(
'API_TopLinkTooltip' => 'Προσπελάστε τα δεδομένα Στατιστικών Ιστού προγραμματιστικά μέσω μιας απλής εφαρμογής σε json, xml, κλπ.',
'CoreAdminHome_PluginDescription' => 'Περιοχή διαχείρισης του Piwik.',
'CoreAdminHome_MenuCommunity' => 'Κοινότητα',
- 'CoreAdminHome_MenuDiagnostic' => 'Διαγνωστικό',
+ 'CoreAdminHome_MenuDiagnostic' => 'Διαγνωστικά',
'CoreAdminHome_MenuGeneralSettings' => 'Γενικές ρυθμίσεις',
'CoreAdminHome_MenuManage' => 'Διαχείριση',
'CoreAdminHome_Administration' => 'Διαχείριση',
'CoreAdminHome_EmailServerSettings' => 'Ρυθμίσεις διακομιστή ηλεκτρονικής αλληλογραφίας',
'CoreAdminHome_OptOutForYourVisitors' => 'Απενεργοποίηση του Piwik για τους επισκέπτες σας',
'CoreAdminHome_OptOutExplanation' => 'Το Piwik είναι αφοσιωμένο στην προστασία του ιδιωτικού απορρήτου στο Διαδίκτυο. Για να παρέχετε την δυνατότητα απενεργοποίησης των στατιστικών ιστού του Piwik στους επισκέπτες σας, μπορείτε να προσθέσετε τον ακόλουθο κώδικα σε μια από τις ιστοσελίδες σας, για παράδειγμα στη σελίδα Ιδιωτικού Απορρήτου.',
- 'CoreAdminHome_OptOutExplanationBis' => 'Αυτός ο κώδικας θα εμφανίσει ένα πλαίσιο (iframe) που θα περιέχει έναν σύνδεσμο για τους επισκέπτες σας για να απενεργοποιήσουν το Piwik ορίζοντας ένα cookie απενεργοποίησης στους φυλλομετρητές τους. %s Πατήστε εδώ %s για να δείτε τα περιεχόμενα που θα εμφανίζονται στο πλαίσιο.',
+ 'CoreAdminHome_OptOutExplanationBis' => 'Αυτός ο κώδικας θα εμφανίσει ένα πλαίσιο (iframe) που θα περιέχει έναν σύνδεσμο για τους επισκέπτες σας για να απενεργοποιήσουν το Piwik ορίζοντας ένα cookie απενεργοποίησης στους φυλλομετρητές τους. %sΠατήστε εδώ%s για να δείτε τα περιεχόμενα που θα εμφανίζονται στο πλαίσιο.',
'CoreAdminHome_OptOutComplete' => 'Η απενεργοποίηση ολοκληρώθηκε. Οι επισκέψεις σας σε αυτή την ιστοσελίδα δεν θα καταγράφονται από το εργαλείο Στατιστικών Ιστού.',
'CoreAdminHome_OptOutCompleteBis' => 'Σημειώστε ότι αν εκκαθαρίσετε τα cookies σας ή διαγράψετε το cookie απενεργοποιήσης ή αλλάξετε υπολογιστές ή φυλλομετρητές Ιστού, θα χρειαστεί να επαναλάβετε ξανά την διαδικασία απενεργοποιήσης.',
'CoreAdminHome_YouMayOptOut' => 'Μπορείτε να επιλέξετε να μην έχετε μοναδικό αριθμό ταυτοποίησης στατιστικών ιστού στον υπολογιστή σας για να αποφύγετε την ενσωμάτωση και την ανάλυση των συλλεχθέντων δεδομένων σε αυτή την ιστοσελίδα.',
@@ -460,16 +491,16 @@ $translations = array(
'CoreAdminHome_LogoUpload' => 'Επιλέξτε ένα Λογότυπο για αποστολή',
'CoreAdminHome_LogoUploadDescription' => 'Αποστείλτε ένα αρχείο σε μορφές %s, χωρίς διάφανο υπόβαθρο, με ελάχιστο ύψος %s εικονοστοιχεία (pixels).',
'CoreAdminHome_LogoNotWriteable' => 'Για να χρησιμοποιήσετε ένα προσαρμοσμένο υπόβαθρο, το Piwik απαιτεί δικαιώματα εγγραφής στα αρχεία λογοτύπου μέσα στο φάκελο των θεμάτων: %s',
- 'CoreAdminHome_TrustedHostSettings' => 'Αξιόπιστο όνομα Φιλοξενητή Piwik',
+ 'CoreAdminHome_TrustedHostSettings' => 'Αξιόπιστο όνομα Διακομιστή Piwik',
'CoreAdminHome_TrustedHostConfirm' => 'Είστε βέβαιοι ότι θέλετε να αλλάξετε το διαπιστευμένο όνομα του εξυπηρετητή του Piwik;',
'CoreAdminHome_PiwikIsInstalledAt' => 'Το Piwik εγκαταστάθηκε στο',
- 'CoreAdminHome_ValidPiwikHostname' => 'Έγκυρο Όνομα Φιλοξενητή Piwik',
+ 'CoreAdminHome_ValidPiwikHostname' => 'Έγκυρο Όνομα Διακομιστή Piwik',
'CoreAdminHome_MissingPluginsWarning' => 'Τα ακόλουθα πρόσθετα δεν φορτώθηκαν, επειδή δεν βρέθηκαν στον κατάλογο με τα «πρόσθετα»: %1$s. Μπορείτε να απενεργοποιήσετε αυτά τα plugins από τη σελίδα %2$sΔιαχείριση Plugins%3$s.',
- 'CoreAdminHome_JSTrackingIntro1' => 'Μπορείτε να παρακολουθείτε τους επισκέπτες στο site σας με πολλούς διαφορετικούς τρόπους. Ο συνιστώμενος τρόπος είναι μέσω της JavaScript. Για να χρησιμοποιήσετε αυτή τη μέθοδο θα πρέπει να βεβαιωθείτε ότι κάθε σελίδα του ιστοτόπου σας έχει κάποιο κώδικα JavaScript, τον οποίο μπορείτε να δημιουργήσετε εδώ.',
+ 'CoreAdminHome_JSTrackingIntro1' => 'Μπορείτε να παρακολουθείτε τους επισκέπτες στον ιστοτόπο σας με πολλούς διαφορετικούς τρόπους. Ο συνιστώμενος τρόπος είναι μέσω της JavaScript. Για να χρησιμοποιήσετε αυτή τη μέθοδο θα πρέπει να βεβαιωθείτε ότι κάθε σελίδα του ιστοτόπου σας έχει κάποιο κώδικα JavaScript, τον οποίο μπορείτε να δημιουργήσετε εδώ.',
'CoreAdminHome_JSTrackingIntro2' => 'Μόλις έχετε το JavaScript κώδικα παρακολούθησης για την ιστοσελίδα σας, αντιγράψετε και επικολλήστε τον σε όλες τις σελίδες που θέλετε να παρακολουθήσετε με το Piwik.',
- 'CoreAdminHome_JSTrackingIntro3' => 'Στις περισσότερες ιστοσελίδες, blogs, CMS, κλπ. μπορείτε να χρησιμοποιήσετε ένα προ-κατασκευασμένο πρόσθετο (plugin) για να κάνει την τεχνική δουλειά αντί για σας. (Βλέπε %1$sΛίστα των plugins που χρησιμοποιούνται για την ενσωμάτωση του Piwik%2$s.) Εάν δεν υπάρχει plugin μπορείτε να επεξεργαστείτε τα πρότυπα της ιστοσελίδας σας και να προσθέσετε αυτόν τον κώδικα στο αρχείο "footer".',
+ 'CoreAdminHome_JSTrackingIntro3' => 'Στις περισσότερες ιστοσελίδες, blogs, CMS, κλπ. μπορείτε να χρησιμοποιήσετε ένα προ-κατασκευασμένο πρόσθετο (plugin) για να κάνει την τεχνική δουλειά αντί για σας. (Βλέπε %1$sΛίστα των πρόσθετων που χρησιμοποιούνται για την ενσωμάτωση του Piwik%2$s.) Εάν δεν υπάρχει πρόσθετο μπορείτε να επεξεργαστείτε τα πρότυπα της ιστοσελίδας σας και να προσθέσετε αυτόν τον κώδικα στο αρχείο "footer".',
'CoreAdminHome_JSTrackingIntro4' => 'Αν δεν θέλετε να χρησιμοποιήσετε JavaScript για να παρακολουθείτε τους επισκέπτες, %1$sΔημιουργήστε ένα σύνδεσμο παρακολούθησης εικόνας παρακάτω%2$s.',
- 'CoreAdminHome_JSTrackingIntro5' => 'Αν θέλετε να κάνετε περισσότερα από να παρακολουθείτε προβολές σελίδων, παρακαλώ ελέγξτε το %1$sΤεκμηρίωση Piwik για Παρακολούθηση με Javascript%2$s για να δείτε τη λίστα με τις διαθέσιμες λειτουργίες. Χρησιμοποιώντας αυτές τις λειτουργίες, μπορείτε να παρακολουθείτε τους στόχους, προσαρμοσμένε μεταβλητές, παραγγελίες ηλεκτρονικού εμπορίου, εγκαταλελειμμένα καλάθια αγορών και πολλά άλλα.',
+ 'CoreAdminHome_JSTrackingIntro5' => 'Αν θέλετε να κάνετε περισσότερα από να παρακολουθείτε προβολές σελίδων, παρακαλώ ελέγξτε το %1$sΤεκμηρίωση Piwik για Παρακολούθηση με Javascript%2$s για να δείτε τη λίστα με τις διαθέσιμες λειτουργίες. Χρησιμοποιώντας αυτές τις λειτουργίες, μπορείτε να παρακολουθείτε τους στόχους, προσαρμοσμένες μεταβλητές, παραγγελίες ηλεκτρονικού εμπορίου, εγκαταλελειμμένα καλάθια αγορών και πολλά άλλα.',
'CoreAdminHome_TrackingCode' => 'Κώδικας παρακολούθησης',
'CoreAdminHome_JSTracking_MergeSubdomains' => 'Παρακολούθηση επισκεπτών σε όλα τα υπο-domains του',
'CoreAdminHome_JSTracking_MergeSubdomainsDesc' => 'Έτσι, αν κάποιος χρήστης επισκευθεί το %1$s και το %2$s, θα υπολογίζεται ως μοναδικός επισκέπτης.',
@@ -499,10 +530,19 @@ $translations = array(
'CoreAdminHome_ImportingServerLogs' => 'Εισαγωγή Αρχείων Καταγραφής Διακομιστή',
'CoreAdminHome_ImportingServerLogsDesc' => 'Μια εναλλακτική λύση για την παρακολούθηση επισκεπτών μέσω του προγράμματος περιήγησης (μέσω JavaScript ή σύνδεσμου εικόνας) είναι να εισάγετε συνεχώς τα αρχεία καταγραφής του διακομιστή. Μάθετε περισσότερα για τα %1$sΣτατιστικά Αρχείων Καταγραφής Εξυπηρετητή%2$s.',
'CoreAdminHome_JavaScriptTracking' => 'Παρακολούθηση με JavaScript',
+ 'CoreAdminHome_LatestStableRelease' => 'Η τελευταία σταθερή έκδοση',
+ 'CoreAdminHome_LatestBetaRelease' => 'Η τελευταία δοκιμαστική έκδοση',
+ 'CoreAdminHome_ForBetaTestersOnly' => 'Για χρήστες δοκιμαστές μόνο',
+ 'CoreAdminHome_CheckReleaseGetVersion' => 'Κατά τον έλεγχο για νέες εκδόσεις του Piwik, πάντα να γίνεται λήψη',
+ 'CoreAdminHome_DevelopmentProcess' => 'Παρόλο που η %sδιαδικασία μας ανάπτυξης%s περιλαμβάνει χιλιάδες αυτοματοποιημένων ελέγχων, οι χρήστες δοκιμαστές παίζουν ένα κύριο ρόλο στο να πετύχουμε την "Χωρίς σφάλματα πολιτική" του Piwik.',
+ 'CoreAdminHome_StableReleases' => 'Αν το Piwik αποτελεί ένα κρίσιμο μέρος της επιχείρησής σας, προτείνουμε να χρησιμοποιείτε την τελευταία σταθερή έκδοση. Αν χρησιμοποιείτε την τελευταία δοκιμαστική έκδοση και βρείτε κάποιο σφάλμα ή έχετε κάποια πρόταση, παρακαλούμε %sδείτε εδώ%s.',
+ 'CoreAdminHome_YouAreCurrentlyUsingPHP' => 'Χρησιμοποιείτε έκδοση PHP %1$s.',
+ 'CoreAdminHome_OldPHPVersionWarning_Part1' => 'Το Piwik βελτιώνεται με γρήγορο ρυθμό και προκειμένου να σας δώσει μια βελτιωμένη πλατφόρμα Στατιστικών Ιστού με την λέξη της τελευταίας τεχνολογίας, σύντομα θα αυξήσουμε την ελάχιστη απαιτούμενη έκδοση PHP στην έκδοση 5.3. %1$sΠαρακαλούμε ζητήστε από το διαχειριστή του διακομιστή σας ή τον πάροχο φιλοξενίας να ενημερώσει την PHP στην τελευταία έκδοση, ιδανικά στην PHP 5.4.%2$s',
+ 'CoreAdminHome_OldPHPVersionWarning_Part2' => 'Όταν αναβαθμίσετε σε PHP 5.3 ή μεγαλύτερη, το μήνυμα αυτό θα εξαφανιστεί και ο διακομιστής σας Piwik θα επεξεργάζεται τις αναφορές με χρήση λιγότερης μνήμης. %1$sΕνημερώστε την PHP και πάρετε τα μέγιστα από το Piwik!%2$s',
'CoreHome_InjectedHostWarningIntro' => 'Θα έχετε πρόσβαση τώρα στο Piwik από το %1$s, αλλά το Piwik έχει ρυθμιστεί να τρέχει σε αυτή τη διεύθυνση: %2$s.',
'CoreHome_InjectedHostSuperUserWarning' => 'Το Piwik μπορεί να είναι λάθος ρυθμισμένο (για  παράδειγμα, αν το Piwik πρόσφατα μεταφέρθηκε σε ένα νέο εξυπηρετητή ή URL). Μπορείτε είτε %1$sνα κάνετε κλικ εδώ και να προσθέσετε %2$s ως έγκυρο όνομα εξυπηρετητή του Piwik (αν τον εμπιστεύεστε)%3$s ή %4$sνα κάνετε κλικ εδώ και πηγαίνετε στο %5$s για να έχουν πρόσβαση με ασφάλεια Piwik%6$s.',
'CoreHome_InjectedHostNonSuperUserWarning' => '%1$sΚάντε κλικ εδώ για να αποκτήσετε πρόσβαση με Piwik με ασφάλεια%2$s και να αφαιρέσετε αυτή την προειδοποίηση. Μπορεί επίσης να θέλετε να επικοινωνήσετε με το διαχειριστή του Piwik και τους ανακοινώνει για το θέμα αυτό (%3$sκάντε κλικ εδώ για να στείλετε email%4$s).',
- 'CoreHome_InjectedHostEmailSubject' => 'Το Piwik προσπελάστηκε μέ ένα άγνωστο όνομα φιλοξενητή: %s',
+ 'CoreHome_InjectedHostEmailSubject' => 'Το Piwik προσπελάστηκε με ένα άγνωστο όνομα διακομιστή: %s',
'CoreHome_InjectedHostEmailBody' => 'Γεια σας, προσπάθησα να έχω σήμερα πρόσβαση στο Piwik και αντιμετώπισα μια προειδοποίηση για άγνωστο όνομα εξυπηρετητή.',
'CoreHome_CheckForUpdates' => 'Έλεγχος για ενημερώσεις',
'CoreHome_YouAreUsingTheLatestVersion_js' => 'Χρησιμοποιείτε την τελευταία έκδοση του Piwik!',
@@ -522,7 +562,7 @@ $translations = array(
'CoreHome_SharePiwikShort' => 'Piwik! Δωρεάν και ανοικτού κώδικα στατιστικά ιστοσελίδων. Κρατήστε δικά σας τα δεδομένα.',
'CoreHome_SharePiwikLong' => 'Γεια σας! Βρήκα μόνο ένα καταπληκτικό λογισμικό ανοικτού κώδικα: το Piwik! Το Piwik θα σας επιτρέψει να παρακολουθείτε τους επισκέπτες στην ιστοσελίδα σας δωρεάν. Καλό θα είναι να το δείτε!',
'PrivacyManager_TeaserHeadline' => 'Ρυθμίσεις ιδιωτικού απορρήτου',
- 'PrivacyManager_Teaser' => 'Σε αυτή τη σελίδα, μπορείτε να προσαρμόσετε το Piwik ώστε να είναι συμβατό με την ισχύουσα νομοθεσία όσο αφορά τα προσωπικά δεδομένα, %sκάνοντας ανώνυμες τις διευθύνσεις IP των επισκεπτών%s, %sαπομακρύνοντας αυτόματα τις παλαιές καταγραφές επισκεπτών από τη βάση δεδομένων%s και %sπαρέχοντας ένα μηχανισμό απενεργοποίηησης για την ιστοσελίδα σας%s.',
+ 'PrivacyManager_Teaser' => 'Σε αυτή τη σελίδα, μπορείτε να προσαρμόσετε το Piwik ώστε να είναι συμβατό με την ισχύουσα νομοθεσία όσο αφορά τα προσωπικά δεδομένα, %sκάνοντας ανώνυμες τις διευθύνσεις IP των επισκεπτών%s, %sαπομακρύνοντας αυτόματα τις παλαιές καταγραφές επισκεπτών από τη βάση δεδομένων%s και %sπαρέχοντας ένα μηχανισμό απενεργοποίησης για την ιστοσελίδα σας%s.',
'PrivacyManager_MenuPrivacySettings' => 'Ιδιωτικό απόρρητο',
'PrivacyManager_PluginDescription' => 'Προσαρμόστε το Piwik ώστε να είναι συμβατό με την ισχύουσα νομοθεσία περί προσωπικών δεδομένων.',
'PrivacyManager_UseAnonymizeIp' => 'Κάντε ανώνυμες τις διευθύνσεις IP Επισκεπτών',
@@ -533,7 +573,7 @@ $translations = array(
'PrivacyManager_DeleteLogInfo' => 'Οι καταγραφές από τους ακόλουθους πίνακες θα διαγραφούν: %s',
'PrivacyManager_UseDeleteLog' => 'Τακτική διαγραφή παλαιών καταγραφών επισκεπτών από τη βάση δεδομένων',
'PrivacyManager_DeleteDataDescription' => 'Μπορείτε να ρυθμίσετε το Piwik να διαγράφει τακτικά τις παλαιές καταγραφές επισκεπτών και/ή των προωθημένων αναφορών για διατήρηση της βάσης δεδομένων σας σε μικρό μέγεθος.',
- 'PrivacyManager_DeleteDataDescription2' => 'Αν επιθυμείτε, οι προ-προωθημένες αναφορές δεν θα διαγραφούν, μόνο τα δεδομένα καταγραφής επίσκεψης, προβολής σελίδας και μετατροπής θα διαγραφούν. Ή, οι προ-προωθημένες αναφορές μοπρούν να διαγραφούν και τα δεδομένα καταγραφής μπορούν να κρατηθούν.',
+ 'PrivacyManager_DeleteDataDescription2' => 'Αν επιθυμείτε, οι προεπεξεργασμένες αναφορές δε θα διαγραφούν, μόνο τα δεδομένα καταγραφής επίσκεψης, προβολής σελίδας και μετατροπής θα διαγραφούν. Ή, οι προεπεξεργασμένες αναφορές μπορεί να διαγραφούν και τα δεδομένα καταγραφής μπορεί να κρατηθούν.',
'PrivacyManager_DeleteLogDescription2' => 'Όταν ενεργοποιήσετε την αυτόματη διαγραφή καταγραφών, πρέπει να είστε σίγουροι ότι όλες οι προηγούμενες ημερήσιες αναφορές έχουν καταχωρηθεί για να μην χαθούν δεδομένα.',
'PrivacyManager_DeleteLogsOlderThan' => 'Διαγραφή καταγραφών παλαιοτέρων από',
'PrivacyManager_DeleteDataInterval' => 'Διαγραφή παλαιών δεδομένων κάθε',
@@ -770,7 +810,7 @@ $translations = array(
'Dashboard_RemoveDashboard' => 'Απομάκρυνση κεντρικού πίνακα',
'Dashboard_CopyDashboardToUser' => 'Αντιγραφή κεντρικού πίνακα στο χρήστη',
'Dashboard_DashboardCopied_js' => 'Ο τρέχων κεντρικός πίνακας αντιγράφτηκε επιτυχώς στον επιλεγμένο χρήστη.',
- 'Dashboard_SetAsDefaultWidgets' => 'Ορίστε τη ως προεπιλεγμένη ομάδα μικροεφαρμογών',
+ 'Dashboard_SetAsDefaultWidgets' => 'Ορισμός ως προεπιλεγμένης ομάδας μικροεφαρμογών',
'Dashboard_SetAsDefaultWidgetsConfirm' => 'Θέλετε, σίγουρα, να ορίσετε την τρέχουσα επιλογή μικροεφαρμογών και διάταξης κεντρικού πίνακα ως το προεπιλεγμένο πρότυπο κεντρικού πίνακα;',
'Dashboard_SetAsDefaultWidgetsConfirmHelp' => 'Αυτή η επιλογή μικροεφαρμογών και διάταξης στηλών κεντρικού πίνακα θα χρησιμοποιηθεί όταν κάθε χρήστης δημιουργεί έναν νέο κεντρικό πίνακα ή όταν το χαρακτηριστικό «%s» χρησιμοποιείται.',
'Dashboard_RemoveDashboardConfirm' => 'Θέλετε, σίγουρα, να απομακρύνετε τον Κεντρικό Πίνακα «%s»;',
@@ -799,9 +839,9 @@ $translations = array(
'Feedback_DoYouHaveBugReportOrFeatureRequest' => 'Έχετε να αναφέρετε ένα πρόβλημα ή ένα αίτημα για χαρακτηριστικό;',
'Feedback_ViewAnswersToFAQ' => 'Δείτε απαντήσεις στις %s Συχνά Απαντημένες Ερωτήσεις%s',
'Feedback_WhyAreMyVisitsNoTracked' => 'Γιατί δεν παρακολουθούνται οι επισκέψεις στην ιστοσελίδα μου;',
- 'Feedback_HowToExclude' => 'Πως αποτρέπω την παρακολούθηση των επισκέψεών μου;',
+ 'Feedback_HowToExclude' => 'Πώς αποτρέπω την παρακολούθηση των επισκέψεών μου;',
'Feedback_WhyWrongCountry' => 'Γιατί το Piwik προβάλει την επίσκεψή μου από λάθος χώρα;',
- 'Feedback_HowToAnonymizeIP' => 'Πως μπορώ να δώσω μάσκα στις διευθύνσεις IP των επισκεπτών στη βάση δεδομένων μου;',
+ 'Feedback_HowToAnonymizeIP' => 'Πώς μπορώ να δώσω μάσκα στις διευθύνσεις IP των επισκεπτών στη βάση δεδομένων μου;',
'Feedback_VisitTheForums' => 'Επισκεφτείτε τις %s Δημόσιες Συζητήσεις%s',
'Feedback_LearnWaysToParticipate' => 'Μάθετε όλους του τρόπους που μπορείτε να %sσυμμετέχετε%s',
'Feedback_SpecialRequest' => 'Έχετε κάποιο ειδικό αίτημα για την ομάδα του Piwik;',
@@ -867,6 +907,10 @@ $translations = array(
'Goals_ConversionRate' => '%s βαθμός μετατροπής',
'Goals_NoGoalsNeedAccess' => 'Μόνο ο Διαχειριστής ή ένας Υπερχρήστης μπορεί να προσθέσει Στόχους για μια ιστοσελίδα. Ρωτήστε τον Διαχειριστή του Piwik για να ορίσει έναν Στόχο για την ιστοσελίδα σας.<br>Οι Στόχοι Παρακολούθησης είναι ένας καλός τρόπος που βοηθάει να καταλάβετε και μεγιστοποιήσετε την απόδοση της ιστοσελίδας σας!',
'Goals_AddNewGoal' => 'Προσθήκη νέου Στόχου',
+ 'Goals_NewGoalIntro' => 'Η παρακολούθηση για τη Μετατροπή Στόχων είναι ένας από τους αποτελεσματικότερους τρόπους για να μετρήσετε και να βελτιώσετε τους στόχους της επιχείρησής σας.',
+ 'Goals_NewGoalDescription' => 'Ένας Στόχος στο Piwik είναι η στρατηγική σας, η προτεραιότητά σας και μπορεί να σημαίνει πολλά πράματα: "Κατεβασμένα φυλλάδια", "Εγγεγραμμένα νέα", "Επισκέψεις στη σελίδα services.html", κτλ.',
+ 'Goals_NewWhatDoYouWantUsersToDo' => 'Τι θέλετε οι χρήστες σας να κάνουν στον ιστοτόπο σας;',
+ 'Goals_NewGoalYouWillBeAbleTo' => 'Θα μπορείτε να δείτε και να αναλύσετε την απόδοση κάθε Στόχου και να μάθετε πως να αυξήσετε τις μετατροπές, ρυθμό μετατροπών και κέρδος ανά επίσκεψη.',
'Goals_AddNewGoalOrEditExistingGoal' => '%sΠροσθέστε έναν νέο Στόχο%s ή %sΕπεξεργαστείτε%s υπάρχοντες Στόχους',
'Goals_AddGoal_js' => 'Προσθήκη Στόχου',
'Goals_UpdateGoal_js' => 'Ενημέρωση Στόχου',
@@ -880,14 +924,14 @@ $translations = array(
'Goals_WhereThe' => 'όπου το',
'Goals_Manually' => 'χειροκίνητα',
'Goals_ManuallyTriggeredUsingJavascriptFunction' => 'Ο Στόχος ενεργοποιείτε χειροκίνητα με χρήση του Javascript API trackGoal()',
- 'Goals_VisitUrl' => 'ένα δοθέν URL (σελίδα ή ομάδα σελίδων)',
+ 'Goals_VisitUrl' => 'Επίσκεψη σε μια δοθείσα διεύθυνση URL (σελίδα ή ομάδα σελίδων)',
'Goals_URL' => 'URL',
'Goals_PageTitle' => 'Τίτλος Σελίδας',
'Goals_Filename' => 'όνομα αρχείου',
'Goals_ExternalWebsiteUrl' => 'εξωτερικό URL ιστοσελίδας',
- 'Goals_Download' => 'τη λήψη ενός αρχείου',
+ 'Goals_Download' => 'Τη λήψη ενός αρχείου',
'Goals_VisitPageTitle' => 'Επίσκεψη σε έναν Δοθέν Τίτλο Σελίδας',
- 'Goals_ClickOutlink' => 'το πάτημα Συνδέσμου σε εξωτερική ιστοσελίδα',
+ 'Goals_ClickOutlink' => 'Το πάτημα Συνδέσμου προς εξωτερική ιστοσελίδα',
'Goals_Optional' => '(προαιρετικό)',
'Goals_WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore' => 'όπου η επισκεπτόμενη σελίδα περιέχει μια κλήση στη μέθοδο Javascript piwikTracker.trackGoal() (%sμάθετε περισσότερα%s)',
'Goals_AllowMultipleConversionsPerVisit' => 'Δυνατότητα πολλαπλών μετατροπών ανά επίσκεψη',
@@ -937,7 +981,7 @@ $translations = array(
'Installation_JsTag' => 'Ετικέτα Javascript',
'Installation_JsTagArchivingHelp1' => 'Για ιστοσελίδες μεσαίας και υψηλής επισκεψιμότητας, υπάρχουν ορισμένες βελτιώσεις που πρέπει να γίνουν για να βοηθήσουν το Piwik να τρέξει γρηγορότερα (όπως %1$sρύθμιση αυτόματης αρχειοθέτησης%2$s).',
'Installation_Congratulations' => 'Συγχαρητήρια',
- 'Installation_CongratulationsHelp' => '<p>Συγχαρητήρια! Η εγκατάσταση του Piwik έχει ολοκληρωθεί.</p><p>Σιγουρευτείτε ότι ο κώδικας Javascript έχει εισηχθή στις ιστοσελίδες και περιμένετε για τους πρώτους επισκέπτες σας!</p>',
+ 'Installation_CongratulationsHelp' => '<p>Συγχαρητήρια! Η εγκατάσταση του Piwik έχει ολοκληρωθεί.</p><p>Σιγουρευτείτε ότι ο κώδικας Javascript έχει εισαχθεί στις ιστοσελίδες και περιμένετε για τους πρώτους επισκέπτες σας!</p>',
'Installation_ContinueToPiwik' => 'Συνέχεια στο Piwik',
'Installation_SiteSetup' => 'Εγκαταστήστε την πρώτη ιστοσελίδα που θέλετε να καταγράφετε και να αναλύσετε με το Piwik:',
'Installation_SetupWebsite' => 'Ρύθμιση μιας ιστοσελίδας',
@@ -989,7 +1033,7 @@ $translations = array(
'Installation_SystemCheckTimeLimitHelp' => 'Σε ιστοσελίδες με μεγάλη επισκεψιμότητα, όταν διενεργείται η αποθήκευση ασφαλείας μπορεί να δαπανήθει περισσότερος χρόνος από ότι είναι προς το παρόν επιτρεπτό.<br />Δείτε την οδηγία max_execution_time στο αρχείο php.ini αν είναι απαραίτητο',
'Installation_SystemCheckMailHelp' => 'Τα μηνύματα με τις παρατηρήσεις σας και για τους Ξεχασμένους Κωδικούς δεν θα στέλνονται αν δεν είναι ενεργοποιημένη η συνάρτηση mail().',
'Installation_SystemCheckParseIniFileHelp' => 'Αυτή η εσωτερική συνάρτηση έχει απενεργοποιηθεί στον διακομιστή σας. Το Piwik θα προσπαθήσει να εξομοιώσει αυτή τη συνάρτηση αλλά ίσως προκύψουν περαιτέρω περιορισμοί ασφάλειας. Η απόδοση της ανίχνευσης θα επηρεαστεί.',
- 'Installation_SystemCheckGlobHelp' => 'Η εσωτερική συνάρτηση έχει απενεργοποιηθεί στον φιλοξενητή σας. Το Piwik θα προσπαθήσει να εξομοιώσει τη συνάρτηση αλλά ίσως να υπάρχουν επιπλέον περιορισμοί ασφαλείας. Η λειτουργικότητα μπορεί να επηρεαστεί.',
+ 'Installation_SystemCheckGlobHelp' => 'Η εσωτερική συνάρτηση έχει απενεργοποιηθεί στον διακομιστή σας. Το Piwik θα προσπαθήσει να εξομοιώσει τη συνάρτηση αλλά ίσως να υπάρχουν επιπλέον περιορισμοί ασφαλείας. Η λειτουργικότητα μπορεί να επηρεαστεί.',
'Installation_SystemCheckDebugBacktraceHelp' => 'Η εντολή View::factory δεν θα μπορεί να δημιουργήσει προβολές για το κληθέν πρότυπο.',
'Installation_SystemCheckCreateFunctionHelp' => 'Το Piwik χρησιμοποιεί ανώνυμες συναρτήσεις για ανακλήσεις.',
'Installation_SystemCheckEvalHelp' => 'Απαιτείται από το HTML QuickForm και το σύστημα προτύπων Smarty.',
@@ -1059,6 +1103,10 @@ $translations = array(
'Live_GoalRevenue' => 'Πρόσοδος',
'Live_GoalDetails' => 'Λεπτομέρειες',
'Live_VisitorsLastVisit' => 'Η τελευταία επίσκεψη αυτού του επισκέπτη ήταν πριν από %s ημέρες.',
+ 'Live_NbVisitors' => '%s επισκέπτες',
+ 'Live_NbVisitor' => '1 επισκέπτης',
+ 'Live_RealTimeVisitorCount' => 'Αριθμός επισκεπτών σε πραγματικό χρόνο',
+ 'Live_SimpleRealTimeWidget_Message' => '%s και %s στα τελευταία %s.',
'Login_PluginDescription' => 'Το πρόσθετο Πιστοποίησης χρήστη, διαβάζει τα απαραίτητα από το αρχείο config/config.inc.php για τον υπερχρήστη και από τη βάση δεδομένων για τους άλλους χρήστες. Μπορεί εύκολα να αντικατασταθεί και να προταθεί ένας νέος μηχανισμός πιστοποίησης (OpenID, htaccess, custom Auth, κλπ.).',
'Login_LoginPasswordNotCorrect' => 'Το όνομα χρήστη και ο κωδικός δεν είναι σωστά',
'Login_Password' => 'Κωδικός',
@@ -1071,7 +1119,7 @@ $translations = array(
'Login_LostYourPassword' => 'Ξεχάσατε τον κωδικό σας;',
'Login_PasswordsDoNotMatch' => 'Οι κωδικοί δεν ταιριάζουν.',
'Login_InvalidUsernameEmail' => 'Λανθασμένο όνομα χρήστη ή/και λάθος ηλεκτρονική διεύθυνση',
- 'Login_InvalidNonceOrHeadersOrReferer' => 'Η ασφάλεια της Φόρμας απέτυχε. Επαναφορτώστε τη φόρμα και ελέγξτε ότι είναι ενεργοποιημένα τα cookies. Αν χρησιμοποιείτε διακομιστή proxy, πρέπει να %sρυθμίσετε το Piwik να δέχεται την κεφαλίδα proxy%s που προωθεί την κεφαλίδα του φιλοξενητή. Επίσης, ελέγξτε ότι η κεφαλίδα Αναφορέα στέλνεται σωστά.',
+ 'Login_InvalidNonceOrHeadersOrReferer' => 'Η ασφάλεια της φόρμας απέτυχε. Επαναφορτώστε τη φόρμα και ελέγξτε ότι είναι ενεργοποιημένα τα cookies. Αν χρησιμοποιείτε διακομιστή μεσολάβησης, πρέπει να %sρυθμίσετε το Piwik να δέχεται την κεφαλίδα proxy%s που προωθεί την κεφαλίδα του διακομιστή. Επίσης, ελέγξτε ότι η κεφαλίδα Αναφορέα στέλνεται σωστά.',
'Login_InvalidOrExpiredToken' => 'Το τεκμήριο είναι άκυρο ή έχει λήξει',
'Login_MailTopicPasswordChange' => 'Επιβεβαίωση Αλλαγής Κωδικού',
'Login_MailPasswordChangeBody' => 'Γεια σας, %1$s,
@@ -1094,7 +1142,7 @@ $translations = array(
'Mobile_AddPiwikDemo' => 'Προσθήκη Δοκιμής του Piwik',
'Mobile_AnonymousTracking' => 'Ανώνυμη καταγραφή',
'Mobile_AskForAnonymousTrackingPermission' => 'Όταν ενεργοποιηθεί, το Κινητό Piwik θα στέλνει δεδομένα ανώνυμης χρήσης στο piwik.org. Η πρόθεση είναι να χρησιμοποιηθούν αυτά τα δεδομένα ώστε να βοηθήσει τους δημιουργους του Κινητού Piwik ώστε να κατανοήσουν καλυτερα τη χρήση του. Οι πληροφορίες που στέλνονται είναι: μενού και ρυθμίσεις, όνομα λειτουργικού και έκδοση, εμφανιζόμενα σφάλματα. ΔΕΝ θα καταγράψουμε κανένα από τα δεδομένα στατιστικών σας. Αυτά τα ανώνυμα δεδομένα δεν θα δημοσιευτούν ποτέ. Μπορείτε να ενεργοποιήσετε/απενεργοποιήσετε την ανώνυμη καταγραφή στις Ρυθμίσεις οποτεδήποτε.',
- 'Mobile_Advanced' => 'Για προσχωρημένους',
+ 'Mobile_Advanced' => 'Για προχωρημένους',
'Mobile_ChooseHttpTimeout' => 'Επιλέξτε τιμή χρόνου λήξης HTTP',
'Mobile_ChooseMetric' => 'Επιλογή Μέτρησης',
'Mobile_ChooseReport' => 'Επιλέξτε μια αναφορά',
@@ -1256,11 +1304,14 @@ $translations = array(
'SEO_Bing_IndexedPages' => 'Σελίδες σε ευρετήριο Bing',
'SEO_Dmoz' => 'Εισαγωγές DMOZ',
'SEO_SEORankingsFor' => 'Βαθμολόγηση BMA για %s',
+ 'SEO_ExternalBacklinks' => 'Εξωτερικοί Σύνδεσμοι για πίσω (Majestic)',
+ 'SEO_ReferrerDomains' => 'Αναφέροντα ονόματα χώρου (Majestic)',
+ 'SEO_ViewBacklinksOnMajesticSEO' => 'Εμφάνιση της αναφοράς των εξωτερικών κατευθυνόμενων συνδέσμων στο MajesticSEO.com',
'SitesManager_PluginDescription' => 'Διαχείριση Ιστοσελίδων στο Piwik: Προσθήκη μιας νέας ιστοσελίδας, Επεξεργαστείτε μια υπάρχουσα, Προβάλετε τον κώδικα Javascript που πρέπει να περιληφθεί στις σελίδες σας. Όλες οι δραστηριότητες είναι επίσης διαθέσιμες μέσω του API.',
'SitesManager_Sites' => 'Ιστοσελίδες',
'SitesManager_TrackingTags' => 'Κώδικας εποπτείας για %s',
'SitesManager_WebsitesManagement' => 'Διαχείριση ιστοσελίδων',
- 'SitesManager_MainDescription' => 'Το σύστημα αναλυτικών αναφορών χρειάζεται ιστοσελίδες! Προσθέστε, ενημερώστε, διαγράψτε ιστοσελίδες και εμφανίστε τον κώδικα Javascript που θα εισηχθή στις ιστοσελίδες σας.',
+ 'SitesManager_MainDescription' => 'Το σύστημα αναλυτικών αναφορών χρειάζεται ιστοσελίδες! Προσθέστε, ενημερώστε, διαγράψτε ιστοσελίδες και εμφανίστε τον κώδικα Javascript που θα εισαχθεί στις ιστοσελίδες σας.',
'SitesManager_YouCurrentlyHaveAccessToNWebsites' => 'Έχετε πρόσβαση σε %s ιστοσελίδες.',
'SitesManager_OnlyOneSiteAtTime_js' => 'Μπορείτε να επεξεργαστείτε μόνο μια ιστοσελίδα τη φορά. Αποθηκεύστε ή Ακυρώστε τις τρέχουσες αλλαγές για την ιστοσελίδα %s.',
'SitesManager_JsTrackingTag' => 'Κώδικας Παρακολούθησης JavaScript',
@@ -1647,7 +1698,28 @@ $translations = array(
'UserCountry_continent_oce' => 'Ωκεανία',
'UserCountryMap_map' => 'χάρτης',
'UserCountryMap_worldMap' => 'παγκόσμιος χάρτης',
+ 'UserCountryMap_VisitorMap' => 'Χάρτης Επισκεπτών',
+ 'UserCountryMap_Countries' => 'Χώρες',
+ 'UserCountryMap_Regions' => 'Περιοχές',
+ 'UserCountryMap_Cities' => 'Πόλεις',
+ 'UserCountryMap_WorldWide' => 'Παγκοσμίως',
'UserCountryMap_toggleFullscreen' => 'Εναλλαγή πλήρους οθόνης',
+ 'UserCountryMap_AndNOthers' => 'και %s άλλοι',
+ 'UserCountryMap_None' => 'Κανένα',
+ 'UserCountryMap_Unlocated' => '<b>%s</b> %p από τις επισκέψεις από %c δεν ήταν δυνατόν να χαρακτηριστούν με γεωτοποθεσία.',
+ 'UserCountryMap_NoVisit' => 'Δεν υπάρχουν επισκέψεις',
+ 'UserCountryMap_LoginToViewRealTime' => 'Κάντε είσοδο για να δείτε τον Χάρτη Επισκεπτών σε Πραγματικό Χρόνο του Piwik',
+ 'UserCountryMap_RealTimeMap' => 'Χάρτης σε πραγματικό χρόνο',
+ 'UserCountryMap_Seconds' => 'δευτερόλεπτα',
+ 'UserCountryMap_SecondsAgo' => 'πριν %s δευτερόλεπτα',
+ 'UserCountryMap_Minutes' => 'λεπτά',
+ 'UserCountryMap_MinutesAgo' => 'πριν %s λεπτά',
+ 'UserCountryMap_Hours' => 'ώρες',
+ 'UserCountryMap_HoursAgo' => 'πριν %s ώρες',
+ 'UserCountryMap_DaysAgo' => 'πριν %s ημέρες',
+ 'UserCountryMap_ShowingVisits' => 'Επισκέψεις με γεωτοποθεσία από τις τελευταίες',
+ 'UserCountryMap_Searches' => '%s αναζητήσεις',
+ 'UserCountryMap_GoalConversions' => '%s μετατροπές στόχων',
'UserCountry_HttpServerModule' => 'Επέκταση Διακομιστή HTTP',
'UserCountry_GeoIPDatabases' => 'Βάσεις δεδομένων GeoIP',
'UserCountry_PiwikNotManagingGeoIPDBs' => 'Το Piwik δεν διαχειρίζεται καμιά βάση δεδομένων GeoIP.',
@@ -1664,27 +1736,41 @@ $translations = array(
'UserCountry_GeolocationPageDesc' => 'Σε αυτή τη σελίδα μπορείτε να αλλάξετε τον τρόπο που το Piwik καθορίζει τις τοποθεσίες των επισκεπτών.',
'UserCountry_CurrentLocationIntro' => 'Σύμφωνα με τον πάροχο, η τρέχουσα τοποθεσία σας είναι',
'UserCountry_CannotFindPeclGeoIPDb' => 'Δεν ήταν δυνατή η εύρεση μιας βάσης δεδομένων της χώρας, περιοχής ή πόλης για το πρόσθετο GeoIP PECL. Βεβαιωθείτε ότι GeoIP βάση δεδομένων σας βρίσκεται στο %1$s και έχει πάρει το όνομα %2$s ή %3$s αλλιώς το πρόσθετο PECL δεν θα το προσέξει.',
+ 'UserCountry_PeclGeoIPNoDBDir' => 'Η μονάδα PECL ψάχνει για βάσεις δεδομένων στο %1$s, αλλά αυτός ο κατάλογος δεν υπάρχει. Παρακαλούμε δημιουργήστε τον και προσθέστε τις GeoIP βάσεις δεδομένων μέσα. Εναλλακτικά, μπορείτε να ορίσετε το %2$s στο σωστό κατάλογο στο αρχείο σας php.ini.',
+ 'UserCountry_PeclGeoLiteError' => 'Η βάση δεδομένων σας με γεωτοποθεσία στο %1$s ονομάζεται %2$s. Δυστυχώς, η μονάδα PECL δε θα την αναγνωρίσει με αυτό το όνομα. Παρακαλούμε μετονομάστε την σε %3$s.',
'UserCountry_GeoIpLocationProviderDesc_Pecl1' => 'Αυτός ο παροχέας τοποθεσιών χρησιμοποιεί μια βάση δεδομένων GeoIP και μια λειτουργική μονάδα PECL για να καθορίσει με ακρίβεια και αποτελεσματικά τη θέση των επισκεπτών σας.',
'UserCountry_GeoIpLocationProviderDesc_Pecl2' => 'Δεν υπάρχουν περιορισμοί με αυτό τον Πάροχο, έτσι είναι αυτός που σας συνιστούμε να χρησιμοποιήσετε.',
'UserCountry_GeoIPImplHasAccessTo' => 'Αυτή η υλοποίηση GeoIP έχει πρόσβαση στους ακόλουθους τύπους βάσεων δεδομένων',
'UserCountry_CannotFindGeoIPServerVar' => 'Η μεταβλητή %s δεν έχει οριστεί. Ο εξυπηρετητής σας μπορεί να μην έχει ρυθμιστεί σωστά.',
'UserCountry_GeoIPCannotFindMbstringExtension' => 'Δεν μπορείτε να βρείτε τη λειτουργία του %1$s. Παρακαλώ βεβαιωθείτε ότι η επέκταση %2$s είναι εγκατεστημένη και έχει φορτωθεί.',
+ 'UserCountry_InvalidGeoIPUpdatePeriod' => 'Μη έγκυρη περίοδος για την ενημέρωση του GeoIP: %1$s. Έγκυρες τιμές είναι %2$s.',
'UserCountry_LocationProvider' => 'Πάροχος Τοποθεσίας',
+ 'UserCountry_TestIPLocatorFailed' => 'Το Piwik προσπάθησε να ελέγξει την τοποθεσία μιας γνωστής διεύθυνσης IP (%1$s), αλλά ο διακομιστής σας επέστρεψε %2$s. Αν ο πάροχος είχε ρυθμιστεί σωστά, θα επέστρεφε %3$s.',
'UserCountry_CannotLocalizeLocalIP' => 'Η IP διεύθυνση %s είναι μια τοπική διεύθυνση και δεν μπορεί να προσδιοριστεί γεωγραφικά.',
'UserCountry_HowToSetupGeoIP' => 'Πως εγκαθιστώ ακριβή γεωτοποθέτηση με το GeoIP',
+ 'UserCountry_HowToSetupGeoIPIntro' => 'Δεν φαίνεται να έχετε εγκατεστημένη τη Γεωτοποθεσία. Αποτελεί ένα χρήσιμο χαρακτηριστικό και χωρίς αυτό δε θα βλέπετε έγκυρες και πλήρης πληροφορίες για τις τοποθεσίες των επισκεπτών σας. Δείτε πως μπορείτε γρήγορα να αρχίσετε να τη χρησιμοποιείτε:',
'UserCountry_HowToSetupGeoIP_Step1' => '%1$sΛήψη%2$s της βάσης δεδομένων GeoLite City από το %3$sMaxMind%4$s.',
+ 'UserCountry_HowToSetupGeoIP_Step2' => 'Αποσυμπιέστε το αρχείο και αντιγράψτε το αποτέλεσμα, %1$s μέσα στον υποκατάλογο %2$smisc%3$s του Piwik (μπορείτε να το κάνετε αυτό είτε με FTP είτε με SSH).',
+ 'UserCountry_HowToSetupGeoIP_Step3' => 'Επαναφόρτωση της οθόνης. Ο πάροχος %1$sGeoIP (PHP)%2$s τώρα θα %3$sInstalled%4$s. Επιλέξτε τον.',
+ 'UserCountry_HowToSetupGeoIP_Step4' => 'Και είστε έτοιμοι! Μόλις εγκαταστήσατε το Piwik να χρησιμοποιεί GeoIP που σημαίνει ότι θα μπορείτε να βλέπετε τις περιοχές και τις πόλεις των επισκεπτών σας μαζί με αρκετά έγκυρη πληροφορία σχετικά με τις χώρες.',
'UserCountry_getCountryDocumentation' => 'Αυτή η αναφορά δείχνει σε ποιά χώρα ήταν οι επισκέπτες σας όταν επισκεύθηκαν την ιστοσελίδα σας.',
'UserCountry_getContinentDocumentation' => 'Η παρούσα αναφορά δείχνει σε ποια ήπειρο βρίσκονταν οι επισκέπτες σας ήταν όταν επισκεύθηκαν την ιστοσελίδα σας.',
'UserCountry_getRegionDocumentation' => 'Η παρούσα αναφορά δείχνει σε ποιά περιοχή ήταν οι επισκέπτες σας όταν επισκεύθηκαν την ιστοσελίδα σας.',
'UserCountry_getCityDocumentation' => 'Η παρούσα αναφορά παρουσιάζει τις πόλεις στις οποίες οι επισκέπτες σας βρίσκονταν όταν επισκεύθηκαν την ιστοσελίδα σας.',
'UserCountry_GeoIPDocumentationSuffix' => 'Για για να δείτε τα δεδομένα για αυτή την αναφορά, θα πρέπει να ρυθμίσετε το GeoIP στην καρτέλα διαχειριστή Geolocation. Οι εμπορικές %1$sMaxmind%2$s βάσεις δεδομένων GeoIP είναι πιο ακριβείς από τις ελεύθερες. Για να δείτε πόσο ακριβείς είναι, κάντε κλικ στο %3$shere%4$s.',
+ 'UserCountry_OldGeoIPWarning' => 'Έχει εντοπιστεί το παλιό πρόσθετο GeoIP. Η ενσωμάτωση GeoIP είναι πλέον εντός του πυρήνα του Piwik και το πρόσθετο αυτό θεωρείται παρωχημένο. Νέες αναφορές περιοχών και πόλεων δε θα εμφανίζονται όσο αυτό το πρόσθετο είναι φορτωμένο. %1$sΠαρακαλούμε απενεργοποιήστε το πρόσθετο%2$s και %3$sρυθμίστε το GeoIP%4$s. Αν θέλετε δεδομένα τοποθεσιών για τις παλιές σας επισκέψεις, χρησιμοποιήστε το σενάριο που περιγράφεται %5$sεδώ%6$s και %7$sεπαναεπεξεργαστείτε τις αναφορές σας%8$s.',
+ 'UserCountry_NoDataForGeoIPReport1' => 'Δεν υπάρχουν δεδομένα για αυτή την αναφορά επειδή είτε δεν υπάρχουν δεδομένα τοποθεσίας διαθέσιμα είτε επειδή για τις διευθύνσεις IP των επισκεπτών δεν ήταν δυνατός ο εντοπισμός της τοποθεσίας τους.',
+ 'UserCountry_NoDataForGeoIPReport2' => 'Για να ενεργοποιήστε ακριβή Γεωτοποθεσία, αλλάξτε τις ρυθμίσεις %1$sεδώ%2$s και χρησιμοποιήστε μια %3$sβάση δεδομένων πόλεων%4$s.',
+ 'UserCountry_ToGeolocateOldVisits' => 'Για να κάνετε λήψη των δεδομένων γεωτοποθεσίας από τις παλιές σας επισκέψεις, χρησιμοποιήστε το σενάριο που περιγράφεται %1$sεδώ%2$s.',
'UserCountry_GeoIPPeclCustomDirNotSet' => 'Η ρύθμιση ini %s της PHP δεν έχει οριστεί.',
'UserCountry_GeoIPServerVarsFound' => 'Το Piwik ανίχνευσε τις ακόλουθες μεταβλητές GeoIP %s',
'UserCountry_AssumingNonApache' => 'Αδύνατη η εύρεση της συνάρτησης apache_get_modules, υποθέτουμε ότι ο διακομιστής δεν είναι Apache.',
'UserCountry_FoundApacheModules' => 'Το Piwik βρήκε τα ακόλουθα πρόσθετα Apache',
'UserCountry_GeoIPNoServerVars' => 'Το Piwik δεν μπορεί να βρει καμιά μεταβλητή %s GeoIP.',
+ 'UserCountry_IPurchasedGeoIPDBs' => 'Αγόρασα περισσότερες %1$s ακριβείς βάσεις δεδομένων από το MaxMind%2$s και θέλω να εγκαταστήσω τις αυτόματες ενημερώσεις.',
'UserCountry_GeoIPUpdaterInstructions' => 'Εισάγετε παρακάτω τους συνδέσμους λήψης για τις βάσεις δεδομένων σας. Αν έχετε αγοράσει βάσεις δεδομένων από την %3$sMaxMind%4$s, μπορείτε να βρείτε αυτές τις συνδέσεις %1$sεδώ%2$s. Παρακαλούμε επικοινωνήστε με την %3$sMaxMind%4$s, αν έχετε πρόβλημα με την πρόσβαση σας σε αυτές.',
'UserCountry_GeoIPUpdaterIntro' => 'Το Piwik επί του παρόντος διαχειρίζεται τις ενημερωμένες εκδόσεις για τις ακόλουθες βάσεις δεδομένων GeoIP',
+ 'UserCountry_LocationDatabase' => 'Βάση δεδομένων τοποθεσιών',
'UserCountry_LocationDatabaseHint' => 'Μια βάση δεδομένων τοποθεσιών είναι μια βάση δεδομένων χωρών, περιοχών ή πόλεων.',
'UserCountry_ISPDatabase' => 'Βάση δεδομένων Παρόχων',
'UserCountry_OrgDatabase' => 'Βάση δεδομένων Οργανισμών',
@@ -1694,13 +1780,18 @@ $translations = array(
'UserCountry_CannotFindGeoIPDatabaseInArchive' => 'Αδύνατη η εύρεση του αρχείου %1$s στο συμπιεσμένο tar %2$s!',
'UserCountry_CannotUnzipDatFile' => 'Αδύνατη η αποσυμπίεση αρχείου dat στο %1$s: %2$s',
'UserCountry_UnsupportedArchiveType' => 'Παρουσιάστηκε μη υποστηριζόμενος τύπος συμπιεσμένου αρχείου %1$s.',
+ 'UserCountry_ThisUrlIsNotAValidGeoIPDB' => 'Το κατεβασμένο αρχείο δεν είναι έγκυρη βάση δεδομένων με Γεωτοποθεσία. Παρακαλούμε διπλοελέγξτε τη διεύθυνση URL ή κατεβάστε το αρχείο χειροκίνητα.',
'UserCountry_FatalErrorDuringDownload_js' => 'Παρουσιάστηκε ανεπανόρθωτο σφάλμα κατά τη λήψη αυτού του αρχείου. Μπορεί να υπάρχει κάτι λανθασμένο με σύνδεση σας στο internet, με τη βάση δεδομένων GeoIP που έχετε κατεβάσει ή με το Piwik. Προσπαθήστε να κάνετε λήψη και να την εγκαταστήσετε με μη αυτόματο τρόπο.',
'UserCountry_SetupAutomaticUpdatesOfGeoIP_js' => 'Εγκατάσταση αυτόματων ενημερώσεων των βάσεων δεδομένων GeoIP',
'UserCountry_DownloadNewDatabasesEvery' => 'Ενημέρωση βάσεων δεδομένων κάθε',
'UserCountry_GeoLiteCityLink' => 'Αν χρησιμοποιείτε τη βάση δεδομένων Πόλεων της GeoLite, χρησιμοποιήστε τον παρακάτω σύνδεσμο: %1$s%2$s%3$s.',
+ 'UserCountry_UpdaterWasLastRun' => 'Το πρόγραμμα ενημέρωσης εκτελέστηκε τελευταία στις %s.',
+ 'UserCountry_UpdaterHasNotBeenRun' => 'Το πρόγραμμα ενημέρωσης δεν εκτελέστηκε ποτέ.',
'UserSettings_VisitorSettings' => 'Ρυθμίσεις επισκέπτη',
'UserSettings_BrowserFamilies' => 'Ομάδες φυλλομετρητών',
'UserSettings_Browsers' => 'Φυλλομετρητές',
+ 'UserSettings_BrowserWithNoPluginsEnabled' => '%1$s με ανενεργά πρόσθετα',
+ 'UserSettings_BrowserWithPluginsEnabled' => '%1$s με %2$s πρόσθετα ενεργά',
'UserSettings_Plugins' => 'Πρόσθετα',
'UserSettings_Configurations' => 'Ρυθμίσεις',
'UserSettings_WidgetGlobalVisitorsDocumentation' => 'Αυτή η αναφορά δείχνει τις πιο συχνές καθολικές ρυθμίσεις που έχουν οι επισκέπτες σας. Μια ρύθμιση είναι ο συνδυασμός του λειτουργικού συστήματος, του τύπου φυλλομετρητή και της ανάλυσης οθόνης.',
@@ -1750,17 +1841,19 @@ $translations = array(
'UsersManager_PrivAdmin' => 'Διαχείριση',
'UsersManager_ChangeAllConfirm' => 'Είστε σίγουρος ότι θέλετε να αλλάξετε «%s» δικαιώματα σε όλες τις ιστοσελίδες;',
'UsersManager_ChangePasswordConfirm' => 'Η αλλαγή του κωδικού πρόσβασης συνεπάγεται αλλαγή του πειστηρίου πιστοποίησης των χρηστών (token_auth). Θέλετε να συνεχίσετε;',
+ 'UsersManager_AnonymousUserHasViewAccess' => 'Σημείωση: ο %1$s χρήστης έχει %2$s πρόσβαση στον ιστοτόπο.',
+ 'UsersManager_AnonymousUserHasViewAccess2' => 'Οι αναφορές στατιστικών σας και οι πληροφορίες για τους επισκέπτες είναι δημόσια προσπελάσιμες.',
'UsersManager_Password' => 'Κωδικός',
'UsersManager_Email' => 'Ηλεκτρονική Διεύθυνση',
'UsersManager_Alias' => 'Ψευδώνυμο',
- 'UsersManager_TheSuperUserAliasCannotBeChanged' => 'Η μάσκα του Υπερχρήστη δεν μπορεί να αλλάξει.',
- 'UsersManager_ReportToLoadByDefault' => 'Αναφέρεται να φορτώνει ως προεπιλογή',
- 'UsersManager_ReportDateToLoadByDefault' => 'Αναφέρεται την ημερομηνία για να φορτώνεται ως προεπιλογή',
- 'UsersManager_ForAnonymousUsersReportDateToLoadByDefault' => 'Για ανώνυμους χρήστες, αναφέρεται την ημερομηνία για να φορτώνεται ως προεπιλογή',
+ 'UsersManager_TheSuperUserAliasCannotBeChanged' => 'Το ψευδώνυμο του Υπερχρήστη δεν μπορεί να αλλάξει.',
+ 'UsersManager_ReportToLoadByDefault' => 'Αναφορά που θα φορτώνεται ως προεπιλογή',
+ 'UsersManager_ReportDateToLoadByDefault' => 'Αναφορά ημερομηνίας που θα φορτώνεται ως προεπιλογή',
+ 'UsersManager_ForAnonymousUsersReportDateToLoadByDefault' => 'Για ανώνυμους χρήστες, αναφορά ημερομηνίας που θα φορτώνεται ως προεπιλογή',
'UsersManager_ExcludeVisitsViaCookie' => 'Αποκλείστε τις επισκέψεις σας με χρήση cookie',
'UsersManager_YourVisitsAreIgnoredOnDomain' => '%sΟι επισκέψεις σας παραβλέπονται από το Piwik στο %s %s (το Piwik παραβλέπει το cookie που βρέθηκα στον φυλλομετρητή σας).',
'UsersManager_YourVisitsAreNotIgnored' => '%sΟι επισκέψεις δεν αγνοούνται από το Piwik%s (δεν βρέθηκε cookie αγνόησης του Piwik στον φυλλομετρητή σας).',
- 'UsersManager_ClickHereToDeleteTheCookie' => 'Πατήστε εδώ για να διαγράψετε το cookie και αφήστε το Piwik να καταγράφει τις εκισκέψεις σας',
+ 'UsersManager_ClickHereToDeleteTheCookie' => 'Πατήστε εδώ για να διαγράψετε το cookie και αφήστε το Piwik να καταγράφει τις επισκέψεις σας',
'UsersManager_ClickHereToSetTheCookieOnDomain' => 'Πατήστε εδώ για να ορίσετε ένα cookie που θα αποκλείει τις επισκέψεις σας στις ιστοσελίδες που ανιχνεύονται από το Piwik στο %s',
'UsersManager_Edit' => 'Επεξεργασία',
'UsersManager_AddUser' => 'Προσθήκη νέου χρήστη',
@@ -1770,7 +1863,7 @@ $translations = array(
'UsersManager_NoteNoAnonymousUserAccessSettingsWontBeUsed2' => 'Σημείωση: Δεν μπορείτε να αλλάξετε τις ρυθμίσεις σε αυτό τον τομέα γιατί δεν έχετε κάποια ιστοσελίδα που μπορείτε να έχετε πρόσβαση ως ανώνυμος χρήστης.',
'UsersManager_WhenUsersAreNotLoggedInAndVisitPiwikTheyShouldAccess' => 'Όταν οι χρήστες δεν έχουν συνδεθεί και επισκέπτονται το Piwik, θα έχουν πρόσβαση',
'UsersManager_ChangePassword' => 'Αλλαγή κωδικού πρόσβασης',
- 'UsersManager_IfYouWouldLikeToChangeThePasswordTypeANewOne' => 'Αν θέλετε να αλλάξετε τον κωδικός πρόσβασης, γράψτε έναν νέο. Διαφορετικά αφήστε το κενό.',
+ 'UsersManager_IfYouWouldLikeToChangeThePasswordTypeANewOne' => 'Αν θέλετε να αλλάξετε τον κωδικό πρόσβασης εισάγετε ένα νέο. Διαφορετικά αφήστε το κενό.',
'UsersManager_TypeYourPasswordAgain' => 'Γράψτε τον νέο σας κωδικό ξανά.',
'UsersManager_TheLoginScreen' => 'Η οθόνη σύνδεσης',
'UsersManager_DeleteConfirm_js' => 'Είστε σίγουρος ότι θέλετε να διαγράψετε τον/ην χρήστη %s;',
@@ -1787,6 +1880,8 @@ $translations = array(
'UsersManager_ExceptionUserDoesNotExist' => 'Ο χρήστης «%s» δεν υπάρχει.',
'UsersManager_ExceptionAccessValues' => 'Η πρόσβαση παραμέτρου πρέπει να έχει τις ακόλουθες τιμές : [ %s ]',
'UsersManager_ExceptionPasswordMD5HashExpected' => 'Το UsersManager.getTokenAuth αναμένει έναν κωδικό πρόσβασης ως αριθμό MD5 (μήκος 32 χαρακτήρων). Ανακαλέστε τη συνάρτηση md5() στον κωδικό πρόσβασης πριν ανακαλέσετε τη μέθοδο.',
+ 'UsersManager_InjectedHostCannotChangePwd' => 'Αυτή τη στιγμή είστε επισκέπτης από ένα άγνωστο υπολογιστή (%1$s). Δεν μπορείτε να αλλάξετε το συνθηματικό σας μέχρι να διορθωθεί αυτό το πρόβλημα.',
+ 'UsersManager_EmailYourAdministrator' => '%1$sΣτείλτε e-mail στον διαχειριστή σχετικά με το πρόβλημα %2$s.',
'VisitFrequency_PluginDescription' => 'Αναφέρει διάφορα στατιστικά για τον Επιστρεφόμενο Επισκέπτη αντί το Πρωτοεμφανιζόμενου επισκέπτη.',
'VisitFrequency_Evolution' => 'Εξέλιξη εντός της περιόδου',
'VisitFrequency_ColumnReturningVisits' => 'Επιστρεφόμενες επισκέψεις',
@@ -1851,12 +1946,15 @@ $translations = array(
'VisitsSummary_NbUniquePageviewsDescription' => '%s μοναδικές προβολές σελίδων',
'VisitsSummary_NbDownloadsDescription' => '%s λήψεις',
'VisitsSummary_NbUniqueDownloadsDescription' => '%s μοναδικές λήψεις',
- 'VisitsSummary_NbOutlinksDescription' => '%s εξωεερικοί σύνδεσμοι',
- 'VisitsSummary_NbUniqueOutlinksDescription' => '%s μοναδικοί εξωτερικοί σύνδεσμοι',
+ 'VisitsSummary_NbOutlinksDescription' => '%s σύνδεσμοι προς εξωτερικό',
+ 'VisitsSummary_NbSearchesDescription' => '%s συνολικές αναζητήσεις στον ιστοτόπο σας',
+ 'VisitsSummary_NbKeywordsDescription' => '%s μοναδικές λέξεις κλειδιά',
+ 'VisitsSummary_NbUniqueOutlinksDescription' => '%s μοναδικοί σύνδεσμοι προς εξωτερικό',
'VisitsSummary_AverageVisitDuration' => '%s μέση διάρκεια επισκέψεων',
'VisitsSummary_MaxNbActions' => '%s είναι ο μέγιστος αριθμός δραστηριοτήτων σε μία επίσκεψη',
'VisitsSummary_NbActionsPerVisit' => '%s δραστηριότητες ανά επίσκεψη',
'VisitsSummary_NbVisitsBounced' => '%s των επισκεπτών απομακρύνθηκαν (έφυγαν από την πρώτη σελίδα)',
+ 'VisitsSummary_AverageGenerationTime' => '%s μέσος χρόνος δημιουργίας',
'VisitsSummary_GenerateTime' => '%s δευτερόλεπτα για τη δημιουργία της σελίδας',
'VisitsSummary_GenerateQueries' => '%s ερωτήματα εκτελέστηκαν',
'VisitsSummary_WidgetLastVisits' => 'Διάγραμμα τελευταίων επισκέψεων',
@@ -1900,6 +1998,8 @@ $translations = array(
'PDFReports_CreateAndScheduleReport' => 'Δημιουργήστε και Προγραμματίστε μια αναφορά',
'PDFReports_CancelAndReturnToReports' => 'Άκυρο και %sεπιστροφή στη λίστα αναφορών%s',
'PDFReports_DescriptionOnFirstPage' => 'Η περιγραφή της αναφοράς θα εμφανίζεται στην πρώτη σελίδα της αναφοράς.',
+ 'PDFReports_Segment_Help' => 'Μπορείτε να επιλέξετε ένα υπάρχον προσαρμοσμένο τμήμα για να χρησιμοποιηθεί στα δεδομένα σε αυτή την αναφορά e-mail. Μπορείτε να δημιουργήσετε και να επεξεργαστείτε προσαρμοσμένα τμήματα στον πίνακα ελέγχου σας %s(κάντε κλικ για άνοιγμα)%s, μετά να κάνετε κλικ στο κουτί "%s" και μετά "%s".',
+ 'PDFReports_Segment_Deletion_Error' => 'Δεν είναι δυνατή η διαγραφή του τμήματος, γιατί χρησιμοποιείται για τη δημιουργία των αναφορών e-mail %s. Για να διαγράψετε το τμήμα, θα πρέπει πρώτα να επεξεργαστείτε τις αναφορές αυτές για να μη χρησιμοποιούν το τμήμα αυτό.',
'PDFReports_WeeklyScheduleHelp' => 'Εβδομαδιαίος προγραμματισμός: η αναφορά θα αποσταλεί την Δευτέρα κάθε εβδομάδας.',
'PDFReports_MonthlyScheduleHelp' => 'Μηνιαίος προγραμματισμός: η αναφορά θα αποσταλεί την πρώτη μέρα κάθε μήνα.',
'PDFReports_ReportHour' => 'Αποστολή αναφοράς στο',
@@ -1913,6 +2013,8 @@ $translations = array(
'PDFReports_EmailHello' => 'Γεια σας,',
'PDFReports_PleaseFindAttachedFile' => 'Βρείτε στο συνημμένο αρχείο την αναφορά %1$s για %2$s.',
'PDFReports_PleaseFindBelow' => 'Βρείτε παρακάτω την αναφορά %1$s για τη %2$s.',
+ 'PDFReports_SegmentAppliedToReports' => 'Το τμήμα \'%s\' εφαρμόζεται στις αναφορές.',
+ 'PDFReports_CustomVisitorSegment' => 'Προσαρμοσμένο Τμήμα Επισκεπτών:',
'PDFReports_AreYouSureDeleteReport' => 'Θέλετε σίγουρα να διαγράψετε αυτή την αναφορά και τον προγραμματισμό της;',
'PDFReports_ThereIsNoReportToManage' => 'Δεν υπάρχει αναφορά για τη διαχείριση της ιστοσελίδας %s',
'PDFReports_MustBeLoggedIn' => 'Πρέπει να έχετε συνδεθεί για να δημιουργήσετε και να προγραμματίσετε προσαρμοσμένες αναφορές.',
@@ -1923,6 +2025,7 @@ $translations = array(
'PDFReports_ReportIncludeNWebsites' => 'Η αναφορά θα περιλαμβάνει βασικές μετρήσεις για όλες τις ιστοσελίδες που έχουν τουλάχιστον μια επισκεψη (από τις συνολικά %s διαθέσιμες ιστοσελίδες).',
'PDFReports_TopLinkTooltip' => 'Δημιουργία Αναφορών Ηλεκτρονικής Αλληλογραφίας για να λάβετε στατιστικά Piwik που θα παραδίδονται στο ηλεκτρονικό σας ταχυδρομείο ή στη διεύθυνση των πελατών σας αυτόματα!',
'ImageGraph_PluginDescription' => 'Δημιουργία όμορφων στατικών εικόνων PNG Διαγραμμάτων για οποιαδήποτε αναφορά του Piwik.',
+ 'ImageGraph_ColumnOrdinateMissing' => 'Η στήλη \'%s\' δε βρέθηκε σε αυτή την αναφορά. Δοκιμάστε ένα από τα %s',
'RowEvolution_MetricsFor' => 'Μετρήσεις για %s',
'RowEvolution_AvailableMetrics' => 'Διαθέσιμες μετρήσεις',
'RowEvolution_MetricBetweenText' => 'μεταξύ %s και %s',
@@ -2184,6 +2287,28 @@ $translations = array(
'UserLanguage_Language_za' => 'Ζουάνγκ',
'UserLanguage_Language_zh' => 'Κινεζικά',
'UserLanguage_Language_zu' => 'Ζουλού',
+ 'UserSettings_BrowserLanguage' => 'Γλώσσα φυλλομετρητή',
+ 'SegmentEditor_AddNewSegment' => 'Προσθήκη νέου τμήματος',
+ 'SegmentEditor_NewSegment' => 'Νέο τμήμα',
+ 'SegmentEditor_SelectSegmentOfVisitors' => 'Επιλέξτε ένα τμήμα επισκεπτών:',
+ 'SegmentEditor_YouMustBeLoggedInToCreateSegments' => 'Θα πρέπει να έχετε κάνει είσοδο για να δημιουργήσετε και να επεξεργαστείτε προσαρμοσμένα τμήματα επισκεπτών.',
+ 'SegmentEditor_DragDropCondition' => 'Συνθήκη με Σύρε & Άσε',
+ 'SegmentEditor_OperatorAND' => 'ΚΑΙ',
+ 'SegmentEditor_OperatorOR' => 'Ή',
+ 'SegmentEditor_DefaultAllVisits' => 'Όλες οι επισκέψεις',
+ 'SegmentEditor_AddANDorORCondition' => 'Προσθήκη της %s συνθήκης',
+ 'SegmentEditor_ThisSegmentIsVisibleTo' => 'Το τμήμα αυτό είναι ορατό σε:',
+ 'SegmentEditor_VisibleToMe' => 'εμένα',
+ 'SegmentEditor_VisibleToAllUsers' => 'όλους τους χρήστες',
+ 'SegmentEditor_SegmentIsDisplayedForWebsite' => 'και εμφανίζεται για',
+ 'SegmentEditor_SegmentDisplayedThisWebsiteOnly' => 'μόνο αυτόν τον ιστοτόπο',
+ 'SegmentEditor_SegmentDisplayedAllWebsites' => 'όλους τους ιστοτόπους',
+ 'SegmentEditor_SaveAndApply' => 'Αποθήκευση και εφαρμογή',
+ 'SegmentEditor_AreYouSureDeleteSegment' => 'Είστε σίγουροι για τη διαγραφή του τμήματος;',
+ 'SegmentEditor_ChooseASegment' => 'Επιλέξτε ένα τμήμα',
+ 'SegmentEditor_LoadingSegmentedDataMayTakeSomeTime' => 'Η επεξεργασία των δεδομένων των τμημάτων επισκεπτών μπορεί να διαρκέσει κάποια λεπτά...',
+ 'SegmentEditor_AutoArchiveRealTime' => 'οι αναφορές τμημάτων επεξεργάζονται σε πραγματικό χρόνο',
+ 'SegmentEditor_AutoArchivePreProcessed' => 'οι αναφορές τμημάτων προεπεξεργάζονται (γρηγορότερα, απαιτείται το archive.php με cron)',
// FOR REVIEW
'EntryPage_Bounces' => 'Αναπηδήσεις',
@@ -2195,4 +2320,6 @@ $translations = array(
'Forecast_Visitors' => 'Επισκέπτες',
'Forecast_Widget' => 'Πρόγνωση για σήμερα',
'UserLanguage_Language' => 'Γλώσσες',
+ 'UserLanguage_SubmenuLanguage' => 'Γλώσσες',
+ 'UserLanguage_WidgetLanguage' => 'Γλώσσες επισκεπτών',
);
diff --git a/lang/es.php b/lang/es.php
index df950f5740..ef086b3e71 100644
--- a/lang/es.php
+++ b/lang/es.php
@@ -1013,14 +1013,14 @@ $translations = array(
'Login_InvalidNonceOrHeadersOrReferer' => 'La seguridad del formulario ha fallado. Por favor actualice el formulario y compruebe que sus cookies están habilitadas. Si usa un proxy, debe %s configurar Piwik para aceptar la cabecera proxy%s que precede la cabecera Host. Compruebe también que su cabecera Referer se envía correctamente.',
'Login_InvalidOrExpiredToken' => 'El indicio no es válido o ha caducado',
'Login_MailTopicPasswordChange' => 'Confirma el Cambio de Contraseña',
- 'Login_MailPasswordChangeBody' => 'Estimado %1$s:
-
-Se ha recibido una solicitud de modificación de contraseña desde %2$s. Para confirmar el cambio y de esta manera permitir tu inicio de sesión con nuevas credenciales, visita esta enlace:
-
-%3$s
-
-Nota: Este código vencerá en 24 hora.
-
+ 'Login_MailPasswordChangeBody' => 'Estimado %1$s:
+
+Se ha recibido una solicitud de modificación de contraseña desde %2$s. Para confirmar el cambio y de esta manera permitir tu inicio de sesión con nuevas credenciales, visita esta enlace:
+
+%3$s
+
+Nota: Este código vencerá en 24 hora.
+
¡Y gracias por usar Piwik!',
'Login_ConfirmationLinkSent' => 'Un enlace de confirmación ha sido enviado a tu casilla de correo. Chequea tu e-mail y visita ese enlace para autorizar tu solicitud de cambios de contraseña.',
'Login_PasswordChanged' => 'Tu contraseña ha sido modificada.',
diff --git a/lang/fr.php b/lang/fr.php
index 5a51a23277..5dbc60f48a 100644
--- a/lang/fr.php
+++ b/lang/fr.php
@@ -506,6 +506,7 @@ $translations = array(
'CoreAdminHome_JSTracking_MergeSubdomains' => 'Suivre les visiteurs sur tous les sous-domaines de',
'CoreAdminHome_JSTracking_MergeSubdomainsDesc' => 'Ainsi si un visiteur visite %1$s et %2$s, cela sera comptabilisé comme une visite unique.',
'CoreAdminHome_JSTracking_MergeAliases' => 'Dans le rapport des liens sortants, cacher les clicks vers des alias d\'adresses connues telles que',
+ 'CoreAdminHome_JSTracking_MergeAliasesDesc' => 'Ainsi un click sur les adresses d\'alias (ex %s) ne sera pas compté comme un lien sortant.',
'CoreAdminHome_JSTracking_GroupPageTitlesByDomain' => 'Préfixer le domaine du site au titre de la page lors du suivit',
'CoreAdminHome_JSTracking_GroupPageTitlesByDomainDesc1' => 'Donc si quelqu\'un visite la page "à propos de" sur le site "blog". %1$s ce sera enregistré en tant que "blog / à propos de". C\'est la manière la plus facile d\'avoir un aperçu de votre trafic par sous-domaine.',
'CoreAdminHome_JSTracking_VisitorCustomVars' => 'Effectuer le suivit des variables personnalisées pour ce visiteur',
@@ -1097,7 +1098,7 @@ $translations = array(
'Live_LastHours' => 'Dernières %s heures',
'Live_MorePagesNotDisplayed' => 'plus de pages de ce visiteur ne sont pas affichées',
'Live_GoalType' => 'Type',
- 'Live_PageRefreshed' => 'Nombre de fois où cette page a été vue / rafraîchi dans une rangée.',
+ 'Live_PageRefreshed' => 'Nombre de fois où cette page a été vue / rafraîchie d\'affilée.',
'Live_GoalTime' => 'Temps de première conversion',
'Live_KeywordRankedOnSearchResultForThisVisitor' => 'Le mot clef %1$s a été a été noté %2$s dans la page de résultats de recherche %3$s pour ce visiteur',
'Live_GoalRevenue' => 'Revenu',
@@ -1122,14 +1123,14 @@ $translations = array(
'Login_InvalidNonceOrHeadersOrReferer' => 'La sécurité du formulaire a échoué. Veuillez recharger le formulaire et vérifier que vos cookies sont activés. Si vous utilisez un serveur proxy, vous devez %s configurer Piwik pour accepter les en-têtes du proxy %s qui relaient les en-têtes de l\'hôte. Vérifiez aussi que l\'en-tête de votre référant est correctement transmis.',
'Login_InvalidOrExpiredToken' => 'La clef est invalide ou a expiré',
'Login_MailTopicPasswordChange' => 'Confirmer le changement de mot de passe',
- 'Login_MailPasswordChangeBody' => 'Bonjour %s,
-
-Une demande de réinitialisation de mot de passe a été reçue depuis %2$s. Pour confirmer le changement de mot de passe afin de pouvoir vous authentifier avec vos nouveaux identifiants, cliquez sur le lien suivant :
-
-%3$s
-
-Note : ce jeton expirera dans 24 heures.
-
+ 'Login_MailPasswordChangeBody' => 'Bonjour %s,
+
+Une demande de réinitialisation de mot de passe a été reçue depuis %2$s. Pour confirmer le changement de mot de passe afin de pouvoir vous authentifier avec vos nouveaux identifiants, cliquez sur le lien suivant :
+
+%3$s
+
+Note : ce jeton expirera dans 24 heures.
+
Merci d\'utiliser Piwik!',
'Login_ConfirmationLinkSent' => 'Un lien de confirmation a été envoyé à votre courriel. Vérifiez votre courriel et cliquez sur le lien pour autoriser votre demande de changement de mot de passe.',
'Login_PasswordChanged' => 'Votre mot de passe a été modifié',
@@ -1314,7 +1315,7 @@ Merci d\'utiliser Piwik!',
'SitesManager_MainDescription' => 'Piwik a besoin de sites pour générer des rapports ! Ajoutez, éditez et supprimez des sites, et voyez le code JavaScript à inclure dans vos pages.',
'SitesManager_YouCurrentlyHaveAccessToNWebsites' => 'Vous avez actuellement accès à %s sites web.',
'SitesManager_OnlyOneSiteAtTime_js' => 'Vous pouvez éditer un site web à la fois. Veuillez Enregistrer ou Annuler vos modifications courantes sur le site web %s.',
- 'SitesManager_JsTrackingTag' => 'Code JavaScript de suivit',
+ 'SitesManager_JsTrackingTag' => 'Code JavaScript de suivi',
'SitesManager_JsTrackingTagHelp' => 'Ci-dessous le code JavaScript à inclure dans toutes vos pages',
'SitesManager_ShowTrackingTag' => 'Afficher le code',
'SitesManager_NoWebsites' => 'Vous n\'avez aucun site Internet à administrer.',
diff --git a/lang/hi.php b/lang/hi.php
index c8958b7c5a..3579a58303 100644
--- a/lang/hi.php
+++ b/lang/hi.php
@@ -465,10 +465,15 @@ $translations = array(
'CoreHome_ViewAllPiwikVideoTutorials' => 'सभी Piwik वीडियो ट्यूटोरियल देखें',
'CoreHome_SharePiwikShort' => 'Piwik! मुफ्त और ओपन सोर्स वेब विश्लेषण. आपके डेटा के मालिक हैं.',
'CoreHome_SharePiwikLong' => 'Piwik आपको मुफ्त अपनी वेबसाइट के आगंतुकों पर नज़र रखने देगा. आपको निश्चित रूप से बाहर की जाँच करनी चाहिए!',
+ 'PrivacyManager_TeaserHeadline' => 'गोपनीयता की सेटिंग्स',
+ 'PrivacyManager_MenuPrivacySettings' => 'गोपनीयता',
+ 'PrivacyManager_PluginDescription' => 'विद्यमान विधान के साथ इसे गोपनीयता के अनुरूप बनाने के लिए Piwik अनुकूलित करें.',
+ 'PrivacyManager_UseAnonymizeIp' => 'आगंतुक आईपी पते को गुमनाम करे',
'PrivacyManager_AnonymizeIpDescription' => 'यदि आप पूरी तरह से योग्य आईपी पतों को Piwik से ट्रैक नहीं करना चाहते हैं तो "हाँ" का चयन करें.',
'PrivacyManager_AnonymizeIpMaskLengtDescription' => 'आवृत किया जाना चाहिए कि कितने बाइट्स \'दर्शकों के आईपी का चयन करें.',
'PrivacyManager_AnonymizeIpMaskLength' => '%s बाइट - e.g. %s',
'PrivacyManager_DeleteDataSettings' => 'पुराने आगंतुक लॉग और रिपोर्ट हटाएं',
+ 'PrivacyManager_UseDeleteLog' => 'नियमित रूप से डेटाबेस से पुराने आगंतुक लॉग को हटाना',
'PrivacyManager_DeleteDataDescription' => 'आप नियमित रूप से अपने डेटाबेस का आकार छोटा रखने के लिए पुराने आगंतुक लॉग और / या प्रसंस्कृत रिपोर्टों को नष्ट करने के लिए Piwik विन्यस्त कर सकते हैं.',
'PrivacyManager_DeleteDataDescription2' => 'वांछित, पूर्व संसाधित रिपोर्टों को नष्ट नहीं किया जाएगा, केवल, यात्रा पृष्ठदृश्य और रूपांतरण लॉग डेटा को हटा दिया जाएगा. या, पूर्व संसाधित रिपोर्टों को नष्ट कर दिया जा सकता है और लॉग डेटा रखा जा सकता है.',
'PrivacyManager_DeleteLogDescription2' => 'जब आप स्वत: लॉग हटाना सक्षम करते हैं, जिससे कि कोई डेटा खो जाती है आप सभी पिछले दैनिक रिपोर्ट संसाधित किया गया है कि यह सुनिश्चित करना होगा.',
@@ -476,19 +481,38 @@ $translations = array(
'PrivacyManager_DeleteDataInterval' => 'हर पुराने डेटा हटाएं',
'PrivacyManager_DeleteMaxRows' => 'एक समय में नष्ट करने के लिए पंक्तियों की अधिकतम संख्या:',
'PrivacyManager_DeleteMaxRowsNoLimit' => 'कोई सीमा नहीं',
+ 'PrivacyManager_LastDelete' => 'अंतिम हटाए जाने पर था',
+ 'PrivacyManager_NextDelete' => 'में अगले अनुसूचित को हटाएँ',
'PrivacyManager_ClickHereSettings' => '%s की सेटिंग्स का उपयोग करने के लिए यहां क्लिक करें.',
+ 'PrivacyManager_LeastDaysInput' => '%s की तुलना में अधिक से अधिक दिनों की संख्या का उल्लेख करें.',
+ 'PrivacyManager_UseDeleteReports' => 'नियमित रूप से डेटाबेस से पुरानी रिपोर्टें हटाना',
'PrivacyManager_DeleteReportsOlderThan' => 'की तुलना में पुराने रिपोर्टों को हटाएँ',
'PrivacyManager_DeleteSchedulingSettings' => 'निर्धारण सेटिंग्स',
+ 'PrivacyManager_ReportsDataSavedEstimate' => 'डेटाबेस विस्तार',
+ 'PrivacyManager_KeepBasicMetrics' => 'बुनियादी मैट्रिक्स (दौरा, पृष्ठ विचारों, उछाल दर, लक्ष्य रूपांतरण, ईकॉमर्स रूपांतरण, आदि) रखें',
+ 'PrivacyManager_KeepDataFor' => 'के लिए सभी डेटा रखें:',
'PrivacyManager_DeleteLogsConfirm' => 'आप लॉग डेटा मिटाना सक्षम करने के बारे में हैं. पुरानी लॉग डेटा निकाल दिया जाता है, और रिपोर्ट पहले से ही नहीं बनाया गया है, तो आप ऐतिहासिक अतीत विश्लेषिकी डाटा को देखने के लिए सक्षम नहीं होगा. आप सुनिश्चित करें कि आप यह करना चाहते हैं?',
'PrivacyManager_DeleteReportsConfirm' => 'आप रिपोर्ट डेटा मिटाना सक्षम करने के बारे में हैं. पुराने रिपोर्टों को हटा रहे हैं, तो आप उन्हें देखने के क्रम में फिर से प्रक्रिया उनमें करनी होगी. आप सुनिश्चित करें कि आप यह करना चाहते हैं?',
'PrivacyManager_DeleteBothConfirm' => 'आप लॉग डेटा विलोपन और रिपोर्ट डेटा विलोपन दोनों को सक्षम करने के बारे में हैं. यह स्थायी रूप से पुराने विश्लेषण डेटा देखने के लिए अपनी क्षमता को हटा देगा. आप सुनिश्चित करें कि आप यह करना चाहते हैं?',
+ 'PrivacyManager_PurgeNow' => 'शुद्ध DB अब है',
+ 'PrivacyManager_PurgingData' => 'डेटा शुद्धीकरण ...',
+ 'PrivacyManager_SaveSettingsBeforePurge' => 'अपने डेटा विलोपन सेटिंग्स को बदल दिया है. शुद्धीकरण शुरू करने से पहले उन्हें बचाइए.',
+ 'PrivacyManager_PurgeNowConfirm' => 'आप स्थायी रूप से अपने डेटाबेस से डेटा को नष्ट करने के बारे में हैं. क्या आप जारी रखना चाहते हैं?',
'PrivacyManager_CurrentDBSize' => 'वर्तमान डेटाबेस का आकार',
+ 'PrivacyManager_EstimatedDBSizeAfterPurge' => 'शुद्ध करने के बाद अनुमानित डेटाबेस का विस्तार',
+ 'PrivacyManager_EstimatedSpaceSaved' => 'अनुमानित स्थान को बचाया',
+ 'PrivacyManager_KeepReportSegments' => 'उपरोक्त डेटा के लिए भी खंडों की रिपोर्ट रखना',
+ 'PrivacyManager_DoNotTrack_SupportDNTPreference' => 'समर्थन प्राथमिकता ट्रैक नहीं',
'PrivacyManager_DoNotTrack_Description' => '\'नहीं ट्रैक करते हैं\' एक प्रौद्योगिकी और नीति प्रस्ताव है जो कि उपयोगकर्ताओं को यात्रा नहीं की सहित विश्लेषिकी सेवाओं, विज्ञापन नेटवर्क, और सामाजिक प्लेटफार्मों वेबसाइटों की ट्रैकिंग से बाहर निकलना करने में सक्षम बनाता है',
+ 'PrivacyManager_DoNotTrack_Enabled' => 'आप वर्तमान में अपने उपयोगकर्ताओं की गोपनीयता का सम्मान कर रहे हैं शाबाश!',
+ 'PrivacyManager_DoNotTrack_EnabledMoreInfo' => 'उपयोगकर्ताओं (DoNotTrack सक्षम है) "मैं ट्रैक नहीं किया जाना चाहता" के लिए अपने वेब ब्राउज़र सेट कर लेते हैं तो Piwik इन यात्राओं को ट्रैक नहीं किया जाएगा.',
'PrivacyManager_DoNotTrack_Disabled' => 'Piwik वर्तमान में सभी आगंतुकों को ट्रैक कर रहा है, वे निर्दिष्ट किया यहां तक जब अपने वेब ब्राउज़र में "मैं ट्रैक नहीं किया जाना चाहता."',
'PrivacyManager_DoNotTrack_DisabledMoreInfo' => 'हम अपने आगंतुकों की गोपनीयता का सम्मान करते हैं और \'DoNotTrack\' समर्थन को सक्रिय करने की सलाह देते हैं.',
'PrivacyManager_DoNotTrack_Enable' => 'सक्षम करें समर्थन \'ट्रैक नहीं\'',
'PrivacyManager_DoNotTrack_Disable' => 'निष्क्रिय करें समर्थन ट्रैक नहीं',
+ 'PrivacyManager_GetPurgeEstimate' => 'शुद्ध अनुमान करें',
'PrivacyManager_DBPurged' => 'डीबी शुद्ध किए गए.',
+ 'PrivacyManager_GeolocationAnonymizeIpNote' => 'नोट: जियोलोकेशन लगभग 1 बाइट अनाम के साथ ही परिणाम होगा. 2 बाइट या अधिक के साथ, जियोलोकेशन गलत हो जाएगा.',
'CoreHome_PluginDescription' => 'वेब विश्लेषिकी रिपोर्टें संरचना.',
'CoreHome_WebAnalyticsReports' => 'वेब विश्लेषिकी रिपोर्टें',
'CoreHome_ThereIsNoDataForThisReport' => 'इस रिपोर्ट के लिए कोई डाटा नहीं है.',
@@ -996,6 +1020,117 @@ $translations = array(
'MultiSites_PluginDescription' => 'एकाधिक साइट कार्यकारी सारांश / आँकड़े प्रदर्शित करता है. वर्तमान में एक कोर Piwik प्लगइन के रूप में रखा.',
'MultiSites_Evolution' => 'विकास',
'MultiSites_TopLinkTooltip' => 'आपकी वेबसाइट सभी के लिए वेब विश्लेषिकी आँकड़ों की तुलना करें.',
+ 'Provider_PluginDescription' => 'आगंतुकों के प्रदाता के रिपोर्ट.',
+ 'Provider_WidgetProviders' => 'प्रदाता',
+ 'Provider_ColumnProvider' => 'प्रदाता',
+ 'Provider_SubmenuLocationsProvider' => 'स्थान और प्रदाता',
+ 'Referers_PluginDescription' => 'खोज इंजन, कीवर्ड, वेबसाइट, अभियान ट्रैकिंग, डायरेक्ट एंट्री: सन्दर्भदाता डेटा की रिपोर्ट.',
+ 'Referers_Referrer' => 'संदर्भ',
+ 'Referers_Referers' => 'सन्दर्भदाता',
+ 'Referers_ReferrersOverview' => 'सन्दर्भदाता अवलोकन',
+ 'Referers_EvolutionDocumentation' => 'इससे आपकी वेबसाइट पर आगंतुकों का नेतृत्व किया जो सन्दर्भदाता का अवलोकन है.',
+ 'Referers_SearchEngines' => 'सर्च इंजन',
+ 'Referers_Keywords' => 'खोजशब्द',
+ 'Referers_DirectEntry' => 'प्रत्यक्ष प्रवेश',
+ 'Referers_Websites' => 'वेबसाइटें',
+ 'Referers_Socials' => 'सामाजिक संजाल',
+ 'Referers_AllReferersReportDocumentation' => 'इस रिपोर्ट में अपनी वेबसाइट खोजने के लिए अपने आगंतुकों द्वारा उपयोग किए गए सभी वेबसाइटों, खोज कीवर्ड और अभियान को सूचीबद्ध, एक एकीकृत रिपोर्ट में आपके सभी सन्दर्भदाता दिखाता है.',
+ 'Referers_SocialsReportDocumentation' => 'यह रिपोर्ट दिखाता है जो सामाजिक नेटवर्क आपकी वेबसाइट पर आगंतुकों का नेतृत्व किया.<br /> तालिका में एक पंक्ति पर क्लिक करते हुए आप देख सकते जिसमें सामाजिक नेटवर्क पृष्ठों से आगंतुकों को अपनी वेबसाइट पर आया था',
+ 'Referers_Campaigns' => 'अभियान',
+ 'Referers_Evolution' => 'अवधि में विकास',
+ 'Referers_Type' => 'संदर्भ प्रकार',
+ 'Referers_TypeReportDocumentation' => 'इस तालिका में संदर्भ प्रकार के वितरण के बारे में जानकारी शामिल हैं.',
+ 'Referers_DirectEntryDocumentation' => 'एक आगंतुक अपने ब्राउज़र में URL दर्ज किया है और आपकी वेबसाइट पर ब्राउज़िंग शुरू कर दी है - उन्होंने सीधे वेबसाइट में प्रवेश किया.',
+ 'Referers_ColumnRefererType' => 'संदर्भ प्रकार',
+ 'Referers_ColumnSearchEngine' => 'सर्च इंजिन',
+ 'Referers_ColumnWebsite' => 'वेबसाइट',
+ 'Referers_ColumnWebsitePage' => 'वेबसाइट के पेज',
+ 'Referers_ColumnSocial' => 'सामाजिक संजाल',
+ 'Referers_ColumnKeyword' => 'खोजशब्द',
+ 'Referers_ColumnCampaign' => 'अभियान',
+ 'Referers_RefererName' => 'संदर्भ का नाम',
+ 'Referers_DetailsByRefererType' => 'संदर्भ प्रकार से विवरण',
+ 'Referers_Distinct' => 'संदर्भ प्रकार से अलग सन्दर्भदाता',
+ 'Referers_DistinctSearchEngines' => 'विशिष्ट सर्च इंजन',
+ 'Referers_DistinctKeywords' => 'विशिष्ट खोजशब्दों',
+ 'Referers_DistinctCampaigns' => 'विशिष्ट अभियानों',
+ 'Referers_DistinctWebsites' => 'विशिष्ट वेबसाइटों',
+ 'Referers_SubmenuOverview' => 'अवलोकन',
+ 'Referers_SubmenuSearchEngines' => 'सर्च इंजन और खोजशब्द',
+ 'Referers_SubmenuWebsites' => 'वेबसाइटों और सामाजिक',
+ 'Referers_SubmenuCampaigns' => 'अभियान',
+ 'Referers_WidgetKeywords' => 'खोजशब्द',
+ 'Referers_WidgetCampaigns' => 'अभियान',
+ 'Referers_WidgetExternalWebsites' => 'संदर्भ वेबसाईटें',
+ 'Referers_WidgetSocials' => 'सामाजिक संजाल की सूची',
+ 'Referers_WidgetSearchEngines' => 'सर्च इंजन',
+ 'Referers_WidgetOverview' => 'अवलोकन',
+ 'Referers_SocialFooterMessage' => 'यह एक बाईं ओर रिपोर्ट है वेबसाइटों का एक सबसेट है. आप सीधे अपने सामाजिक नेटवर्क सन्दर्भदाता तुलना कर सकते हैं ताकि यह अन्य वेबसाइटों फिल्टर करे.',
+ 'Referers_WidgetGetAll' => 'सभी सन्दर्भदाता',
+ 'Referers_ViewReferrersBy' => '%s द्वारा सन्दर्भदाता देखें',
+ 'Referers_ViewAllReferrers' => 'सभी सन्दर्भदाता देखें',
+ 'Referers_WidgetTopKeywordsForPages' => 'पृष्ठ URL के लिए शीर्ष खोजशब्द',
+ 'SecurityInfo_PluginDescription' => 'PHP सुरक्षा कंसोर्टियम से PhpSecInfo के आधार पर, यह प्लगइन आपके PHP वातावरण के बारे में सुरक्षा जानकारी प्रदान करता है और सुधार के लिए सुझाव देता है. यह एक बहुस्तरीय सुरक्षा के दृष्टिकोण का एक उपकरण है. यह सुरक्षित विकास प्रथाओं की जगह और न ही कोड / आवेदन ऑडिट नहीं करता.',
+ 'SecurityInfo_Security' => 'सुरक्षा',
+ 'SecurityInfo_SecurityInformation' => 'PHP सुरक्षा जानकारी',
+ 'SecurityInfo_Test' => 'परीक्षण',
+ 'SecurityInfo_Result' => 'परिणाम',
+ 'SEO_SeoRankings' => 'एसईओ रैंकिंग',
+ 'SEO_AlexaRank' => 'एलेक्सा दरजा',
+ 'SEO_DomainAge' => 'डोमेन आयु',
+ 'SEO_Rank' => 'श्रेणी',
+ 'SEO_Pages' => 'पृष्ठों',
+ 'SEO_Google_IndexedPages' => 'गूगल पृष्ठों से अनुक्रमित',
+ 'SEO_Bing_IndexedPages' => 'बिंग अनुक्रमित पृष्ठों',
+ 'SEO_Dmoz' => 'डीमॉज़ प्रविष्टियां',
+ 'SEO_SEORankingsFor' => '%s के लिए एसईओ रैंकिंग',
+ 'SEO_ExternalBacklinks' => 'बाह्य बैकलिंक (राजसी)',
+ 'SEO_ReferrerDomains' => 'संदर्भ डोमेन (राजसी)',
+ 'SEO_ViewBacklinksOnMajesticSEO' => 'MajesticSEO.com पर बाह्य बैकलिंक रिपोर्ट देखें',
+ 'SitesManager_MainDescription' => 'आपकी वेब Analytics रिपोर्ट में वेबसाइट की जरूरत है! जोड़ें,अद्यतन,वेबसाइटें हटाने, और अपने पृष्ठों में सम्मिलित करने के लिए जावास्क्रिप्ट दिखाए.',
+ 'SitesManager_JsTrackingTag' => 'जावास्क्रिप्ट ट्रैकिंग कोड',
+ 'SitesManager_JsTrackingTagHelp' => 'यहाँ जावास्क्रिप्ट ट्रैकिंग कोड आपके सभी पृष्ठों पर शामिल करने के लिए है',
+ 'SitesManager_NoWebsites' => 'आपके पास प्रबंधन के लिए कोई भी वेबसाइट नहीं है.',
+ 'SitesManager_AddSite' => 'एक नई वेबसाइट जोड़ें',
+ 'SitesManager_NotFound' => 'वेबसाइटों के लिए नहीं मिला',
+ 'SitesManager_MenuSites' => 'वेबसाइटें',
+ 'SitesManager_ExceptionNoUrl' => 'आपको वेबसाइट के लिए कम से कम एक URL निर्दिष्ट करना होगा.',
+ 'SitesManager_ExceptionEmptyName' => 'वेबसाइट का नाम खाली नहीं हो सकता.',
+ 'SitesManager_ExcludedIps' => 'बहिष्कृत IP',
+ 'SitesManager_GlobalListExcludedIps' => 'अपवर्जित आईपी की वैश्विक सूची',
+ 'SitesManager_ExcludedUserAgents' => 'अपवर्जित प्रयोक्ता एजेंटों',
+ 'SitesManager_GlobalListExcludedUserAgents' => 'बाहर करने के उपयोगकर्ता एजेंट की वैश्विक सूची',
+ 'SitesManager_GlobalExcludedUserAgentHelp1' => 'Piwik द्वारा ट्रैक किये जा रहे से बाहर करने के लिए उपयोगकर्ता एजेंटों की सूची दर्ज करें.',
+ 'SitesManager_GlobalExcludedUserAgentHelp2' => 'आप ट्रैक किए जाने से बाहर रहने के लिए कुछ बॉट का उपयोग कर सकते हैं.',
+ 'SitesManager_ListOfIpsToBeExcludedOnAllWebsites' => 'नीचे आईपी सभी वेबसाइटों पर ट्रैक किए जाने से बाहर रखा जाएगा.',
+ 'SitesManager_ExcludedParameters' => 'अपवर्जित पैरामीटर्स',
+ 'SitesManager_GlobalListExcludedQueryParameters' => 'बाहर करने के प्रश्न यूआरएल मापदंडों की वैश्विक सूची',
+ 'SitesManager_ListOfQueryParametersToBeExcludedOnAllWebsites' => 'नीचे प्रश्न यूआरएल मापदंडों को सभी वेबसाइटों को यूआरएल से बाहर रखा जाएगा.',
+ 'SitesManager_ListOfQueryParametersToExclude' => 'URL प्रश्न पैरामीटर, एक प्रति पंक्ति, पृष्ठ यूआरएल रिपोर्टों से को बाहर करने की सूची दर्ज करें.',
+ 'SitesManager_SelectACity' => 'कोई नगर चुनें',
+ 'SitesManager_ChooseCityInSameTimezoneAsYou' => 'आप के रूप में एक ही समय क्षेत्र में एक शहर चुनें.',
+ 'SitesManager_AdvancedTimezoneSupportNotFound' => 'उन्नत समय क्षेत्र समर्थन (PHP>=5.2 में समर्थन) आपके PHP में नहीं मिला. आप अभी भी एक मैनुअल यूटीसी ऑफसेट चुन सकते हैं.',
+ 'SitesManager_GlobalWebsitesSettings' => 'वैश्विक वेबसाइटों के सेटिंग्स',
+ 'SitesManager_DefaultTimezoneForNewWebsites' => 'नई वेबसाइट के लिए तयशुदा समय क्षेत्र',
+ 'SitesManager_Currency' => 'मुद्रा',
+ 'SitesManager_CurrencySymbolWillBeUsedForGoals' => 'मुद्रा प्रतीक लक्ष्य राजस्व के बगल में प्रदर्शित किया जाएगा.',
+ 'SitesManager_DefaultCurrencyForNewWebsites' => 'नई वेबसाइट के लिए डिफ़ॉल्ट मुद्रा',
+ 'SitesManager_SelectDefaultCurrency' => 'आप नई वेबसाइट को डिफ़ॉल्ट रूप से स्थापित करने के लिए मुद्रा का चयन कर सकते हैं.',
+ 'SitesManager_EnableEcommerce' => 'ईकॉमर्स सक्षम किया',
+ 'SitesManager_NotAnEcommerceSite' => 'एक ईकॉमर्स साइट नहीं',
+ 'SitesManager_EnableSiteSearch' => 'साइट खोज ट्रैकिंग सक्षम',
+ 'SitesManager_DisableSiteSearch' => 'साइट खोज ट्रैक न करें',
+ 'SitesManager_EcommerceHelp' => 'जब सक्रिय किया, "लक्ष्य" रिपोर्ट एक नया "ईकॉमर्स" खंड होगा.',
+ 'SitesManager_SearchKeywordParametersDesc' => 'साइट खोज कीवर्ड वाली सभी प्रश्न को पैरामीटर नाम की एक अल्पविराम से अलग सूची दर्ज करें.',
+ 'SitesManager_SearchCategoryDesc' => 'Piwik भी एक आंतरिक साइट खोज कीवर्ड के लिए खोज श्रेणी ट्रैक कर सकता हैं.',
+ 'SitesManager_SearchCategoryParametersDesc' => 'आप खोज श्रेणी को निर्दिष्ट करने क्वेरी पैरामीटर को एक अल्पविराम से अलग सूची दर्ज कर सकते हैं.',
+ 'SitesManager_SearchParametersNote2' => 'नई वेबसाइटों के लिए साइट खोज को निष्क्रिय करने के लिए, इन दो क्षेत्रों को खाली छोड़ दें.',
+ 'SitesManager_SearchKeywordLabel' => 'प्रश्न पैरामीटर',
+ 'SitesManager_SearchCategoryLabel' => 'श्रेणी पैरामीटर',
+ 'SitesManager_EnableSiteSpecificUserAgentExclude' => 'वेबसाइट विशिष्ट उपयोगकर्ता एजेंट बहिष्कार सक्षम करें.',
+ 'SitesManager_KeepURLFragments' => 'ट्रैकिंग पृष्ठ URL टुकड़े',
+ 'SitesManager_KeepURLFragmentsHelp2' => 'तुम भी ऊपर व्यक्तिगत वेबसाइटों के लिए इस सेटिंग को अध्यारोहित कर सकते हैं.',
+ 'SitesManager_KeepURLFragmentsLong' => 'पृष्ठ यूआरएल ट्रैकिंग जब पृष्ठ URL टुकड़े रखो',
'UserCountry_country_ad' => 'अन्डोरा',
'UserCountry_country_ae' => 'संयुक्त अरब अमीरात',
'UserCountry_country_af' => 'अफ़गानिस्तान',
@@ -1283,6 +1418,16 @@ $translations = array(
'PDFReports_Pagination' => '%s का %s पृष्ठ',
'PDFReports_TopLinkTooltip' => 'Piwik आँकड़े आपके ईमेल या स्वचालित रूप से आपके ग्राहकों के पते पर दिया प्राप्त करने के लिए ईमेल रिपोर्ट बनाएँ!',
'ImageGraph_PluginDescription' => 'किसी भी Piwik रिपोर्ट के लिए सुंदर स्थिर पीएनजी ग्राफ छवियों को उत्पन्न करता है.',
+ 'RowEvolution_MetricsFor' => '%s के लिए मेट्रिक्स',
+ 'RowEvolution_AvailableMetrics' => 'उपलब्ध मीट्रिक',
+ 'RowEvolution_MetricBetweenText' => '%s और %s के बीच',
+ 'RowEvolution_MetricChangeText' => 'अवधि %s से अधिक है',
+ 'RowEvolution_Documentation' => 'विशाल विकास ग्राफ में उन्हें प्रदर्शित करने के लिए मेट्रिक्स क्लिक करें. प्रयोग एक ही बार में एकाधिक मैट्रिक्स प्रदर्शित करने के लिए शिफ्ट क्लिक करें.',
+ 'RowEvolution_CompareRows' => 'रिकॉर्ड की तुलना करें',
+ 'RowEvolution_CompareDocumentation' => 'नीचे दिए गए लिंक पर क्लिक करें और कई रिकॉर्ड की तुलना में एक ही तालिका से दूसरी पंक्ति के लिए इस पॉपअप को खोले .',
+ 'RowEvolution_PickARow' => 'तुलना करने के लिए एक पंक्ति उठाओ',
+ 'RowEvolution_PickAnotherRow' => 'तुलना करने के लिए एक और पंक्ति उठाओ',
+ 'RowEvolution_MultiRowEvolutionTitle' => 'एकाधिक पंक्तियों का विकास',
'Overlay_Overlay' => 'पृष्ठ आवरण',
'Overlay_PluginDescription' => 'आपकी वास्तविक वेबसाइट पर आच्छादन के रूप में एनालिटिक्स डेटा देखें.',
'Overlay_Location' => 'स्थिति',
@@ -1495,6 +1640,26 @@ $translations = array(
'UserLanguage_Language_za' => 'ज़ुआंग',
'UserLanguage_Language_zh' => 'चीनी',
'UserLanguage_Language_zu' => 'ज़ुलू',
+ 'SegmentEditor_AddNewSegment' => 'नया खंड जोड़ें',
+ 'SegmentEditor_NewSegment' => 'नई खंड',
+ 'SegmentEditor_SelectSegmentOfVisitors' => 'दर्शकों के एक वर्ग का चयन करें:',
+ 'SegmentEditor_YouMustBeLoggedInToCreateSegments' => 'आपको कस्टम आगंतुक खंड बनाने और संपादित करने के लिए लॉग इन करना होगा.',
+ 'SegmentEditor_DragDropCondition' => 'खींचें और शर्त बताये',
+ 'SegmentEditor_OperatorAND' => 'और',
+ 'SegmentEditor_OperatorOR' => 'या',
+ 'SegmentEditor_DefaultAllVisits' => 'सभी का दौरा',
+ 'SegmentEditor_ThisSegmentIsVisibleTo' => 'इस खंड के लिए दिख रहा है:',
+ 'SegmentEditor_VisibleToMe' => 'मुझे',
+ 'SegmentEditor_VisibleToAllUsers' => 'सभी उपयोगकर्ताओं',
+ 'SegmentEditor_SegmentIsDisplayedForWebsite' => 'और के लिए प्रदर्शित',
+ 'SegmentEditor_SegmentDisplayedThisWebsiteOnly' => 'यह वेबसाइट केवल',
+ 'SegmentEditor_SegmentDisplayedAllWebsites' => 'सभी वेबसाइटों',
+ 'SegmentEditor_SaveAndApply' => 'सहेजें और लागू करें',
+ 'SegmentEditor_AreYouSureDeleteSegment' => 'क्या आप इस खंड को हटाना चाहते हैं?',
+ 'SegmentEditor_ChooseASegment' => 'एक खंड चुनें',
+ 'SegmentEditor_LoadingSegmentedDataMayTakeSomeTime' => 'खंडों आगंतुक डेटा प्रसंस्करण में कुछ मिनट लग सकते हैं ...',
+ 'SegmentEditor_AutoArchiveRealTime' => 'खंडों की रिपोर्ट के वास्तविक समय में कार्रवाई कर रहे हैं',
+ 'SegmentEditor_AutoArchivePreProcessed' => 'खंडों की रिपोर्ट पूर्व संसाधित कर रहे हैं(तेज, archive.php क्रॉन की आवश्यकता)',
// FOR REVIEW
'EntryPage_Bounces' => 'वापिस आना',
diff --git a/lang/id.php b/lang/id.php
index 5dc8654a5c..47dfff0563 100644
--- a/lang/id.php
+++ b/lang/id.php
@@ -1123,13 +1123,13 @@ $translations = array(
'Login_InvalidNonceOrHeadersOrReferer' => 'Borang keamanan gagal. Silkan muat ulang borang dan periksa apakah kuki Anda telah aktif. Bila Anda menggunakan peladen wali, Anda harus %s mengkonfigurasi Piwik untuk menerima `header` wali%s yang meneruskan `header` Inang. Serta, periksa apakah `header` Pengarah telah terkirim dengan benar.',
'Login_InvalidOrExpiredToken' => 'Kepingan tak sahih atau telah kedaluwarsa.',
'Login_MailTopicPasswordChange' => 'Konfirmasi Pengubahan Sandi',
- 'Login_MailPasswordChangeBody' => 'Hai %1$s,
-
-Sebuah permintaan atur ulang sandi telah diterima dari %2$s. Untuk mengkonfirmasi pengubahan sandi, Anda dapat masuk-log dengan mandat baru Anda, kunjungi tautan berikut:
-
-%3$s
-
-Catatan: kepingan ini akan kedaluwarsa dalam 24 jam.
+ 'Login_MailPasswordChangeBody' => 'Hai %1$s,
+
+Sebuah permintaan atur ulang sandi telah diterima dari %2$s. Untuk mengkonfirmasi pengubahan sandi, Anda dapat masuk-log dengan mandat baru Anda, kunjungi tautan berikut:
+
+%3$s
+
+Catatan: kepingan ini akan kedaluwarsa dalam 24 jam.
Dan terima kasih menggunakan Piwik!',
'Login_ConfirmationLinkSent' => 'Tautan konfirmasi telah dikirim ke kotak masuk Anda. Periksa surel Anda dan kunjungi tautan ini untuk memberi izin permintaan perubahan sandi Anda.',
'Login_PasswordChanged' => 'Sandi Anda telah berubah.',
diff --git a/lang/ja.php b/lang/ja.php
index fd2a947707..08e1ba76eb 100644
--- a/lang/ja.php
+++ b/lang/ja.php
@@ -325,13 +325,24 @@ $translations = array(
'Actions_Actions' => 'アクション',
'Actions_SubmenuPages' => 'ページ',
'Actions_SubmenuPagesEntry' => '入口ページ',
+ 'Actions_WidgetPagesEntry' => '入口ページ',
'Actions_SubmenuPagesExit' => '出口ページ',
+ 'Actions_WidgetPagesExit' => '出口ページ',
'Actions_EntryPageTitles' => '入口ページタイトル',
+ 'Actions_WidgetEntryPageTitles' => '入口ページタイトル',
'Actions_ExitPageTitles' => '出口ページタイトル',
+ 'Actions_WidgetExitPageTitles' => '出口ページタイトル',
'Actions_SubmenuPageTitles' => 'ページタイトル',
+ 'Actions_WidgetPageTitles' => 'ページタイトル',
+ 'Actions_WidgetSearchKeywords' => 'サイト検索キーワード',
+ 'Actions_WidgetSearchCategories' => '検索カテゴリー',
+ 'Actions_WidgetSearchNoResultKeywords' => '検索結果無しの検索キーワード',
+ 'Actions_WidgetPageUrlsFollowingSearch' => 'サイト検索後に見られたページ',
+ 'Actions_WidgetPageTitlesFollowingSearch' => 'サイト検索後に見られたページタイトル',
'Actions_PageUrls' => 'ページURL',
'Actions_SubmenuOutlinks' => '外部リンク',
'Actions_SubmenuDownloads' => 'ダウンロード',
+ 'Actions_SubmenuSitesearch' => 'サイト検索',
'Actions_PagesReportDocumentation' => 'これは訪問されたページURLについてのリポートです。%s 表は階層構造になっており、URLはフォルダーの階層で表示されています。',
'Actions_PageTitlesReportDocumentation' => 'これは訪問されたページタイトルについてのリポートです。%s ページタイトルは多くのブラウザでウインドウのタイトルに表示されるHTMLの %s タグです。',
'Actions_OutlinksReportDocumentation' => '訪問者がクリックした外部リンクのURLを階層構造のリストで表示したリポートです。',
@@ -347,6 +358,10 @@ $translations = array(
'Actions_ColumnUniqueOutlinks' => 'ユニーク外部リンク数',
'Actions_ColumnPageName' => 'ページ名',
'Actions_ColumnPageURL' => 'ページ URL',
+ 'Actions_ColumnSearchCategory' => '検索カテゴリー',
+ 'Actions_ColumnSearchResultsCount' => '検索結果数',
+ 'Actions_ColumnSearchKeyword' => 'キーワード',
+ 'Actions_SiteSearchKeyword' => 'キーワード(サイト検索)',
'Actions_ColumnClickedURL' => 'クリックされた URL',
'Actions_ColumnDownloadURL' => 'ダウンロード URL',
'Actions_ColumnEntryPageURL' => '入口ページURL',
@@ -354,10 +369,24 @@ $translations = array(
'Actions_ColumnExitPageURL' => '出口ページURL',
'Actions_ColumnExitPageTitle' => '出口ページタイトル',
'Actions_ColumnNoResultKeyword' => '検索結果がみつかりませんでした',
+ 'Actions_ColumnSearches' => '検索',
+ 'Actions_ColumnSiteSearchKeywords' => '単一のキーワード',
+ 'Actions_ColumnSearchesDocumentation' => 'ウェブサイトの検索機能を使って、このキーワードを検索した訪問者の数。',
+ 'Actions_ColumnSearchExits' => '% 検索から離脱',
+ 'Actions_ColumnSearchExitsDocumentation' => 'サイトの検索機能を使って、このキーワードを検索した後、ウェブサイトを離れた訪問者の割合。',
+ 'Actions_ColumnPagesPerSearch' => '検索結果ページ',
+ 'Actions_ColumnPagesPerSearchDocumentation' => '訪問者はウェブサイト上で検索し、時にはより多くの検索結果を表示するために"次へ"をクリックします。これは、その検索語で見られた結果ページ数の平均値です。',
'Actions_EntryPagesReportDocumentation' => 'これは期間中の入口ページタイトルについてのリポートです。入口ページとは訪問者が最初に見たページです。%s 入口ページのURLはフォルダーの階層で表示されています。',
'Actions_EntryPageTitlesReportDocumentation' => 'これは期間中の入口ページタイトルについてのリポートです。',
'Actions_ExitPagesReportDocumentation' => 'これは期間中の出口ページタイトルについてのリポートです。出口ページとは訪問者が最後に見たページです。 %s 出口ページのURLはフォルダーの階層で表示されています。',
'Actions_ExitPageTitlesReportDocumentation' => 'これは期間中の出口ページタイトルについてのリポートです。',
+ 'Actions_SiteSearchKeywordsDocumentation' => 'このレポートは、訪問者がサイト内検索機能で検索したキーワードの一覧を表示します。',
+ 'Actions_LearnMoreAboutSiteSearchLink' => '訪問者がサイト内検索機能をどう使っているか解析する方法について詳しくは、こちらをご覧ください。',
+ 'Actions_SiteSearchIntro' => '訪問者の検索を追跡することは、あなたのウェブサイトを改善するのにとても効果的です。顧客が探しているものについての詳細を知ることができ、新しいコンテンツのアイデアを見つけるのに役立ち、潜在的な顧客が求める新たなeコマースの製品を提供することができるようになります。そして、訪問者のWeb体験を大幅に向上させます。',
+ 'Actions_SiteSearchCategories1' => 'このレポートは、訪問者がサイトで検索した時に選択したカテゴリの一覧です。',
+ 'Actions_SiteSearchCategories2' => '例えば、eコマースサイトは一般的に"カテゴリー"のセレクトを持っていて、訪問者は製品の検索結果を特定のカテゴリーに絞り込みできます。',
+ 'Actions_SiteSearchKeywordsNoResultDocumentation' => 'このレポートは、検索結果が0件であったキーワードの一覧を表示します。恐らく検索機能のアルゴリズムの改善が必要か、もしくは訪問者はあなたのウェブサイトに(まだ)ないコンテンツを探しているのでしょう。',
+ 'Actions_SiteSearchFollowingPagesDoc' => '訪問者は、特定のページ、コンテンツ、製品、またはサービスを見つけようとして、サイト内で検索を行います。このレポートは、サイト内で検索してから最も多くクリックされたページの一覧です。言い換えれば、サイト内で訪問者が最も検索したページの一覧ということです。',
'AnonymizeIP_PluginDescription' => 'ローカルプライバシー規則やガイドラインに応じて、ビジターの IP アドレスの最終バイトを匿名化します。',
'API_PluginDescription' => 'Piwik のすべてのデータはシンプルな API 経由で利用可能です。 このプラグインは、xml、json、php、csv 等にウェブ解析データを得るためにコールすることができる、ウェブサービスのエントリーポイントです。',
'API_QuickDocumentationTitle' => 'API クイックドキュメント',
@@ -1537,6 +1566,18 @@ $translations = array(
'PDFReports_TopOfReport' => 'トップへ戻る',
'PDFReports_Pagination' => 'Page %s of %s',
'ImageGraph_PluginDescription' => 'Piwikリポートの美しい静的PNGグラフ画像を生成します。',
+ 'Annotations_Annotations' => '注釈',
+ 'Annotations_EnterAnnotationText' => 'メモを入力して下さい',
+ 'Annotations_IconDesc_js' => 'この期間内のメモを参照する',
+ 'Annotations_IconDescHideNotes_js' => 'この期間内のメモを隠す',
+ 'Annotations_HideAnnotationsFor_js' => '%sの注釈を隠す…',
+ 'Annotations_AddAnnotationsFor_js' => '%sの注釈を追加…',
+ 'Annotations_ClickToEdit' => 'クリックしてこの注釈を編集',
+ 'Annotations_ClickToDelete' => 'クリックしてこの注釈を削除',
+ 'Annotations_ClickToStarOrUnstar' => 'クリックして注釈に星印を付ける、または外す',
+ 'Annotations_CreateNewAnnotation' => '新しい注釈を作成する',
+ 'Annotations_AnnotationOnDate' => '%1$sの注釈: %2$s',
+ 'Annotations_ClickToEditOrAdd' => 'クリックして新しい注釈を編集または作成',
'UserLanguage_Language_aa' => 'アファル語',
'UserLanguage_Language_ab' => 'アブハズ語',
'UserLanguage_Language_ae' => 'アヴェスタ語',
diff --git a/lang/ko.php b/lang/ko.php
index 9c1aaa19b0..cf907a16f6 100644
--- a/lang/ko.php
+++ b/lang/ko.php
@@ -1041,14 +1041,14 @@ $translations = array(
'Login_InvalidNonceOrHeadersOrReferer' => '양식 보안 실패, 양식을 새로고침하여 쿠키가 활성화되어 있는지 확인하세요. 프록시 서버를 사용하는 경우라면, 호스트 헤더에 %sPiwik configure에서 프록시 헤더를 수락%s하고 전달해야합니다. 또한 리퍼러 헤더가 올바르게 전송되는지 확인합니다.',
'Login_InvalidOrExpiredToken' => '토큰이 잘못되었거나 만료되었습니다.',
'Login_MailTopicPasswordChange' => '비밀번호 변경 확인',
- 'Login_MailPasswordChangeBody' => '안녕하세요, %1$s 님,
-
-%2$s님으로부터 비밀번호 재설정 요청을 받았습니다. 새로운 자격 증명을 이용하여 로그인할 수 있도록 다음 링크를 클릭하고 비밀번호를 변경해주세요:
-
-%3$s
-
-참고: 이 토큰은 24시간 내에 만료됩니다.
-
+ 'Login_MailPasswordChangeBody' => '안녕하세요, %1$s 님,
+
+%2$s님으로부터 비밀번호 재설정 요청을 받았습니다. 새로운 자격 증명을 이용하여 로그인할 수 있도록 다음 링크를 클릭하고 비밀번호를 변경해주세요:
+
+%3$s
+
+참고: 이 토큰은 24시간 내에 만료됩니다.
+
그리고 Piwik을 사용하여 주셔서 감사합니다!',
'Login_ConfirmationLinkSent' => '확인 링크가 당신의 받은 편지함으로 전송되었습니다. 이메일을 확인하고 비밀번호 변경요청을 승인하려면 이 링크를 방문하세요.',
'Login_PasswordChanged' => '비밀번호가 변경되었습니다.',
diff --git a/lang/sl.php b/lang/sl.php
index c1bde1f4a7..ed120fc5cc 100644
--- a/lang/sl.php
+++ b/lang/sl.php
@@ -718,7 +718,7 @@ $translations = array(
'Provider_SubmenuLocationsProvider' => 'Lokacije & Ponudnik',
'Referers_SearchEngines' => 'Spletni iskalniki',
'Referers_Keywords' => 'Ključne Besede',
- 'Referers_DirectEntry' => 'Neposredni obiski',
+ 'Referers_DirectEntry' => 'Neposreden obisk',
'Referers_Websites' => 'Spletne strani',
'Referers_Campaigns' => 'Kampanje',
'Referers_Type' => 'Tip napotitelja',
diff --git a/lang/sr.php b/lang/sr.php
index cbdc1cdb3e..52ec9a7d23 100644
--- a/lang/sr.php
+++ b/lang/sr.php
@@ -41,12 +41,16 @@ $translations = array(
'General_Close' => 'Zatvoriti',
'General_Cancel' => 'Odustajanje',
'General_OrCancel' => 'ili %s prekid %s',
+ 'General_And' => 'i',
'General_Logout' => 'Odjava',
'General_Username' => 'Korisničko ime',
'General_Description' => 'Opis',
'General_Done' => 'Izvršeno',
'General_PoweredBy' => 'Pokreće',
+ 'General_MetricsToPlot_js' => 'Metrike za prikaz',
'General_RowsToDisplay' => 'Prikazati redova',
+ 'General_MetricToPlot_js' => 'Metrike za prikaz',
+ 'General_RecordsToPlot_js' => 'Zapisi za prikaz',
'General_Name' => 'Ime',
'General_Value' => 'Vrednost',
'General_Total' => 'Ukupno',
@@ -81,6 +85,8 @@ $translations = array(
'General_NumberOfVisits' => 'Broj poseta',
'General_VisitConvertedGoal' => 'Broj poseta koje su ostvarile barem jedan cilj',
'General_VisitConvertedGoalId' => 'Broj poseta koje su ostvarile određeni cilj',
+ 'General_EcommerceVisitStatusDesc' => 'Prikaži status elektronske porudžbine na kraju posete',
+ 'General_EcommerceVisitStatusEg' => 'Na primer, ukoliko želite da izaberete sve posete koje su dovele do elektronske porudžbine, API zahtev bi sadržavao %s',
'General_VisitConvertedNGoals' => 'Pogledaj %s konvertovana cilja',
'General_NewVisitor' => 'Novi posetilac',
'General_NewVisits' => 'Nove posete',
@@ -174,6 +180,9 @@ $translations = array(
'General_ColumnAverageTimeOnPage' => 'Prosečno vreme na strani',
'General_TimeOnPage' => 'Vreme na strani',
'General_ColumnAverageTimeOnPageDocumentation' => 'Prosečno vreme koje posetioci provedu na ovoj stranici (samo stranici, ne na celom sajtu)',
+ 'General_ColumnGenerationTime' => 'Vreme generisanja',
+ 'General_ColumnAverageGenerationTime' => 'Prosečno vreme generisanja',
+ 'General_ColumnAverageGenerationTimeDocumentation' => 'Prosečno vreme potrebno za prikaz stranice. Ovaj izveštaj uključuje vreme koje je potrebno serveru da kreira stranicu plus vreme koje je potrebno korisniku da je preuzme. Manja vrednost za \'Prosečno vreme generisanja\' znači brži sajt za vaše posetioce!',
'General_ColumnValuePerVisit' => 'Vrednost po poseti',
'General_ColumnVisitsWithConversions' => 'Posete sa konverzijom',
'General_VisitsWith' => 'Posete sa %s',
@@ -198,6 +207,7 @@ $translations = array(
'General_MediumToHighTrafficItIsRecommendedTo' => 'Za sajtove sa osrednjim ili velikim saobraćajem preporučujemo da današnje izveštaje procerirate na svakih barem pola sata (%s sekundi) ili svaki sat (%s sekundi)',
'General_RequiresFlash' => 'Za prikaz grafikona morate imati instaliran Flash',
'General_GraphHelp' => 'Više informacija o prikazivanju grafikona u Piwik',
+ 'General_NoDataForGraph_js' => 'Nema podataka za ovaj grafikon.',
'General_DataForThisGraphHasBeenPurged' => 'Podaci za ovaj grafikon su više od %s meseci stari te su izbrisani.',
'General_NoDataForTagCloud' => 'Nema podataka',
'General_DataForThisTagCloudHasBeenPurged' => 'Podaci za ovaj oblak tagova su više od %s meseci stari te su izbrisani.',
@@ -258,6 +268,10 @@ $translations = array(
'General_Daily' => 'Dnevno',
'General_Weekly' => 'Nedeljno',
'General_Monthly' => 'Mesečno',
+ 'General_DailyReport' => 'dnevno',
+ 'General_WeeklyReport' => 'nedeljno',
+ 'General_MonthlyReport' => 'mesečno',
+ 'General_YearlyReport' => 'godišnje',
'General_DailyReports' => 'Dnevni izveštaji',
'General_WeeklyReports' => 'Nedeljni izveštaji',
'General_MonthlyReports' => 'Mesečni izveštaji',
@@ -329,9 +343,12 @@ $translations = array(
'General_Metadata' => 'Meta podaci',
'General_OneVisit' => '1 poseta',
'General_NVisits' => '%s poseta',
+ 'General_OneAction' => '1 akcija',
'General_EvolutionSummaryGeneric' => '%1$s u %2$s u odnosu na %3$s u %4$s. Razvoj: %5$s',
'General_OneDay' => '1 dan',
'General_NDays' => '%s dana',
+ 'General_OneMinute' => '1 minut',
+ 'General_NMinutes' => '%s minuta',
'General_MainMetrics' => 'Glavne metrike',
'General_Mobile' => 'Mobilni',
'General_Desktop' => 'Desktop',
@@ -358,6 +375,19 @@ $translations = array(
'General_MoreDetails' => 'Više detalja',
'General_Source' => 'Izvor',
'General_Options' => 'Opcije',
+ 'General_Matches' => 'Pogodaka',
+ 'General_OperationEquals' => 'Jednako',
+ 'General_OperationNotEquals' => 'Različito od',
+ 'General_OperationAtMost' => 'Najviše',
+ 'General_OperationAtLeast' => 'Barem',
+ 'General_OperationLessThan' => 'Manje od',
+ 'General_OperationGreaterThan' => 'Više od',
+ 'General_OperationContains' => 'Sadrži',
+ 'General_OperationDoesNotContain' => 'Ne sadrži',
+ 'General_OperationIs' => 'Je',
+ 'General_OperationIsNot' => 'Nije',
+ 'General_DefaultAppended' => '(podrazumevano)',
+ 'General_SearchNoResults' => 'Nema rezultata',
'General_ReadThisToLearnMore' => '%1$sPročitajte kako biste više saznali.%2$s',
'Actions_PluginDescription' => 'Izveštaji o broju prikaza stranica, izlaznih linkova i preuzimanja. Praćenje izlaznih linkova i preuzimanja je automatsko!',
'Actions_Actions' => 'Akcije',
@@ -399,6 +429,7 @@ $translations = array(
'Actions_ColumnSearchCategory' => 'Kategorija pretrage',
'Actions_ColumnSearchResultsCount' => 'Broj rezultata pretrage',
'Actions_ColumnSearchKeyword' => 'Ključna reč',
+ 'Actions_SiteSearchKeyword' => 'Ključna reč (Pretraživanje)',
'Actions_ColumnClickedURL' => 'Kliknutih linkova',
'Actions_ColumnDownloadURL' => 'Download link',
'Actions_ColumnEntryPageURL' => 'Adresa ulazne strane',
@@ -424,6 +455,7 @@ $translations = array(
'Actions_SiteSearchCategories2' => 'Na primer, sajtovi za elektronsku trgovinu obično nude mogućnost izbora kategorije kako bi posetioci ograničili svoju pretragu na proizvode iz određene kategorije.',
'Actions_SiteSearchKeywordsNoResultDocumentation' => 'Ovaj izveštaj prikazuje ključne reči koje nisu vratile nijedan rezultat pretrage. Možda algoritam pretrage može da se poboljša ili možda posetioci traže sadržaje koji (još uvek) nisu na sajtu?',
'Actions_SiteSearchFollowingPagesDoc' => 'Kada posetioci pretražuju vaš sajt, oni traže određenu stranicu, sadržaj, proizvod ili uslugu. Ovaj izveštaj prikazuje stranice koje su najčešće otvarane nakom završene pretrage. Drugim rečima, ovo je spisak stranica koje se najviše traže na vašem sajtu.',
+ 'Actions_AvgGenerationTimeTooltip' => 'Prosek zasnovan na %s pogodaka %s između %s i %s',
'AnonymizeIP_PluginDescription' => 'Maskiranje poslednjeg bajta IP adresa posetioca kako bi sve bilo u skladu sa vašim lokalnim zakonima i preporukama o zaštiti privatnosti.',
'API_PluginDescription' => 'Svi podaci u Piwik-u su dostupni preko jednostavnog API-ja. Ovaj dodatak je ulazna tačka koju pozivate kako biste dobili podatke u xml, json, php, csv itd.',
'API_QuickDocumentationTitle' => 'API kratka dokumentacija',
@@ -498,6 +530,15 @@ $translations = array(
'CoreAdminHome_ImportingServerLogs' => 'Uvoz serverskih zapisa',
'CoreAdminHome_ImportingServerLogsDesc' => 'Alternativa praćenju posetilaca kroz čitač (bilo pomoću JavaScripta ili slike sa linkom) je konstantan uvoz serverskih logova. Pročitajte više o tome u %1$sAnalizi serverskih logova%2$s.',
'CoreAdminHome_JavaScriptTracking' => 'Praćenje pomoću JavaScript-a',
+ 'CoreAdminHome_LatestStableRelease' => 'Poslednja stabilna verzija',
+ 'CoreAdminHome_LatestBetaRelease' => 'Poslednje beta izdanje',
+ 'CoreAdminHome_ForBetaTestersOnly' => 'Samo za beta testere',
+ 'CoreAdminHome_CheckReleaseGetVersion' => 'Kada kliknem na novu verziju Piwik-a, uvek mi prikaži',
+ 'CoreAdminHome_DevelopmentProcess' => 'Iako se naš %srazvojni proces%s zasniva na preko hiljadu automatskih testova, beta testeri igraju ključnu ulogu u postizanju "Politike bez bagova"',
+ 'CoreAdminHome_StableReleases' => 'Ukoliko Piwik čini kritičan deo vašeg poslovanja, preporučujemo vam da koristite poslednju stabilnu verziju. Ukoliko koristite poslednju beta verziju i nađete bag ili imate predlog, molimo vas %spogledajte ovde%s.',
+ 'CoreAdminHome_YouAreCurrentlyUsingPHP' => 'Trenutno koristite PHP %1$s.',
+ 'CoreAdminHome_OldPHPVersionWarning_Part1' => 'Piwik se brzo razvija i da bismo vam pružili modernu analitičku platformu, uskoro ćemo podići minimalnu neophodnu verziju PHP-a na 5.3. %1$sMolimo vas da kontaktirate administratora vašeg servera ili hosting provajdera kako bi nadogradio PHP na poslednju verziju, po mogućstvu na 5.4.%2$s',
+ 'CoreAdminHome_OldPHPVersionWarning_Part2' => 'Kada nadogradite PHP na 5.3 ili višu verziju, ova poruka će nestati i Piwik server će obrađivati izveštaje znatno brže koristeći manje memorije. %1$sNadogradite PHP i iskoristite Piwik do maksimuma!%2$s',
'CoreHome_InjectedHostWarningIntro' => 'Sada pristupate Piwik-u sa %1$s, ali je Piwik podešen da radi sa ove adrese: %2$s.',
'CoreHome_InjectedHostSuperUserWarning' => 'Piwik možda nije podešen kako treba (na primer, premešten je na novi server ili URL). Možete ili da %1$skliknete ovde i dodate %2$s kao validan naziv hosta (ukoliko mu verijete)%3$s, ili da %4$skliknete ovde i %5$s pristupite bezbedno Piwik-u%6$s.',
'CoreHome_InjectedHostNonSuperUserWarning' => '%1$sKliknite ovde kako biste pristupili Piwik-u bezbedno%2$s i uklonili ovo upozorenje. Takođe možete kontaktirati administratora i obavestiti ga o ovom upozorenju (%3$skliknite ovde kako biste poslali poruku%4$s).',
@@ -866,6 +907,10 @@ $translations = array(
'Goals_ConversionRate' => '%s stepen ispunjenja',
'Goals_NoGoalsNeedAccess' => 'Samo adminitartor i superkorisnik mogu dodavati ciljeve za dati sajt. Molimo vas da zatražite od vašeg Piwik administratora da postavi cilj za vaš sajt. <br>Praćenje ciljeva je odličan način za razumevanje i maksimiziranje učinka vašeg sajta!',
'Goals_AddNewGoal' => 'Dodavanje novog cilja',
+ 'Goals_NewGoalIntro' => 'Praćenje ispunjenja ciljeva je jedan od najefikasnijih načina za merenje i unapređenje vaših poslovnih ciljeva.',
+ 'Goals_NewGoalDescription' => 'Cilj u Piwik-u je vaša strategija, vaš prioritet, i može predstavljati različite stvari: "Preuzeta brošura", "Registracija za listu slanja", "Posećena stranica services.html" itd.',
+ 'Goals_NewWhatDoYouWantUsersToDo' => 'Šta želite da posetioci rade na vašem sajtu?',
+ 'Goals_NewGoalYouWillBeAbleTo' => 'Moći ćete da vidite i analizirate ponašanje svakog cilja i da naučite kako da povećate ispunjenja, stope ispunjenja i zaradu po poseti.',
'Goals_AddNewGoalOrEditExistingGoal' => '%sDodaj novi cilj%s ili %sizmeni%s postojeće',
'Goals_AddGoal_js' => 'Dodaj cilj',
'Goals_UpdateGoal_js' => 'Ažuriraj cilj',
@@ -1058,6 +1103,10 @@ $translations = array(
'Live_GoalRevenue' => 'Zarada',
'Live_GoalDetails' => 'Detalji',
'Live_VisitorsLastVisit' => 'Poslednja poseta je bila pre %s dana.',
+ 'Live_NbVisitors' => '%s posetilaca',
+ 'Live_NbVisitor' => '1 posetilac',
+ 'Live_RealTimeVisitorCount' => 'Brojač posetilaca u realnom vremenu',
+ 'Live_SimpleRealTimeWidget_Message' => '%s i %s u poslednjih %s.',
'Login_PluginDescription' => 'Dodatak za proveru prijavljivanja, čitanje podataka iz datoteke onfig/config.inc.php za superkorisnika i podataka iz baze za ostale korisnike. Može lako biti zamenjen zarad nekih novih mehanizama prijave na sistem (OpenID, htaccess itd.)',
'Login_LoginPasswordNotCorrect' => 'Korisničko ime i lozinka nisu ispravni',
'Login_Password' => 'Lozinka',
@@ -1247,6 +1296,9 @@ $translations = array(
'SEO_Bing_IndexedPages' => 'Stranice koje je indeksirao Bing',
'SEO_Dmoz' => 'DMOZ stavke',
'SEO_SEORankingsFor' => 'SEO rangiranje za %s',
+ 'SEO_ExternalBacklinks' => 'Eksterni povratni linkovi (Majestic)',
+ 'SEO_ReferrerDomains' => 'Domeni sa referencama (Majestic)',
+ 'SEO_ViewBacklinksOnMajesticSEO' => 'Prikaži izveštaj o spoljnim povratnim linkovima sa MajesticSEO.com',
'SitesManager_PluginDescription' => 'Upravljanje sajtovima: dodajte novi sajt, izmenite postojeći, pogledajte JavaScript kod koji treba ubaciti na stranice sajta. Sve akcije su dostupne i preko API-ja.',
'SitesManager_Sites' => 'Sajtovi',
'SitesManager_TrackingTags' => 'Kod za praćenje za %s',
@@ -1708,6 +1760,7 @@ $translations = array(
'UserCountry_FoundApacheModules' => 'Piwik je našao sledeće Apache module',
'UserCountry_GeoIPNoServerVars' => 'Piwik ne može da nađe nijednu GeoIP %s promenljivu',
'UserCountry_IPurchasedGeoIPDBs' => 'Naručio sam %1$sprecizniju bazu od MaxMind-a%2$s i želim da podesim automatska osvežavanja.',
+ 'UserCountry_GeoIPUpdaterInstructions' => 'Upišite linkove za preuzimanje baze podataka. Ukoliko ste baze naručili od %3$sMaxMind%4$s, linkove možete naći %1$sovde%2$s. Kontaktirajte %3$sMaxMind%4$s ukoliko ne možete da im pristupite.',
'UserCountry_GeoIPUpdaterIntro' => 'Piwik trenutno podržava sledeće GeoIP baze',
'UserCountry_LocationDatabase' => 'Baza lokacija',
'UserCountry_LocationDatabaseHint' => 'Baza lokacija je baza zemalja, regija ili gradova.',
@@ -1725,9 +1778,12 @@ $translations = array(
'UserCountry_DownloadNewDatabasesEvery' => 'Ažuriraj bazu svakih',
'UserCountry_GeoLiteCityLink' => 'Ukoliko koristite GeoLite bazu gradova, ovo je link za vas: %1$s%2$s%3$s.',
'UserCountry_UpdaterWasLastRun' => 'Poslednja provera je izvršena %s.',
+ 'UserCountry_UpdaterHasNotBeenRun' => 'Program za nadogradnju nije nikada ranije pokretan.',
'UserSettings_VisitorSettings' => 'Parametri posetilaca',
'UserSettings_BrowserFamilies' => 'Porodica brauzera',
'UserSettings_Browsers' => 'Brauzeri',
+ 'UserSettings_BrowserWithNoPluginsEnabled' => '%1$s sa isključenim dodacima',
+ 'UserSettings_BrowserWithPluginsEnabled' => '%1$s sa uključenim dodacima %2$s',
'UserSettings_Plugins' => 'Dodaci',
'UserSettings_Configurations' => 'Podešavanja',
'UserSettings_WidgetGlobalVisitorsDocumentation' => 'Ovaj izveštaj prikazuje najčešća podešavanja vaših posetilaca. Pod podešavanjem podrazumevamo kombinaciju operativnog sistema, tipa brauzera i ekranske rezolucije.',
@@ -1890,6 +1946,7 @@ $translations = array(
'VisitsSummary_MaxNbActions' => 'Maksimum akcija u jednoj poseti: %s',
'VisitsSummary_NbActionsPerVisit' => 'Akcija po poseti: %s',
'VisitsSummary_NbVisitsBounced' => '%s posetilaca je otišlo posle samo jedne stranice',
+ 'VisitsSummary_AverageGenerationTime' => '%s prosečno vreme generisanja',
'VisitsSummary_GenerateTime' => 'Vreme generisanja izveštaja u sekundama: %s',
'VisitsSummary_GenerateQueries' => 'Izvršeno upita: %s',
'VisitsSummary_WidgetLastVisits' => 'Grafikon najskorijih poseta',
@@ -1933,6 +1990,8 @@ $translations = array(
'PDFReports_CreateAndScheduleReport' => 'Kreiraj i zakaži izveštaj',
'PDFReports_CancelAndReturnToReports' => 'Prekini i %svrati se na spisak izveštaja%s',
'PDFReports_DescriptionOnFirstPage' => 'Opis izveštaja će biti prikazan na prvoj stranici izveštaja.',
+ 'PDFReports_Segment_Help' => 'Možete da izaberete postojeći segment kako biste ga primenili na podatke u ovom elektronskom izveštaju. Segmente možete kreirati i menjati preko konzole %s(kliknite ovde)%s, a zatim kliknite na "%s", pa na "%s".',
+ 'PDFReports_Segment_Deletion_Error' => 'Ovaj segment ne možete da obrišete zato što se koristi za generisanje elektronskih izveštaja %s. Ukoliko želite da obrišete ovaj segment, najpre izmenite izveštaje tako da ga više ne koriste.',
'PDFReports_WeeklyScheduleHelp' => 'Nedeljno zakazivanje: izveštaj će biti poslat svakog ponedeljka.',
'PDFReports_MonthlyScheduleHelp' => 'Mesečno zakazivanje: izveštaj će biti poslat svakog prvog u mesecu.',
'PDFReports_ReportHour' => 'Pošalji izveštaj u',
@@ -1946,6 +2005,8 @@ $translations = array(
'PDFReports_EmailHello' => 'Pozdrav,',
'PDFReports_PleaseFindAttachedFile' => 'u prilogu se nalazi vaš %1$s izveštaj za %2$s.',
'PDFReports_PleaseFindBelow' => 'u nastavku je vaš %1$s izveštaj za %2$s.',
+ 'PDFReports_SegmentAppliedToReports' => 'Segment \'%s\' je primenjen na izveštaje.',
+ 'PDFReports_CustomVisitorSegment' => 'Korisnički definisan segment posetilaca:',
'PDFReports_AreYouSureDeleteReport' => 'Da li ste sigurni da želite da obrišete ovaj izveštaj i njegovu zakazanu dinamiku slanja?',
'PDFReports_ThereIsNoReportToManage' => 'Nema izveštaja za obradu za sajt %s.',
'PDFReports_MustBeLoggedIn' => 'Morate biti prijavljeni na sistem kako biste kreirali i zakazivali izveštaje.',
@@ -2219,6 +2280,27 @@ $translations = array(
'UserLanguage_Language_zh' => 'Kineski',
'UserLanguage_Language_zu' => 'Zulu',
'UserSettings_BrowserLanguage' => 'Jezik brauzera',
+ 'SegmentEditor_AddNewSegment' => 'Dodavanje novog segmenta',
+ 'SegmentEditor_NewSegment' => 'Novi segment',
+ 'SegmentEditor_SelectSegmentOfVisitors' => 'Izaberite segment posetilaca:',
+ 'SegmentEditor_YouMustBeLoggedInToCreateSegments' => 'Morate biti prijavljeni kako biste mogli da kreirate i menjate segmente.',
+ 'SegmentEditor_DragDropCondition' => 'Prevuci i Pusti uslov',
+ 'SegmentEditor_OperatorAND' => 'I',
+ 'SegmentEditor_OperatorOR' => 'ILI',
+ 'SegmentEditor_DefaultAllVisits' => 'Sve posete',
+ 'SegmentEditor_AddANDorORCondition' => 'Dodavanje uslova %s',
+ 'SegmentEditor_ThisSegmentIsVisibleTo' => 'Ovaj segment je vidljiv:',
+ 'SegmentEditor_VisibleToMe' => 'meni',
+ 'SegmentEditor_VisibleToAllUsers' => 'svi korisnici',
+ 'SegmentEditor_SegmentIsDisplayedForWebsite' => 'i prikazan za',
+ 'SegmentEditor_SegmentDisplayedThisWebsiteOnly' => 'samo ovaj sajt',
+ 'SegmentEditor_SegmentDisplayedAllWebsites' => 'svi sajtovi',
+ 'SegmentEditor_SaveAndApply' => 'Sačuvaj i primeni',
+ 'SegmentEditor_AreYouSureDeleteSegment' => 'Da li ste sigurni da želite da obrišete ovaj segment?',
+ 'SegmentEditor_ChooseASegment' => 'Izaberite segment',
+ 'SegmentEditor_LoadingSegmentedDataMayTakeSomeTime' => 'Obrada podataka može potrajati par trenutaka...',
+ 'SegmentEditor_AutoArchiveRealTime' => 'segmentirani izveštaji se obrađuju u realnom vremenu',
+ 'SegmentEditor_AutoArchivePreProcessed' => 'segmentirani izveštaji su unapred pripremljeni (brže, zahteva archive.php cron)',
// FOR REVIEW
'EntryPage_Bounces' => 'Odbijene posete',
diff --git a/lang/sv.php b/lang/sv.php
index ac3007f05a..ad7cb50efe 100644
--- a/lang/sv.php
+++ b/lang/sv.php
@@ -1,7 +1,7 @@
<?php
$translations = array(
'General_Locale' => 'sv_SE.UTF-8',
- 'General_TranslatorName' => '<a href="http://www.lagun.se/">Fredrik Astrom</a>, <a href="http://www.dumsnal.se/">Rabattkoder</a>',
+ 'General_TranslatorName' => '<a href="http://www.lagun.se/">Fredrik Astrom</a>, <a href="http://www.dumsnal.se/">Dumsnål</a>',
'General_TranslatorEmail' => 'fredrik@lagun.se, tony@d0h.us',
'General_EnglishLanguageName' => 'Swedish',
'General_OriginalLanguageName' => 'Svenska',
@@ -42,6 +42,7 @@ $translations = array(
'General_Close' => 'Stäng',
'General_Cancel' => 'Avbryt',
'General_OrCancel' => 'eller %s Avbryt %s',
+ 'General_And' => 'och',
'General_Logout' => 'Logga ut',
'General_Username' => 'Användarnamn',
'General_Description' => 'Beskrivning',
@@ -199,6 +200,7 @@ $translations = array(
'General_MediumToHighTrafficItIsRecommendedTo' => 'För webbplatser med medelhög till hög trafik rekommenderas det att du behandlar rapporterna för idag som mest varje halvtimma (%s sekunder) eller varje timma (%s sekunder).',
'General_RequiresFlash' => 'Visning av grafer i Piwik kräver Flash',
'General_GraphHelp' => 'Mer information för visning av grafer i Piwik.',
+ 'General_NoDataForGraph_js' => 'Inga data för denna graf.',
'General_DataForThisGraphHasBeenPurged' => 'Data för denna graf är mer än %s månader gammal och har rensats bort.',
'General_NoDataForTagCloud' => 'Ingen data för detta taggmoln.',
'General_DataForThisTagCloudHasBeenPurged' => 'Data för detta taggmoln är mer än %s månader och har rensats bort.',
@@ -259,6 +261,10 @@ $translations = array(
'General_Daily' => 'Dagligen',
'General_Weekly' => 'Veckovis',
'General_Monthly' => 'Månadsvis',
+ 'General_DailyReport' => 'dagligen',
+ 'General_WeeklyReport' => 'veckovis',
+ 'General_MonthlyReport' => 'månadsvis',
+ 'General_YearlyReport' => 'årsvis',
'General_DailyReports' => 'Dagliga rapporter',
'General_WeeklyReports' => 'Veckorapporter',
'General_MonthlyReports' => 'Månadsrapporter',
@@ -333,6 +339,7 @@ $translations = array(
'General_OneDay' => '1 dag',
'General_NDays' => '%s dagar',
'General_OneMinute' => '1 minut',
+ 'General_NMinutes' => '%s minuter',
'General_MainMetrics' => 'Huvudvariabler',
'General_Mobile' => 'Mobil',
'General_Desktop' => 'Stationär',
@@ -359,6 +366,19 @@ $translations = array(
'General_MoreDetails' => 'Mer detaljer',
'General_Source' => 'Källa',
'General_Options' => 'Alternativ',
+ 'General_Matches' => 'Matchningar',
+ 'General_OperationEquals' => 'Lika med',
+ 'General_OperationNotEquals' => 'Inte lika med',
+ 'General_OperationAtMost' => 'Som mest',
+ 'General_OperationAtLeast' => 'Åtminstone',
+ 'General_OperationLessThan' => 'Mindre än',
+ 'General_OperationGreaterThan' => 'Större än',
+ 'General_OperationContains' => 'Innehåller',
+ 'General_OperationDoesNotContain' => 'Innehåller inte',
+ 'General_OperationIs' => 'Är',
+ 'General_OperationIsNot' => 'Är inte',
+ 'General_DefaultAppended' => '(standard)',
+ 'General_SearchNoResults' => 'Inget resultat',
'Actions_PluginDescription' => 'Rapporter om sidvisningar, utlänkar och nedladdningar. Spårning av utlänkar och nedladdningar sker automatiskt!',
'Actions_Actions' => 'Händelser',
'Actions_SubmenuPages' => 'Sidor',
@@ -399,6 +419,7 @@ $translations = array(
'Actions_ColumnSearchCategory' => 'Sök kategori',
'Actions_ColumnSearchResultsCount' => 'Antal sökresultat',
'Actions_ColumnSearchKeyword' => 'Sökord',
+ 'Actions_SiteSearchKeyword' => 'Sökord(Webbplatssökning)',
'Actions_ColumnClickedURL' => 'Klickad URL',
'Actions_ColumnDownloadURL' => 'Nedladdningens URL',
'Actions_ColumnEntryPageURL' => 'Målsidans URL',
@@ -464,11 +485,27 @@ $translations = array(
'CoreAdminHome_PiwikIsInstalledAt' => 'Piwik är installerat på',
'CoreAdminHome_ValidPiwikHostname' => 'Giltig Piwik Värdnamn',
'CoreAdminHome_MissingPluginsWarning' => 'Följande plugins laddades inte eftersom dom inte kunde hittas i \'plugins\'-mappen: %1$s. Du kan avaktivera dessa plugins på sidan %2$sHantera plugins%3$s.',
+ 'CoreAdminHome_TrackingCode' => 'Spårningskod',
+ 'CoreAdminHome_JSTracking_MergeSubdomains' => 'Spåra besökare på alla underdomäner av',
+ 'CoreAdminHome_JSTracking_GroupPageTitlesByDomain' => 'Lägg till webbplatsens domän till sidans titel vid spårning',
+ 'CoreAdminHome_JSTracking_VisitorCustomVars' => 'Spåra anpassade variabler för denna besökare',
+ 'CoreAdminHome_JSTracking_PageCustomVars' => 'Spåra en anpassad variabel för varje sidvisning',
+ 'CoreAdminHome_JSTracking_CampaignKwdParam' => 'Framsteg 100%',
+ 'CoreAdminHome_JSTracking_CodeNote' => 'Se till att denna kod finns på varje sida av din hemsida före %1$s taggen.',
'CoreAdminHome_ImageTrackingIntro1' => 'När en besökare har inaktiverat JavaScript, eller när JavaScript inte kan användas, så kan du använda bildspårning för att spåra besökare.',
'CoreAdminHome_ImageTrackingIntro2' => 'Generera länken här nedanför och klistra in HTML-koden på din sida. Om du använder det här som reservför språning med JavaScript, så kan du omringa koden med %1$s-taggar.',
'CoreAdminHome_ImageTrackingIntro3' => 'Titta i %1$sdokumentationen för Spårnings-API%2$s ör att se hela listan med alternativ för bildspårning.',
'CoreAdminHome_ImageTracking' => 'Bildspårning',
+ 'CoreAdminHome_TrackAGoal' => 'Monitorera ett mål',
+ 'CoreAdminHome_ImageTrackingLink' => 'Bildspårningslänk',
+ 'CoreAdminHome_ImportingServerLogs' => 'Importerar Serverloggar',
+ 'CoreAdminHome_ImportingServerLogsDesc' => 'Ett alternativ till att spåra besökare via webbläsaren (antingen via JavaScript eller en bildlänk) är att kontinuerligt importera serverloggar. Läs mer om %1$sServer loggfilanalys%2$s.',
'CoreAdminHome_JavaScriptTracking' => 'Spårning med JavaScript',
+ 'CoreAdminHome_LatestStableRelease' => 'Senaste stabila versionen',
+ 'CoreAdminHome_LatestBetaRelease' => 'Senaste betaversionen',
+ 'CoreAdminHome_ForBetaTestersOnly' => 'Endast för betatestare',
+ 'CoreAdminHome_CheckReleaseGetVersion' => 'Progress 100%',
+ 'CoreAdminHome_YouAreCurrentlyUsingPHP' => 'Du använder för närvarande PHP %1$s.',
'CoreHome_InjectedHostWarningIntro' => 'Du ansluter till Piwik från %1$s, men Piwik har konfigurerats att köras från den här adressen: %2$s.',
'CoreHome_InjectedHostSuperUserWarning' => 'Piwik kan vara felkonfigurerat (t.ex. om Pwiwik nyligen har flyttats till en ny server eller URL). Du kan antigen %1$sklicka här och lägga till %2$s som ett giltigt värdnamn för Piwik (om det är giltigt)%3$s, eller %4$sklicka här för att gå till %5$s och ansluta till Piwik säkert%6$s.',
'CoreHome_InjectedHostNonSuperUserWarning' => '%1$sKlicka här för att öppna en säker anslutning till Piwik%2$s och ta bort varningen. Du kan också kontakta administratören för Piwik angående det här problemet (%3$sklicka här för att skicka e-post%4$s).',
@@ -477,11 +514,17 @@ $translations = array(
'CoreHome_CheckForUpdates' => 'Sök efter uppdateringar',
'CoreHome_YouAreUsingTheLatestVersion_js' => 'Du använder den senaste versionen av Piwik!',
'CoreHome_MakeADifference' => 'Gör skillnad: %1$sDonera nu%2$s för att finansiera Piwik 2.0!',
+ 'CoreHome_DonateCall1' => 'Piwik kommer alltid vara gratis att använda men det innebär inte att det inte kostar något att skapa den.',
+ 'CoreHome_DonateCall2' => 'Piwik behöver ditt fortsatta stöd för att växa och frodas.',
'CoreHome_HowMuchIsPiwikWorth' => 'Hur mycket är Piwik värt för dig?',
'CoreHome_SupportPiwik' => 'Stödj Piwik!',
+ 'CoreHome_OnlyForAdmin' => 'Detta visas endast för dig, administratören.',
'CoreHome_CheckPiwikOut' => 'Kolla in Piwik!',
+ 'CoreHome_CloseWidgetDirections' => 'Du kan stänga widgeten genom att klicka på (X)-ikonen på widgetens topp.',
'CoreHome_ShareThis' => 'Dela det här',
'CoreHome_ViewAllPiwikVideoTutorials' => 'Visa alla videokurser för Piwik',
+ 'CoreHome_SharePiwikShort' => 'Piwik! Gratis och öppen källkods webbanalys. Äg din egen data.',
+ 'CoreHome_SharePiwikLong' => 'Hej! Jag har just hittat ett fantastiskt öppen källkodsprogram: Piwik! Piwik hjälper dig spåra besökarna på din hemsida helt gratis. Du borde definitivt kolla in det!',
'PrivacyManager_TeaserHeadline' => 'Integritetinställningar',
'PrivacyManager_Teaser' => 'På denna sidan kan du anpassa Piwik så att den personliga integriteten uppfyller existerande lagstiftning, genom att: %s anonymisera besökarens IP%s, %s automatiskt ta bort gamla besöksloggar från databasen %s, och %s erbjuda exkludering av spårning för din webbplats%s.',
'PrivacyManager_MenuPrivacySettings' => 'Integritet',
@@ -629,9 +672,12 @@ $translations = array(
'CoreHome_MakeOneTimeDonation' => 'Donera en engångssumma istället.',
'CorePluginsAdmin_PluginDescription' => 'administrationsgränssnitt för plugins.',
'CorePluginsAdmin_Plugins' => 'Plugins',
+ 'CorePluginsAdmin_Themes' => 'Teman',
'CorePluginsAdmin_PluginsManagement' => 'Pluginhantering',
+ 'CorePluginsAdmin_ThemesManagement' => 'Hantera teman',
'CorePluginsAdmin_MainDescription' => 'Plugins breddar och utökar funktionerna i Piwik. När en plugin är installerad kan du aktivera eller inaktivera den här.',
'CorePluginsAdmin_Plugin' => 'Plugin',
+ 'CorePluginsAdmin_Theme' => 'Tema',
'CorePluginsAdmin_Version' => 'Version',
'CorePluginsAdmin_Status' => 'Status',
'CorePluginsAdmin_Action' => 'Handling',
@@ -643,6 +689,7 @@ $translations = array(
'CorePluginsAdmin_Inactive' => 'Inaktiverad',
'CorePluginsAdmin_Deactivate' => 'Inaktivera',
'CorePluginsAdmin_Activate' => 'Aktivera',
+ 'CorePluginsAdmin_MenuPlatform' => 'Plattform',
'CorePluginsAdmin_PluginCannotBeFound' => 'Denna plugin kan inte hittas!',
'CoreUpdater_PluginDescription' => 'Piwik uppdateringsmekanism',
'CoreUpdater_UpdateTitle' => 'Uppdatera',
@@ -783,6 +830,7 @@ $translations = array(
'Feedback_ExceptionBodyLength' => 'Meddelandet måste vara minst %s tecken långt.',
'Feedback_ExceptionNoUrls' => 'Meddelandet får inte innehålla länkar, detta för att undvika spam meddelanden.',
'Feedback_TopLinkTooltip' => 'Tala om för oss vad du tycker, eller fråga efter professionell support.',
+ 'Feedback_WantToThankConsiderDonating' => 'Tycker du att Piwik är fantastiskt och vill tacka oss? Överväg att donera',
'Goals_Goals' => 'Mål',
'Goals_EcommerceAndGoalsMenu' => 'E-handel & Mål',
'Goals_Ecommerce' => 'E-handel',
@@ -827,6 +875,7 @@ $translations = array(
'Goals_ConversionRate' => '%s omvandlingsgrad',
'Goals_NoGoalsNeedAccess' => 'Endast en administratör eller Super Användare kan lägga till Mål för en viss webbplats. Be din Piwik administratör att sätta upp ett mål för din webbplats. <br> spårningsmål är ett bra sätt för att förstå och maximera din webbplats prestanda!',
'Goals_AddNewGoal' => 'Lägg till ett nytt Mål',
+ 'Goals_NewWhatDoYouWantUsersToDo' => 'Vad vill du att dina användare gör på din hemsida?',
'Goals_AddNewGoalOrEditExistingGoal' => '%sLägg till ett nytt Mål%s eller %sRedigera%s befintliga Mål',
'Goals_AddGoal_js' => 'Lägg till Mål',
'Goals_UpdateGoal_js' => 'Uppdatera Mål',
@@ -1035,14 +1084,14 @@ $translations = array(
'Login_InvalidNonceOrHeadersOrReferer' => 'Formulärets säkerhet misslyckades. Vänligen ladda formuläret och kontrollera att cookies är aktiverade. Om du använder en proxyserver måste du %s konfigurera Piwik att acceptera proxy huvuden %s som överför Host-huvuden. Kontrollera också att din Referer header skickas korrekt.',
'Login_InvalidOrExpiredToken' => 'Lösenordsbevis är felaktigt eller har utgått.',
'Login_MailTopicPasswordChange' => 'Bekräfta byte av lösenord',
- 'Login_MailPasswordChangeBody' => 'Hej %1$s,
-
-En begäran om att återställa ditt lösenord togs emot från %2$s. Besök följande länk för att bekräfta lösenordsbytet och göra det möjligt att logga in med dina nya uppgifter:
-
-%3$s
-
-Notera: den här förfrågan kommer att upphöra om 24 timmar.
-
+ 'Login_MailPasswordChangeBody' => 'Hej %1$s,
+
+En begäran om att återställa ditt lösenord togs emot från %2$s. Besök följande länk för att bekräfta lösenordsbytet och göra det möjligt att logga in med dina nya uppgifter:
+
+%3$s
+
+Notera: den här förfrågan kommer att upphöra om 24 timmar.
+
Tack för att du använder Piwik!',
'Login_ConfirmationLinkSent' => 'En länk för bekräftelse har skickats till dig. Kontrollera din e-post och besök länken för att fullfölja begäran att ändra ditt lösenord.',
'Login_PasswordChanged' => 'Ditt lösenord har ändrats.',
@@ -1096,8 +1145,11 @@ Tack för att du använder Piwik!',
'Mobile_UseSearchBarHint' => 'Endast de första %s webbplatserna visas här. Använd sökfältet för att komma åt dina andra webbplatser.',
'Mobile_YouAreOffline' => 'Tyvärr, du är offline just nu',
'MobileMessaging_TopMenu' => 'E-post och SMS-rapporter',
+ 'MobileMessaging_Settings_SuperAdmin' => 'Administratörsinställningar',
'MobileMessaging_Settings_PhoneNumbers' => 'Telefonnummer',
'MobileMessaging_Settings_PhoneNumbers_Add' => 'Lägg till ett nytt telefonnummer',
+ 'MobileMessaging_Settings_PhoneActivated' => 'Telefonnumret är validerat! Du kan nu få SMS med din statistik.',
+ 'MobileMessaging_Settings_InvalidActivationCode' => 'Koden var inte giltig, var god försök igen.',
'MobileMessaging_Settings_CountryCode' => 'Landskod',
'MobileMessaging_Settings_PhoneNumber' => 'Telefonnummer',
'MobileMessaging_Settings_ManagePhoneNumbers' => 'Hantera telefonnummer',
@@ -1105,6 +1157,7 @@ Tack för att du använder Piwik!',
'MobileMessaging_Settings_AddPhoneNumber' => 'Lägg till',
'MobileMessaging_Settings_ValidatePhoneNumber' => 'Bekräfta',
'MobileMessaging_Settings_RemovePhoneNumber' => 'Radera',
+ 'MobileMessaging_Settings_DeleteAccountConfirm' => 'Är du säker på att du vill radera detta SMS-konto?',
'MobileMessaging_MobileReport_PhoneNumbers' => 'Telefonnummer',
'MobileMessaging_SMS_Content_Too_Long' => '[för långt]',
'MultiSites_PluginDescription' => 'Visar fler-webbplatser sammanfattning/statistik. För närvarande underhållen som en central Piwik plugin.',
@@ -1187,6 +1240,8 @@ Tack för att du använder Piwik!',
'SEO_Bing_IndexedPages' => 'Bing indexerade sidor',
'SEO_Dmoz' => 'DMOZ poster',
'SEO_SEORankingsFor' => 'SEO Ranking för %s',
+ 'SEO_ExternalBacklinks' => 'Externa tillbakalänkar (Majestic)',
+ 'SEO_ReferrerDomains' => 'Refererande Domäner (Majestic)',
'SitesManager_PluginDescription' => 'Hantering av Webbplatser i Piwik: Lägg till en ny hemsida, ändra en befintlig, visa JavaScript-koden att inkludera på dina sidor. Alla åtgärder finns också tillgängliga via API.',
'SitesManager_Sites' => 'Webbplatser',
'SitesManager_TrackingTags' => 'Spårningskod för %s',
@@ -1871,6 +1926,8 @@ Tack för att du använder Piwik!',
'PDFReports_DescriptionOnFirstPage' => 'Rapportens beskrivning kommer att visas på första sidan i rapporten.',
'PDFReports_WeeklyScheduleHelp' => 'Veckans schema: rapporten kommer att skickas ut den första måndagen i varje vecka.',
'PDFReports_MonthlyScheduleHelp' => 'Månatligt schema: Rapporten kommer att skickas ut den första dagen i varje månad.',
+ 'PDFReports_ReportHour' => 'Skicka rapporten vid',
+ 'PDFReports_OClock' => 'klockan',
'PDFReports_AlsoSendReportToTheseEmails' => 'Skicka också rapporterna till dessa e-postadresser (en e-postadress per rad):',
'PDFReports_ReportsIncluded' => 'Statistik ingår',
'PDFReports_CreateReport' => 'Skapa rapport',
@@ -2152,6 +2209,18 @@ Tack för att du använder Piwik!',
'UserLanguage_Language_zh' => 'Kinesiska',
'UserLanguage_Language_zu' => 'Zulu',
'UserSettings_BrowserLanguage' => 'Webbläsarspråk',
+ 'SegmentEditor_AddNewSegment' => 'Lägg till nytt segment',
+ 'SegmentEditor_NewSegment' => 'Nytt segment',
+ 'SegmentEditor_OperatorAND' => 'OCH',
+ 'SegmentEditor_OperatorOR' => 'ELLER',
+ 'SegmentEditor_DefaultAllVisits' => 'Alla besök',
+ 'SegmentEditor_VisibleToMe' => 'jag',
+ 'SegmentEditor_VisibleToAllUsers' => 'alla användare',
+ 'SegmentEditor_SegmentDisplayedThisWebsiteOnly' => 'endast denna webbsida',
+ 'SegmentEditor_SegmentDisplayedAllWebsites' => 'alla webbsidor',
+ 'SegmentEditor_SaveAndApply' => 'Spara & Använd',
+ 'SegmentEditor_AreYouSureDeleteSegment' => 'Vill du verkligen radera detta segment?',
+ 'SegmentEditor_ChooseASegment' => 'Välj ett segment',
// FOR REVIEW
'EntryPage_Bounces' => 'Studsningar',
diff --git a/lang/ta.php b/lang/ta.php
index d7f99bc801..cf70c41dad 100644
--- a/lang/ta.php
+++ b/lang/ta.php
@@ -231,6 +231,7 @@ $translations = array(
'CoreUpdater_InstallingTheLatestVersion' => 'தற்போதைய புதிய பதிப்பு நிறுவப்படுகிறது.',
'CoreUpdater_PiwikUpdatedSuccessfully' => 'பிவிக் வெற்றிகரமாக புதுபிக்கப்பட்டது!',
'CoreUpdater_EmptyDatabaseError' => 'தரவுத்தளம் %s காலியாக உள்ளது. நீங்கள் பிவிக் கட்டமைப்புக் கோப்பை திருத்த அல்லது அகற்ற வேண்டும்.',
+ 'CoreUpdater_ExceptionAlreadyLatestVersion' => 'உங்களுடைய பிவிக் பதிவு %s தான் தற்போதைய புதிய பதிவு.',
'CoreUpdater_ExceptionArchiveIncompatible' => 'பொருத்தமற்ற ஆவணக்கோப்பு: %s',
'CoreUpdater_ExceptionArchiveEmpty' => 'காலியான ஆவணக்கோப்பு.',
'CoreUpdater_ExceptionArchiveIncomplete' => 'முழுமையற்ற ஆவணக்கோப்பு: சில கோப்புகளை காணவில்லை (எ.க., %s)',
diff --git a/lang/te.php b/lang/te.php
index 6e1062b960..77bcdc1674 100644
--- a/lang/te.php
+++ b/lang/te.php
@@ -160,6 +160,7 @@ $translations = array(
'Actions_ColumnSearchKeyword' => 'కీపదం',
'Actions_ColumnClickedURL' => 'నొక్కిన URL',
'Actions_ColumnDownloadURL' => 'దింపుకోలు URL',
+ 'Actions_ColumnEntryPageTitle' => 'చర్యలు',
'API_UserAuthentication' => 'వాడుకరి అధీకరణ',
'CoreAdminHome_PluginDescription' => 'పివిక్ నిర్వహణా కేంద్రం.',
'CoreAdminHome_MenuGeneralSettings' => 'సాధారణ అమరికలు',
@@ -665,6 +666,7 @@ $translations = array(
'Overlay_Location' => 'ప్రాంతం',
'Overlay_Clicks' => '%s నొక్కులు',
'Overlay_Link' => 'లంకె',
+ 'Annotations_ClickToEdit' => 'మార్చడానికి నొక్కండి',
'UserLanguage_Language_aa' => 'అఫార్',
'UserLanguage_Language_ab' => 'అబ్ఖాజియన్',
'UserLanguage_Language_ae' => 'అవేస్టాన్',
diff --git a/lang/tr.php b/lang/tr.php
index 4cc72189aa..c6b48917d7 100644
--- a/lang/tr.php
+++ b/lang/tr.php
@@ -303,8 +303,11 @@ $translations = array(
'Actions_SubmenuOutlinks' => 'Dış Bağlantılar',
'Actions_SubmenuDownloads' => 'İndirilenler',
'Actions_SubmenuSitesearch' => 'Arama',
+ 'Actions_PagesReportDocumentation' => 'Bu rapor ziyaret edilen sayfa URL\'leri hakkında bilgi içerir. %s Tablo hiyerarşik olarak düzenlenmiştir, URL\'ler klasör yapısı ile görüntülenmektedir.',
+ 'Actions_PageTitlesReportDocumentation' => 'Bu rapor ziyaret edilen sayfaların başlıkları ile ilgili bilgi içerir. %s Sayfa başlığı, birçok tarayıcının pencere başlığında gösterdiği HTML %s imidir.',
'Actions_OutlinksReportDocumentation' => 'Bu rapor, ziyaretçilerin tıkladıkları dış linklerin hiyerarşik listesini gösterir.',
'Actions_OutlinkDocumentation' => 'Bu dış bağlantı linki ziyaretçilerinizin sitenizden uzaklaştığı diğer alan adlarını kapsar.',
+ 'Actions_DownloadsReportDocumentation' => 'Bu raporda, ziyaretçilerinizin hangi dosyaları indirdiğini görebilirsiniz. %s Piwik\'in indirme olarak saydığı eylem indirme bağlantısına tıklanmasıdır. İndirmenin tamamlanıp tamamlanmadığı Piwik tarafından bilinmemektedir.',
'Actions_ColumnClicks' => 'Tıklamalar',
'Actions_ColumnClicksDocumentation' => 'Tıklama sayısı',
'Actions_ColumnUniqueClicks' => 'Tekil Tıklamalar',
@@ -318,6 +321,7 @@ $translations = array(
'Actions_ColumnSearchCategory' => 'Arama Kategorisi',
'Actions_ColumnSearchResultsCount' => 'Arama Sonucu Sayısı',
'Actions_ColumnSearchKeyword' => 'Anahtar Kelime',
+ 'Actions_SiteSearchKeyword' => 'Anahtar Kelime (Site Arama)',
'Actions_ColumnClickedURL' => 'Tıklanan Sayfa Adresleri',
'Actions_ColumnDownloadURL' => 'İndirme Sayfa Adresleri',
'Actions_ColumnEntryPageURL' => 'Giriş Sayfa Adresi',
@@ -339,6 +343,7 @@ $translations = array(
'Actions_SiteSearchKeywordsDocumentation' => 'Bu rapor, ziyaretçilerinizin Arama Motorunda aradığı Anahtar Kelimeleri listeler.',
'Actions_LearnMoreAboutSiteSearchLink' => 'Ziyaretçilerinizin Arama motoru nasıl kullandığı hakkında daha fazla bilgi edinin.',
'Actions_SiteSearchCategories1' => 'Bu rapor, ziyaretçilerin sitenizde arama yaptıklarında seçtikleri kategorileri listelemektedir.',
+ 'Actions_SiteSearchCategories2' => 'Örnek olarak, E-Ticaret websitelerinde tipik bir "Kategori" seçimi vardır böylece ziyaretçiler aramalarını belirli bir kategori içindeki tüm ürünler ile kısıtlayabilirler.',
'Actions_AvgGenerationTimeTooltip' => 'Ortalama %s hit, %s arasında %s / %s \'e dayalı',
'AnonymizeIP_PluginDescription' => 'Yerel gizlilik kurallarına uymak için ziyaretçi IP adreslerini gizleyin.',
'API_PluginDescription' => 'Piwik içerisindeki tüm veriler basit APIlerle kullanılabilmektedir. Bu eklenti Web Istatistiklerinize xml, json, php, csv vb. yollarla erişebilmenizi sağlayan bir erişim noktasıdır.',
diff --git a/lang/zh-cn.php b/lang/zh-cn.php
index 391e3ae5a7..4425f2eeb4 100644
--- a/lang/zh-cn.php
+++ b/lang/zh-cn.php
@@ -1104,14 +1104,14 @@ $translations = array(
'Login_InvalidNonceOrHeadersOrReferer' => '表单安全检查失败,请重新打开表单,检查是否启用cookie。如果配置了代理服务器,需要 %s 设置Piwik接收代理头信息 %s ,同时检查Referer头是否正确',
'Login_InvalidOrExpiredToken' => '凭证无效或已经过期。',
'Login_MailTopicPasswordChange' => '密码修改确认',
- 'Login_MailPasswordChangeBody' => '您好 %1$s,
-
-重置密码的请求来自 %2$s。要确认密码修改,请访问下面的链接:
-
-%3$s
-
-提示: 本链接24小时后失效。
-
+ 'Login_MailPasswordChangeBody' => '您好 %1$s,
+
+重置密码的请求来自 %2$s。要确认密码修改,请访问下面的链接:
+
+%3$s
+
+提示: 本链接24小时后失效。
+
感谢您使用 Piwik!',
'Login_ConfirmationLinkSent' => '确认链接已发到您的邮箱,请接收邮件并点击链接确认密码修改。',
'Login_PasswordChanged' => '您的密码已修改。',
diff --git a/lang/zh-tw.php b/lang/zh-tw.php
index aa4af957ba..143dc1a967 100644
--- a/lang/zh-tw.php
+++ b/lang/zh-tw.php
@@ -235,6 +235,8 @@ $translations = array(
'Actions_ColumnUniqueDownloads' => '絕對不重複下載次數',
'Actions_ColumnPageName' => '頁面名稱',
'Actions_ColumnPageURL' => '頁面網址',
+ 'Actions_ColumnSearchCategory' => '搜索類別',
+ 'Actions_ColumnSearchKeyword' => '關鍵字',
'Actions_ColumnClickedURL' => '點擊的 URL 位址',
'Actions_ColumnDownloadURL' => '下載的 URL 位址',
'Actions_ColumnEntryPageURL' => '到達網頁 URL',
@@ -242,6 +244,7 @@ $translations = array(
'Actions_ColumnExitPageURL' => '離站網頁 URL',
'Actions_ColumnExitPageTitle' => '離站網頁標題',
'Actions_ColumnNoResultKeyword' => '查無資料的關鍵字',
+ 'Actions_ColumnSearches' => '搜查',
'Actions_EntryPagesReportDocumentation' => '此報告涵括指定時段內之到達網頁相關資訊。所謂的到達網頁,便是訪客入站時所訪問的第一個頁面。 %s 到達網頁之 URL 以資料夾結構顯示。',
'Actions_EntryPageTitlesReportDocumentation' => '此報告涵括指定時段內,到達網頁標題的相關資訊。',
'Actions_ExitPageTitlesReportDocumentation' => '此報表涵括關於指定時段內離站網頁之標題等資訊',
@@ -953,7 +956,7 @@ $translations = array(
'UserCountry_country_tr' => '土耳其',
'UserCountry_country_tt' => '千里達托貝哥',
'UserCountry_country_tv' => '吐瓦魯',
- 'UserCountry_country_tw' => '台灣共和國',
+ 'UserCountry_country_tw' => '台灣',
'UserCountry_country_tz' => '坦尚尼亞',
'UserCountry_country_ua' => '烏克蘭',
'UserCountry_country_ug' => '烏干達',
diff --git a/misc/updateLanguageFiles.sh b/misc/updateLanguageFiles.sh
index 2ad201446e..c824d0b02d 100644
--- a/misc/updateLanguageFiles.sh
+++ b/misc/updateLanguageFiles.sh
@@ -1,6 +1,12 @@
#!/bin/bash
PIWIKPATH=$PWD/..
+ENABLEGIT=1;
+if [ "$1" == '--no-git' ]; then
+ ENABLEGIT=0;
+ echo "NO-GIT MODE: No git actions will be performed!!"
+fi
+
################################
# Configuration
#
@@ -13,20 +19,24 @@ OTranceUser="downloaduser"
# Perform initial git actions
#
# update master branch
-git checkout master > /dev/null 2>&1
-git pull > /dev/null 2>&1
+if [ $ENABLEGIT -eq 1 ]; then
-# check if branch exists local (assume its the correct one if so)
-git branch | grep $GitBranchName > /dev/null 2>&1
+ git checkout master > /dev/null 2>&1
+ git pull > /dev/null 2>&1
-if [ $? -eq 1 ]; then
- git checkout -b $GitBranchName origin/$GitBranchName > /dev/null 2>&1
-fi
+ # check if branch exists local (assume its the correct one if so)
+ git branch | grep $GitBranchName > /dev/null 2>&1
+
+ if [ $? -eq 1 ]; then
+ git checkout -b $GitBranchName origin/$GitBranchName > /dev/null 2>&1
+ fi
+
+ # switch to branch and merge with master
+ git checkout $GitBranchName > /dev/null 2>&1
+ git merge master > /dev/null 2>&1
+ git push origin $GitBranchName > /dev/null 2>&1
-# switch to branch and merge with master
-git checkout $GitBranchName > /dev/null 2>&1
-git merge master > /dev/null 2>&1
-git push origin $GitBranchName > /dev/null 2>&1
+fi
#
################################
@@ -114,16 +124,22 @@ mv *.php ../lang/
cd $PIWIKPATH
list=(`git ls-files --other --exclude-standard lang`)
-echo "Untracked language files detected:
- Please choose the files that should be added to git.
- Other files will be removed.";
+if [ $ENABLEGIT -eq 1 ]; then
+ echo "Untracked language files detected:
+ Please choose the files that should be added to git.
+ Other files will be removed.";
+else
+ echo "Untracked language files detected:
+ Please choose the files that should be kept.
+ Other files will be removed.";
+fi;
for file in ${list[@]}
do
while true; do
read -p "Add new file $file to git? " yn
case $yn in
- [Yy]* ) git add $file; break;;
+ [Yy]* ) if [ $ENABLEGIT -eq 1 ]; then git add $file; fi; break;;
[Nn]* ) rm $file; break;;
* ) echo "Please answer yes or no. ";;
esac
@@ -136,6 +152,7 @@ done
# Cleanup / Test new files
#
# run tests to cleanup files as long as tests are failing
+echo "" &> $PIWIKPATH/tmp/languagecleanup.txt
counter=0
while true; do
@@ -148,7 +165,7 @@ while true; do
# run tests to cleanup files
echo "Running unittests to cleanup language files. This may take some time..."
cd $PIWIKPATH/tests/PHPUnit
- phpunit --group LanguagesManager > /dev/null 2>&1
+ phpunit --group LanguagesManager >> $PIWIKPATH/tmp/languagecleanup.txt
# If all tests pass, break loop
if [ $? -eq 0 ]; then
@@ -172,50 +189,54 @@ done
# Perform finish git actions & create pull request
#
# commit files
-cd $PIWIKPATH
-git add lang/. > /dev/null 2>&1
-git commit -m "language update refs #3430"
-git push
+if [ $ENABLEGIT -eq 1 ]; then
-while true; do
- read -p "Please provide your github username (to create a pull request using Github API): " username
-
- returnCode=(`curl \
- -X POST \
- -k \
- --silent \
- --write-out %{http_code} \
- --stderr /dev/null \
- -o /dev/null \
- -u $username \
- --data "{\"title\":\"automatic translation update\",\"body\":\"autogenerated translation update out of $downloadfile\",\"head\":\"$GitBranchName\",\"base\":\"master\"}" \
- -H 'Accept: application/json' \
- https://api.github.com/repos/piwik/piwik/pulls`);
-
- if [ $returnCode -eq 401 ]; then
- echo "Pull request failed. Bad credentials... Please try again"
- continue;
- fi
+ cd $PIWIKPATH
+ git add lang/. > /dev/null 2>&1
+ git commit -m "language update refs #3430"
+ git push
- if [ $returnCode -eq 422 ]; then
- echo "Pull request failed. Unprocessable Entity. Maybe a pull request was already created before."
- break;
- fi
-
- if [ $returnCode -eq 201 ]; then
- echo "Pull request successfully created."
- break;
- fi
-
- if [ $returnCode -eq 200 ]; then
- echo "Pull request successfully created."
- break;
- fi
+ while true; do
+ read -p "Please provide your github username (to create a pull request using Github API): " username
+
+ returnCode=(`curl \
+ -X POST \
+ -k \
+ --silent \
+ --write-out %{http_code} \
+ --stderr /dev/null \
+ -o /dev/null \
+ -u $username \
+ --data "{\"title\":\"automatic translation update\",\"body\":\"autogenerated translation update out of $downloadfile\",\"head\":\"$GitBranchName\",\"base\":\"master\"}" \
+ -H 'Accept: application/json' \
+ https://api.github.com/repos/piwik/piwik/pulls`);
+
+ if [ $returnCode -eq 401 ]; then
+ echo "Pull request failed. Bad credentials... Please try again"
+ continue;
+ fi
+
+ if [ $returnCode -eq 422 ]; then
+ echo "Pull request failed. Unprocessable Entity. Maybe a pull request was already created before."
+ break;
+ fi
+
+ if [ $returnCode -eq 201 ]; then
+ echo "Pull request successfully created."
+ break;
+ fi
+
+ if [ $returnCode -eq 200 ]; then
+ echo "Pull request successfully created."
+ break;
+ fi
+
+ echo "Pull request failed."
- echo "Pull request failed."
+ done
-done;
+ git checkout master > /dev/null 2>&1
-git checkout master > /dev/null 2>&1
+fi
#
################################ \ No newline at end of file
diff --git a/piwik.js b/piwik.js
index f35bf262d3..ce1fa80c9c 100644
--- a/piwik.js
+++ b/piwik.js
@@ -14,7 +14,7 @@ return typeof f==="function"?m({"":n},""):n}throw new SyntaxError("JSON2.parse")
}while(i.getTimeAlias()<h)}}function J(){var P;if(!n){n=true;I("load");for(P=0;P<y.length;P++){y[P]()}}return true}function m(){var P;if(q.addEventListener){N(q,"DOMContentLoaded",function i(){q.removeEventListener("DOMContentLoaded",i,false);J()})}else{if(q.attachEvent){q.attachEvent("onreadystatechange",function i(){if(q.readyState==="complete"){q.detachEvent("onreadystatechange",i);J()}});if(q.documentElement.doScroll&&A===A.top){(function i(){if(!n){try{q.documentElement.doScroll("left")}catch(Q){setTimeout(i,0);return}J()}}())}}}if((new RegExp("WebKit")).test(d.userAgent)){P=setInterval(function(){if(n||/loaded|complete/.test(q.readyState)){clearInterval(P);J()}},10)}N(A,"load",J,false)}function g(Q,P){var i=q.createElement("script");i.type="text/javascript";i.src=Q;if(i.readyState){i.onreadystatechange=function(){var R=this.readyState;if(R==="loaded"||R==="complete"){i.onreadystatechange=null;P()}}}else{i.onload=P}q.getElementsByTagName("head")[0].appendChild(i)}function t(){var i="";
try{i=A.top.document.referrer}catch(Q){if(A.parent){try{i=A.parent.document.referrer}catch(P){i=""}}}if(i===""){i=q.referrer}return i}function j(i){var Q=new RegExp("^([a-z]+):"),P=Q.exec(i);return P?P[1]:null}function b(i){var Q=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),P=Q.exec(i);return P?P[1]:i}function B(Q,P){var i="[\\?&#]"+P+"=([^&#]*)";var S=new RegExp(i);var R=S.exec(Q);return R?z(R[1]):""}function p(i){return f(k(i))}function M(af){var R=function(W,i){return(W<<i)|(W>>>(32-i))},ag=function(am){var al="",ak,W;for(ak=7;ak>=0;ak--){W=(am>>>(ak*4))&15;al+=W.toString(16)}return al},U,ai,ah,Q=[],Z=1732584193,X=4023233417,V=2562383102,T=271733878,S=3285377520,ae,ad,ac,ab,aa,aj,P,Y=[];af=p(af);P=af.length;for(ai=0;ai<P-3;ai+=4){ah=af.charCodeAt(ai)<<24|af.charCodeAt(ai+1)<<16|af.charCodeAt(ai+2)<<8|af.charCodeAt(ai+3);Y.push(ah)}switch(P&3){case 0:ai=2147483648;break;case 1:ai=af.charCodeAt(P-1)<<24|8388608;break;case 2:ai=af.charCodeAt(P-2)<<24|af.charCodeAt(P-1)<<16|32768;
break;case 3:ai=af.charCodeAt(P-3)<<24|af.charCodeAt(P-2)<<16|af.charCodeAt(P-1)<<8|128;break}Y.push(ai);while((Y.length&15)!==14){Y.push(0)}Y.push(P>>>29);Y.push((P<<3)&4294967295);for(U=0;U<Y.length;U+=16){for(ai=0;ai<16;ai++){Q[ai]=Y[U+ai]}for(ai=16;ai<=79;ai++){Q[ai]=R(Q[ai-3]^Q[ai-8]^Q[ai-14]^Q[ai-16],1)}ae=Z;ad=X;ac=V;ab=T;aa=S;for(ai=0;ai<=19;ai++){aj=(R(ae,5)+((ad&ac)|(~ad&ab))+aa+Q[ai]+1518500249)&4294967295;aa=ab;ab=ac;ac=R(ad,30);ad=ae;ae=aj}for(ai=20;ai<=39;ai++){aj=(R(ae,5)+(ad^ac^ab)+aa+Q[ai]+1859775393)&4294967295;aa=ab;ab=ac;ac=R(ad,30);ad=ae;ae=aj}for(ai=40;ai<=59;ai++){aj=(R(ae,5)+((ad&ac)|(ad&ab)|(ac&ab))+aa+Q[ai]+2400959708)&4294967295;aa=ab;ab=ac;ac=R(ad,30);ad=ae;ae=aj}for(ai=60;ai<=79;ai++){aj=(R(ae,5)+(ad^ac^ab)+aa+Q[ai]+3395469782)&4294967295;aa=ab;ab=ac;ac=R(ad,30);ad=ae;ae=aj}Z=(Z+ae)&4294967295;X=(X+ad)&4294967295;V=(V+ac)&4294967295;T=(T+ab)&4294967295;S=(S+aa)&4294967295}aj=ag(Z)+ag(X)+ag(V)+ag(T)+ag(S);return aj.toLowerCase()}function G(Q,i,P){if(Q==="translate.googleusercontent.com"){if(P===""){P=i
-}i=B(i,"u");Q=b(i)}else{if(Q==="cc.bingj.com"||Q==="webcache.googleusercontent.com"||Q.slice(0,5)==="74.6."){i=q.links[0].href;Q=b(i)}}return[Q,i,P]}function u(P){var i=P.length;if(P.charAt(--i)==="."){P=P.slice(0,i)}if(P.slice(0,2)==="*."){P=P.slice(1)}return P}function O(P){P=P&&P.text?P.text:P;if(!l(P)){var i=q.getElementsByTagName("title");if(i&&s(i[0])){P=i[0].text}}return P}function w(i,P){if(P){return P}if(i.slice(-9)==="piwik.php"){i=i.slice(0,i.length-9)}return i}function v(S){var i="Piwik_Overlay";var V=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idsite=([0-9]+)&period=([^&]+)&date=([^&]+)$");var Q=V.exec(q.referrer);if(Q){var R=Q[1];if(R!==String(S)){return false}var U=Q[2],P=Q[3];A.name=i+"###"+U+"###"+P}var T=A.name.split("###");return T.length===3&&T[0]===i}function F(P,U,R){var T=A.name.split("###"),S=T[1],i=T[2],Q=w(P,U);g(Q+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(Q,R,S,i)})}function x(ak,aL){var T=G(q.domain,A.location.href,t()),a5=u(T[0]),bj=T[1],aS=T[2],aQ="GET",S=ak||"",ah="",aN="",a9=aL||"",aC,ar=q.title,au="7z|aac|ar[cj]|as[fx]|avi|bin|csv|deb|dmg|docx?|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|ms[ip]|od[bfgpst]|og[gv]|pdf|phps|png|pptx?|qtm?|ra[mr]?|rpm|sea|sit|tar|t?bz2?|tgz|torrent|txt|wav|wm[av]|wpd||xlsx?|xml|z|zip",aO=[a5],W=[],aG=[],aj=[],aM=500,X,al,Y,Z,aw=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],aq=["pk_kwd","piwik_kwd","utm_term"],bh="_pk_",ac,bi,aa=false,bc,ay,aB,ag=63072000000,ai=1800000,aD=15768000000,az=true,an=0,V=false,aH={},bd=200,aY={},ba={},aV=false,aT=false,aR,aI,ad,av=M,aU,aA;
+}i=B(i,"u");Q=b(i)}else{if(Q==="cc.bingj.com"||Q==="webcache.googleusercontent.com"||Q.slice(0,5)==="74.6."){i=q.links[0].href;Q=b(i)}}return[Q,i,P]}function u(P){var i=P.length;if(P.charAt(--i)==="."){P=P.slice(0,i)}if(P.slice(0,2)==="*."){P=P.slice(1)}return P}function O(P){P=P&&P.text?P.text:P;if(!l(P)){var i=q.getElementsByTagName("title");if(i&&s(i[0])){P=i[0].text}}return P}function w(i,P){if(P){return P}if(i.slice(-9)==="piwik.php"){i=i.slice(0,i.length-9)}return i}function v(S){var i="Piwik_Overlay";var V=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idsite=([0-9]+)&period=([^&]+)&date=([^&]+)$");var Q=V.exec(q.referrer);if(Q){var R=Q[1];if(R!==String(S)){return false}var U=Q[2],P=Q[3];A.name=i+"###"+U+"###"+P}var T=A.name.split("###");return T.length===3&&T[0]===i}function F(P,U,R){var T=A.name.split("###"),S=T[1],i=T[2],Q=w(P,U);g(Q+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(Q,R,S,i)})}function x(ak,aL){var T=G(q.domain,A.location.href,t()),a5=u(T[0]),bj=T[1],aS=T[2],aQ="GET",S=ak||"",ah="",aN="",a9=aL||"",aC,ar=q.title,au="7z|aac|apk|ar[cj]|as[fx]|avi|bin|csv|deb|dmg|docx?|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|ms[ip]|od[bfgpst]|og[gv]|pdf|phps|png|pptx?|qtm?|ra[mr]?|rpm|sea|sit|tar|t?bz2?|tgz|torrent|txt|wav|wm[av]|wpd||xlsx?|xml|z|zip",aO=[a5],W=[],aG=[],aj=[],aM=500,X,al,Y,Z,aw=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],aq=["pk_kwd","piwik_kwd","utm_term"],bh="_pk_",ac,bi,aa=false,bc,ay,aB,ag=63072000000,ai=1800000,aD=15768000000,az=true,an=0,V=false,aH={},bd=200,aY={},ba={},aV=false,aT=false,aR,aI,ad,av=M,aU,aA;
function a0(bs,bp,bo,br,bn,bq){if(aa){return}var bm;if(bo){bm=new Date();bm.setTime(bm.getTime()+bo)}q.cookie=bs+"="+k(bp)+(bo?";expires="+bm.toGMTString():"")+";path="+(br||"/")+(bn?";domain="+bn:"")+(bq?";secure":"")}function af(bo){if(aa){return 0}var bm=new RegExp("(^|;)[ ]*"+bo+"=([^;]*)"),bn=bm.exec(q.cookie);return bn?z(bn[2]):0}function be(bm){var bn;if(Y){bn=new RegExp("#.*");return bm.replace(bn,"")}return bm}function a4(bo,bm){var bp=j(bm),bn;if(bp){return bm}if(bm.slice(0,1)==="/"){return j(bo)+"://"+b(bo)+bm}bo=be(bo);if((bn=bo.indexOf("?"))>=0){bo=bo.slice(0,bn)}if((bn=bo.lastIndexOf("/"))!==bo.length-1){bo=bo.slice(0,bn+1)}return bo+bm}function aP(bp){var bn,bm,bo;for(bn=0;bn<aO.length;bn++){bm=u(aO[bn].toLowerCase());if(bp===bm){return true}if(bm.slice(0,1)==="."){if(bp===bm.slice(1)){return true}bo=bp.length-bm.length;if((bo>0)&&(bp.slice(bo)===bm)){return true}}}return false}function bl(bm){var bn=new Image(1,1);bn.onload=function(){};bn.src=S+(S.indexOf("?")<0?"?":"&")+bm
}function a1(bm){try{var bo=A.XMLHttpRequest?new A.XMLHttpRequest():A.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;bo.open("POST",S,true);bo.onreadystatechange=function(){if(this.readyState===4&&this.status!==200){bl(bm)}};bo.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");bo.send(bm)}catch(bn){bl(bm)}}function ax(bo,bn){var bm=new Date();if(!bc){if(aQ==="POST"){a1(bo)}else{bl(bo)}h=bm.getTime()+bn}}function aZ(bm){return bh+bm+"."+a9+"."+aU}function U(){if(aa){return"0"}if(!s(d.cookieEnabled)){var bm=aZ("testcookie");a0(bm,"1");return af(bm)==="1"?"1":"0"}return d.cookieEnabled?"1":"0"}function aJ(){aU=av((ac||a5)+(bi||"/")).slice(0,4)}function ae(){var bn=aZ("cvar"),bm=af(bn);if(bm.length){bm=JSON2.parse(bm);if(C(bm)){return bm}}return{}}function R(){if(V===false){V=ae()}}function a8(){var bm=new Date();aR=bm.getTime()}function ab(bq,bn,bm,bp,bo,br){a0(aZ("id"),bq+"."+bn+"."+bm+"."+bp+"."+bo+"."+br,ag,bi,ac)}function Q(){var bn=new Date(),bm=Math.round(bn.getTime()/1000),bp=af(aZ("id")),bo;
if(bp){bo=bp.split(".");bo.unshift("0")}else{if(!aA){aA=av((d.userAgent||"")+(d.platform||"")+JSON2.stringify(ba)+bm).slice(0,16)}bo=["1",aA,bm,0,bm,"",""]}return bo}function i(){var bm=af(aZ("ref"));if(bm.length){try{bm=JSON2.parse(bm);if(C(bm)){return bm}}catch(bn){}}return["","",0,""]}function P(){var bm=aa;aa=false;a0(aZ("id"),"",-86400,bi,ac);a0(aZ("ses"),"",-86400,bi,ac);a0(aZ("cvar"),"",-86400,bi,ac);a0(aZ("ref"),"",-86400,bi,ac);aa=bm}function at(bo,bM,bN,bq){var bK,bn=new Date(),bw=Math.round(bn.getTime()/1000),bP,bL,bs,bD,bH,bv,bF,bt,bJ,br=1024,bQ,bz,bG=V,bx=aZ("ses"),by=aZ("ref"),bR=aZ("cvar"),bE=Q(),bB=af(bx),bI=i(),bO=aC||bj,bu,bm;if(aa){P()}if(bc){return""}bP=bE[0];bL=bE[1];bD=bE[2];bs=bE[3];bH=bE[4];bv=bE[5];if(!s(bE[6])){bE[6]=""}bF=bE[6];if(!s(bq)){bq=""}var bA=q.characterSet||q.charset;if(!bA||bA.toLowerCase()==="utf-8"){bA=null}bu=bI[0];bm=bI[1];bt=bI[2];bJ=bI[3];if(!bB){bs++;bv=bH;if(!aB||!bu.length){for(bK in aw){if(Object.prototype.hasOwnProperty.call(aw,bK)){bu=B(bO,aw[bK]);
@@ -27,4 +27,4 @@ ba[bn]=(bo&&bo.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unkno
}}}},getCustomVariable:function(bn,bo){var bm;if(!s(bo)){bo="visit"}if(bo==="page"||bo===3){bm=aH[bn]}else{if(bo==="visit"||bo===2){R();bm=V[bn]}}if(!s(bm)||(bm&&bm[0]==="")){return false}return bm},deleteCustomVariable:function(bm,bn){if(this.getCustomVariable(bm,bn)){this.setCustomVariable(bm,"","",bn)}},setLinkTrackingTimer:function(bm){aM=bm},setDownloadExtensions:function(bm){au=bm},addDownloadExtensions:function(bm){au+="|"+bm},setDomains:function(bm){aO=l(bm)?[bm]:bm;aO.push(a5)},setIgnoreClasses:function(bm){W=l(bm)?[bm]:bm},setRequestMethod:function(bm){aQ=bm||"GET"},setReferrerUrl:function(bm){aS=bm},setCustomUrl:function(bm){aC=a4(bj,bm)},setDocumentTitle:function(bm){ar=bm},setAPIUrl:function(bm){ah=bm},setDownloadClasses:function(bm){aG=l(bm)?[bm]:bm},setLinkClasses:function(bm){aj=l(bm)?[bm]:bm},setCampaignNameKey:function(bm){aw=l(bm)?[bm]:bm},setCampaignKeywordKey:function(bm){aq=l(bm)?[bm]:bm},discardHashTag:function(bm){Y=bm},setCookieNamePrefix:function(bm){bh=bm;V=ae()
},setCookieDomain:function(bm){ac=u(bm);aJ()},setCookiePath:function(bm){bi=bm;aJ()},setVisitorCookieTimeout:function(bm){ag=bm*1000},setSessionCookieTimeout:function(bm){ai=bm*1000},setReferralCookieTimeout:function(bm){aD=bm*1000},setConversionAttributionFirstReferrer:function(bm){aB=bm},disableCookies:function(){aa=true;ba.cookie="0"},deleteCookies:function(){P()},setDoNotTrack:function(bn){var bm=d.doNotTrack||d.msDoNotTrack;bc=bn&&(bm==="yes"||bm==="1");if(bc){this.disableCookies()}},addListener:function(bn,bm){aW(bn,bm)},enableLinkTracking:function(bm){if(n){aE(bm)}else{y.push(function(){aE(bm)})}},disablePerformanceTracking:function(){az=false},setGenerationTimeMs:function(bm){an=parseInt(bm,10)},setHeartBeatTimer:function(bo,bn){var bm=new Date();X=bm.getTime()+bo*1000;al=bn*1000},killFrame:function(){if(A.location!==A.top.location){A.top.location=A.location}},redirectFile:function(bm){if(A.location.protocol==="file:"){A.location=bm}},setCountPreRendered:function(bm){ay=bm},trackGoal:function(bm,bo,bn){ao(function(){aK(bm,bo,bn)
})},trackLink:function(bn,bm,bo){ao(function(){a7(bn,bm,bo)})},trackPageView:function(bm,bn){if(v(a9)){ao(function(){F(S,ah,a9)})}else{ao(function(){aF(bm,bn)})}},trackSiteSearch:function(bm,bo,bn){ao(function(){ap(bm,bo,bn)})},setEcommerceView:function(bp,bm,bo,bn){if(!s(bo)||!bo.length){bo=""}else{if(bo instanceof Array){bo=JSON2.stringify(bo)}}aH[5]=["_pkc",bo];if(s(bn)&&String(bn).length){aH[2]=["_pkp",bn]}if((!s(bp)||!bp.length)&&(!s(bm)||!bm.length)){return}if(s(bp)&&bp.length){aH[3]=["_pks",bp]}if(!s(bm)||!bm.length){bm=""}aH[4]=["_pkn",bm]},addEcommerceItem:function(bq,bm,bo,bn,bp){if(bq.length){aY[bq]=[bq,bm,bo,bn,bp]}},trackEcommerceOrder:function(bm,bq,bp,bo,bn,br){a2(bm,bq,bp,bo,bn,br)},trackEcommerceCartUpdate:function(bm){bg(bm)}}}function r(){return{push:K}}N(A,"beforeunload",L,false);m();Date.prototype.getTimeAlias=Date.prototype.getTime;E=new x();for(H=0;H<_paq.length;H++){if(_paq[H][0]==="setTrackerUrl"||_paq[H][0]==="setSiteId"){K(_paq[H]);delete _paq[H]}}for(H=0;H<_paq.length;
-H++){if(_paq[H]){K(_paq[H])}}_paq=new r();c={addPlugin:function(i,P){a[i]=P},getTracker:function(i,P){return new x(i,P)},getAsyncTracker:function(){return E}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return c})}return c}())}if(typeof piwik_log!=="function"){piwik_log=function(b,f,d,g){function a(h){try{return eval("piwik_"+h)}catch(i){}return}var c,e=Piwik.getTracker(d,f);e.setDocumentTitle(b);e.setCustomData(g);c=a("tracker_pause");if(c){e.setLinkTrackingTimer(c)}c=a("download_extensions");if(c){e.setDownloadExtensions(c)}c=a("hosts_alias");if(c){e.setDomains(c)}c=a("ignore_classes");if(c){e.setIgnoreClasses(c)}e.trackPageView();if(a("install_tracker")){piwik_track=function(i,k,j,h){e.setSiteId(k);e.setTrackerUrl(j);e.trackLink(i,h)};e.enableLinkTracking()}}};
+H++){if(_paq[H]){K(_paq[H])}}_paq=new r();c={addPlugin:function(i,P){a[i]=P},getTracker:function(i,P){return new x(i,P)},getAsyncTracker:function(){return E}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return c})}return c}())}if(typeof piwik_log!=="function"){piwik_log=function(b,f,d,g){function a(h){try{return eval("piwik_"+h)}catch(i){}return}var c,e=Piwik.getTracker(d,f);e.setDocumentTitle(b);e.setCustomData(g);c=a("tracker_pause");if(c){e.setLinkTrackingTimer(c)}c=a("download_extensions");if(c){e.setDownloadExtensions(c)}c=a("hosts_alias");if(c){e.setDomains(c)}c=a("ignore_classes");if(c){e.setIgnoreClasses(c)}e.trackPageView();if(a("install_tracker")){piwik_track=function(i,k,j,h){e.setSiteId(k);e.setTrackerUrl(j);e.trackLink(i,h)};e.enableLinkTracking()}}}; \ No newline at end of file
diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php
index fdc75d1891..f7bcef4b1f 100644
--- a/plugins/Actions/Actions.php
+++ b/plugins/Actions/Actions.php
@@ -627,27 +627,21 @@ class Piwik_Actions extends Plugin
}
}
- public function getReportDisplayProperties(&$properties, $apiAction)
+ public function getReportDisplayProperties(&$properties)
{
- $reportViewProperties = array(
- 'Actions.getPageUrls' => $this->getDisplayPropertiesForPageUrls(),
- 'Actions.getEntryPageUrls' => $this->getDisplayPropertiesForEntryPageUrls(),
- 'Actions.getExitPageUrls' => $this->getDisplayPropertiesForExitPageUrls(),
- 'Actions.getSiteSearchKeywords' => $this->getDisplayPropertiesForSiteSearchKeywords(),
- 'Actions.getSiteSearchNoResultKeywords' => $this->getDisplayPropertiesForSiteSearchNoResultKeywords(),
- 'Actions.getSiteSearchCategories' => $this->getDisplayPropertiesForSiteSearchCategories(),
- 'Actions.getPageUrlsFollowingSiteSearch' => $this->getDisplayPropertiesForGetPageUrlsOrTitlesFollowingSiteSearch(false),
- 'Actions.getPageTitlesFollowingSiteSearch' => $this->getDisplayPropertiesForGetPageUrlsOrTitlesFollowingSiteSearch(true),
- 'Actions.getPageTitles' => $this->getDisplayPropertiesForGetPageTitles(),
- 'Actions.getEntryPageTitles' => $this->getDisplayPropertiesForGetEntryPageTitles(),
- 'Actions.getExitPageTitles' => $this->getDisplayPropertiesForGetExitPageTitles(),
- 'Actions.getDownloads' => $this->getDisplayPropertiesForGetDownloads(),
- 'Actions.getOutlinks' => $this->getDisplayPropertiesForGetOutlinks(),
- );
-
- if (isset($reportViewProperties[$apiAction])) {
- $properties = $reportViewProperties[$apiAction];
- }
+ $properties['Actions.getPageUrls'] = $this->getDisplayPropertiesForPageUrls();
+ $properties['Actions.getEntryPageUrls'] = $this->getDisplayPropertiesForEntryPageUrls();
+ $properties['Actions.getExitPageUrls'] = $this->getDisplayPropertiesForExitPageUrls();
+ $properties['Actions.getSiteSearchKeywords'] = $this->getDisplayPropertiesForSiteSearchKeywords();
+ $properties['Actions.getSiteSearchNoResultKeywords'] = $this->getDisplayPropertiesForSiteSearchNoResultKeywords();
+ $properties['Actions.getSiteSearchCategories'] = $this->getDisplayPropertiesForSiteSearchCategories();
+ $properties['Actions.getPageUrlsFollowingSiteSearch'] = $this->getDisplayPropertiesForGetPageUrlsOrTitlesFollowingSiteSearch(false);
+ $properties['Actions.getPageTitlesFollowingSiteSearch'] = $this->getDisplayPropertiesForGetPageUrlsOrTitlesFollowingSiteSearch(true);
+ $properties['Actions.getPageTitles'] = $this->getDisplayPropertiesForGetPageTitles();
+ $properties['Actions.getEntryPageTitles'] = $this->getDisplayPropertiesForGetEntryPageTitles();
+ $properties['Actions.getExitPageTitles'] = $this->getDisplayPropertiesForGetExitPageTitles();
+ $properties['Actions.getDownloads'] = $this->getDisplayPropertiesForGetDownloads();
+ $properties['Actions.getOutlinks'] = $this->getDisplayPropertiesForGetOutlinks();
}
private function addBaseDisplayProperties(&$result)
diff --git a/plugins/CoreHome/Controller.php b/plugins/CoreHome/Controller.php
index 8d52088cae..52539d400e 100644
--- a/plugins/CoreHome/Controller.php
+++ b/plugins/CoreHome/Controller.php
@@ -134,20 +134,11 @@ class Piwik_CoreHome_Controller extends Controller
// evolution of a singe or multiple rows in a data table
// --------------------------------------------------------
- /**
- * This static cache is necessary because the signature cannot be modified
- * if the method renders a ViewDataTable. So we use it to pass information
- * to getRowEvolutionGraph()
- * @var Piwik_CoreHome_DataTableAction_Evolution
- */
- private static $rowEvolutionCache = null;
-
/** Render the entire row evolution popover for a single row */
public function getRowEvolutionPopover()
{
$rowEvolution = $this->makeRowEvolution($isMulti = false);
- self::$rowEvolutionCache = $rowEvolution;
- $view = new View('@CoreHome/getRowEvolutionPopover');
+ $view = new Piwik_View('@CoreHome/getRowEvolutionPopover');
echo $rowEvolution->renderPopover($this, $view);
}
@@ -155,22 +146,19 @@ class Piwik_CoreHome_Controller extends Controller
public function getMultiRowEvolutionPopover()
{
$rowEvolution = $this->makeRowEvolution($isMulti = true);
- self::$rowEvolutionCache = $rowEvolution;
- $view = new View('@CoreHome/getMultiRowEvolutionPopover');
+ $view = new Piwik_View('@CoreHome/getMultiRowEvolutionPopover');
echo $rowEvolution->renderPopover($this, $view);
}
/** Generic method to get an evolution graph or a sparkline for the row evolution popover */
- public function getRowEvolutionGraph($fetch = false)
+ public function getRowEvolutionGraph($fetch = false, $rowEvolution = null)
{
- $rowEvolution = self::$rowEvolutionCache;
- if ($rowEvolution === null) {
+ if (empty($rowEvolution)) {
$paramName = Piwik_CoreHome_DataTableRowAction_MultiRowEvolution::IS_MULTI_EVOLUTION_PARAM;
$isMultiRowEvolution = Common::getRequestVar($paramName, false, 'int');
$rowEvolution = $this->makeRowEvolution($isMultiRowEvolution, $graphType = 'graphEvolution');
$rowEvolution->useAvailableMetrics();
- self::$rowEvolutionCache = $rowEvolution;
}
$view = $rowEvolution->getRowEvolutionGraph();
diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php
index 75d50a2f2e..003cf6ee91 100644
--- a/plugins/CoreHome/CoreHome.php
+++ b/plugins/CoreHome/CoreHome.php
@@ -49,6 +49,7 @@ class Piwik_CoreHome extends Plugin
$cssFiles[] = "plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css";
$cssFiles[] = "plugins/CoreHome/stylesheets/jqplot.css";
$cssFiles[] = "plugins/CoreHome/stylesheets/promo.less";
+ $cssFiles[] = "plugins/CoreHome/stylesheets/color_manager.css";
}
public function getJsFiles(&$jsFiles)
@@ -77,6 +78,7 @@ class Piwik_CoreHome extends Plugin
$jsFiles[] = "plugins/CoreHome/javascripts/jqplot.js";
$jsFiles[] = "libs/jqplot/jqplot-custom.min.js";
$jsFiles[] = "plugins/CoreHome/javascripts/promo.js";
+ $jsFiles[] = "plugins/CoreHome/javascripts/color_manager.js";
}
}
diff --git a/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php b/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php
index bbfc80832f..fa6478c167 100644
--- a/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php
+++ b/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php
@@ -79,9 +79,9 @@ class Piwik_CoreHome_DataTableRowAction_MultiRowEvolution
*
* @return ViewDataTable
*/
- public function getRowEvolutionGraph()
+ public function getRowEvolutionGraph($graphType = false, $metrics = false)
{
- $view = parent::getRowEvolutionGraph();
+ $view = parent::getRowEvolutionGraph($graphType, $metrics);
$view->setCustomParameter(self::IS_MULTI_EVOLUTION_PARAM, 1); // set in JS
return $view;
}
diff --git a/plugins/CoreHome/DataTableRowAction/RowEvolution.php b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
index 694a64c641..7b2c908bd1 100644
--- a/plugins/CoreHome/DataTableRowAction/RowEvolution.php
+++ b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
@@ -99,7 +99,7 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
list($this->date, $lastN) =
Piwik_ViewDataTable_GenerateGraphHTML_ChartEvolution::getDateRangeAndLastN($this->period, $end);
}
- $this->segment = ViewDataTable::getRawSegmentFromRequest();
+ $this->segment = \Piwik\API\Request::getRawSegmentFromRequest();
$this->loadEvolutionReport();
}
@@ -114,10 +114,10 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
// render main evolution graph
$this->graphType = 'graphEvolution';
$this->graphMetrics = $this->availableMetrics;
- $view->graph = $controller->getRowEvolutionGraph(true);
+ $view->graph = $controller->getRowEvolutionGraph($fetch = true, $rowEvolution = $this);
// render metrics overview
- $view->metrics = $this->getMetricsToggles($controller);
+ $view->metrics = $this->getMetricsToggles();
// available metrics text
$metricsText = Piwik_Translate('RowEvolution_AvailableMetrics');
@@ -180,40 +180,39 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
* Do as much as possible from outside the controller.
* @return ViewDataTable
*/
- public function getRowEvolutionGraph()
+ public function getRowEvolutionGraph($graphType = false, $metrics = false)
{
// set up the view data table
- $view = ViewDataTable::factory($this->graphType);
+ $view = ViewDataTable::factory(
+ $graphType ?: $this->graphType, $this->apiMethod, $controllerAction = 'CoreHome.getRowEvolutionGraph');
$view->setDataTable($this->dataTable);
- $view->init('CoreHome', 'getRowEvolutionGraph', $this->apiMethod);
- if (!empty($this->graphMetrics)) // In row Evolution popover, this is empty
- {
- $view->setColumnsToDisplay(array_keys($this->graphMetrics));
+ if (!empty($this->graphMetrics)) { // In row Evolution popover, this is empty
+ $view->columns_to_display = array_keys($metrics ?: $this->graphMetrics);
}
- $view->hideAllViewsIcons();
+
+ $view->show_all_views_icons = false;
+ $view->show_active_view_icon = false;
+ $view->show_related_reports = false;
foreach ($this->availableMetrics as $metric => $metadata) {
- $view->setColumnTranslation($metric, $metadata['name']);
+ $view->translations[$metric] = $metadata['name'];
}
- if (method_exists($view, 'addRowEvolutionSeriesToggle')) {
- $view->addRowEvolutionSeriesToggle($this->initiallyShowAllMetrics);
- }
+ $view->external_series_toggle = 'RowEvolutionSeriesToggle';
+ $view->external_series_toggle_show_all = $this->initiallyShowAllMetrics;
return $view;
}
/**
* Prepare metrics toggles with spark lines
- * @param $controller
* @return array
*/
- protected function getMetricsToggles($controller)
+ protected function getMetricsToggles()
{
$chart = new Piwik_Visualization_Chart_Evolution;
- $colors = $chart->getSeriesColors();
-
+
$i = 0;
$metrics = array();
foreach ($this->availableMetrics as $metric => $metricData) {
@@ -247,12 +246,10 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
$details .= ', ' . Piwik_Translate('RowEvolution_MetricChangeText', $change);
}
- $color = $colors[$i % count($colors)];
$newMetric = array(
'label' => $metricData['name'],
- 'color' => $color,
'details' => $details,
- 'sparkline' => $this->getSparkline($metric, $controller),
+ 'sparkline' => $this->getSparkline($metric),
);
// Multi Rows, each metric can be for a particular row and display an icon
if (!empty($metricData['logo'])) {
@@ -266,14 +263,14 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
}
/** Get the img tag for a sparkline showing a single metric */
- protected function getSparkline($metric, $controller)
+ protected function getSparkline($metric)
{
- $this->graphType = 'sparkline';
- $this->graphMetrics = array($metric => $metric);
-
// sparkline is always echoed, so we need to buffer the output
+ $view = $this->getRowEvolutionGraph($graphType = 'sparkline', $metrics = array($metric => $metric));
+ $view->main();
+
ob_start();
- $controller->getRowEvolutionGraph();
+ $view->getView()->render();
$spark = ob_get_contents();
ob_end_clean();
diff --git a/plugins/CoreHome/javascripts/color_manager.js b/plugins/CoreHome/javascripts/color_manager.js
new file mode 100644
index 0000000000..cfdc26bbff
--- /dev/null
+++ b/plugins/CoreHome/javascripts/color_manager.js
@@ -0,0 +1,132 @@
+/*!
+ * Piwik - Web Analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+(function ($) {
+
+ /**
+ * The ColorManager class allows JS code to grab colors defined in CSS for
+ * components that don't manage HTML (like jqPlot or sparklines). Such components
+ * can't use CSS colors directly since the colors are used to generate images
+ * or by <canvas> elements.
+ *
+ * Colors obtained via ColorManager are defined in CSS like this:
+ *
+ * .my-color-namespace[data-name=color-name] {
+ * color: #fff
+ * }
+ *
+ * and can be accessed in JavaScript like this:
+ *
+ * piwik.ColorManager.getColor("my-color-namespace", "color-name");
+ *
+ * The singleton instance of this class can be accessed via piwik.ColorManager.
+ */
+ var ColorManager = function () {
+ // empty
+ };
+
+ ColorManager.prototype = {
+
+ /**
+ * Returns the color for a namespace and name.
+ *
+ * @param {String} namespace The string identifier that groups related colors
+ * together. For example, 'sparkline-colors'.
+ * @param {String} name The name of the color to retrieve. For example, 'lineColor'.
+ * @return {String} A hex color, eg, '#fff'.
+ */
+ getColor: function (namespace, name) {
+ var element = this._getElement();
+
+ element.attr('class', 'color-manager ' + namespace).attr('data-name', name);
+ return this._normalizeColor(element.css('color'));
+ },
+
+ /**
+ * Returns the colors for a namespace and a list of names.
+ *
+ * @param {String} namespace The string identifier that groups related colors
+ * together. For example, 'sparkline-colors'.
+ * @param {Array} names An array of color names to retrieve.
+ * @param {Boolean} asArray Whether the result should be an array or an object.
+ * @return {Object|Array} An object mapping color names with color values or an
+ * array of colors.
+ */
+ getColors: function (namespace, names, asArray) {
+ var colors = asArray ? [] : {};
+ for (var i = 0; i != names.length; ++i) {
+ var name = names[i],
+ color = this.getColor(namespace, name);
+ if (color) {
+ if (asArray) {
+ colors.push(color);
+ } else {
+ colors[name] = color;
+ }
+ }
+ }
+ return colors;
+ },
+
+ /**
+ * Turns a color string that might be an rgb value rgb(12, 34, 56) into
+ * a hex color string.
+ */
+ _normalizeColor: function (color) {
+ if (color == this._getTransparentColor()) {
+ return null;
+ }
+
+ if (color
+ && color[0] != '#'
+ ) {
+ // parse rgb(#, #, #) and get rgb numbers
+ var parts = color.split(/[()rgb,\s]+/);
+ parts = [+parts[1], +parts[2], +parts[3]];
+
+ // convert parts to hex with one leading 0
+ for (var i = 0; i != parts.length; ++i) {
+ parts[i] = ("00" + parts[i].toString(16)).slice(-2);
+ }
+
+ // create hex string
+ color = '#' + parts.join('');
+ }
+ return color;
+ },
+
+ /**
+ * Returns the manufactured <div> element used to obtain color data. When
+ * getting color data the class and data-name attribute of this element are
+ * changed.
+ */
+ _getElement: function () {
+ if (!this.$element) {
+ $('body').append('<div id="color-manager"></div>');
+ this.$element = $('#color-manager');
+ }
+
+ return this.$element;
+ },
+
+ /**
+ * Returns this browser's representation of the 'transparent' color. Used to
+ * compare against colors obtained in getColor. If a color is 'transparent'
+ * it means there's no color for that namespace/name combination.
+ */
+ _getTransparentColor: function () {
+ if (!this.transparentColor) {
+ this.transparentColor = $('<div style="color:transparent;"></div>').appendTo($('body')).css('color');
+ }
+
+ return this.transparentColor;
+ }
+ };
+
+ piwik.ColorManager = new ColorManager();
+
+}(jQuery));
diff --git a/plugins/CoreHome/javascripts/datatable.js b/plugins/CoreHome/javascripts/datatable.js
index 82b9ab5df6..bf85c07d1c 100644
--- a/plugins/CoreHome/javascripts/datatable.js
+++ b/plugins/CoreHome/javascripts/datatable.js
@@ -532,7 +532,7 @@ dataTable.prototype =
// set position of evolution annotation icons
annotations.css({
top: -datatableFeatures.height() - annotationAxisHeight + noteSize / 2,
- left: 6 // padding-left of .jqplot-evolution element (in graph.tpl)
+ left: 6 // padding-left of .jqplot-graph element (in _dataTableViz_jqplotGraph.tpl)
});
piwik.annotations.placeEvolutionIcons(annotations, domElem);
diff --git a/plugins/CoreHome/javascripts/datatable_manager.js b/plugins/CoreHome/javascripts/datatable_manager.js
index 5db471eb18..a1ea816484 100644
--- a/plugins/CoreHome/javascripts/datatable_manager.js
+++ b/plugins/CoreHome/javascripts/datatable_manager.js
@@ -131,7 +131,7 @@
// render the graph (setTimeout is required, otherwise the graph will not
// render initially)
setTimeout(function () {
- plot.render(graphElement.attr('data-graph-type'), graphId, {
+ plot.render(graphId, {
noData: _pk_translate('General_NoDataForGraph_js'),
exportTitle: _pk_translate('General_ExportAsImage_js'),
exportText: _pk_translate('General_SaveImageOnYourComputer_js'),
diff --git a/plugins/CoreHome/javascripts/datatable_rowactions.js b/plugins/CoreHome/javascripts/datatable_rowactions.js
index 233fa34683..ab5fb7b7b2 100644
--- a/plugins/CoreHome/javascripts/datatable_rowactions.js
+++ b/plugins/CoreHome/javascripts/datatable_rowactions.js
@@ -376,6 +376,7 @@ DataTable_RowActions_RowEvolution.prototype.showRowEvolution = function (apiMeth
requestParams.module = 'CoreHome';
requestParams.action = action;
+ requestParams.colors = JSON.stringify(piwik.getSparklineColors());
var ajaxRequest = new ajaxHelper();
ajaxRequest.addParams(requestParams, 'get');
diff --git a/plugins/CoreHome/javascripts/jqplot.js b/plugins/CoreHome/javascripts/jqplot.js
index d77d7f582f..5153b19a26 100644
--- a/plugins/CoreHome/javascripts/jqplot.js
+++ b/plugins/CoreHome/javascripts/jqplot.js
@@ -8,7 +8,6 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-
/**
* Constructor function
*
@@ -27,33 +26,31 @@ JQPlot.prototype = {
this.originalData = data;
this.data = data.data;
- defaultParams = {};
- defaultParams.grid = {
- drawGridLines: false,
- background: '#fff',
- borderColor: '#f00',
- borderWidth: 0,
- shadow: false
- };
-
- defaultParams.title = {
- show: false
- };
-
- defaultParams.axesDefaults = {
- pad: 1.0,
- tickRenderer: $.jqplot.CanvasAxisTickRenderer,
- tickOptions: {
- showMark: false,
- fontSize: '11px',
- fontFamily: 'Arial'
+ defaultParams = {
+ grid: {
+ drawGridLines: false,
+ borderWidth: 0,
+ shadow: false
},
- rendererOptions: {
- drawBaseline: false
+ title: {
+ show: false
+ },
+ axesDefaults: {
+ pad: 1.0,
+ tickRenderer: $.jqplot.CanvasAxisTickRenderer,
+ tickOptions: {
+ showMark: false,
+ fontSize: '11px',
+ fontFamily: 'Arial'
+ },
+ rendererOptions: {
+ drawBaseline: false
+ }
}
};
this.params = $.extend(true, {}, defaultParams, data.params);
+ this._setColors();
this.tooltip = data.tooltip;
this.seriesPicker = data.seriesPicker;
@@ -61,6 +58,7 @@ JQPlot.prototype = {
if (typeof this.params.axes.yaxis == 'undefined') {
this.params.axes.yaxis = {};
}
+
if (typeof this.params.axes.yaxis.tickOptions == 'undefined') {
this.params.yaxis.tickOptions = {
formatString: '%d'
@@ -69,16 +67,18 @@ JQPlot.prototype = {
},
/** Generic render function */
- render: function (type, targetDivId, lang) {
+ render: function (targetDivId, lang) {
+ var type = $('#' + targetDivId).closest('div.dataTable').data('dataTableInstance').param['viewDataTable'];
+
// preapare the appropriate chart type
switch (type) {
- case 'evolution':
+ case 'graphEvolution':
this.prepareEvolutionChart(targetDivId, lang);
break;
- case 'bar':
+ case 'graphVerticalBar':
this.prepareBarChart(targetDivId, lang);
break;
- case 'pie':
+ case 'graphPie':
this.preparePieChart(targetDivId, lang);
break;
default:
@@ -100,7 +100,7 @@ JQPlot.prototype = {
this.innerHTML = '';
}
- (new JQPlot(data, self.dataTableId)).render(type, targetDivId, lang);
+ (new JQPlot(data, self.dataTableId)).render(targetDivId, lang);
});
// show loading
@@ -217,7 +217,7 @@ JQPlot.prototype = {
plotWidth = width;
target.trigger('piwikDestroyPlot');
(new JQPlot(self.originalData, self.dataTableId))
- .render(type, targetDivId, lang);
+ .render(targetDivId, lang);
}
});
var resizeListener = function () {
@@ -302,26 +302,26 @@ JQPlot.prototype = {
});
var popover = $(document.createElement('div'));
-
- popover.append('<div style="font-size: 13px; margin-bottom: 10px;">'
+
+ popover.append('<div style="font-size: 13px; margin-bottom: 10px;">'
+ lang.exportText + '</div>').append($(img))
-
- popover.dialog({
- title: lang.exportTitle,
- modal: true,
- width: 'auto',
- position: ['center', 'center'],
- resizable: false,
- autoOpen: true,
- open: function (event, ui) {
- $('.ui-widget-overlay').on('click.popover', function () {
- popover.dialog('close');
- });
- },
- close: function (event, ui) {
- $(this).dialog("destroy").remove();
- }
- });
+
+ popover.dialog({
+ title: lang.exportTitle,
+ modal: true,
+ width: 'auto',
+ position: ['center', 'center'],
+ resizable: false,
+ autoOpen: true,
+ open: function (event, ui) {
+ $('.ui-widget-overlay').on('click.popover', function () {
+ popover.dialog('close');
+ });
+ },
+ close: function (event, ui) {
+ $(this).dialog("destroy").remove();
+ }
+ });
},
@@ -355,7 +355,8 @@ JQPlot.prototype = {
defaultParams.piwikTicks = {
showTicks: true,
showGrid: true,
- showHighlight: true
+ showHighlight: true,
+ tickColor: this.tickColor
};
this.params = $.extend(true, {}, defaultParams, this.params);
@@ -433,18 +434,21 @@ JQPlot.prototype = {
this.params.piwikTicks = {
showTicks: false,
showGrid: false,
- showHighlight: false
+ showHighlight: false,
+ tickColor: this.tickColor
};
this.params.legend = {
show: false
};
this.params.pieLegend = {
- show: true
+ show: true,
+ labelColor: this.singleMetricColor
};
this.params.canvasLegend = {
show: true,
- singleMetric: true
+ singleMetric: true,
+ singleMetricColor: this.singleMetricColor
};
// pie charts have a different data format
@@ -477,7 +481,8 @@ JQPlot.prototype = {
this.params.piwikTicks = {
showTicks: true,
showGrid: false,
- showHighlight: false
+ showHighlight: false,
+ tickColor: this.tickColor
};
this.params.axes.xaxis.renderer = $.jqplot.CategoryAxisRenderer;
@@ -592,8 +597,35 @@ JQPlot.prototype = {
this.data = [this.data[0]];
this.params.series = [this.params.series[0]];
}
- }
+ },
+ /**
+ * Sets the colors used to render this graph.
+ */
+ _setColors: function () {
+ var colorManager = piwik.ColorManager,
+ seriesColorNames = ['series1', 'series2', 'series3', 'series4', 'series5',
+ 'series6', 'series7', 'series8', 'series9', 'series10'];
+
+ var viewDataTable = $('#' + this.dataTableId).data('dataTableInstance').param['viewDataTable'];
+
+ var graphType;
+ if (viewDataTable == 'graphEvolution') {
+ graphType = 'evolution';
+ } else if (viewDataTable == 'graphPie') {
+ graphType = 'pie';
+ } else if (viewDataTable == 'graphVerticalBar') {
+ graphType = 'bar';
+ }
+
+ var namespace = graphType + '-graph-colors';
+
+ this.params.seriesColors = colorManager.getColors(namespace, seriesColorNames, true);
+ this.params.grid.background = colorManager.getColor(namespace, 'grid-background');
+ this.params.grid.borderColor = colorManager.getColor(namespace, 'grid-border');
+ this.tickColor = colorManager.getColor(namespace, 'ticks');
+ this.singleMetricColor = colorManager.getColor(namespace, 'single-metric-label')
+ }
};
@@ -831,7 +863,7 @@ RowEvolutionSeriesToggle.prototype.beforeReplot = function () {
for (var i = 0; i < ticks.length; i++) {
var pos = Math.round(i * tickWidth + tickWidth / 2);
var full = xaxisLabels[i] && xaxisLabels[i] != ' ';
- drawLine(ctx, pos, full, c.showGrid);
+ drawLine(ctx, pos, full, c.showGrid, c.tickColor);
}
}
};
@@ -840,9 +872,9 @@ RowEvolutionSeriesToggle.prototype.beforeReplot = function () {
$.jqplot.postDrawHooks.push($.jqplot.PiwikTicks.postDraw);
// draw a 1px line
- function drawLine(ctx, x, full, showGrid) {
+ function drawLine(ctx, x, full, showGrid, color) {
ctx.save();
- ctx.strokeStyle = '#cccccc';
+ ctx.strokeStyle = color;
ctx.beginPath();
ctx.lineWidth = 2;
@@ -987,7 +1019,7 @@ RowEvolutionSeriesToggle.prototype.beforeReplot = function () {
ctx.fillStyle = s.color;
if (legend.singleMetric) {
- ctx.fillStyle = '#666666';
+ ctx.fillStyle = legend.singleMetricColor;
}
ctx.fillRect(x, 10, 10, 2);
@@ -1387,7 +1419,7 @@ RowEvolutionSeriesToggle.prototype.beforeReplot = function () {
var x = x2 - 9 - ctx.measureText(label).width;
}
- ctx.fillStyle = '#666666';
+ ctx.fillStyle = legend.labelColor;
ctx.fillText(label, x, y2 + 3);
}
diff --git a/plugins/CoreHome/javascripts/sparkline.js b/plugins/CoreHome/javascripts/sparkline.js
index 712dd0e7a5..6093955eeb 100644
--- a/plugins/CoreHome/javascripts/sparkline.js
+++ b/plugins/CoreHome/javascripts/sparkline.js
@@ -5,7 +5,29 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-function initializeSparklines() {
+(function ($) {
+
+var sparklineColorNames = ['lineColor', 'red', 'blue', 'green'];
+
+piwik.getSparklineColors = function () {
+ return piwik.ColorManager.getColors('sparkline-colors', sparklineColorNames);
+};
+
+// initializes each sparkline so they use colors defined in CSS
+piwik.initSparklines = function () {
+ $('img.sparkline').each(function () {
+ var $self = $(this);
+
+ if ($self.attr('src')) {
+ return;
+ }
+
+ var colors = JSON.stringify(piwik.getSparklineColors());
+ $self.attr('src', $self.attr('data-src') + '&colors=' + encodeURIComponent(colors));
+ });
+};
+
+window.initializeSparklines = function () {
var sparklineUrlParamsToIgnore = ['module', 'action', 'idSite', 'period', 'date', 'viewDataTable'];
$("[data-graph-id]").each(function () {
@@ -14,7 +36,7 @@ function initializeSparklines() {
// try to find sparklines and add them clickable behaviour
graph.parent().find('div.sparkline').each(function () {
// find the sparkline and get it's src attribute
- var sparklineUrl = $('img.sparkline', this).attr('src');
+ var sparklineUrl = $('img.sparkline', this).attr('data-src');
if (sparklineUrl != "") {
var params = broadcast.getValuesFromUrl(sparklineUrl);
@@ -32,32 +54,23 @@ function initializeSparklines() {
// on click, reload the graph with the new url
$(this).click(function () {
- var idDataTable = graph.attr('data-graph-id'),
- dataTable = $('#' + idDataTable);
+ var reportId = graph.attr('data-graph-id'),
+ dataTable = $(piwik.DataTableManager.getDataTableByReport(reportId));
// when the metrics picker is used, the id of the data table might be updated (which is correct behavior).
// for example, in goal reports it might change from GoalsgetEvolutionGraph to GoalsgetEvolutionGraph1.
// if this happens, we can't find the graph using $('#'+idDataTable+"Chart");
// instead, we just use the first evolution graph we can find.
if (dataTable.length == 0) {
- dataTable = $('div.dataTableGraphEvolutionWrapper').first().closest('.dataTable');
+ dataTable = $('div.dataTableEvolutionGraph');
}
// reload the datatable w/ a new column & scroll to the graph
dataTable.trigger('reload', params);
});
- $(this).hover(
- function () {
- $(this).css({
- "cursor": "pointer",
- "border-bottom": "1px dashed #C3C3C3"
- });
- },
- function () {
- $(this).css({"border-bottom": "1px solid white"});
- }
- );
}
});
});
-}
+};
+
+}(jQuery));
diff --git a/plugins/CoreHome/stylesheets/cloud.less b/plugins/CoreHome/stylesheets/cloud.less
index b17741e1cf..2d490de3d0 100644
--- a/plugins/CoreHome/stylesheets/cloud.less
+++ b/plugins/CoreHome/stylesheets/cloud.less
@@ -1,56 +1,55 @@
.tagCloud {
padding: 10px;
-}
-
-.tagCloud img {
- border: 0;
-}
-
-.tagCloud .word a {
- text-decoration: none;
-}
-
-.tagCloud .word {
- padding: 4px 8px 4px 0;
- white-space: nowrap;
-}
-
-.tagCloud .valueIsZero {
- text-decoration: line-through;
-}
-
-.tagCloud span.size0, .tagCloud span.size0 a {
- color: #255792;
- font-size: 28px;
-}
-
-.tagCloud span.size1, .tagCloud span.size1 a {
- color: #255792;
- font-size: 24px;
-}
-
-.tagCloud span.size2, .tagCloud span.size2 a {
- color: #255792;
- font-size: 20px;
-}
-
-.tagCloud span.size3, .tagCloud span.size3 a {
- color: #255792;
- font-size: 16px;
-}
-
-.tagCloud span.size4, .tagCloud span.size4 a {
- color: #255792;
- font-size: 15px;
-}
-
-.tagCloud span.size5, .tagCloud span.size5 a {
- color: #255792;
- font-size: 14px;
-}
-
-.tagCloud span.size6, .tagCloud span.size6 a {
- color: #255792;
- font-size: 11px;
-}
+ img {
+ border: 0;
+ }
+
+ .word a {
+ text-decoration: none;
+ }
+
+ .word {
+ padding: 4px 8px 4px 0;
+ white-space: nowrap;
+ }
+
+ .valueIsZero {
+ text-decoration: line-through;
+ }
+
+ span.size0, span.size0 a {
+ color: #255792;
+ font-size: 28px;
+ }
+
+ span.size1, span.size1 a {
+ color: #255792;
+ font-size: 24px;
+ }
+
+ span.size2, span.size2 a {
+ color: #255792;
+ font-size: 20px;
+ }
+
+ span.size3, span.size3 a {
+ color: #255792;
+ font-size: 16px;
+ }
+
+ span.size4, span.size4 a {
+ color: #255792;
+ font-size: 15px;
+ }
+
+ span.size5, span.size5 a {
+ color: #255792;
+ font-size: 14px;
+ }
+
+ span.size6, span.size6 a {
+ color: #255792;
+ font-size: 11px;
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreHome/stylesheets/color_manager.css b/plugins/CoreHome/stylesheets/color_manager.css
new file mode 100644
index 0000000000..725d3df59a
--- /dev/null
+++ b/plugins/CoreHome/stylesheets/color_manager.css
@@ -0,0 +1,3 @@
+.color-manager {
+ color: transparent;
+} \ No newline at end of file
diff --git a/plugins/CoreHome/stylesheets/dataTable.less b/plugins/CoreHome/stylesheets/dataTable.less
index 8124a50586..04e82f539c 100644
--- a/plugins/CoreHome/stylesheets/dataTable.less
+++ b/plugins/CoreHome/stylesheets/dataTable.less
@@ -25,20 +25,17 @@
width: 95%;
}
-.dataTableGraphWrapper {
+.dataTableGraph > .dataTableWrapper {
width: 500px;
min-height: 1px;
}
-.dataTableGraphEvolutionWrapper {
+.dataTableEvolutionGraph > .dataTableWrapper {
width: 100%;
}
/*Overriding some dataTable css for better dashboard display*/
-.widget .dataTableWrapper,
-.widget .dataTableGraphWrapper,
-.widget .dataTableActionsWrapper,
-.widget .dataTableGraphEvolutionWrapper {
+.widget .dataTableWrapper {
width: 100%;
}
@@ -774,3 +771,11 @@ a.tableConfigurationIcon.highlighted {
table.dataTable span.cell-tooltip {
cursor: default;
}
+
+.dataTable .jqplot-graph {
+ padding-left: 6px;
+
+ > div {
+ position: relative;
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreHome/templates/_dataTable.twig b/plugins/CoreHome/templates/_dataTable.twig
index 73eb6f1143..9aa0757f28 100644
--- a/plugins/CoreHome/templates/_dataTable.twig
+++ b/plugins/CoreHome/templates/_dataTable.twig
@@ -5,7 +5,7 @@
data-report="{{ properties.report_id }}"
data-params="{{ javascriptVariablesToSet|json_encode }}">
<div class="reportDocumentation">
- {% if reportDocumentation|default is not empty %}<p>{{ reportDocumentation|raw }}</p>{% endif %}
+ {% if properties.documentation|default is not empty %}<p>{{ properties.documentation|raw }}</p>{% endif %}
{% if properties.metadata.archived_date is defined %}<span class='helpDate'>{{ properties.metadata.archived_date }}</span>{% endif %}
</div>
<div class="dataTableWrapper">
@@ -21,33 +21,7 @@
{% endif %}
</div>
{% else %}
- <table cellspacing="0" class="dataTable">
- {% include "@CoreHome/_dataTableHead.twig" %}
-
- <tbody>
- {% for rowId, row in dataTable.getRows() %}
- {%- set rowHasSubtable = row.getIdSubDataTable() and javascriptVariablesToSet.controllerActionCalledWhenRequestSubTable is not null -%}
- {%- set shouldHighlightRow = rowId == summaryRowId and properties.highlight_summary_row -%}
-
- {# display this row if it doesn't have a subtable or if we don't replace the row with the subtable #}
- {% if not rowHasSubtable or not properties.show_expanded|default(false) or not properties.replace_row_with_subtable|default(false) %}
- <tr {% if rowHasSubtable %}id="{{ row.getIdSubDataTable() }}"{% endif %}
- class="{{ row.getMetadata('css_class') }} {% if rowHasSubtable %}subDataTable{% endif %}{% if shouldHighlightRow %} highlight{% endif %}">
- {% for column in dataTableColumns %}
- <td>
- {% include "@CoreHome/_dataTableCell.twig" with properties %}
- </td>
- {% endfor %}
- </tr>
- {% endif %}
-
- {# display subtable if present and showing expanded datatable #}
- {% if properties.show_expanded|default(false) and rowHasSubtable %}
- {% include properties.subtable_template with {'dataTable': row.getSubtable()} %}
- {% endif %}
- {% endfor %}
- </tbody>
- </table>
+ {{ visualization.render(dataTable, properties)|raw }}
{% endif %}
{% if properties.show_footer %}
diff --git a/plugins/CoreHome/templates/_dataTableActions_subDataTable.twig b/plugins/CoreHome/templates/_dataTableActions_subDataTable.twig
index 4f4789d49e..72bf6607c1 100644
--- a/plugins/CoreHome/templates/_dataTableActions_subDataTable.twig
+++ b/plugins/CoreHome/templates/_dataTableActions_subDataTable.twig
@@ -3,7 +3,7 @@
{% else %}
{% if (dataTable is empty or dataTable.getRowsCount() == 0) and not properties.show_expanded|default(false) %}
<tr>
- <td colspan="{{ nbColumns }}">{{ 'CoreHome_CategoryNoData'|translate }}</td>
+ <td colspan="{{ properties.columns_to_display|length }}">{{ 'CoreHome_CategoryNoData'|translate }}</td>
</tr>
{% else %}
{% for row in dataTable.getRows() %}
@@ -11,9 +11,9 @@
{% if not row.getIdSubDataTable() or not properties.show_expanded|default(false) or not properties.replace_row_with_subtable|default(false) %}
<tr {% if row.getIdSubDataTable() %}id="{{ row.getIdSubDataTable() }}"{% endif %}
class="{{ row.getMetadata('css_class') }} {% if row.getIdSubDataTable() %}subDataTable{% endif %}">
- {% for column in dataTableColumns %}
+ {% for column in properties.columns_to_display %}
<td>
- {% include "@CoreHome/_dataTableCell.twig" with {'column': column} %}
+ {% include "@CoreHome/_dataTableCell.twig" %}
</td>
{% endfor %}
</tr>
diff --git a/plugins/CoreHome/templates/_dataTableCell.twig b/plugins/CoreHome/templates/_dataTableCell.twig
index 1d012d1248..4cd40ef68b 100644
--- a/plugins/CoreHome/templates/_dataTableCell.twig
+++ b/plugins/CoreHome/templates/_dataTableCell.twig
@@ -14,7 +14,7 @@
<span class='label{% if row.getMetadata('is_aggregate') %} highlighted{% endif %}'
{% if properties is defined and properties.tooltip_metadata_name is not empty %}title="{{ row.getMetadata(properties.tooltip_metadata_name) }}"{% endif %}>
{%- if row.getMetadata('html_label_suffix') %}<span class='label-suffix'>{{ row.getMetadata('html_label_suffix') | raw }}</span>{% endif -%}
-{% endif %}{% if row.getColumn(column) %}{{- row.getColumn(column)|raw -}}{% else %}{{ defaultWhenColumnValueNotDefined }}{% endif %}
+{% endif %}{% if row.getColumn(column) %}{{- row.getColumn(column)|raw -}}{% else %}-{% endif %}
{% if column=='label' %}</span>{% endif %}
{% if not row.getIdSubDataTable() and column=='label' and row.getMetadata('url') %}
</a>
diff --git a/plugins/CoreHome/templates/_dataTableCloud.twig b/plugins/CoreHome/templates/_dataTableCloud.twig
deleted file mode 100644
index 4c70887307..0000000000
--- a/plugins/CoreHome/templates/_dataTableCloud.twig
+++ /dev/null
@@ -1,34 +0,0 @@
-<div class="dataTable" data-report="{{ properties.report_id }}" data-params="{{ javascriptVariablesToSet|json_encode }}">
- {% if reportDocumentation is not empty and javascriptVariablesToSet.viewDataTable != 'tableGoals' %}
- <div class="reportDocumentation"><p>{{ reportDocumentation|raw }}</p></div>
- {% endif %}
- <div class="tagCloud">
- {% if cloudValues|length == 0 %}
- {% if showReportDataWasPurgedMessage %}
- <div class="pk-emptyDataTable">{{ 'General_DataForThisTagCloudHasBeenPurged'|translate(deleteReportsOlderThan) }}</div>
- {% else %}
- <div class="pk-emptyDataTable">{{ 'General_NoDataForTagCloud'|translate }}</div>
- {% endif %}
- {% else %}
- {% for word,value in cloudValues %}
- <span title="{{ value.word }} ({{ value.value }} {{ columnTranslation }})" class="word size{{ value.size }}
- {# we strike tags with 0 hits #}
- {% if value.value == 0 %}valueIsZero{% endif %}">
- {% if labelMetadata[value.word].url is not sameas(false) %}
- <a href="{{ labelMetadata[value.word].url }}" target="_blank">
- {% endif %}
- {% if labelMetadata[value.word].logo is not sameas(false) %}
- <img src="{{ labelMetadata[value.word].logo }}" width="{{ value.logoWidth }}" />
- {% else %}
- {{ value.wordTruncated }}
- {% endif %}
- {% if labelMetadata[value.word].url is not sameas(false) %}</a>{% endif %}
- </span>
- {% endfor %}
- {% endif %}
- </div>
- {% if properties.show_footer %}
- {% include "@CoreHome/_dataTableFooter.twig" %}
- {% endif %}
- {% include "@CoreHome/_dataTableJS.twig" %}
-</div>
diff --git a/plugins/CoreHome/templates/_dataTableFooter.twig b/plugins/CoreHome/templates/_dataTableFooter.twig
index 8d6f1f1469..5a74cf4a74 100644
--- a/plugins/CoreHome/templates/_dataTableFooter.twig
+++ b/plugins/CoreHome/templates/_dataTableFooter.twig
@@ -24,7 +24,7 @@
{% if properties.show_footer_icons %}
<div class="dataTableFooterIcons">
<div class="dataTableFooterWrap" var="{{ javascriptVariablesToSet.viewDataTable }}">
- {% if not properties.hide_all_views_icons %}
+ {% if properties.show_active_view_icon %}
<img src="plugins/Zeitgeist/images/data_table_footer_active_item.png" class="dataTableFooterActiveItem"/>
{% endif %}
<div class="tableIconsGroup">
@@ -77,14 +77,6 @@
{% endif %}
</span>
</div>
- {% elseif not properties.hide_all_views_icons and javascriptVariablesToSet.viewDataTable == "generateDataChartEvolution" %}
- <div class="tableIconsGroup">
- <span class="tableGraphViews">
- <a class="tableIcon" format="graphEvolution" var="graphEvolution">
- <img width="16" height="16" src="plugins/Zeitgeist/images/chart_bar.png" title="{{ 'General_VBarGraph'|translate }}"/>
- </a>
- </span>
- </div>
{% endif %}
<div class="tableIconsGroup">
<span class="exportToFormatIcons">
diff --git a/plugins/CoreHome/templates/_dataTableGraph.twig b/plugins/CoreHome/templates/_dataTableGraph.twig
deleted file mode 100644
index 2ebd657959..0000000000
--- a/plugins/CoreHome/templates/_dataTableGraph.twig
+++ /dev/null
@@ -1,40 +0,0 @@
-<div class="dataTable" data-report="{{ properties.report_id }}" data-params="{{ javascriptVariablesToSet|json_encode }}">
-
- <div class="reportDocumentation">
- {% if reportDocumentation is not empty %}<p>{{ reportDocumentation|raw }}</p>{% endif %}
- {% if properties.metadata.archived_date is defined %}<p>{{ properties.metadata.archived_date }}</p>{% endif %}
- </div>
-
- <div class="{% if graphType=='evolution' %}dataTableGraphEvolutionWrapper{% else %}dataTableGraphWrapper{% endif %}">
-
- {% if isDataAvailable %}
- <div class="jqplot-{{ graphType }}" style="padding-left: 6px;">
- <div class="piwik-graph"
- style="position: relative; width: {{ width }}{% if width|slice(-1,1) != '%' %}px{% endif %}; height: {{ height }}{% if height|slice(-1,1) != '%' %}px{% endif %};"
- data-data="{{ data|e('html') }}"
- data-graph-type="{{ graphType }}"
- {% if properties.externalSeriesToggle is defined and properties.externalSeriesToggle %}
- data-external-series-toggle="{{ properties.externalSeriesToggle }}"
- data-external-series-show-all="{% if properties.externalSeriesToggleShowAll %}1{% else %}0{% endif %}"
- {% endif %}>
- </div>
- </div>
- {% else %}
- <div>
- <div class="pk-emptyGraph">
- {% if showReportDataWasPurgedMessage %}
- {{ 'General_DataForThisGraphHasBeenPurged'|translate(deleteReportsOlderThan) }}
- {% else %}
- {{ 'General_NoDataForGraph_js'|translate }}
- {% endif %}
- </div>
- </div>
- {% endif %}
-
- {% if properties.show_footer %}
- {% include "@CoreHome/_dataTableFooter.twig" %}
- {% endif %}
-
- {% include "@CoreHome/_dataTableJS.twig" %}
- </div>
-</div>
diff --git a/plugins/CoreHome/templates/_dataTableHead.twig b/plugins/CoreHome/templates/_dataTableHead.twig
index c147aa4df0..caec789b93 100644
--- a/plugins/CoreHome/templates/_dataTableHead.twig
+++ b/plugins/CoreHome/templates/_dataTableHead.twig
@@ -1,16 +1,16 @@
<thead>
<tr>
- {% for column in dataTableColumns %}
+ {% for column in properties.columns_to_display %}
<th class="sortable {% if loop.first %}first{% elseif loop.last %}last{% endif %}" id="{{ column }}">
- {% if columnDocumentation[column] is not empty %}
+ {% if properties.metrics_documentation[column]|default is not empty %}
<div class="columnDocumentation">
<div class="columnDocumentationTitle">
- {{ columnTranslations[column] }}
+ {{ properties.translations[column]|default(column) }}
</div>
- {{ columnDocumentation[column] }}
+ {{ properties.metrics_documentation[column] }}
</div>
{% endif %}
- <div id="thDIV">{{ columnTranslations[column] }}</div>
+ <div id="thDIV">{{ properties.translations[column]|default(column) }}</div>
</th>
{% endfor %}
</tr>
diff --git a/plugins/CoreHome/templates/_dataTableViz_htmlTable.twig b/plugins/CoreHome/templates/_dataTableViz_htmlTable.twig
new file mode 100644
index 0000000000..825fb6b6a5
--- /dev/null
+++ b/plugins/CoreHome/templates/_dataTableViz_htmlTable.twig
@@ -0,0 +1,27 @@
+<table cellspacing="0" class="dataTable">
+ {% include "@CoreHome/_dataTableHead.twig" %}
+
+ <tbody>
+ {% for rowId, row in dataTable.getRows() %}
+ {%- set rowHasSubtable = row.getIdSubDataTable() and properties.subtable_controller_action is not null -%}
+ {%- set shouldHighlightRow = rowId == constant("Piwik_DataTable::ID_SUMMARY_ROW") and properties.highlight_summary_row -%}
+
+ {# display this row if it doesn't have a subtable or if we don't replace the row with the subtable #}
+ {% if not rowHasSubtable or not properties.show_expanded|default(false) or not properties.replace_row_with_subtable|default(false) %}
+ <tr {% if rowHasSubtable %}id="{{ row.getIdSubDataTable() }}"{% endif %}
+ class="{{ row.getMetadata('css_class') }} {% if rowHasSubtable %}subDataTable{% endif %}{% if shouldHighlightRow %} highlight{% endif %}">
+ {% for column in properties.columns_to_display %}
+ <td>
+ {% include "@CoreHome/_dataTableCell.twig" with properties %}
+ </td>
+ {% endfor %}
+ </tr>
+ {% endif %}
+
+ {# display subtable if present and showing expanded datatable #}
+ {% if properties.show_expanded|default(false) and rowHasSubtable %}
+ {% include properties.subtable_template with {'dataTable': row.getSubtable()} %}
+ {% endif %}
+ {% endfor %}
+ </tbody>
+</table> \ No newline at end of file
diff --git a/plugins/CoreHome/templates/_dataTableViz_jqplotGraph.twig b/plugins/CoreHome/templates/_dataTableViz_jqplotGraph.twig
new file mode 100644
index 0000000000..65e9f7a43c
--- /dev/null
+++ b/plugins/CoreHome/templates/_dataTableViz_jqplotGraph.twig
@@ -0,0 +1,10 @@
+<div class="jqplot-graph">
+ <div class="piwik-graph"
+ style="width: {{ properties.graph_width }}; height: {{ properties.graph_height }};"
+ data-data="{{ data|e('html') }}"
+ {% if properties.external_series_toggle is defined and properties.external_series_toggle %}
+ data-external-series-toggle="{{ properties.external_series_toggle }}"
+ data-external-series-show-all="{% if properties.external_series_toggle_show_all %}1{% else %}0{% endif %}"
+ {% endif %}>
+ </div>
+</div> \ No newline at end of file
diff --git a/plugins/CoreHome/templates/_dataTableViz_tagCloud.twig b/plugins/CoreHome/templates/_dataTableViz_tagCloud.twig
new file mode 100644
index 0000000000..1513daca34
--- /dev/null
+++ b/plugins/CoreHome/templates/_dataTableViz_tagCloud.twig
@@ -0,0 +1,18 @@
+{% set cloudColumn = properties.columns_to_display[1] %}
+<div class="tagCloud">
+{% for word,value in cloudValues %}
+ <span title="{{ value.word }} ({{ value.value }} {{ properties.translations[cloudColumn]|default(cloudColumn) }})" class="word size{{ value.size }}
+ {# we strike tags with 0 hits #}
+ {% if value.value == 0 %}valueIsZero{% endif %}">
+ {% if labelMetadata[value.word].url is not sameas(false) %}
+ <a href="{{ labelMetadata[value.word].url }}" target="_blank">
+ {% endif %}
+ {% if labelMetadata[value.word].logo is not sameas(false) %}
+ <img src="{{ labelMetadata[value.word].logo }}" width="{{ value.logoWidth }}" />
+ {% else %}
+ {{ value.wordTruncated }}
+ {% endif %}
+ {% if labelMetadata[value.word].url is not sameas(false) %}</a>{% endif %}
+ </span>
+{% endfor %}
+</div> \ No newline at end of file
diff --git a/plugins/CoreHome/templates/getMultiRowEvolutionPopover.twig b/plugins/CoreHome/templates/getMultiRowEvolutionPopover.twig
index daf93f91b7..7f027b458e 100644
--- a/plugins/CoreHome/templates/getMultiRowEvolutionPopover.twig
+++ b/plugins/CoreHome/templates/getMultiRowEvolutionPopover.twig
@@ -1,3 +1,4 @@
+{% set seriesColorCount = constant("Piwik_Visualization_Chart_Evolution::SERIES_COLOR_COUNT") %}
<div class="rowevolution multirowevolution">
<div class="popover-title">{{ 'RowEvolution_MultiRowEvolutionTitle'|translate }}</div>
<div class="graph">
@@ -6,7 +7,7 @@
<div class="metrics-container">
<h2>{{ availableRecordsText|translate }}</h2>
<table class="metrics" border="0" cellpadding="0" cellspacing="0">
- {% for metric in metrics %}
+ {% for i, metric in metrics %}
<tr>
<td class="sparkline">
{{ metric.sparkline|raw }}
@@ -14,7 +15,9 @@
<td class="text">
{% import 'macros.twig' as piwik %}
{{ piwik.logoHtml(metric, "") }}
- <span style="color:{{ metric.color }}">{{ metric.label|raw }}</span><br/>
+ <span class="evolution-graph-colors" data-name="series{{ (i % seriesColorCount) + 1 }}">
+ {{- metric.label|raw -}}
+ </span>
<span class="details">{{ metric.details }}</span>
</td>
</tr>
diff --git a/plugins/CoreHome/templates/getRowEvolutionPopover.twig b/plugins/CoreHome/templates/getRowEvolutionPopover.twig
index 6179cfd5cf..4c38c80ac7 100644
--- a/plugins/CoreHome/templates/getRowEvolutionPopover.twig
+++ b/plugins/CoreHome/templates/getRowEvolutionPopover.twig
@@ -1,3 +1,4 @@
+{% set seriesColorCount = constant("Piwik_Visualization_Chart_Evolution::SERIES_COLOR_COUNT") %}
<div class="rowevolution">
<div class="popover-title">{{ popoverTitle | raw }}</div>
<div class="graph">
@@ -9,14 +10,16 @@
<div class="rowevolution-documentation">
{{ 'RowEvolution_Documentation'|translate }}
</div>
- <table class="metrics" border="0" cellpadding="0" cellspacing="0">
- {% for metric in metrics %}
- <tr>
+ <table class="metrics" border="0" cellpadding="0" cellspacing="0" data-thing="{{ seriesColorCount }}">
+ {% for i, metric in metrics %}
+ <tr data-i="{{ i }}">
<td class="sparkline">
- {{ metric.sparkline | raw }}
+ {{ metric.sparkline|raw }}
</td>
<td class="text">
- <span style="color:{{ metric.color }}">{{ metric.label|raw }}</span>
+ <span class="evolution-graph-colors" data-name="series{{ (i % seriesColorCount) + 1 }}">
+ {{- metric.label|raw -}}
+ </span>
{% if metric.details %}:
<span class="details">{{ metric.details }}</span>
{% endif %}
diff --git a/plugins/CustomVariables/Controller.php b/plugins/CustomVariables/Controller.php
index 6c6054f418..9734c0883b 100644
--- a/plugins/CustomVariables/Controller.php
+++ b/plugins/CustomVariables/Controller.php
@@ -26,39 +26,12 @@ class Piwik_CustomVariables_Controller extends Controller
public function getCustomVariables($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__, "CustomVariables.getCustomVariables", "getCustomVariablesValuesFromNameId");
-
- $this->setPeriodVariablesView($view);
- $this->setMetricsVariablesView($view);
-
- $this->configureView($view);
- $view->setColumnTranslation('label', Piwik_Translate('CustomVariables_ColumnCustomVariableName'));
-
- $view->setFooterMessage(Piwik_Translate('CustomVariables_TrackingHelp', array('<a target="_blank" href="http://piwik.org/docs/custom-variables/">', '</a>')));
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getCustomVariablesValuesFromNameId($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__, 'CustomVariables.getCustomVariablesValuesFromNameId');
-
- $this->configureView($view);
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $view->setColumnTranslation('label', Piwik_Translate('CustomVariables_ColumnCustomVariableValue'));
- return $this->renderView($view, $fetch);
- }
-
- protected function configureView($view)
- {
- $view->setColumnsToDisplay(array('label', 'nb_actions', 'nb_visits'));
- $view->setSortedColumn('nb_actions');
- $view->enableShowGoals();
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
-
-
}
diff --git a/plugins/CustomVariables/CustomVariables.php b/plugins/CustomVariables/CustomVariables.php
index 055ce64993..30ebb6b580 100644
--- a/plugins/CustomVariables/CustomVariables.php
+++ b/plugins/CustomVariables/CustomVariables.php
@@ -31,13 +31,14 @@ class Piwik_CustomVariables extends Plugin
public function getListHooksRegistered()
{
$hooks = array(
- 'ArchiveProcessing_Day.compute' => 'archiveDay',
- 'ArchiveProcessing_Period.compute' => 'archivePeriod',
- 'WidgetsList.add' => 'addWidgets',
- 'Menu.add' => 'addMenus',
- 'Goals.getReportsWithGoalMetrics' => 'getReportsWithGoalMetrics',
- 'API.getReportMetadata' => 'getReportMetadata',
- 'API.getSegmentsMetadata' => 'getSegmentsMetadata',
+ 'ArchiveProcessing_Day.compute' => 'archiveDay',
+ 'ArchiveProcessing_Period.compute' => 'archivePeriod',
+ 'WidgetsList.add' => 'addWidgets',
+ 'Menu.add' => 'addMenus',
+ 'Goals.getReportsWithGoalMetrics' => 'getReportsWithGoalMetrics',
+ 'API.getReportMetadata' => 'getReportMetadata',
+ 'API.getSegmentsMetadata' => 'getSegmentsMetadata',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
return $hooks;
}
@@ -149,4 +150,40 @@ class Piwik_CustomVariables extends Plugin
$archiving->archivePeriod();
}
}
+
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['CustomVariables.getCustomVariables'] = $this->getDisplayPropertiesForGetCustomVariables();
+ $properties['CustomVariables.getCustomVariablesValuesFromNameId'] =
+ $this->getDisplayPropertiesForGetCustomVariablesValuesFromNameId();
+ }
+
+ private function getDisplayPropertiesForGetCustomVariables()
+ {
+ $footerMessage = Piwik_Translate('CustomVariables_TrackingHelp',
+ array('<a target="_blank" href="http://piwik.org/docs/custom-variables/">', '</a>'));
+
+ return array(
+ 'columns_to_display' => array('label', 'nb_actions', 'nb_visits'),
+ 'filter_sort_column' => 'nb_actions',
+ 'filter_sort_order' => 'desc',
+ 'show_goals' => true,
+ 'subtable_controller_action' => 'getCustomVariablesValuesFromNameId',
+ 'translations' => array('label' => Piwik_Translate('CustomVariables_ColumnCustomVariableName')),
+ 'show_footer_message' => $footerMessage
+ );
+ }
+
+ private function getDisplayPropertiesForGetCustomVariablesValuesFromNameId()
+ {
+ return array(
+ 'columns_to_display' => array('label', 'nb_actions', 'nb_visits'),
+ 'filter_sort_column' => 'nb_actions',
+ 'filter_sort_order' => 'desc',
+ 'show_goals' => true,
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate('CustomVariables_ColumnCustomVariableValue'))
+ );
+ }
}
diff --git a/plugins/DBStats/Controller.php b/plugins/DBStats/Controller.php
index 8194c29cc4..51f2a00ae6 100644
--- a/plugins/DBStats/Controller.php
+++ b/plugins/DBStats/Controller.php
@@ -57,21 +57,7 @@ class Piwik_DBStats_Controller extends Admin
public function getDatabaseUsageSummary($fetch = false)
{
Piwik::checkUserIsSuperUser();
-
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'graphPie', $orderDir = 'desc',
- $addPercentColumn = true);
- $view->disableOffsetInformationAndPaginationControls();
-
- if ($view instanceof Piwik_ViewDataTable_GenerateGraphHTML) {
- $view->showAllTicks();
- }
-
- // translate the labels themselves
- $translateSummaryLabel = array($this, 'translateSummarylabel');
- $view->queueFilter('ColumnCallbackReplace', array(array('label'), $translateSummaryLabel),
- $runBeforeGenericFilters = true);
-
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -85,10 +71,7 @@ class Piwik_DBStats_Controller extends Admin
public function getTrackerDataSummary($fetch = false)
{
Piwik::checkUserIsSuperUser();
-
- $view = $this->getDataTableView(__FUNCTION__);
- $view->disableOffsetInformationAndPaginationControls();
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -102,11 +85,7 @@ class Piwik_DBStats_Controller extends Admin
public function getMetricDataSummary($fetch = false)
{
Piwik::checkUserIsSuperUser();
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'table', $orderDir = 'desc');
- $view->addRelatedReports(Piwik_Translate('DBStats_MetricTables'), array(
- 'DBStats.getMetricDataSummaryByYear' => Piwik_Translate('DBStats_MetricDataByYear')
- ));
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -120,12 +99,7 @@ class Piwik_DBStats_Controller extends Admin
public function getMetricDataSummaryByYear($fetch = false)
{
Piwik::checkUserIsSuperUser();
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'table', $orderDir = 'desc',
- $addPercentColumn = false, $labelKey = 'CoreHome_PeriodYear');
- $view->addRelatedReports(Piwik_Translate('DBStats_MetricDataByYear'), array(
- 'DBStats.getMetricDataSummary' => Piwik_Translate('DBStats_MetricTables')
- ));
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -139,11 +113,7 @@ class Piwik_DBStats_Controller extends Admin
public function getReportDataSummary($fetch = false)
{
Piwik::checkUserIsSuperUser();
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'table', $orderDir = 'desc');
- $view->addRelatedReports(Piwik_Translate('DBStats_ReportTables'), array(
- 'DBStats.getReportDataSummaryByYear' => Piwik_Translate('DBStats_ReportDataByYear')
- ));
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -157,12 +127,7 @@ class Piwik_DBStats_Controller extends Admin
public function getReportDataSummaryByYear($fetch = false)
{
Piwik::checkUserIsSuperUser();
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'table', $orderDir = 'desc',
- $addPercentColumn = false, $labelKey = 'CoreHome_PeriodYear');
- $view->addRelatedReports(Piwik_Translate('DBStats_ReportDataByYear'), array(
- 'DBStats.getReportDataSummary' => Piwik_Translate('DBStats_ReportTables')
- ));
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -178,18 +143,7 @@ class Piwik_DBStats_Controller extends Admin
public function getIndividualReportsSummary($fetch = false)
{
Piwik::checkUserIsSuperUser();
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'table', $orderDir = 'asc',
- $addPercentColumn = false, $labelKey = 'General_Report',
- $sizeColumns = array('estimated_size'));
-
- // this report table has some extra columns that shouldn't be shown
- if ($view instanceof Piwik_ViewDataTable_HtmlTable) {
- $view->setColumnsToDisplay(array('label', 'row_count', 'estimated_size'));
- }
-
- $this->setIndividualSummaryFooterMessage($view);
-
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -205,13 +159,7 @@ class Piwik_DBStats_Controller extends Admin
public function getIndividualMetricsSummary($fetch = false)
{
Piwik::checkUserIsSuperUser();
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'table', $orderDir = 'asc',
- $addPercentColumn = false, $labelKey = 'General_Metric',
- $sizeColumns = array('estimated_size'));
-
- $this->setIndividualSummaryFooterMessage($view);
-
- return $this->renderView($view, $fetch);
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -228,151 +176,6 @@ class Piwik_DBStats_Controller extends Admin
public function getAdminDataSummary($fetch = false)
{
Piwik::checkUserIsSuperUser();
- $view = $this->getDataTableView(__FUNCTION__, $viewType = 'table');
- $view->disableOffsetInformationAndPaginationControls();
- return $this->renderView($view, $fetch);
- }
-
- /**
- * Utility function that creates and prepares a ViewDataTable for this plugin.
- */
- private function getDataTableView($function, $viewType = 'table', $orderDir = 'asc', $addPercentColumn = false,
- $labelKey = 'DBStats_Table', $sizeColumns = array('data_size', 'index_size'),
- $limit = 25)
- {
- $columnTranslations = array(
- 'label' => Piwik_Translate($labelKey),
- 'year' => Piwik_Translate('CoreHome_PeriodYear'),
- 'data_size' => Piwik_Translate('DBStats_DataSize'),
- 'index_size' => Piwik_Translate('DBStats_IndexSize'),
- 'total_size' => Piwik_Translate('DBStats_TotalSize'),
- 'row_count' => Piwik_Translate('DBStats_RowCount'),
- 'percent_total' => '%&nbsp;' . Piwik_Translate('DBStats_DBSize'),
- 'estimated_size' => Piwik_Translate('DBStats_EstimatedSize')
- );
-
- $view = ViewDataTable::factory($viewType);
- $view->init($this->pluginName, $function, "DBStats.$function");
- $view->setSortedColumn('label', $orderDir);
- $view->setLimit($limit);
- $view->setHighlightSummaryRow(true);
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $view->disableTagCloud();
- $view->disableShowAllColumns();
- $view->alwaysShowSummaryRow();
-
- // translate columns
- foreach ($columnTranslations as $columnName => $translation) {
- $view->setColumnTranslation($columnName, $translation);
- }
-
- // add total_size column (if necessary columns are present)
- if (in_array('data_size', $sizeColumns) && in_array('index_size', $sizeColumns)) {
- $getTotalTableSize = array($this, 'getTotalTableSize');
- $view->queueFilter('ColumnCallbackAddColumn',
- array(array('data_size', 'index_size'), 'total_size', $getTotalTableSize),
- $runBeforeGenericFilters = true);
-
- $sizeColumns[] = 'total_size';
- }
-
- $runPrettySizeFilterBeforeGeneric = false;
- $fixedMemoryUnit = false;
- if ($view instanceof Piwik_ViewDataTable_HtmlTable) { // if displaying a table
- $view->disableRowEvolution();
-
- // add summary row only if displaying a table
- $view->queueFilter('AddSummaryRow', array(0, Piwik_Translate('General_Total'), 'label', false),
- $runBeforeGenericFilters = true);
-
- // add other filters
- if ($addPercentColumn && in_array('total_size', $sizeColumns)) {
- $view->queueFilter('ColumnCallbackAddColumnPercentage',
- array('percent_total', 'total_size', 'total_size', $quotientPrecision = 0, $shouldSkipRows = false,
- $getDivisorFromSummaryRow = true),
- $runBeforeGenericFilters = true);
- $view->setSortedColumn('percent_total', $orderDir);
- }
- } else if ($view instanceof Piwik_ViewDataTable_GenerateGraphHtml) { // if displaying a graph
- if (in_array('total_size', $sizeColumns)) {
- $view->setColumnsToDisplay(array('label', 'total_size'));
-
- // when displaying a graph, we force sizes to be shown as the same unit so axis labels
- // will be readable. NOTE: The unit should depend on the smallest value of the data table,
- // however there's no way to know this information, short of creating a custom filter. For
- // now, just assume KB.
- $fixedMemoryUnit = 'K';
- $view->setAxisYUnit(' K');
-
- $view->setSortedColumn('total_size', 'desc');
-
- $runPrettySizeFilterBeforeGeneric = true;
- } else {
- $view->setColumnsToDisplay(array('label', 'row_count'));
- $view->setAxisYUnit(' ' . Piwik_Translate('General_Rows'));
-
- $view->setSortedColumn('row_count', 'desc');
- }
- }
-
- $getPrettySize = '\Piwik\Piwik::getPrettySizeFromBytes';
- $params = $fixedMemoryUnit === false ? array() : array($fixedMemoryUnit);
- $view->queueFilter(
- 'ColumnCallbackReplace', array($sizeColumns, $getPrettySize, $params), $runPrettySizeFilterBeforeGeneric);
-
- // jqPlot will display &nbsp; as, well, '&nbsp;', so don't replace the spaces when rendering as a graph
- if (!($view instanceof Piwik_ViewDataTable_GenerateGraphHtml)) {
- $replaceSpaces = array($this, 'replaceColumnSpaces');
- $view->queueFilter('ColumnCallbackReplace', array($sizeColumns, $replaceSpaces));
- }
-
- $view->queueFilter('ColumnCallbackReplace', array(array('row_count'), '\Piwik\Piwik::getPrettyNumber'));
-
- return $view;
- }
-
- /**
- * Replaces spaces w/ &nbsp; for correct HTML output.
- */
- public function replaceColumnSpaces($value)
- {
- return str_replace(' ', '&nbsp;', $value);
- }
-
- /**
- * Row callback function that calculates a tables total size.
- */
- public function getTotalTableSize($dataSize, $indexSize)
- {
- return $dataSize + $indexSize;
- }
-
- /**
- * Column callback used to translate the column values in the database usage summary table.
- */
- public function translateSummarylabel($value)
- {
- static $valueToTranslationStr = array(
- 'tracker_data' => 'DBStats_TrackerTables',
- 'report_data' => 'DBStats_ReportTables',
- 'metric_data' => 'DBStats_MetricTables',
- 'other_data' => 'DBStats_OtherTables'
- );
-
- return isset($valueToTranslationStr[$value])
- ? Piwik_Translate($valueToTranslationStr[$value])
- : $value;
- }
-
- /**
- * Sets the footer message for the Individual...Summary reports.
- */
- private function setIndividualSummaryFooterMessage($view)
- {
- $lastGenerated = Piwik_DBStats::getDateOfLastCachingRun();
- if ($lastGenerated !== false) {
- $view->setFooterMessage(Piwik_Translate('Mobile_LastUpdated', $lastGenerated));
- }
+ return ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
}
diff --git a/plugins/DBStats/DBStats.php b/plugins/DBStats/DBStats.php
index 955c0b6812..467933d1e3 100644
--- a/plugins/DBStats/DBStats.php
+++ b/plugins/DBStats/DBStats.php
@@ -27,9 +27,10 @@ class Piwik_DBStats extends Plugin
public function getListHooksRegistered()
{
return array(
- 'AssetManager.getCssFiles' => 'getCssFiles',
- 'AdminMenu.add' => 'addMenu',
- 'TaskScheduler.getScheduledTasks' => 'getScheduledTasks',
+ 'AssetManager.getCssFiles' => 'getCssFiles',
+ 'AdminMenu.add' => 'addMenu',
+ 'TaskScheduler.getScheduledTasks' => 'getScheduledTasks',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
}
@@ -80,4 +81,281 @@ class Piwik_DBStats extends Plugin
{
return Piwik_GetOption(self::TIME_OF_LAST_TASK_RUN_OPTION);
}
+
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['DBStats.getDatabaseUsageSummary'] = $this->getDisplayPropertiesForGetDatabaseUsageSummary();
+ $properties['DBStats.getTrackerDataSummary'] = $this->getDisplayPropertiesForGetTrackerDataSummary();
+ $properties['DBStats.getMetricDataSummary'] = $this->getDisplayPropertiesForGetMetricDataSummary();
+ $properties['DBStats.getMetricDataSummaryByYear'] = $this->getDisplayPropertiesForGetMetricDataSummaryByYear();
+ $properties['DBStats.getReportDataSummary'] = $this->getDisplayPropertiesForGetReportDataSummary();
+ $properties['DBStats.getReportDataSummaryByYear'] = $this->getDisplayPropertiesForGetReportDataSummaryByYear();
+ $properties['DBStats.getIndividualReportsSummary'] = $this->getDisplayPropertiesForGetIndividualReportsSummary();
+ $properties['DBStats.getIndividualMetricsSummary'] = $this->getDisplayPropertiesForGetIndividualMetricsSummary();
+ $properties['DBStats.getAdminDataSummary'] = $this->getDisplayPropertiesForGetAdminDataSummary();
+ }
+
+ private function getDisplayPropertiesForGetDatabaseUsageSummary()
+ {
+ $result = array('default_view_type' => 'graphPie');
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result, $addTotalSizeColumn = true, $addPercentColumn = true);
+
+ $result['show_offset_information'] = false;
+ $result['show_pagination_control'] = false;
+ $result['show_all_ticks'] = true;
+
+ // translate the labels themselves
+ $valueToTranslationStr = array(
+ 'tracker_data' => 'DBStats_TrackerTables',
+ 'report_data' => 'DBStats_ReportTables',
+ 'metric_data' => 'DBStats_MetricTables',
+ 'other_data' => 'DBStats_OtherTables'
+ );
+
+ $translateSummaryLabel = function ($value) use ($valueToTranslationStr) {
+ return isset($valueToTranslationStr[$value])
+ ? Piwik_Translate($valueToTranslationStr[$value])
+ : $value;
+ };
+
+ $result['filters'][] = array('ColumnCallbackReplace', array('label', $translateSummaryLabel), $isPriority = true);
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetTrackerDataSummary()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result);
+
+ $result['filter_sort_order'] = 'asc';
+ $result['show_offset_information'] = false;
+ $result['show_pagination_control'] = false;
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetMetricDataSummary()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result);
+
+ $result['title'] = Piwik_Translate('DBStats_MetricTables');
+ $result['relatedReports'] = array(
+ 'DBStats.getMetricDataSummaryByYear' => Piwik_Translate('DBStats_MetricDataByYear')
+ );
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetMetricDataSummaryByYear()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result);
+
+ $result['translations']['label'] = Piwik_Translate('CoreHome_PeriodYear');
+ $result['title'] = Piwik_Translate('DBStats_MetricDataByYear');
+ $result['relatedReports'] = array(
+ 'DBStats.getMetricDataSummary' => Piwik_Translate('DBStats_MetricTables')
+ );
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetReportDataSummary()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result);
+
+ $result['title'] = Piwik_Translate('DBStats_ReportTables');
+ $result['relatedReports'] = array(
+ 'DBStats.getReportDataSummaryByYear' => Piwik_Translate('DBStats_ReportDataByYear')
+ );
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetReportDataSummaryByYear()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result);
+
+ $result['translations']['label'] = Piwik_Translate('CoreHome_PeriodYear');
+ $result['title'] = Piwik_Translate('DBStats_ReportDataByYear');
+ $result['relatedReports'] = array(
+ 'DBStats.getReportDataSummary' => Piwik_Translate('DBStats_ReportTables')
+ );
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetIndividualReportsSummary()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $viewDataTable = $this->addPresentationFilters($result, $addTotalSizeColumn = false, $addPercentColumn = false,
+ $sizeColumns = array('estimated_size'));
+
+ $result['filter_sort_order'] = 'asc';
+ $result['translations']['label'] = Piwik_Translate('General_Report');
+
+ // this report table has some extra columns that shouldn't be shown
+ if ($viewDataTable == 'table') {
+ $result['columns_to_display'] = array('label', 'row_count', 'estimated_size');
+ }
+
+ $this->setIndividualSummaryFooterMessage($result);
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetIndividualMetricsSummary()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result, $addTotalSizeColumn = false, $addPercentColumn = false,
+ $sizeColumns = array('estimated_size'));
+
+ $result['filter_sort_order'] = 'asc';
+ $result['translations']['label'] = Piwik_Translate('General_Metric');
+
+ $this->setIndividualSummaryFooterMessage($result);
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetAdminDataSummary()
+ {
+ $result = array();
+ $this->addBaseDisplayProperties($result);
+ $this->addPresentationFilters($result);
+
+ $result['filter_sort_order'] = 'asc';
+ $result['show_offset_information'] = false;
+ $result['show_pagination_control'] = false;
+
+ return $result;
+ }
+
+ private function addBaseDisplayProperties(&$properties)
+ {
+ $properties['filter_sort_column'] = 'label';
+ $properties['filter_sort_order'] = 'desc';
+ $properties['filter_limit'] = 25;
+ $properties['highlight_summary_row'] = true;
+ $properties['show_search'] = false;
+ $properties['show_exclude_low_population'] = false;
+ $properties['show_tag_cloud'] = false;
+ $properties['show_table_all_columns'] = false;
+ $properties['keep_summary_row'] = true;
+ $properties['disable_row_evolution'] = true;
+ $properties['translations'] = array(
+ 'label' => Piwik_Translate('DBStats_Table'),
+ 'year' => Piwik_Translate('CoreHome_PeriodYear'),
+ 'data_size' => Piwik_Translate('DBStats_DataSize'),
+ 'index_size' => Piwik_Translate('DBStats_IndexSize'),
+ 'total_size' => Piwik_Translate('DBStats_TotalSize'),
+ 'row_count' => Piwik_Translate('DBStats_RowCount'),
+ 'percent_total' => '%&nbsp;' . Piwik_Translate('DBStats_DBSize'),
+ 'estimated_size' => Piwik_Translate('DBStats_EstimatedSize')
+ );
+ }
+
+ private function addPresentationFilters(&$properties, $addTotalSizeColumn = true, $addPercentColumn = false,
+ $sizeColumns = array('data_size', 'index_size'))
+ {
+ // add total_size column
+ if ($addTotalSizeColumn) {
+ $getTotalTableSize = function ($dataSize, $indexSize) {
+ return $dataSize + $indexSize;
+ };
+
+ $properties['filters'][] = array('ColumnCallbackAddColumn',
+ array(array('data_size', 'index_size'), 'total_size', $getTotalTableSize), $isPriority = true);
+
+ $sizeColumns[] = 'total_size';
+ }
+
+ $runPrettySizeFilterBeforeGeneric = false;
+
+ $viewDataTable = empty($properties['default_view_type']) ? 'table' : $properties['default_view_type'];
+ $viewDataTable = Piwik_Common::getRequestVar('viewDataTable', $viewDataTable);
+
+ if ($viewDataTable == 'table') {
+ // add summary row only if displaying a table
+ $properties['filters'][] = array(
+ 'AddSummaryRow', array(0, Piwik_Translate('General_Total'), 'label', false), $isPriority = true);
+
+ // add percentage column if desired
+ if ($addPercentColumn
+ && $addTotalSizeColumn
+ ) {
+ $properties['filters'][] = array('ColumnCallbackAddColumnPercentage',
+ array('percent_total', 'total_size', 'total_size', $quotientPrecision = 0,
+ $shouldSkipRows = false, $getDivisorFromSummaryRow = true),
+ $isPriority = true
+ );
+
+ $properties['filter_sort_column'] = 'percent_total';
+ }
+ } else if (strpos($viewDataTable, 'graph') === 0) {
+ if ($addTotalSizeColumn) {
+ $properties['columns_to_display'] = array('label', 'total_size');
+
+ // when displaying a graph, we force sizes to be shown as the same unit so axis labels
+ // will be readable. NOTE: The unit should depend on the smallest value of the data table,
+ // however there's no way to know this information, short of creating a custom filter. For
+ // now, just assume KB.
+ $fixedMemoryUnit = 'K';
+ $properties['y_axis_unit'] = ' K';
+
+ $properties['filter_sort_column'] = 'total_size';
+ $properties['filter_sort_order'] = 'desc';
+
+ $runPrettySizeFilterBeforeGeneric = true;
+ } else {
+ $properties['columns_to_display'] = array('label', 'row_count');
+ $properties['y_axis_unit'] = ' ' . Piwik_Translate('General_Rows');
+
+ $properties['filter_sort_column'] = 'row_count';
+ $properties['filter_sort_order'] = 'desc';
+ }
+ }
+
+ $getPrettySize = array('Piwik', 'getPrettySizeFromBytes');
+ $params = !isset($fixedMemoryUnit) ? array() : array($fixedMemoryUnit);
+ $properties['filters'][] = array(
+ 'ColumnCallbackReplace', array($sizeColumns, $getPrettySize, $params), $runPrettySizeFilterBeforeGeneric);
+
+ // jqPlot will display &nbsp; as, well, '&nbsp;', so don't replace the spaces when rendering as a graph
+ if ($viewDataTable == 'table') {
+ $replaceSpaces = function ($value) {
+ return str_replace(' ', '&nbsp;', $value);
+ };
+
+ $properties['filters'][] = array('ColumnCallbackReplace', array($sizeColumns, $replaceSpaces));
+ }
+
+ $getPrettyNumber = array('Piwik', 'getPrettyNumber');
+ $properties['filters'][] = array('ColumnCallbackReplace', array('row_count', $getPrettyNumber));
+
+ return $viewDataTable;
+ }
+
+ /**
+ * Sets the footer message for the Individual...Summary reports.
+ */
+ private function setIndividualSummaryFooterMessage($result)
+ {
+ $lastGenerated = self::getDateOfLastCachingRun();
+ if ($lastGenerated !== false) {
+ $result['show_footer_message'] = Piwik_Translate('Mobile_LastUpdated', $lastGenerated);
+ }
+ }
}
diff --git a/plugins/DevicesDetection/Controller.php b/plugins/DevicesDetection/Controller.php
index 8b90751400..848483af24 100644
--- a/plugins/DevicesDetection/Controller.php
+++ b/plugins/DevicesDetection/Controller.php
@@ -18,24 +18,6 @@ use Piwik\Db;
*/
class Piwik_DevicesDetection_Controller extends Controller
{
-
- /** The set of related reports displayed under the 'Operating Systems' header. */
- private $osRelatedReports = null;
- private $browserRelatedReports = null;
-
- public function __construct()
- {
- parent::__construct();
- $this->osRelatedReports = array(
- 'DevicesDetection.getOsFamilies' => Piwik_Translate('DeviceDetection_OperatingSystemFamilies'),
- 'DevicesDetection.getOsVersions' => Piwik_Translate('DeviceDetection_OperatingSystemVersions')
- );
- $this->browserRelatedReports = array(
- 'DevicesDetection.getBrowserFamilies' => Piwik_Translate('DevicesDetection_BrowsersFamily'),
- 'DevicesDetection.getBrowserVersions' => Piwik_Translate('DevicesDetection_BrowserVersions')
- );
- }
-
public function index($fetch = false)
{
$view = new View('@DevicesDetection/index');
@@ -50,88 +32,37 @@ class Piwik_DevicesDetection_Controller extends Controller
public function getType($fetch = false)
{
- $view = $this->getStandardDataTableUserSettings(
- __FUNCTION__, 'DevicesDetection.getType'
- );
-
- $view->setColumnTranslation('label', Piwik_Translate("DevicesDetection_dataTableLabelTypes"));
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getBrand($fetch = false)
{
- $view = $this->getStandardDataTableUserSettings(
- __FUNCTION__, 'DevicesDetection.getBrand'
- );
-
- $view->setColumnTranslation('label', Piwik_Translate("DevicesDetection_dataTableLabelBrands"));
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getModel($fetch = false)
{
- $view = $this->getStandardDataTableUserSettings(
- __FUNCTION__, 'DevicesDetection.getModel'
- );
-
- $view->setColumnTranslation('label', Piwik_Translate("DevicesDetection_dataTableLabelModels"));
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getOsFamilies($fetch = false)
{
- $view = $this->getStandardDataTableUserSettings(
- __FUNCTION__, 'DevicesDetection.getOsFamilies'
- );
-
- $view->setColumnTranslation('label', Piwik_Translate("DevicesDetection_dataTableLabelSystemFamily"));
- $view->addRelatedReports(Piwik_Translate('DeviceDetection_OperatingSystemFamilies'), $this->osRelatedReports);
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getOsVersions($fetch = false)
{
- $view = $this->getStandardDataTableUserSettings(
- __FUNCTION__, 'DevicesDetection.getOsVersions'
- );
-
- $view->setColumnTranslation('label', Piwik_Translate("DevicesDetection_dataTableLabelSystemVersion"));
- $view->addRelatedReports(Piwik_Translate('DeviceDetection_OperatingSystemVersions'), $this->osRelatedReports);
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getBrowserFamilies($fetch = false)
{
- $view = $this->getStandardDataTableUserSettings(
- __FUNCTION__, 'DevicesDetection.getBrowserFamilies'
- );
-
- $view->setColumnTranslation('label', Piwik_Translate("DevicesDetection_dataTableLabelBrowserFamily"));
- $view->addRelatedReports(Piwik_Translate('DevicesDetection_BrowsersFamily'), $this->browserRelatedReports);
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getBrowserVersions($fetch = false)
{
- $view = $this->getStandardDataTableUserSettings(
- __FUNCTION__, 'DevicesDetection.getBrowserVersions'
- );
-
- $view->setColumnTranslation('label', Piwik_Translate("DevicesDetection_dataTableLabelBrowserVersion"));
- $view->addRelatedReports(Piwik_Translate('DevicesDetection_BrowserVersions'), $this->browserRelatedReports);
- return $this->renderView($view, $fetch);
- }
-
- protected function getStandardDataTableUserSettings($currentControllerAction, $APItoCall, $defaultDatatableType = null)
- {
- $view = ViewDataTable::factory($defaultDatatableType);
- $view->init($this->pluginName, $currentControllerAction, $APItoCall);
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $this->setPeriodVariablesView($view);
- $this->setMetricsVariablesView($view);
- return $view;
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -181,5 +112,4 @@ class Piwik_DevicesDetection_Controller extends Controller
WHERE idvisit = " . $idVisit;
Db::query($q);
}
-
}
diff --git a/plugins/DevicesDetection/DevicesDetection.php b/plugins/DevicesDetection/DevicesDetection.php
index 4af04a5678..8adc51141c 100644
--- a/plugins/DevicesDetection/DevicesDetection.php
+++ b/plugins/DevicesDetection/DevicesDetection.php
@@ -22,6 +22,23 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/DevicesDetection/functions.php';
class Piwik_DevicesDetection extends Plugin
{
+ /** The set of related reports displayed under the 'Operating Systems' header. */
+ private $osRelatedReports = null;
+ private $browserRelatedReports = null;
+
+ public function __construct()
+ {
+ parent::__construct();
+ $this->osRelatedReports = array(
+ 'DevicesDetection.getOsFamilies' => Piwik_Translate('DeviceDetection_OperatingSystemFamilies'),
+ 'DevicesDetection.getOsVersions' => Piwik_Translate('DeviceDetection_OperatingSystemVersions')
+ );
+ $this->browserRelatedReports = array(
+ 'DevicesDetection.getBrowserFamilies' => Piwik_Translate('DevicesDetection_BrowsersFamily'),
+ 'DevicesDetection.getBrowserVersions' => Piwik_Translate('DevicesDetection_BrowserVersions')
+ );
+ }
+
/**
* @see Piwik_Plugin::getInformation
*/
@@ -49,6 +66,7 @@ class Piwik_DevicesDetection extends Plugin
'WidgetsList.add' => 'addWidgets',
'API.getReportMetadata' => 'getReportMetadata',
'API.getSegmentsMetadata' => 'getSegmentsMetadata',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
}
@@ -254,4 +272,101 @@ class Piwik_DevicesDetection extends Plugin
{
Piwik_AddMenu('General_Visitors', 'DevicesDetection_submenu', array('module' => 'DevicesDetection', 'action' => 'index'));
}
+
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['DevicesDetection.getType'] = $this->getDisplayPropertiesForGetType();
+ $properties['DevicesDetection.getBrand'] = $this->getDisplayPropertiesForGetBrand();
+ $properties['DevicesDetection.getModel'] = $this->getDisplayPropertiesForGetModel();
+ $properties['DevicesDetection.getOsFamilies'] = $this->getDisplayPropertiesForGetOsFamilies();
+ $properties['DevicesDetection.getOsVersions'] = $this->getDisplayPropertiesForGetOsVersions();
+ $properties['DevicesDetection.getBrowserFamilies'] = $this->getDisplayPropertiesForGetBrowserFamilies();
+ $properties['DevicesDetection.getBrowserVersions'] = $this->getDisplayPropertiesForGetBrowserVersions();
+ }
+
+ private function getDisplayPropertiesForGetType()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate("DevicesDetection_dataTableLabelTypes"))
+ );
+ }
+
+ private function getDisplayPropertiesForGetBrand()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate("DevicesDetection_dataTableLabelBrands"))
+ );
+ }
+
+ private function getDisplayPropertiesForGetModel()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate("DevicesDetection_dataTableLabelModels"))
+ );
+ }
+
+ private function getDisplayPropertiesForGetOsFamilies()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate("DevicesDetection_dataTableLabelSystemFamily")),
+ 'title' => Piwik_Translate('DeviceDetection_OperatingSystemFamilies'),
+ 'relatedReports' => $this->getOsRelatedReports()
+ );
+ }
+
+ private function getDisplayPropertiesForGetOsVersions()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate("DevicesDetection_dataTableLabelSystemVersion")),
+ 'title' => Piwik_Translate('DeviceDetection_OperatingSystemVersions'),
+ 'relatedReports' => $this->getOsRelatedReports()
+ );
+ }
+
+ private function getDisplayPropertiesForGetBrowserFamilies()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate("DevicesDetection_dataTableLabelBrowserFamily")),
+ 'title' => Piwik_Translate('DevicesDetection_BrowsersFamily'),
+ 'relatedReports' => $this->getBrowserRelatedReports()
+ );
+ }
+
+ private function getDisplayPropertiesForGetBrowserVersions()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate("DevicesDetection_dataTableLabelBrowserVersion")),
+ 'relatedReports' => $this->getBrowserRelatedReports()
+ );
+ }
+
+ private function getOsRelatedReports()
+ {
+ return array(
+ 'DevicesDetection.getOsFamilies' => Piwik_Translate('DeviceDetection_OperatingSystemFamilies'),
+ 'DevicesDetection.getOsVersions' => Piwik_Translate('DeviceDetection_OperatingSystemVersions')
+ );
+ }
+
+ private function getBrowserRelatedReports()
+ {
+ return array(
+ 'DevicesDetection.getBrowserFamilies' => Piwik_Translate('DevicesDetection_BrowsersFamily'),
+ 'DevicesDetection.getBrowserVersions' => Piwik_Translate('DevicesDetection_BrowserVersions')
+ );
+ }
}
diff --git a/plugins/ExampleUI/API.php b/plugins/ExampleUI/API.php
index 3730c54eba..4fc0c513f8 100644
--- a/plugins/ExampleUI/API.php
+++ b/plugins/ExampleUI/API.php
@@ -23,6 +23,9 @@ class Piwik_ExampleUI_API
{
static private $instance = null;
+ /**
+ * @return Piwik_ExampleUI_API
+ */
static public function getInstance()
{
if (self::$instance == null) {
diff --git a/plugins/ExampleUI/Controller.php b/plugins/ExampleUI/Controller.php
index ffb9342830..0656b8d3a5 100644
--- a/plugins/ExampleUI/Controller.php
+++ b/plugins/ExampleUI/Controller.php
@@ -18,61 +18,61 @@ use Piwik\View;
*/
class Piwik_ExampleUI_Controller extends Controller
{
- function dataTables()
+ public function dataTables()
{
- $view = ViewDataTable::factory('table');
- $view->init($this->pluginName, __FUNCTION__, 'ExampleUI.getTemperatures');
- $view->setColumnTranslation('value', "Temperature in °C");
- $view->setColumnTranslation('label', "Hour of day");
- $view->setSortedColumn('label', 'asc');
- $view->setGraphLimit(24);
- $view->setLimit(24);
- $view->disableExcludeLowPopulation();
- $view->disableShowAllColumns();
- $view->disableRowEvolution();
- $view->setAxisYUnit('°C'); // useful if the user requests the bar graph
- return $this->renderView($view);
+ $view = Piwik_ViewDataTable::factory('table', 'ExampleUI.getTemperatures', $controllerAction = 'ExampleUI.dataTables');
+ $view->translations['value'] = "Temperature in °C";
+ $view->translations['label'] = "Hour of day";
+ $view->filter_sort_column = 'label';
+ $view->filter_sort_order = 'asc';
+ $view->graph_limit = 24;
+ $view->filter_limit = 24;
+ $view->show_exclude_low_population = false;
+ $view->show_table_all_columns = false;
+ $view->disable_row_evolution = true;
+ $view->y_axis_unit = '°C'; // useful if the user requests the bar graph
+ echo $view->render();
}
- function evolutionGraph()
+ public function evolutionGraph()
{
echo "<h2>Evolution of server temperatures over the last few days</h2>";
$this->echoEvolutionGraph();
}
- function echoEvolutionGraph()
+ public function echoEvolutionGraph()
{
- $view = ViewDataTable::factory('graphEvolution');
- $view->init($this->pluginName, __FUNCTION__, 'ExampleUI.getTemperaturesEvolution');
- $view->setColumnTranslation('server1', "Temperature server piwik.org");
- $view->setColumnTranslation('server2', "Temperature server dev.piwik.org");
- $view->setAxisYUnit('°C'); // useful if the user requests the bar graph
- return $this->renderView($view);
+ $view = Piwik_ViewDataTable::factory(
+ 'graphEvolution', 'ExampleUI.getTemperaturesEvolution', $controllerAction = 'ExampleUI.echoEvolutionGraph');
+ $view->translations['server1'] = "Temperature server piwik.org";
+ $view->translations['server2'] = "Temperature server dev.piwik.org";
+ $view->y_axis_unit = '°C'; // useful if the user requests the bar graph
+ echo $view->render();
}
- function barGraph()
+ public function barGraph()
{
- $view = ViewDataTable::factory('graphVerticalBar');
- $view->init($this->pluginName, __FUNCTION__, 'ExampleUI.getTemperatures');
- $view->setColumnTranslation('value', "Temperature");
- $view->setAxisYUnit('°C');
- $view->setGraphLimit(24);
- $view->disableFooter();
- return $this->renderView($view);
+ $view = Piwik_ViewDataTable::factory(
+ 'graphVerticalBar', 'ExampleUI.getTemperatures', $controllerAction = 'ExampleUI.barGraph');
+ $view->translations['value'] = "Temperature";
+ $view->y_axis_unit = '°C';
+ $view->graph_limit = 24;
+ $view->show_footer = false;
+ echo $view->render();
}
- function pieGraph()
+ public function pieGraph()
{
- $view = ViewDataTable::factory('graphPie');
- $view->init($this->pluginName, __FUNCTION__, 'ExampleUI.getPlanetRatios');
- $view->setColumnsToDisplay('value');
- $view->setColumnTranslation('value', "times the diameter of Earth");
- $view->setGraphLimit(10);
- $view->disableFooterIcons();
- return $this->renderView($view);
+ $view = Piwik_ViewDataTable::factory(
+ 'graphPie', 'ExampleUI.getPlanetRatios', $controllerAction = 'ExampleUI.pieGraph');
+ $view->columns_to_display = array('value');
+ $view->translations['value'] = "times the diameter of Earth";
+ $view->graph_limit = 10;
+ $view->show_footer_icons = false;
+ echo $view->render();
}
- function tagClouds()
+ public function tagClouds()
{
echo "<h2>Simple tag cloud</h2>";
$this->echoSimpleTagClouds();
@@ -85,28 +85,27 @@ class Piwik_ExampleUI_Controller extends Controller
$this->echoAdvancedTagClouds();
}
- function echoSimpleTagClouds()
+ public function echoSimpleTagClouds()
{
- $view = ViewDataTable::factory('cloud');
- $view->init($this->pluginName, __FUNCTION__, 'ExampleUI.getPlanetRatios');
- $view->setColumnsToDisplay(array('label', 'value'));
- $view->setColumnTranslation('value', "times the diameter of Earth");
- $view->disableFooter();
- $this->renderView($view);
+ $view = Piwik_ViewDataTable::factory(
+ 'cloud', 'ExampleUI.getPlanetRatios', $controllerAction = 'ExampleUI.echoSimpleTagClouds');
+ $view->columns_to_display = array('label', 'value');
+ $view->translations['value'] = "times the diameter of Earth";
+ $view->show_footer = false;
+ echo $view->render();
}
- function echoAdvancedTagClouds()
+ public function echoAdvancedTagClouds()
{
- $view = ViewDataTable::factory('cloud');
- $view->init($this->pluginName, __FUNCTION__, 'ExampleUI.getPlanetRatiosWithLogos');
- $view->setDisplayLogoInTagCloud(true);
- $view->disableFooterExceptExportIcons();
- $view->setColumnsToDisplay(array('label', 'value'));
- $view->setColumnTranslation('value', "times the diameter of Earth");
- $this->renderView($view);
+ $view = Piwik_ViewDataTable::factory(
+ 'cloud', 'ExampleUI.getPlanetRatiosWithLogos', $controllerAction = 'ExampleUI.echoAdvancedTagClouds');
+ $view->display_logo_instead_of_label = true;
+ $view->columns_to_display = array('label', 'value');
+ $view->translations['value'] = "times the diameter of Earth";
+ echo $view->render();
}
- function sparklines()
+ public function sparklines()
{
$view = new View('@ExampleUI/sparklines');
$view->urlSparkline1 = $this->getUrlSparkline('generateSparkline', array('server' => 'server1', 'rand' => mt_rand()));
@@ -114,13 +113,17 @@ class Piwik_ExampleUI_Controller extends Controller
echo $view->render();
}
- function generateSparkline()
+ public function generateSparkline()
{
- $serverRequested = Common::getRequestVar('server', '');
- $view = ViewDataTable::factory('sparkline');
- $view->init($this->pluginName, __FUNCTION__, 'ExampleUI.getTemperaturesEvolution');
- $view->setColumnsToDisplay($serverRequested);
- $this->renderView($view);
+ $view = Piwik_ViewDataTable::factory(
+ 'sparkline', 'ExampleUI.getTemperaturesEvolution', $controllerAction = 'ExampleUI.generateSparkline');
+
+ $serverRequested = Piwik_Common::getRequestVar('server', false);
+ if ($serverRequested !== false) {
+ $view->columns_to_display = array($serverRequested);
+ }
+
+ echo $view->render();
}
// Example use
diff --git a/plugins/Goals/Controller.php b/plugins/Goals/Controller.php
index 953f73cf51..a75dcd76f3 100644
--- a/plugins/Goals/Controller.php
+++ b/plugins/Goals/Controller.php
@@ -131,7 +131,7 @@ class Piwik_Goals_Controller extends Controller
$view->goalName = $goalDefinition['name'];
$view->goalAllowMultipleConversionsPerVisit = $goalDefinition['allow_multiple'];
$view->graphEvolution = $this->getEvolutionGraph(true, array('nb_conversions'), $idGoal);
- $view->nameGraphEvolution = 'GoalsgetEvolutionGraph' . $idGoal;
+ $view->nameGraphEvolution = 'Goals.getEvolutionGraph' . $idGoal;
$view->topDimensions = $this->getTopDimensions($idGoal);
// conversion rate for new and returning visitors
@@ -459,26 +459,26 @@ class Piwik_Goals_Controller extends Controller
public function getItemsSku($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getItemsName($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getItemsCategory($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getVisitsUntilConversion($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getDaysToConversion($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
}
diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php
index 7c9b006477..1ae77ed879 100644
--- a/plugins/Goals/Goals.php
+++ b/plugins/Goals/Goals.php
@@ -504,19 +504,13 @@ class Piwik_Goals extends Plugin
}
}
- public function getReportDisplayProperties(&$properties, $apiAction)
+ public function getReportDisplayProperties(&$properties)
{
- $reportViewProperties = array(
- 'Goals.getItemsSku' => $this->getDisplayPropertiesForGetItemsSku(),
- 'Goals.getItemsName' => $this->getDisplayPropertiesForGetItemsName(),
- 'Goals.getItemsCategory' => $this->getDisplayPropertiesForGetItemsCategory(),
- 'Goals.getVisitsUntilConversion' => $this->getDisplayPropertiesForGetVisitsUntilConversion(),
- 'Goals.getDaysToConversion' => $this->getDisplayPropertiesForGetDaysToConversion(),
- );
-
- if (isset($reportViewProperties[$apiAction])) {
- $properties = $reportViewProperties[$apiAction];
- }
+ $properties['Goals.getItemsSku'] = $this->getDisplayPropertiesForGetItemsSku();
+ $properties['Goals.getItemsName'] = $this->getDisplayPropertiesForGetItemsName();
+ $properties['Goals.getItemsCategory'] = $this->getDisplayPropertiesForGetItemsCategory();
+ $properties['Goals.getVisitsUntilConversion'] = $this->getDisplayPropertiesForGetVisitsUntilConversion();
+ $properties['Goals.getDaysToConversion'] = $this->getDisplayPropertiesForGetDaysToConversion();
}
private function getDisplayPropertiesForGetItemsSku()
diff --git a/plugins/Live/Controller.php b/plugins/Live/Controller.php
index 0420f85615..1ebfacd951 100644
--- a/plugins/Live/Controller.php
+++ b/plugins/Live/Controller.php
@@ -83,49 +83,23 @@ class Piwik_Live_Controller extends Controller
public function indexVisitorLog()
{
- $view = new View('@Live/indexVisitorLog.twig');
+ $view = new Piwik_View('@Live/indexVisitorLog.twig');
$view->filterEcommerce = Common::getRequestVar('filterEcommerce', 0, 'int');
- $view->visitorLog = $this->getVisitorLog($fetch = true);
+ $view->visitorLog = $this->getLastVisitsDetails($fetch = true);
echo $view->render();
}
- public function getVisitorLog($fetch = false)
+ public function getLastVisitsDetails($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName,
- __FUNCTION__,
- 'Live.getLastVisitsDetails'
- );
- $view->disableGenericFilters();
- $view->disableSort();
- $view->setTemplate("@Live/getVisitorLog.twig");
- $view->setSortedColumn('idVisit', 'ASC');
- $view->disableSearchBox();
- $view->setLimit(20);
- $view->disableOffsetInformation();
- $view->disableExcludeLowPopulation();
-
- // disable the tag cloud, pie charts, bar chart icons
- $view->disableShowAllViewsIcons();
- // disable the button "show more data"
- $view->disableShowAllColumns();
- // disable the RSS feed
- $view->disableShowExportAsRssFeed();
-
- // disable all row actions
- if ($view instanceof Piwik_ViewDataTable_HtmlTable) {
- $view->disableRowActions();
- }
-
- $view->setReportDocumentation(Piwik_Translate('Live_VisitorLogDocumentation', array('<br />', '<br />')));
-
- // set a very high row count so that the next link in the footer of the data table is always shown
- $view->setCustomParameter('totalRows', 10000000);
-
- $view->setCustomParameter('filterEcommerce', Common::getRequestVar('filterEcommerce', 0, 'int'));
- $view->setCustomParameter('pageUrlNotDefined', Piwik_Translate('General_NotDefined', Piwik_Translate('Actions_ColumnPageURL')));
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
+ }
- return $this->renderView($view, $fetch);
+ /**
+ * @deprecated
+ */
+ public function getVisitorLog($fetch = false)
+ {
+ return $this->getLastVisitsDetails($fetch);
}
public function getLastVisitsStart($fetch = false)
@@ -145,7 +119,7 @@ class Piwik_Live_Controller extends Controller
private function setCounters($view)
{
- $segment = ViewDataTable::getRawSegmentFromRequest();
+ $segment = Piwik_API_Request::getRawSegmentFromRequest();
$last30min = Piwik_Live_API::getInstance()->getCounters($this->idSite, $lastMinutes = 30, $segment);
$last30min = $last30min[0];
$today = Piwik_Live_API::getInstance()->getCounters($this->idSite, $lastMinutes = 24 * 60, $segment);
@@ -156,5 +130,4 @@ class Piwik_Live_Controller extends Controller
$view->pisToday = $today['actions'];
return $view;
}
-
-}
+} \ No newline at end of file
diff --git a/plugins/Live/Live.php b/plugins/Live/Live.php
index d4b6865039..c7fe556fe0 100644
--- a/plugins/Live/Live.php
+++ b/plugins/Live/Live.php
@@ -27,6 +27,7 @@ class Piwik_Live extends Plugin
'AssetManager.getCssFiles' => 'getCssFiles',
'WidgetsList.add' => 'addWidget',
'Menu.add' => 'addMenu',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
}
@@ -52,4 +53,35 @@ class Piwik_Live extends Plugin
WidgetsList::add('Live!', 'Live_RealTimeVisitorCount', 'Live', 'getSimpleLastVisitCount');
}
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['Live.getLastVisitsDetails'] = $this->getDisplayPropertiesForGetLastVisitsDetails();
+ }
+
+ private function getDisplayPropertiesForGetLastVisitsDetails()
+ {
+ return array(
+ 'datatable_template' => "@Live/getVisitorLog.twig",
+ 'disable_generic_filters' => true,
+ 'enable_sort' => false,
+ 'filter_sort_column' => 'idVisit',
+ 'filter_sort_order' => 'asc',
+ 'show_search' => false,
+ 'filter_limit' => 20,
+ 'show_offset_information' => false,
+ 'show_exclude_low_population' => false,
+ 'show_all_views_icons' => false,
+ 'show_table_all_columns' => false,
+ 'show_export_as_rss_feed' => false,
+ 'disable_row_actions' => true,
+ 'documentation' => Piwik_Translate('Live_VisitorLogDocumentation', array('<br />', '<br />')),
+ 'custom_parameters' => array(
+ // set a very high row count so that the next link in the footer of the data table is always shown
+ 'totalRows' => 10000000,
+
+ 'filterEcommerce' => Piwik_Common::getRequestVar('filterEcommerce', 0, 'int'),
+ 'pageUrlNotDefined' => Piwik_Translate('General_NotDefined', Piwik_Translate('Actions_ColumnPageURL'))
+ ),
+ );
+ }
}
diff --git a/plugins/Live/templates/getVisitorLog.twig b/plugins/Live/templates/getVisitorLog.twig
index 4294dbfa06..9c9a520acc 100644
--- a/plugins/Live/templates/getVisitorLog.twig
+++ b/plugins/Live/templates/getVisitorLog.twig
@@ -2,12 +2,12 @@
data-report="{{ properties.report_id }}"
data-params="{{ javascriptVariablesToSet|json_encode }}">
-{% if reportDocumentation is not empty %}
- <div class="reportDocumentation"><p>{{ reportDocumentation|raw }}</p></div>
+{% if properties.documentation|default is not empty %}
+ <div class="reportDocumentation"><p>{{ properties.documentation|raw }}</p></div>
{% endif %}
{% set displayVisitorsInOwnColumn %}{% if isWidget %}0{% else %}1{% endif %}{% endset %}
-<span data-graph-id="VisitsSummarygetEvolutionGraph"></span>
+<span data-graph-id="VisitsSummary.getEvolutionGraph"></span>
{% if error is defined %}
{{ error.message }}
diff --git a/plugins/Provider/Controller.php b/plugins/Provider/Controller.php
index 078e10fb52..afb1e0f41c 100644
--- a/plugins/Provider/Controller.php
+++ b/plugins/Provider/Controller.php
@@ -22,23 +22,9 @@ class Piwik_Provider_Controller extends Controller
* @param bool $fetch
* @return string|void
*/
- function getProvider($fetch = false)
+ public function getProvider($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__, "Provider.getProvider");
-
- $this->setPeriodVariablesView($view);
- $column = 'nb_visits';
- if ($view->period == 'day') {
- $column = 'nb_uniq_visitors';
- }
- $view->setColumnsToDisplay(array('label', $column));
- $view->setColumnTranslation('label', Piwik_Translate('Provider_ColumnProvider'));
- $view->setSortedColumn($column);
- $view->setLimit(5);
- $this->setMetricsVariablesView($view);
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
-
}
diff --git a/plugins/Provider/Provider.php b/plugins/Provider/Provider.php
index 1d7b0b0a99..f20e823b95 100644
--- a/plugins/Provider/Provider.php
+++ b/plugins/Provider/Provider.php
@@ -35,6 +35,7 @@ class Piwik_Provider extends Plugin
'Menu.add' => 'addMenu',
'API.getReportMetadata' => 'getReportMetadata',
'API.getSegmentsMetadata' => 'getSegmentsMetadata',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
return $hooks;
}
@@ -64,7 +65,7 @@ class Piwik_Provider extends Plugin
);
}
- function install()
+ public function install()
{
// add column hostname / hostname ext in the visit table
$query = "ALTER IGNORE TABLE `" . Common::prefixTable('log_visit') . "` ADD `location_provider` VARCHAR( 100 ) NULL";
@@ -80,25 +81,25 @@ class Piwik_Provider extends Plugin
}
- function uninstall()
+ public function uninstall()
{
// add column hostname / hostname ext in the visit table
$query = "ALTER TABLE `" . Common::prefixTable('log_visit') . "` DROP `location_provider`";
Db::exec($query);
}
- function addWidget()
+ public function addWidget()
{
WidgetsList::add('General_Visitors', 'Provider_WidgetProviders', 'Provider', 'getProvider');
}
- function addMenu()
+ public function addMenu()
{
Piwik_RenameMenuEntry('General_Visitors', 'UserCountry_SubmenuLocations',
'General_Visitors', 'Provider_SubmenuLocationsProvider');
}
- function postLoad()
+ public function postLoad()
{
Piwik_AddAction('template_footerUserCountry', array('Piwik_Provider', 'footerUserCountry'));
}
@@ -213,4 +214,17 @@ class Piwik_Provider extends Plugin
$archiving->archivePeriod();
}
}
+
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['Provider.getProvider'] = $this->getDisplayPropertiesForGetProvider();
+ }
+
+ private function getDisplayPropertiesForGetProvider()
+ {
+ return array(
+ 'translations' => array('label' => Piwik_Translate('Provider_ColumnProvider')),
+ 'filter_limit' => 5
+ );
+ }
}
diff --git a/plugins/Referers/Controller.php b/plugins/Referers/Controller.php
index 072fc1ec4a..e2fe4976d4 100644
--- a/plugins/Referers/Controller.php
+++ b/plugins/Referers/Controller.php
@@ -24,12 +24,12 @@ use Piwik\Url;
*/
class Piwik_Referers_Controller extends Controller
{
- function index()
+ public function index()
{
$view = new View('@Referers/index');
$view->graphEvolutionReferers = $this->getEvolutionGraph(true, Common::REFERER_TYPE_DIRECT_ENTRY, array('nb_visits'));
- $view->nameGraphEvolutionReferers = 'ReferersgetEvolutionGraph';
+ $view->nameGraphEvolutionReferers = 'Referers.getEvolutionGraph';
// building the referers summary report
$view->dataTableRefererType = $this->getRefererType(true);
@@ -127,7 +127,7 @@ class Piwik_Referers_Controller extends Controller
return $result;
}
- function getSearchEnginesAndKeywords()
+ public function getSearchEnginesAndKeywords()
{
$view = new View('@Referers/getSearchEnginesAndKeywords');
$view->searchEngines = $this->getSearchEngines(true);
@@ -135,43 +135,9 @@ class Piwik_Referers_Controller extends Controller
echo $view->render();
}
- function getRefererType($fetch = false)
+ public function getRefererType($fetch = false)
{
- $view = ViewDataTable::factory('tableAllColumns');
- $view->init($this->pluginName,
- __FUNCTION__,
- 'Referers.getRefererType',
- 'getRefererType'
- );
- $view->disableSearchBox();
- $view->disableOffsetInformationAndPaginationControls();
- $view->disableExcludeLowPopulation();
- $view->disableSubTableWhenShowGoals();
- $view->enableShowGoals();
- $view->setLimit(10);
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
-
- $idSubtable = Common::getRequestVar('idSubtable', false);
- $labelColumnTitle = Piwik_Translate('Referers_ColumnRefererType');
- if ($idSubtable !== false) {
- switch ($idSubtable) {
- case Common::REFERER_TYPE_SEARCH_ENGINE:
- $labelColumnTitle = Piwik_Translate('Referers_ColumnSearchEngine');
- break;
- case Common::REFERER_TYPE_WEBSITE:
- $labelColumnTitle = Piwik_Translate('Referers_ColumnWebsite');
- break;
- case Common::REFERER_TYPE_CAMPAIGN:
- $labelColumnTitle = Piwik_Translate('Referers_ColumnCampaign');
- break;
- default:
- break;
- }
- }
- $view->setColumnTranslation('label', $labelColumnTitle);
-
- $this->setMetricsVariablesView($view);
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -184,127 +150,32 @@ class Piwik_Referers_Controller extends Controller
*/
public function getAll($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__, 'Referers.getAll');
- $view->disableExcludeLowPopulation();
- $view->setColumnTranslation('label', Piwik_Translate('Referers_Referrer'));
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->enableShowGoals();
- $view->setLimit(20);
- $view->setCustomParameter('disable_row_actions', '1');
-
- $setGetAllHtmlPrefix = array($this, 'setGetAllHtmlPrefix');
- $view->queueFilter(
- 'MetadataCallbackAddMetadata', array('referrer_type', 'html_label_prefix', $setGetAllHtmlPrefix));
-
- $view->setMetricsVariablesView($view);
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- /**
- * DataTable filter callback that returns the HTML prefix for a label in the
- * 'getAll' report based on the row's referrer type.
- *
- * @param int $referrerType The referrer type.
- * @return string
- */
- public function setGetAllHtmlPrefix($referrerType)
+ public function getKeywords($fetch = false)
{
- // get singular label for referrer type
- $indexTranslation = '';
- switch ($referrerType) {
- case Common::REFERER_TYPE_DIRECT_ENTRY:
- $indexTranslation = 'Referers_DirectEntry';
- break;
- case Common::REFERER_TYPE_SEARCH_ENGINE:
- $indexTranslation = 'Referers_ColumnKeyword';
- break;
- case Common::REFERER_TYPE_WEBSITE:
- $indexTranslation = 'Referers_ColumnWebsite';
- break;
- case Common::REFERER_TYPE_CAMPAIGN:
- $indexTranslation = 'Referers_ColumnCampaign';
- break;
- default:
- // case of newsletter, partners, before Piwik 0.2.25
- $indexTranslation = 'General_Others';
- break;
- }
-
- $label = strtolower(Piwik_Translate($indexTranslation));
-
- // return html that displays it as grey & italic
- return '<span style="color:#999"><em>(' . $label . ')</em></span>';
- }
-
- function getKeywords($fetch = false)
- {
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getKeywords',
- 'getSearchEnginesFromKeywordId'
- );
- $view->disableExcludeLowPopulation();
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnKeyword'));
- $view->enableShowGoals();
- $view->setLimit(25);
- $view->disableSubTableWhenShowGoals();
-
- $this->setMetricsVariablesView($view);
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getSearchEnginesFromKeywordId($fetch = false)
+ public function getSearchEnginesFromKeywordId($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getSearchEnginesFromKeywordId'
- );
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnSearchEngine'));
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
-
- function getSearchEngines($fetch = false)
+ public function getSearchEngines($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getSearchEngines',
- 'getKeywordsFromSearchEngineId'
- );
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $view->enableShowGoals();
- $view->setLimit(25);
- $view->disableSubTableWhenShowGoals();
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnSearchEngine'));
-
- $this->setMetricsVariablesView($view);
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getKeywordsFromSearchEngineId($fetch = false)
+ public function getKeywordsFromSearchEngineId($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getKeywordsFromSearchEngineId'
- );
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnKeyword'));
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function indexWebsites($fetch = false)
+ public function indexWebsites($fetch = false)
{
- $view = new View('@Referers/indexWebsites');
+ $view = new Piwik_View('@Referers/indexWebsites');
$view->websites = $this->getWebsites(true);
$view->socials = $this->getSocials(true);
if ($fetch) {
@@ -314,113 +185,41 @@ class Piwik_Referers_Controller extends Controller
}
}
- function getWebsites($fetch = false)
+ public function getWebsites($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getWebsites',
- 'getUrlsFromWebsiteId'
- );
- $view->disableExcludeLowPopulation();
- $view->enableShowGoals();
- $view->setLimit(25);
- $view->disableSubTableWhenShowGoals();
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnWebsite'));
-
- $this->setMetricsVariablesView($view);
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getSocials($fetch = false)
+ public function getSocials($fetch = false)
{
- $view = ViewDataTable::factory('graphPie');
- $view->init($this->pluginName, __FUNCTION__, 'Referers.getSocials', 'getUrlsForSocial');
- $view->disableExcludeLowPopulation();
- $view->setLimit(10);
- $view->enableShowGoals();
- $view->disableSubTableWhenShowGoals();
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnSocial'));
-
- if (empty($_REQUEST['widget'])) {
- $view->setFooterMessage(Piwik_Translate('Referers_SocialFooterMessage'));
- }
-
- $this->setMetricsVariablesView($view);
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getUrlsForSocial($fetch = false)
+ public function getUrlsForSocial($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__, 'Referers.getUrlsForSocial');
- $view->disableExcludeLowPopulation();
- $view->setLimit(10);
- $view->enableShowGoals();
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnWebsitePage'));
-
- $this->setMetricsVariablesView($view);
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function indexCampaigns($fetch = false)
+ public function indexCampaigns($fetch = false)
{
return View::singleReport(
Piwik_Translate('Referers_Campaigns'),
$this->getCampaigns(true), $fetch);
}
- function getCampaigns($fetch = false)
+ public function getCampaigns($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getCampaigns',
- 'getKeywordsFromCampaignId'
- );
- $view->disableExcludeLowPopulation();
- $view->enableShowGoals();
- $view->setLimit(25);
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnCampaign'));
-
- $help = Piwik_Translate('Referers_CampaignFooterHelp', array('<a target="_blank" href="http://piwik.org/docs/tracking-campaigns/">',
- '</a> - <a target="_blank" href="http://piwik.org/docs/tracking-campaigns/url-builder/">',
- '</a>'
- ));
- $view->setFooterMessage($help);
- $this->setMetricsVariablesView($view);
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getKeywordsFromCampaignId($fetch = false)
+ public function getKeywordsFromCampaignId($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getKeywordsFromCampaignId'
- );
-
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnKeyword'));
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getUrlsFromWebsiteId($fetch = false)
+ public function getUrlsFromWebsiteId($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__,
- 'Referers.getUrlsFromWebsiteId'
- );
- $view->disableSearchBox();
- $view->disableExcludeLowPopulation();
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnWebsitePage'));
- $view->setTooltipMetadataName('url');
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
protected function getReferersVisitorsByType($date = false)
diff --git a/plugins/Referers/Referers.php b/plugins/Referers/Referers.php
index bf87a719ce..abda5df50e 100644
--- a/plugins/Referers/Referers.php
+++ b/plugins/Referers/Referers.php
@@ -36,6 +36,7 @@ class Piwik_Referers extends Plugin
'Goals.getReportsWithGoalMetrics' => 'getReportsWithGoalMetrics',
'API.getReportMetadata' => 'getReportMetadata',
'API.getSegmentsMetadata' => 'getSegmentsMetadata',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
return $hooks;
}
@@ -289,4 +290,224 @@ class Piwik_Referers extends Plugin
$archiving->archivePeriod();
}
}
+
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['Referers.getRefererType'] = $this->getDisplayPropertiesForGetRefererType();
+ $properties['Referers.getAll'] = $this->getDisplayPropertiesForGetAll();
+ $properties['Referers.getKeywords'] = $this->getDisplayPropertiesForGetKeywords();
+ $properties['Referers.getSearchEnginesFromKeywordId'] = $this->getDisplayPropertiesForGetSearchEnginesFromKeywordId();
+ $properties['Referers.getSearchEngines'] = $this->getDisplayPropertiesForGetSearchEngines();
+ $properties['Referers.getKeywordsFromSearchEngineId'] = $this->getDisplayPropertiesForGetKeywordsFromSearchEngineId();
+ $properties['Referers.getWebsites'] = $this->getDisplayPropertiesForGetWebsites();
+ $properties['Referers.getSocials'] = $this->getDisplayPropertiesForGetSocials();
+ $properties['Referers.getUrlsForSocial'] = $this->getDisplayPropertiesForGetUrlsForSocial();
+ $properties['Referers.getCampaigns'] = $this->getDisplayPropertiesForGetCampaigns();
+ $properties['Referers.getKeywordsFromCampaignId'] = $this->getDisplayPropertiesForGetKeywordsFromCampaignId();
+ $properties['Referers.getUrlsFromWebsiteId'] = $this->getDisplayPropertiesForGetUrlsFromWebsiteId();
+ }
+
+ private function getDisplayPropertiesForGetRefererType()
+ {
+ $idSubtable = Piwik_Common::getRequestVar('idSubtable', false);
+ $labelColumnTitle = Piwik_Translate('Referers_ColumnRefererType');
+ switch ($idSubtable) {
+ case Piwik_Common::REFERER_TYPE_SEARCH_ENGINE:
+ $labelColumnTitle = Piwik_Translate('Referers_ColumnSearchEngine');
+ break;
+ case Piwik_Common::REFERER_TYPE_WEBSITE:
+ $labelColumnTitle = Piwik_Translate('Referers_ColumnWebsite');
+ break;
+ case Piwik_Common::REFERER_TYPE_CAMPAIGN:
+ $labelColumnTitle = Piwik_Translate('Referers_ColumnCampaign');
+ break;
+ default:
+ break;
+ }
+
+ return array(
+ 'default_view_type' => 'tableAllColumns',
+ 'show_search' => false,
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'show_exclude_low_population' => false,
+ 'disable_subtable_when_show_goals' => true,
+ 'show_goals' => true,
+ 'filter_limit' => 10,
+ 'translations' => array('label' => $labelColumnTitle)
+ );
+ }
+
+ private function getDisplayPropertiesForGetAll()
+ {
+ $setGetAllHtmlPrefix = array($this, 'setGetAllHtmlPrefix');
+ return array(
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate('Referers_Referrer')),
+ 'show_goals' => true,
+ 'filter_limit' => 20,
+ 'custom_parameters' => array('disable_row_actions' => '1'),
+ 'filters' => array(
+ array('MetadataCallbackAddMetadata', array('referrer_type', 'html_label_prefix', $setGetAllHtmlPrefix))
+ )
+ );
+ }
+
+ private function getDisplayPropertiesForGetKeywords()
+ {
+ return array(
+ 'subtable_controller_action' => 'getSearchEnginesFromKeywordId',
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnKeyword')),
+ 'show_goals' => true,
+ 'filter_limit' => 25,
+ 'disable_subtable_when_show_goals' => true,
+ );
+ }
+
+ private function getDisplayPropertiesForGetSearchEnginesFromKeywordId()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnSearchEngine'))
+ );
+ }
+
+ private function getDisplayPropertiesForGetSearchEngines()
+ {
+ return array(
+ 'subtable_controller_action' => 'getKeywordsFromSearchEngineId',
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'show_goals' => true,
+ 'filter_limit' => 25,
+ 'disable_subtable_when_show_goals' => true,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnSearchEngine'))
+ );
+ }
+
+ private function getDisplayPropertiesForGetKeywordsFromSearchEngineId()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnKeyword'))
+ );
+ }
+
+ private function getDisplayPropertiesForGetWebsites()
+ {
+ return array(
+ 'subtable_controller_action' => 'getUrlsFromWebsiteId',
+ 'show_exclude_low_population' => false,
+ 'show_goals' => true,
+ 'filter_limit' => 25,
+ 'disable_subtable_when_show_goals' => true,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnWebsite'))
+ );
+ }
+
+ private function getDisplayPropertiesForGetSocials()
+ {
+ $result = array(
+ 'default_view_type' => 'graphPie',
+ 'subtable_controller_action' => 'getUrlsForSocial',
+ 'show_exclude_low_population' => false,
+ 'filter_limit' => 10,
+ 'show_goals' => true,
+ 'disable_subtable_when_show_goals' => true,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnSocial'))
+ );
+
+ $widget = Piwik_Common::getRequestVar('widget', false);
+ if (empty($widget)) {
+ $result['show_footer_message'] = Piwik_Translate('Referers_SocialFooterMessage');
+ }
+
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetUrlsForSocial()
+ {
+ return array(
+ 'show_exclude_low_population' => false,
+ 'filter_limit' => 10,
+ 'show_goals' => true,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnWebsitePage'))
+ );
+ }
+
+ private function getDisplayPropertiesForGetCampaigns()
+ {
+ $help = Piwik_Translate('Referers_CampaignFooterHelp',
+ array('<a target="_blank" href="http://piwik.org/docs/tracking-campaigns/">',
+ '</a> - <a target="_blank" href="http://piwik.org/docs/tracking-campaigns/url-builder/">',
+ '</a>')
+ );
+
+ return array(
+ 'subtable_controller_action' => 'getKeywordsFromCampaignId',
+ 'show_exclude_low_population' => false,
+ 'show_goals' => true,
+ 'filter_limit' => 25,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnCampaign')),
+ 'show_footer_message' => $help,
+ );
+ }
+
+ private function getDisplayPropertiesForGetKeywordsFromCampaignId()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnKeyword'))
+ );
+ }
+
+ private function getDisplayPropertiesForGetUrlsFromWebsiteId()
+ {
+ return array(
+ 'show_search' => false,
+ 'show_exclude_low_population' => false,
+ 'translations' => array('label' => Piwik_Translate('Referers_ColumnWebsitePage')),
+ 'tooltip_metadata_name' => 'url'
+ );
+ }
+
+ /**
+ * DataTable filter callback that returns the HTML prefix for a label in the
+ * 'getAll' report based on the row's referrer type.
+ *
+ * @param int $referrerType The referrer type.
+ * @return string
+ */
+ public function setGetAllHtmlPrefix($referrerType)
+ {
+ // get singular label for referrer type
+ $indexTranslation = '';
+ switch ($referrerType) {
+ case Piwik_Common::REFERER_TYPE_DIRECT_ENTRY:
+ $indexTranslation = 'Referers_DirectEntry';
+ break;
+ case Piwik_Common::REFERER_TYPE_SEARCH_ENGINE:
+ $indexTranslation = 'Referers_ColumnKeyword';
+ break;
+ case Piwik_Common::REFERER_TYPE_WEBSITE:
+ $indexTranslation = 'Referers_ColumnWebsite';
+ break;
+ case Piwik_Common::REFERER_TYPE_CAMPAIGN:
+ $indexTranslation = 'Referers_ColumnCampaign';
+ break;
+ default:
+ // case of newsletter, partners, before Piwik 0.2.25
+ $indexTranslation = 'General_Others';
+ break;
+ }
+
+ $label = strtolower(Piwik_Translate($indexTranslation));
+
+ // return html that displays it as grey & italic
+ return '<span class="datatable-label-category"><em>(' . $label . ')</em></span>';
+ }
}
diff --git a/plugins/Transitions/javascripts/transitions.js b/plugins/Transitions/javascripts/transitions.js
index 6f0a633bec..da6c8a8bc2 100644
--- a/plugins/Transitions/javascripts/transitions.js
+++ b/plugins/Transitions/javascripts/transitions.js
@@ -415,10 +415,10 @@ Piwik_Transitions.prototype.renderLoops = function () {
Piwik_Transitions.prototype.renderEntries = function (onlyBg) {
if (this.model.directEntries > 0) {
var self = this;
- var gradient = this.canvas.createHorizontalGradient('#FFFFFF', '#BACFE8', 'left');
- if (this.highlightedGroup == 'directEntries') {
- gradient = this.canvas.createHorizontalGradient('#FFFFFF', '#FAD293', 'left');
- }
+
+ var isHighlighted = this.highlightedGroup == 'directEntries';
+ var gradient = this.canvas.createHorizontalGradient('entries', 'left', isHighlighted);
+
this.canvas.renderBox({
side: 'left',
onlyBg: onlyBg,
@@ -442,10 +442,10 @@ Piwik_Transitions.prototype.renderEntries = function (onlyBg) {
Piwik_Transitions.prototype.renderExits = function (onlyBg) {
if (this.model.exits > 0) {
var self = this;
- var gradient = this.canvas.createHorizontalGradient('#FFFFFF', '#BACFE8', 'right');
- if (this.highlightedGroup == 'exits') {
- gradient = this.canvas.createHorizontalGradient('#FFFFFF', '#FAD293', 'right');
- }
+
+ var isHighlighted = this.highlightedGroup == 'exits';
+ var gradient = this.canvas.createHorizontalGradient('exits', 'right', isHighlighted);
+
this.canvas.renderBox({
side: 'right',
onlyBg: onlyBg,
@@ -481,12 +481,10 @@ Piwik_Transitions.prototype.renderOpenGroup = function (groupName, side, onlyBg)
var details = self.model.getDetailsForGroup(groupName);
// prepare gradients
- var gradientItems = this.canvas.createHorizontalGradient('#E3DFD1', '#E8E4D5', side);
- var gradientOthers = this.canvas.createHorizontalGradient('#F5F3EB', '#E8E4D5', side);
- var gradientBackground = this.canvas.createHorizontalGradient('#FFFFFF', '#BACFE8', side);
- if (groupName == this.highlightedGroup) {
- gradientBackground = this.canvas.createHorizontalGradient('#FFFFFF', '#FAD293', side);
- }
+ var gradientItems = this.canvas.createHorizontalGradient('items', side);
+ var gradientOthers = this.canvas.createHorizontalGradient('others', side);
+ var gradientBackground =
+ this.canvas.createHorizontalGradient('background', side, groupName == this.highlightedGroup);
// remember current offsets to reset them later for drawing the background
var boxPositionBefore, curvePositionBefore;
@@ -600,10 +598,9 @@ Piwik_Transitions.prototype.renderOpenGroup = function (groupName, side, onlyBg)
/** Render a closed group without detailed data, only one box for the sum */
Piwik_Transitions.prototype.renderClosedGroup = function (groupName, side, onlyBg) {
var self = this;
- var gradient = this.canvas.createHorizontalGradient('#DDE4ED', '#9BBADE', side);
- if (groupName == this.highlightedGroup) {
- gradient = this.canvas.createHorizontalGradient('#FAE2C0', '#FAD293', side);
- }
+
+ var isHighlighted = groupName == this.highlightedGroup;
+ var gradient = this.canvas.createHorizontalGradient('closed-group', side, isHighlighted);
var nbTransitionsVarName = groupName + 'NbTransitions';
@@ -782,6 +779,16 @@ function Piwik_Transitions_Canvas(canvasBgLeft, canvasBgRight, canvasLeft, canva
this.rightBoxEndX = this.width;
this.rightBoxBeginX = this.rightCurveEndX = this.rightBoxEndX - this.boxWidth;
this.rightCurveBeginX = this.rightCurveEndX - this.curveWidth;
+
+ // load gradient colors from CSS
+ this.colors = {};
+
+ var transitionsColorNamespaces = ['entries', 'exits', 'background', 'closed-group', 'items', 'others', 'loops'];
+ var gradientColorNames = ['light', 'dark', 'light-highlighted', 'dark-highlighted'];
+ for (var i = 0; i != transitionsColorNamespaces.length; ++i) {
+ var namespace = 'transition-' + transitionsColorNamespaces[i];
+ this.colors[namespace] = piwik.ColorManager.getColors(namespace, gradientColorNames);
+ }
}
/**
@@ -800,13 +807,22 @@ Piwik_Transitions_Canvas.prototype.isNarrowMode = function () {
/**
* Helper to create horizontal gradients
- *
+ * TODO
* @param lightColor
* @param darkColor
* @param position left|right
*/
-Piwik_Transitions_Canvas.prototype.createHorizontalGradient = function (lightColor, darkColor, position) {
- var fromX, toX, fromColor, toColor;
+Piwik_Transitions_Canvas.prototype.createHorizontalGradient = function (colorGroup, position, isHighlighted) {
+ var fromX, toX, fromColor, toColor, lightColor, darkColor;
+
+ colorGroup = 'transition-' + colorGroup;
+ if (isHighlighted) {
+ lightColor = this.colors[colorGroup]['light-highlighted'];
+ darkColor = this.colors[colorGroup]['dark-highlighted'];
+ } else {
+ lightColor = this.colors[colorGroup]['light'];
+ darkColor = this.colors[colorGroup]['dark'];
+ }
if (position == 'left') {
// gradient is used to fill a box on the left
@@ -1109,8 +1125,8 @@ Piwik_Transitions_Canvas.prototype.renderLoops = function (share) {
// create gradient
var gradient = this.contextLoops.createLinearGradient(this.leftCurveEndX - 50, 0, this.rightCurveBeginX + 50, 0);
- var light = '#F5F3EB';
- var dark = '#E8E4D5';
+ var light = this.colors['transition-loops']['light'];
+ var dark = this.colors['transition-loops']['dark'];
gradient.addColorStop(0, dark);
gradient.addColorStop(.5, light);
gradient.addColorStop(1, dark);
diff --git a/plugins/UserCountry/Controller.php b/plugins/UserCountry/Controller.php
index 1fcd911832..0faed8db82 100644
--- a/plugins/UserCountry/Controller.php
+++ b/plugins/UserCountry/Controller.php
@@ -24,7 +24,7 @@ use Piwik\Url;
*/
class Piwik_UserCountry_Controller extends Admin
{
- function index()
+ public function index()
{
$view = new View('@UserCountry/index');
@@ -39,7 +39,7 @@ class Piwik_UserCountry_Controller extends Admin
echo $view->render();
}
- function adminIndex()
+ public function adminIndex()
{
Piwik::checkUserIsSuperUser();
$view = new View('@UserCountry/adminIndex');
@@ -319,23 +319,14 @@ class Piwik_UserCountry_Controller extends Admin
echo $location;
}
- function getCountry($fetch = false)
+ public function getCountry($fetch = false)
{
- $view = $this->getStandardDataTableUserCountry(__FUNCTION__, "UserCountry.getCountry");
- $view->setLimit(5);
- $view->setColumnTranslation('label', Piwik_Translate('UserCountry_Country'));
- $view->setReportDocumentation(Piwik_Translate('UserCountry_getCountryDocumentation'));
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getContinent($fetch = false)
+ public function getContinent($fetch = false)
{
- $view = $this->getStandardDataTableUserCountry(__FUNCTION__, "UserCountry.getContinent", 'table');
- $view->disableSearchBox();
- $view->disableOffsetInformationAndPaginationControls();
- $view->setColumnTranslation('label', Piwik_Translate('UserCountry_Continent'));
- $view->setReportDocumentation(Piwik_Translate('UserCountry_getContinentDocumentation'));
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -346,13 +337,7 @@ class Piwik_UserCountry_Controller extends Admin
*/
public function getRegion($fetch = false)
{
- $view = $this->getStandardDataTableUserCountry(__FUNCTION__, "UserCountry.getRegion");
- $view->setLimit(5);
- $view->setColumnTranslation('label', Piwik_Translate('UserCountry_Region'));
- $view->setReportDocumentation(Piwik_Translate('UserCountry_getRegionDocumentation') . '<br/>'
- . $this->getGeoIPReportDocSuffix());
- $this->checkIfNoDataForGeoIpReport($view);
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -363,47 +348,15 @@ class Piwik_UserCountry_Controller extends Admin
*/
public function getCity($fetch = false)
{
- $view = $this->getStandardDataTableUserCountry(__FUNCTION__, "UserCountry.getCity");
- $view->setLimit(5);
- $view->setColumnTranslation('label', Piwik_Translate('UserCountry_City'));
- $view->setReportDocumentation(Piwik_Translate('UserCountry_getCityDocumentation') . '<br/>'
- . $this->getGeoIPReportDocSuffix());
- $this->checkIfNoDataForGeoIpReport($view);
- return $this->renderView($view, $fetch);
- }
-
- private function getGeoIPReportDocSuffix()
- {
- return Piwik_Translate('UserCountry_GeoIPDocumentationSuffix', array(
- '<a target="_blank" href="http://www.maxmind.com/?rId=piwik">',
- '</a>',
- '<a target="_blank" href="http://www.maxmind.com/en/city_accuracy?rId=piwik">',
- '</a>'
- ));
- }
-
- protected function getStandardDataTableUserCountry($currentControllerAction,
- $APItoCall,
- $defaultDatatableType = null)
- {
- $view = ViewDataTable::factory($defaultDatatableType);
- $view->init($this->pluginName, $currentControllerAction, $APItoCall);
- $view->disableExcludeLowPopulation();
-
- $this->setPeriodVariablesView($view);
- $this->setMetricsVariablesView($view);
-
- $view->enableShowGoals();
-
- return $view;
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
- function getNumberOfDistinctCountries($fetch = false)
+ public function getNumberOfDistinctCountries($fetch = false)
{
return $this->getNumericValue('UserCountry.getNumberOfDistinctCountries');
}
- function getLastDistinctCountriesGraph($fetch = false)
+ public function getLastDistinctCountriesGraph($fetch = false)
{
$view = $this->getLastUnitGraph('UserCountry', __FUNCTION__, "UserCountry.getNumberOfDistinctCountries");
$view->setColumnsToDisplay('UserCountry_distinctCountries');
@@ -411,50 +364,6 @@ class Piwik_UserCountry_Controller extends Admin
}
/**
- * Checks if a datatable for a view is empty and if so, displays a message in the footer
- * telling users to configure GeoIP.
- */
- private function checkIfNoDataForGeoIpReport($view)
- {
- // only display on HTML tables since the datatable for HTML graphs aren't accessible
- if (!($view instanceof Piwik_ViewDataTable_HtmlTable)) {
- return;
- }
-
- // if there's only one row whose label is 'Unknown', display a message saying there's no data
- $view->main();
- $dataTable = $view->getDataTable();
- if ($dataTable->getRowsCount() == 1
- && $dataTable->getFirstRow()->getColumn('label') == Piwik_Translate('General_Unknown')
- ) {
- $footerMessage = Piwik_Translate('UserCountry_NoDataForGeoIPReport1');
-
- // if GeoIP is working, don't display this part of the message
- if (!$this->isGeoIPWorking()) {
- $params = array('module' => 'UserCountry', 'action' => 'adminIndex');
- $footerMessage .= ' ' . Piwik_Translate('UserCountry_NoDataForGeoIPReport2', array(
- '<a target="_blank" href="' . Url::getCurrentQueryStringWithParametersModified($params) . '">',
- '</a>',
- '<a target="_blank" href="http://dev.maxmind.com/geoip/geolite?rId=piwik">',
- '</a>'
- ));
- } else {
- $footerMessage .= ' ' . Piwik_Translate('UserCountry_ToGeolocateOldVisits', array(
- '<a target="_blank" href="http://piwik.org/faq/how-to/#faq_167">',
- '</a>'
- ));
- }
-
- // HACK! Can't use setFooterMessage because the view gets built in the main function,
- // so instead we set the property by hand.
- $realView = $view->getView();
- $properties = $realView->properties;
- $properties['show_footer_message'] = $footerMessage;
- $realView->properties = $properties;
- }
- }
-
- /**
* Gets information for the first missing GeoIP database (if any).
*
* @return bool
@@ -476,17 +385,4 @@ class Piwik_UserCountry_Controller extends Admin
}
return false;
}
-
- /**
- * Returns true if a GeoIP provider is installed & working, false if otherwise.
- *
- * @return bool
- */
- private function isGeoIPWorking()
- {
- $provider = Piwik_UserCountry_LocationProvider::getCurrentProvider();
- return $provider instanceof Piwik_UserCountry_LocationProvider_GeoIp
- && $provider->isAvailable() === true
- && $provider->isWorking() === true;
- }
-}
+} \ No newline at end of file
diff --git a/plugins/UserCountry/UserCountry.php b/plugins/UserCountry/UserCountry.php
index bd970a6ec7..37566f19d6 100644
--- a/plugins/UserCountry/UserCountry.php
+++ b/plugins/UserCountry/UserCountry.php
@@ -43,6 +43,7 @@ class Piwik_UserCountry extends Plugin
'AssetManager.getJsFiles' => 'getJsFiles',
'Tracker.getVisitorLocation' => 'getVisitorLocation',
'TaskScheduler.getScheduledTasks' => 'getScheduledTasks',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
return $hooks;
}
@@ -88,7 +89,7 @@ class Piwik_UserCountry extends Plugin
Common::printDebug("GEO: Found IP location (provider '" . $id . "'): " . var_export($location, true));
}
- function addWidgets()
+ public function addWidgets()
{
$widgetContinentLabel = Piwik_Translate('UserCountry_WidgetLocation')
. ' (' . Piwik_Translate('UserCountry_Continent') . ')';
@@ -105,7 +106,7 @@ class Piwik_UserCountry extends Plugin
WidgetsList::add('General_Visitors', $widgetCityLabel, 'UserCountry', 'getCity');
}
- function addMenu()
+ public function addMenu()
{
Piwik_AddMenu('General_Visitors', 'UserCountry_SubmenuLocations', array('module' => 'UserCountry', 'action' => 'index'));
}
@@ -113,7 +114,7 @@ class Piwik_UserCountry extends Plugin
/**
* Event handler. Adds menu items to the Admin menu.
*/
- function addAdminMenu()
+ public function addAdminMenu()
{
Piwik_AddAdminSubMenu('General_Settings', 'UserCountry_Geolocation',
array('module' => 'UserCountry', 'action' => 'adminIndex'),
@@ -282,4 +283,119 @@ class Piwik_UserCountry extends Plugin
return array('SQL' => "'" . implode("', '", $result) . "', ?",
'bind' => '-'); // HACK: SegmentExpression requires a $bind, even if there's nothing to bind
}
+
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['UserCountry.getCountry'] = $this->getDisplayPropertiesForGetCountry();
+ $properties['UserCountry.getContinent'] = $this->getDisplayPropertiesForGetContinent();
+ $properties['UserCountry.getRegion'] = $this->getDisplayPropertiesForGetRegion();
+ $properties['UserCountry.getCity'] = $this->getDisplayPropertiesForGetCity();
+ }
+
+ private function getDisplayPropertiesForGetCountry()
+ {
+ return array(
+ 'show_exclude_low_population' => false,
+ 'show_goals' => true,
+ 'filter_limit' => 5,
+ 'translations' => array('label' => Piwik_Translate('UserCountry_Country')),
+ 'documentation' => Piwik_Translate('UserCountry_getCountryDocumentation')
+ );
+ }
+
+ private function getDisplayPropertiesForGetContinent()
+ {
+ return array(
+ 'show_exclude_low_population' => false,
+ 'show_goals' => true,
+ 'show_search' => false,
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'translations' => array('label' => Piwik_Translate('UserCountry_Continent')),
+ 'documentation' => Piwik_Translate('UserCountry_getContinentDocumentation')
+ );
+ }
+
+ private function getDisplayPropertiesForGetRegion()
+ {
+ $result = array(
+ 'show_exclude_low_population' => false,
+ 'show_goals' => true,
+ 'filter_limit' => 5,
+ 'translations' => array('label' => Piwik_Translate('UserCountry_Region')),
+ 'documentation' => Piwik_Translate('UserCountry_getRegionDocumentation') . '<br/>'
+ . $this->getGeoIPReportDocSuffix()
+ );
+ $this->checkIfNoDataForGeoIpReport($result);
+ return $result;
+ }
+
+ private function getDisplayPropertiesForGetCity()
+ {
+ $result = array(
+ 'show_exclude_low_population' => false,
+ 'show_goals' => true,
+ 'filter_limit' => 5,
+ 'translations' => array('label' => Piwik_Translate('UserCountry_City')),
+ 'documentation' => Piwik_Translate('UserCountry_getCityDocumentation') . '<br/>'
+ . $this->getGeoIPReportDocSuffix()
+ );
+ $this->checkIfNoDataForGeoIpReport($result);
+ return $result;
+ }
+
+ private function getGeoIPReportDocSuffix()
+ {
+ return Piwik_Translate('UserCountry_GeoIPDocumentationSuffix',
+ array('<a target="_blank" href="http://www.maxmind.com/?rId=piwik">',
+ '</a>',
+ '<a target="_blank" href="http://www.maxmind.com/en/city_accuracy?rId=piwik">',
+ '</a>')
+ );
+ }
+
+ /**
+ * Checks if a datatable for a view is empty and if so, displays a message in the footer
+ * telling users to configure GeoIP.
+ */
+ private function checkIfNoDataForGeoIpReport(&$properties)
+ {
+ $self = $this;
+ $properties['filters'][] = function ($dataTable, $view) use ($self) {
+ // if there's only one row whose label is 'Unknown', display a message saying there's no data
+ if ($dataTable->getRowsCount() == 1
+ && $dataTable->getFirstRow()->getColumn('label') == Piwik_Translate('General_Unknown')
+ ) {
+ $footerMessage = Piwik_Translate('UserCountry_NoDataForGeoIPReport1');
+
+ // if GeoIP is working, don't display this part of the message
+ if (!$self->isGeoIPWorking()) {
+ $params = array('module' => 'UserCountry', 'action' => 'adminIndex');
+ $footerMessage .= ' ' . Piwik_Translate('UserCountry_NoDataForGeoIPReport2',
+ array('<a target="_blank" href="' . Piwik_Url::getCurrentQueryStringWithParametersModified($params) . '">',
+ '</a>',
+ '<a target="_blank" href="http://dev.maxmind.com/geoip/geolite?rId=piwik">',
+ '</a>'));
+ } else {
+ $footerMessage .= ' ' . Piwik_Translate('UserCountry_ToGeolocateOldVisits',
+ array('<a target="_blank" href="http://piwik.org/faq/how-to/#faq_167">', '</a>'));
+ }
+
+ $view->setFooterMessage($footerMessage);
+ }
+ };
+ }
+
+ /**
+ * Returns true if a GeoIP provider is installed & working, false if otherwise.
+ *
+ * @return bool
+ */
+ public function isGeoIPWorking()
+ {
+ $provider = Piwik_UserCountry_LocationProvider::getCurrentProvider();
+ return $provider instanceof Piwik_UserCountry_LocationProvider_GeoIp
+ && $provider->isAvailable() === true
+ && $provider->isWorking() === true;
+ }
}
diff --git a/plugins/UserCountryMap/Controller.php b/plugins/UserCountryMap/Controller.php
index a70e3a83d7..1470a5e4cf 100644
--- a/plugins/UserCountryMap/Controller.php
+++ b/plugins/UserCountryMap/Controller.php
@@ -157,7 +157,7 @@ class Piwik_UserCountryMap_Controller extends Controller
{
$params['format'] = 'json';
$params['showRawMetrics'] = 1;
- $segment = ViewDataTable::getRawSegmentFromRequest();
+ $segment = \Piwik\API\Request::getRawSegmentFromRequest();
if(!empty($segment)) {
$params['segment'] = $segment;
}
@@ -207,7 +207,7 @@ class Piwik_UserCountryMap_Controller extends Controller
. "&period=" . $period
. "&date=" . $date
. "&token_auth=" . $token_auth
- . "&segment=" . ViewDataTable::getRawSegmentFromRequest()
+ . "&segment=" . \Piwik\API\Request::getRawSegmentFromRequest()
. "&enable_filter_excludelowpop=1"
. "&showRawMetrics=1";
diff --git a/plugins/UserSettings/Archiver.php b/plugins/UserSettings/Archiver.php
index cdfa858d6e..8ce5c83b88 100644
--- a/plugins/UserSettings/Archiver.php
+++ b/plugins/UserSettings/Archiver.php
@@ -18,7 +18,12 @@ use Piwik\PluginsArchiver;
require_once PIWIK_INCLUDE_PATH . '/plugins/UserSettings/functions.php';
-class Piwik_UserSettings_Archiver extends PluginsArchiver
+/**
+ * Archiver for UserSettings Plugin
+ *
+ * @see Piwik_PluginsArchiver
+ */
+class Piwik_UserSettings_Archiver extends Piwik_PluginsArchiver
{
const LANGUAGE_RECORD_NAME = 'UserSettings_language';
const PLUGIN_RECORD_NAME = 'UserSettings_plugin';
diff --git a/plugins/UserSettings/Controller.php b/plugins/UserSettings/Controller.php
index 086cd020e7..b064e3b5b8 100644
--- a/plugins/UserSettings/Controller.php
+++ b/plugins/UserSettings/Controller.php
@@ -36,56 +36,56 @@ class Piwik_UserSettings_Controller extends Controller
public function getResolution($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getConfiguration($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getOS($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getOSFamily($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getMobileVsDesktop($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getBrowserVersion($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getBrowser($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getBrowserType($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getWideScreen($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getPlugin($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getLanguage($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
}
diff --git a/plugins/UserSettings/UserSettings.php b/plugins/UserSettings/UserSettings.php
index 1c71dc5a1e..3795d0d6fd 100644
--- a/plugins/UserSettings/UserSettings.php
+++ b/plugins/UserSettings/UserSettings.php
@@ -173,7 +173,7 @@ class Piwik_UserSettings extends Plugin
return $hooks;
}
- public function getReportDisplayProperties(&$properties, $apiAction)
+ public function getReportDisplayProperties(&$properties)
{
$basicUserSettingsProperties = array('show_search' => false,
'show_exclude_low_population' => false,
@@ -195,94 +195,88 @@ class Piwik_UserSettings extends Plugin
'UserSettings.getWideScreen' => Piwik_Translate('UserSettings_ColumnTypeOfScreen')
);
- $reportViewProperties = array(
- 'UserSettings.getResolution' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnResolution'))
- )),
+ $properties['UserSettings.getResolution'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnResolution'))
+ ));
- 'UserSettings.getConfiguration' => array_merge($basicUserSettingsProperties, array(
- 'filter_limit' => 3,
- 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnConfiguration'))
- )),
+ $properties['UserSettings.getConfiguration'] = array_merge($basicUserSettingsProperties, array(
+ 'filter_limit' => 3,
+ 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnConfiguration'))
+ ));
- 'UserSettings.getOS' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnOperatingSystem')),
- 'title' => Piwik_Translate('UserSettings_OperatingSystems'),
- 'relatedReports' => $osRelatedReports
- )),
+ $properties['UserSettings.getOS'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnOperatingSystem')),
+ 'title' => Piwik_Translate('UserSettings_OperatingSystems'),
+ 'relatedReports' => $osRelatedReports
+ ));
- 'UserSettings.getOSFamily' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_OperatingSystemFamily')),
- 'title' => Piwik_Translate('UserSettings_OperatingSystemFamily'),
- 'relatedReports' => $osRelatedReports
- )),
+ $properties['UserSettings.getOSFamily'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_OperatingSystemFamily')),
+ 'title' => Piwik_Translate('UserSettings_OperatingSystemFamily'),
+ 'relatedReports' => $osRelatedReports
+ ));
- 'UserSettings.getBrowserVersion' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnBrowserVersion')),
- 'graph_limit' => 7,
- 'title' => Piwik_Translate('UserSettings_ColumnBrowserVersion'),
- 'relatedReports' => $browserRelatedReports
- )),
+ $properties['UserSettings.getBrowserVersion'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnBrowserVersion')),
+ 'graph_limit' => 7,
+ 'title' => Piwik_Translate('UserSettings_ColumnBrowserVersion'),
+ 'relatedReports' => $browserRelatedReports
+ ));
- 'UserSettings.getBrowser' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnBrowser')),
- 'graph_limit' => 7,
- 'title' => Piwik_Translate('UserSettings_Browsers'),
- 'relatedReports' => $browserRelatedReports
- )),
+ $properties['UserSettings.getBrowser'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnBrowser')),
+ 'graph_limit' => 7,
+ 'title' => Piwik_Translate('UserSettings_Browsers'),
+ 'relatedReports' => $browserRelatedReports
+ ));
- 'UserSettings.getBrowserType' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnBrowserFamily')),
- 'show_offset_information' => false,
- 'show_pagination_control' => false,
- 'default_view_type' => 'graphPie',
- )),
+ $properties['UserSettings.getBrowserType'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnBrowserFamily')),
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'default_view_type' => 'graphPie',
+ ));
- 'UserSettings.getWideScreen' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnTypeOfScreen')),
- 'show_offset_information' => false,
- 'show_pagination_control' => false,
- 'title' => Piwik_Translate('UserSettings_ColumnTypeOfScreen'),
- 'relatedReports' => $wideScreenDeviceTypeRelatedReports
- )),
+ $properties['UserSettings.getWideScreen'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_ColumnTypeOfScreen')),
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'title' => Piwik_Translate('UserSettings_ColumnTypeOfScreen'),
+ 'relatedReports' => $wideScreenDeviceTypeRelatedReports
+ ));
- 'UserSettings.getMobileVsDesktop' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array('label' => Piwik_Translate('UserSettings_MobileVsDesktop')),
- 'title' => Piwik_Translate('UserSettings_MobileVsDesktop'),
- 'relatedReports' => $wideScreenDeviceTypeRelatedReports
- )),
-
- 'UserSettings.getPlugin' => array_merge($basicUserSettingsProperties, array(
- 'translations' => array(
- 'label' => Piwik_Translate('UserSettings_ColumnPlugin'),
- 'nb_visits_percentage' =>
- str_replace(' ', '&nbsp;', Piwik_Translate('General_ColumnPercentageVisits'))
- ),
- 'show_offset_information' => false,
- 'show_pagination_control' => false,
- 'show_all_views_icons' => false,
- 'show_table_all_columns' => false,
- 'columns_to_display' => array('label', 'nb_visits_percentage', 'nb_visits'),
- 'filter_sort_column' => 'nb_visits_percentage',
- 'filter_sort_order' => 'desc',
- 'filter_limit' => 10,
- 'show_footer_message' => Piwik_Translate('UserSettings_PluginDetectionDoesNotWorkInIE'),
- )),
-
- 'UserSettings.getLanguage' => array(
- 'translations' => array('label' => Piwik_Translate('General_Language')),
- 'filter_sort_column' => 'nb_visits',
- 'filter_sort_order' => 'desc',
- 'show_search' => false,
- 'filter_limit' => false,
- 'columns_to_display' => array('label', 'nb_visits'),
- 'show_exclude_low_population' => false,
+ $properties['UserSettings.getMobileVsDesktop'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array('label' => Piwik_Translate('UserSettings_MobileVsDesktop')),
+ 'title' => Piwik_Translate('UserSettings_MobileVsDesktop'),
+ 'relatedReports' => $wideScreenDeviceTypeRelatedReports
+ ));
+
+ $properties['UserSettings.getPlugin'] = array_merge($basicUserSettingsProperties, array(
+ 'translations' => array(
+ 'label' => Piwik_Translate('UserSettings_ColumnPlugin'),
+ 'nb_visits_percentage' =>
+ str_replace(' ', '&nbsp;', Piwik_Translate('General_ColumnPercentageVisits'))
),
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'show_all_views_icons' => false,
+ 'show_table_all_columns' => false,
+ 'columns_to_display' => array('label', 'nb_visits_percentage', 'nb_visits'),
+ 'filter_sort_column' => 'nb_visits_percentage',
+ 'filter_sort_order' => 'desc',
+ 'filter_limit' => 10,
+ 'show_footer_message' => Piwik_Translate('UserSettings_PluginDetectionDoesNotWorkInIE'),
+ ));
+
+ $properties['UserSettings.getLanguage'] = array(
+ 'translations' => array('label' => Piwik_Translate('General_Language')),
+ 'filter_sort_column' => 'nb_visits',
+ 'filter_sort_order' => 'desc',
+ 'show_search' => false,
+ 'filter_limit' => false,
+ 'columns_to_display' => array('label', 'nb_visits'),
+ 'show_exclude_low_population' => false,
);
-
- if (isset($reportViewProperties[$apiAction])) {
- $properties = $reportViewProperties[$apiAction];
- }
}
/**
diff --git a/plugins/VisitFrequency/templates/index.twig b/plugins/VisitFrequency/templates/index.twig
index f3af02c1ad..d701bdae33 100644
--- a/plugins/VisitFrequency/templates/index.twig
+++ b/plugins/VisitFrequency/templates/index.twig
@@ -1,6 +1,6 @@
{{ postEvent("template_headerVisitsFrequency") }}
-<h2 data-graph-id="VisitFrequencygetEvolutionGraph">{{ 'VisitFrequency_ColumnReturningVisits'|translate }}</h2>
+<h2 data-graph-id="VisitFrequency.getEvolutionGraph">{{ 'VisitFrequency_ColumnReturningVisits'|translate }}</h2>
{{ graphEvolutionVisitFrequency|raw }}
<br/>
diff --git a/plugins/VisitTime/Controller.php b/plugins/VisitTime/Controller.php
index 1cc2169741..97698e1de8 100644
--- a/plugins/VisitTime/Controller.php
+++ b/plugins/VisitTime/Controller.php
@@ -28,16 +28,16 @@ class Piwik_VisitTime_Controller extends Controller
public function getVisitInformationPerServerTime($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getVisitInformationPerLocalTime($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getByDayOfWeek($fetch = false)
{
- return ViewDataTable::render($this->pluginName, __FUNCTION__, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
}
diff --git a/plugins/VisitTime/VisitTime.php b/plugins/VisitTime/VisitTime.php
index f4e4232d39..c1285f61cd 100644
--- a/plugins/VisitTime/VisitTime.php
+++ b/plugins/VisitTime/VisitTime.php
@@ -117,7 +117,7 @@ class Piwik_VisitTime extends Plugin
);
}
- public function getReportDisplayProperties(&$properties, $apiAction)
+ public function getReportDisplayProperties(&$properties)
{
$commonProperties = array(
'filter_sort_column' => 'label',
@@ -129,45 +129,39 @@ class Piwik_VisitTime extends Plugin
'default_view_type' => 'graphVerticalBar'
);
- $reportViewProperties = array(
- 'VisitTime.getVisitInformationPerServerTime' => array_merge($commonProperties, array(
- 'filter_limit' => 24,
- 'graph_limit' => null,
- 'show_goals' => true,
- 'translations' => array('label' => Piwik_Translate('VisitTime_ColumnServerTime')),
-
- // custom parameter
- 'hideFutureHoursWhenToday' => 1,
- )),
+ $properties['VisitTime.getVisitInformationPerServerTime'] = array_merge($commonProperties, array(
+ 'filter_limit' => 24,
+ 'graph_limit' => null,
+ 'show_goals' => true,
+ 'translations' => array('label' => Piwik_Translate('VisitTime_ColumnServerTime')),
- 'VisitTime.getVisitInformationPerLocalTime' => array_merge($commonProperties, array(
- 'filter_limit' => 24,
- 'graph_limit' => null,
- 'title' => Piwik_Translate('VisitTime_ColumnLocalTime'),
- 'translations' => array('label' => Piwik_Translate('VisitTime_LocalTime')),
- )),
+ // custom parameter
+ 'hideFutureHoursWhenToday' => 1,
+ ));
- 'VisitTime.getByDayOfWeek' => array_merge($commonProperties, array(
- 'filter_limit' => 7,
- 'graph_limit' => null,
- 'enable_sort' => false,
- 'show_all_ticks' => true,
- 'show_footer_message' =>
- Piwik_Translate('General_ReportGeneratedFrom', self::getDateRangeForFooterMessage()),
- 'translations' => array('label' => Piwik_Translate('VisitTime_DayOfWeek')),
- )),
- );
+ $properties['VisitTime.getVisitInformationPerLocalTime'] = array_merge($commonProperties, array(
+ 'filter_limit' => 24,
+ 'graph_limit' => null,
+ 'title' => Piwik_Translate('VisitTime_ColumnLocalTime'),
+ 'translations' => array('label' => Piwik_Translate('VisitTime_LocalTime')),
+ ));
+
+ $properties['VisitTime.getByDayOfWeek'] = array_merge($commonProperties, array(
+ 'filter_limit' => 7,
+ 'graph_limit' => null,
+ 'enable_sort' => false,
+ 'show_all_ticks' => true,
+ 'show_footer_message' =>
+ Piwik_Translate('General_ReportGeneratedFrom', self::getDateRangeForFooterMessage()),
+ 'translations' => array('label' => Piwik_Translate('VisitTime_DayOfWeek')),
+ ));
// add the visits by day of week as a related report, if the current period is not 'day'
if (Common::getRequestVar('period', 'day') != 'day') {
- $reportViewProperties['VisitTime.getVisitInformationPerLocalTime']['relatedReports'] = array(
+ $properties['VisitTime.getVisitInformationPerLocalTime']['relatedReports'] = array(
'VisitTime.getByDayOfWeek' => Piwik_Translate('VisitTime_VisitsByDayOfWeek')
);
}
-
- if (isset($reportViewProperties[$apiAction])) {
- $properties = $reportViewProperties[$apiAction];
- }
}
public function archivePeriod(ArchiveProcessor\Period $archiveProcessor)
@@ -190,12 +184,16 @@ class Piwik_VisitTime extends Plugin
private static function getDateRangeForFooterMessage()
{
// get query params
- $idSite = Common::getRequestVar('idSite');
- $date = Common::getRequestVar('date');
- $period = Common::getRequestVar('period');
+ $idSite = Common::getRequestVar('idSite', false);
+ $date = Common::getRequestVar('date', false);
+ $period = Common::getRequestVar('period', false);
// create a period instance
- $oPeriod = Period::makePeriodFromQueryParams(Site::getTimezoneFor($idSite), $period, $date);
+ try {
+ $oPeriod = Period::makePeriodFromQueryParams(Piwik_Site::getTimezoneFor($idSite), $period, $date);
+ } catch (Exception $ex) {
+ return ''; // if query params are incorrect, forget about the footer message
+ }
// set the footer message using the period start & end date
$start = $oPeriod->getDateStart()->toString();
diff --git a/plugins/VisitorInterest/Controller.php b/plugins/VisitorInterest/Controller.php
index b3a658f5c8..4b601ca9fd 100644
--- a/plugins/VisitorInterest/Controller.php
+++ b/plugins/VisitorInterest/Controller.php
@@ -30,37 +30,12 @@ class Piwik_VisitorInterest_Controller extends Controller
public function getNumberOfVisitsPerVisitDuration($fetch = false)
{
- $view = ViewDataTable::factory('cloud');
- $view->init($this->pluginName, __FUNCTION__, "VisitorInterest.getNumberOfVisitsPerVisitDuration");
-
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setSortedColumn('label', 'asc');
- $view->setColumnTranslation('label', Piwik_Translate('VisitorInterest_ColumnVisitDuration'));
- $view->setGraphLimit(10);
- $view->disableSort();
- $view->disableExcludeLowPopulation();
- $view->disableOffsetInformationAndPaginationControls();
- $view->disableSearchBox();
- $view->disableShowAllColumns();
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
public function getNumberOfVisitsPerPage($fetch = false)
{
- $view = ViewDataTable::factory('cloud');
- $view->init($this->pluginName, __FUNCTION__, "VisitorInterest.getNumberOfVisitsPerPage");
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setSortedColumn('label', 'asc');
- $view->setColumnTranslation('label', Piwik_Translate('VisitorInterest_ColumnPagesPerVisit'));
- $view->setGraphLimit(10);
- $view->disableExcludeLowPopulation();
- $view->disableOffsetInformationAndPaginationControls();
- $view->disableSearchBox();
- $view->disableSort();
- $view->disableShowAllColumns();
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -72,21 +47,7 @@ class Piwik_VisitorInterest_Controller extends Controller
*/
public function getNumberOfVisitsByVisitCount($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__, "VisitorInterest.getNumberOfVisitsByVisitCount");
- $view->setColumnsToDisplay(array('label', 'nb_visits', 'nb_visits_percentage'));
- $view->setSortedColumn('label', 'asc');
- $view->setColumnTranslation('label', Piwik_Translate('VisitorInterest_VisitNum'));
- $view->setColumnTranslation('nb_visits_percentage', Metrics::getPercentVisitColumn());
- $view->disableExcludeLowPopulation();
- $view->disableOffsetInformationAndPaginationControls();
- $view->disableShowAllViewsIcons();
- $view->setLimit(15);
- $view->disableSearchBox();
- $view->disableSort();
- $view->disableShowAllColumns();
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
/**
@@ -98,19 +59,6 @@ class Piwik_VisitorInterest_Controller extends Controller
*/
public function getNumberOfVisitsByDaysSinceLast($fetch = false)
{
- $view = ViewDataTable::factory();
- $view->init($this->pluginName, __FUNCTION__, 'VisitorInterest.getNumberOfVisitsByDaysSinceLast');
- $view->setColumnsToDisplay(array('label', 'nb_visits'));
- $view->setSortedColumn('label', 'asc');
- $view->setColumnTranslation('label', Piwik_Translate('General_DaysSinceLastVisit'));
- $view->disableExcludeLowPopulation();
- $view->disableOffsetInformationAndPaginationControls();
- $view->disableShowAllViewsIcons();
- $view->setLimit(15);
- $view->disableSearchBox();
- $view->disableSort();
- $view->disableShowAllColumns();
-
- return $this->renderView($view, $fetch);
+ return Piwik_ViewDataTable::renderReport($this->pluginName, __FUNCTION__, $fetch);
}
}
diff --git a/plugins/VisitorInterest/VisitorInterest.php b/plugins/VisitorInterest/VisitorInterest.php
index f61bbeabd0..a46eae1104 100644
--- a/plugins/VisitorInterest/VisitorInterest.php
+++ b/plugins/VisitorInterest/VisitorInterest.php
@@ -30,6 +30,7 @@ class Piwik_VisitorInterest extends Plugin
'WidgetsList.add' => 'addWidgets',
'Menu.add' => 'addMenu',
'API.getReportMetadata' => 'getReportMetadata',
+ 'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
return $hooks;
}
@@ -95,7 +96,7 @@ class Piwik_VisitorInterest extends Plugin
);
}
- function addWidgets()
+ public function addWidgets()
{
WidgetsList::add('General_Visitors', 'VisitorInterest_WidgetLengths', 'VisitorInterest', 'getNumberOfVisitsPerVisitDuration');
WidgetsList::add('General_Visitors', 'VisitorInterest_WidgetPages', 'VisitorInterest', 'getNumberOfVisitsPerPage');
@@ -103,7 +104,7 @@ class Piwik_VisitorInterest extends Plugin
WidgetsList::add('General_Visitors', 'VisitorInterest_WidgetVisitsByDaysSinceLast', 'VisitorInterest', 'getNumberOfVisitsByDaysSinceLast');
}
- function addMenu()
+ public function addMenu()
{
Piwik_RenameMenuEntry('General_Visitors', 'VisitFrequency_SubmenuFrequency',
'General_Visitors', 'VisitorInterest_Engagement');
@@ -144,4 +145,86 @@ class Piwik_VisitorInterest extends Plugin
$out .= FrontController::getInstance()->fetchDispatch('VisitorInterest', 'index');
$out .= '</div>';
}
+
+ public function getReportDisplayProperties(&$properties)
+ {
+ $properties['VisitorInterest.getNumberOfVisitsPerVisitDuration'] =
+ $this->getDisplayPropertiesForGetNumberOfVisitsPerVisitDuration();
+ $properties['VisitorInterest.getNumberOfVisitsPerPage'] =
+ $this->getDisplayPropertiesForGetNumberOfVisitsPerPage();
+ $properties['VisitorInterest.getNumberOfVisitsByVisitCount'] =
+ $this->getDisplayPropertiesForGetNumberOfVisitsByVisitCount();
+ $properties['VisitorInterest.getNumberOfVisitsByDaysSinceLast'] =
+ $this->getDisplayPropertiesForGetNumberOfVisitsByDaysSinceLast();
+ }
+
+ private function getDisplayPropertiesForGetNumberOfVisitsPerVisitDuration()
+ {
+ return array(
+ 'default_view_type' => 'cloud',
+ 'filter_sort_column' => 'label',
+ 'filter_sort_order' => 'asc',
+ 'translations' => array('label' => Piwik_Translate('VisitorInterest_ColumnVisitDuration')),
+ 'graph_limit' => 10,
+ 'enable_sort' => false,
+ 'show_exclude_low_population' => false,
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'show_search' => false,
+ 'show_table_all_columns' => false,
+ );
+ }
+
+ private function getDisplayPropertiesForGetNumberOfVisitsPerPage()
+ {
+ return array(
+ 'default_view_type' => 'cloud',
+ 'filter_sort_column' => 'label',
+ 'filter_sort_order' => 'asc',
+ 'translations' => array('label' => Piwik_Translate('VisitorInterest_ColumnPagesPerVisit')),
+ 'graph_limit' => 10,
+ 'enable_sort' => false,
+ 'show_exclude_low_population' => false,
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'show_search' => false,
+ 'show_table_all_columns' => false,
+ );
+ }
+
+ private function getDisplayPropertiesForGetNumberOfVisitsByVisitCount()
+ {
+ return array(
+ 'columns_to_display' => array('label', 'nb_visits', 'nb_visits_percentage'),
+ 'filter_sort_column' => 'label',
+ 'filter_sort_order' => 'asc',
+ 'translations' => array('label' => Piwik_Translate('VisitorInterest_VisitNum'),
+ 'nb_visits_percentage' => Piwik_Metrics::getPercentVisitColumn()),
+ 'show_exclude_low_population' => false,
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'filter_limit' => 15,
+ 'show_search' => false,
+ 'enable_sort' => false,
+ 'show_table_all_columns' => false,
+ 'show_all_views_icons' => false,
+ );
+ }
+
+ private function getDisplayPropertiesForGetNumberOfVisitsByDaysSinceLast()
+ {
+ return array(
+ 'filter_sort_column' => 'label',
+ 'filter_sort_order' => 'asc',
+ 'translations' => array('label' => Piwik_Translate('General_DaysSinceLastVisit')),
+ 'show_exclude_low_population' => false,
+ 'show_offset_information' => false,
+ 'show_pagination_control' => false,
+ 'show_all_views_icons' => false,
+ 'filter_limit' => 15,
+ 'show_search' => false,
+ 'enable_sort' => false,
+ 'show_table_all_columns' => false
+ );
+ }
}
diff --git a/plugins/VisitsSummary/Controller.php b/plugins/VisitsSummary/Controller.php
index fc32e77e9e..c67b850249 100644
--- a/plugins/VisitsSummary/Controller.php
+++ b/plugins/VisitsSummary/Controller.php
@@ -138,7 +138,7 @@ class Piwik_VisitsSummary_Controller extends Controller
$dataTableVisit = self::getVisitsSummary();
$dataRow = $dataTableVisit->getRowsCount() == 0 ? new Row() : $dataTableVisit->getFirstRow();
- $dataTableActions = Piwik_Actions_API::getInstance()->get($idSite, Common::getRequestVar('period'), Common::getRequestVar('date'), ViewDataTable::getRawSegmentFromRequest());
+ $dataTableActions = Piwik_Actions_API::getInstance()->get($idSite, Piwik_Common::getRequestVar('period'), Piwik_Common::getRequestVar('date'), Piwik_API_Request::getRawSegmentFromRequest());
$dataActionsRow =
$dataTableActions->getRowsCount() == 0 ? new Row() : $dataTableActions->getFirstRow();
diff --git a/plugins/VisitsSummary/templates/index.twig b/plugins/VisitsSummary/templates/index.twig
index fad6c86bff..cd0ca19ade 100644
--- a/plugins/VisitsSummary/templates/index.twig
+++ b/plugins/VisitsSummary/templates/index.twig
@@ -1,5 +1,5 @@
{# This graphId must be unique for this report #}
-<h2 data-graph-id="VisitsSummarygetEvolutionGraph">{{ 'Referers_Evolution'|translate }}</h2>
+<h2 data-graph-id="VisitsSummary.getEvolutionGraph">{{ 'Referers_Evolution'|translate }}</h2>
{{ graphEvolutionVisitsSummary|raw }}
diff --git a/plugins/Zeitgeist/colors.piwik.json b/plugins/Zeitgeist/colors.piwik.json
deleted file mode 100644
index d2ca30e80e..0000000000
--- a/plugins/Zeitgeist/colors.piwik.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "colors": {}
-}
diff --git a/plugins/Zeitgeist/stylesheets/base.less b/plugins/Zeitgeist/stylesheets/base.less
index d4a014f807..4f593a9c92 100644
--- a/plugins/Zeitgeist/stylesheets/base.less
+++ b/plugins/Zeitgeist/stylesheets/base.less
@@ -2,7 +2,7 @@
/* base.css is automatically generated. DO NOT MODIFY */
-/* Genreral styles */
+/* General styles */
@import "general/_default.less";
@import "general/_utils.less";
@@ -11,6 +11,7 @@
@import "general/_jqueryUI.less";
+@import "general/_misc.less";
/* Component styles */
@import "ui/_header.less";
@@ -25,6 +26,11 @@
@import "ui/_loading.less";
+@import "ui/_sparkline.less";
+
+@import "ui/_jqplot.less";
+
+@import "ui/_transitions.less";
/* Remote components */
@import "../../CoreHome/stylesheets/_donate.less";
diff --git a/plugins/Zeitgeist/stylesheets/general/_misc.less b/plugins/Zeitgeist/stylesheets/general/_misc.less
new file mode 100644
index 0000000000..38ef9f463f
--- /dev/null
+++ b/plugins/Zeitgeist/stylesheets/general/_misc.less
@@ -0,0 +1,7 @@
+#topApiRef {
+ color: #95AECB;
+}
+
+.exception-backtrace {
+ color: #888;
+} \ No newline at end of file
diff --git a/plugins/Zeitgeist/stylesheets/general/_utils.less b/plugins/Zeitgeist/stylesheets/general/_utils.less
index ae8f0915b5..0077685734 100644
--- a/plugins/Zeitgeist/stylesheets/general/_utils.less
+++ b/plugins/Zeitgeist/stylesheets/general/_utils.less
@@ -45,6 +45,14 @@ html.old-ie .ie-hide {
opacity: 0.75;
}
+.metricEvolution > .positive-evolution {
+ color: green;
+}
+
+.metricEvolution > .negative-evolution {
+ color: #e02a3b;
+}
+
.reportsByDimensionView > .entityList {
float: left;
width: 220px;
diff --git a/plugins/Zeitgeist/stylesheets/ui/_dataTable.less b/plugins/Zeitgeist/stylesheets/ui/_dataTable.less
new file mode 100644
index 0000000000..f4303658c0
--- /dev/null
+++ b/plugins/Zeitgeist/stylesheets/ui/_dataTable.less
@@ -0,0 +1,3 @@
+.datatable-label-category {
+ color:#999;
+} \ No newline at end of file
diff --git a/plugins/Zeitgeist/stylesheets/ui/_jqplot.less b/plugins/Zeitgeist/stylesheets/ui/_jqplot.less
new file mode 100644
index 0000000000..b8f47543d2
--- /dev/null
+++ b/plugins/Zeitgeist/stylesheets/ui/_jqplot.less
@@ -0,0 +1,150 @@
+// evolution graph colors
+.evolution-graph-colors[data-name=series1] {
+ color: #5170AE;
+}
+
+.evolution-graph-colors[data-name=series2] {
+ color: #F29007;
+}
+
+.evolution-graph-colors[data-name=series3] {
+ color: #CC3399;
+}
+
+.evolution-graph-colors[data-name=series4] {
+ color: #9933CC;
+}
+
+.evolution-graph-colors[data-name=series5] {
+ color: #80a033;
+}
+
+.evolution-graph-colors[data-name=series6] {
+ color: #246AD2;
+}
+
+.evolution-graph-colors[data-name=series7] {
+ color: #FD16EA;
+}
+
+.evolution-graph-colors[data-name=series8] {
+ color: #49C100;
+}
+
+.evolution-graph-colors[data-name=grid-background] {
+ color: #fff;
+}
+
+.evolution-graph-colors[data-name=grid-border] {
+ color: #f00;
+}
+
+.evolution-graph-colors[data-name=ticks] {
+ color: #ccc;
+}
+
+.evolution-graph-colors[data-name=single-metric-label] {
+ color: #666;
+}
+
+// bar graph colors
+.bar-graph-colors[data-name=series1] {
+ color: #5170AE;
+}
+
+.bar-graph-colors[data-name=series2] {
+ color: #F3A010;
+}
+
+.bar-graph-colors[data-name=series3] {
+ color: #CC3399;
+}
+
+.bar-graph-colors[data-name=series4] {
+ color: #9933CC;
+}
+
+.bar-graph-colors[data-name=series5] {
+ color: #80a033;
+}
+
+.bar-graph-colors[data-name=series6] {
+ color: #246AD2;
+}
+
+.bar-graph-colors[data-name=series7] {
+ color: #FD16EA;
+}
+
+.bar-graph-colors[data-name=series8] {
+ color: #49C100;
+}
+
+.bar-graph-colors[data-name=grid-background] {
+ color: #fff;
+}
+
+.bar-graph-colors[data-name=grid-border] {
+ color: #f00;
+}
+
+.bar-graph-colors[data-name=ticks] {
+ color: #ccc;
+}
+
+.bar-graph-colors[data-name=single-metric-label] {
+ color: #666;
+}
+
+// pie graph colors
+.pie-graph-colors[data-name=series1] {
+ color: #59727F;
+}
+
+.pie-graph-colors[data-name=series2] {
+ color: #7DAAC0;
+}
+
+.pie-graph-colors[data-name=series3] {
+ color: #7F7259;
+}
+
+.pie-graph-colors[data-name=series4] {
+ color: #C09E7D;
+}
+
+.pie-graph-colors[data-name=series5] {
+ color: #9BB39B;
+}
+
+.pie-graph-colors[data-name=series6] {
+ color: #B1D8B3;
+}
+
+.pie-graph-colors[data-name=series7] {
+ color: #B39BA7;
+}
+
+.pie-graph-colors[data-name=series8] {
+ color: #D8B1C5;
+}
+
+.pie-graph-colors[data-name=series9] {
+ color: #A5A5A5;
+}
+
+.pie-graph-colors[data-name=grid-background] {
+ color: #fff;
+}
+
+.pie-graph-colors[data-name=grid-border] {
+ color: #f00;
+}
+
+.pie-graph-colors[data-name=ticks] {
+ color: #ccc;
+}
+
+.pie-graph-colors[data-name=single-metric-label] {
+ color: #666;
+}
diff --git a/plugins/Zeitgeist/stylesheets/ui/_sparkline.less b/plugins/Zeitgeist/stylesheets/ui/_sparkline.less
new file mode 100644
index 0000000000..7d2b9c7c8b
--- /dev/null
+++ b/plugins/Zeitgeist/stylesheets/ui/_sparkline.less
@@ -0,0 +1,26 @@
+// sparkline styles
+div.sparkline {
+ border-bottom: 1px solid white;
+}
+
+div.sparkline:hover {
+ cursor: pointer;
+ border-bottom: 1px dashed #c3c3c3;
+}
+
+// sparkline colors
+.sparkline-colors[data-name=lineColor] {
+ color: rgb(22, 44, 74);
+}
+
+.sparkline-colors[data-name=red] {
+ color: #ff7f7f;
+}
+
+.sparkline-colors[data-name=blue] {
+ color: #55AAFF;
+}
+
+.sparkline-colors[data-name=green] {
+ color: #75BF7C;
+}
diff --git a/plugins/Zeitgeist/stylesheets/ui/_transitions.less b/plugins/Zeitgeist/stylesheets/ui/_transitions.less
new file mode 100644
index 0000000000..e74d16b341
--- /dev/null
+++ b/plugins/Zeitgeist/stylesheets/ui/_transitions.less
@@ -0,0 +1,98 @@
+//
+// transitions colors
+//
+
+// colors for entries gradients
+.transition-entries[data-name=light] {
+ color: #fff;
+}
+
+.transition-entries[data-name=dark] {
+ color: #BACFE8;
+}
+
+.transition-entries[data-name=light-highlighted] {
+ color: #fff;
+}
+
+.transition-entries[data-name=dark-highlighted] {
+ color: #FAD293;
+}
+
+// colors for exits gradients
+.transition-exits[data-name=light] {
+ color: #fff;
+}
+
+.transition-exits[data-name=dark] {
+ color: #BACFE8;
+}
+
+.transition-exits[data-name=light-highlighted] {
+ color: #fff;
+}
+
+.transition-exits[data-name=dark-highlighted] {
+ color: #FAD293;
+}
+
+// background gradients colors
+.transition-background[data-name=light] {
+ color: #fff;
+}
+
+.transition-background[data-name=dark] {
+ color: #BACFE8;
+}
+
+.transition-background[data-name=light-highlighted] {
+ color: #fff;
+}
+
+.transition-background[data-name=dark-highlighted] {
+ color: #FAD293;
+}
+
+// closed group gradient colors
+.transition-closed-group[data-name=light] {
+ color: #DDE4ED;
+}
+
+.transition-closed-group[data-name=dark] {
+ color: #9BBADE;
+}
+
+.transition-closed-group[data-name=light-highlighted] {
+ color: #FAE2C0;
+}
+
+.transition-closed-group[data-name=dark-highlighted] {
+ color: #FAD293;
+}
+
+// items gradient colors
+.transition-items[data-name=light] {
+ color: #E3DFD1;
+}
+
+.transition-items[data-name=dark] {
+ color: #E8E4D5;
+}
+
+// 'others' gradients colors
+.transition-others[data-name=light] {
+ color: #F5F3EB;
+}
+
+.transition-others[data-name=dark] {
+ color: #E8E4D5;
+}
+
+// loop gradient colors
+.transition-loops[data-name=light] {
+ color: #F5F3EB;
+}
+
+.transition-loops[data-name=dark] {
+ color: #E8E4D5;
+} \ No newline at end of file
diff --git a/tests/PHPUnit/Core/AccessTest.php b/tests/PHPUnit/Core/AccessTest.php
index f6d8f6e103..6ebd280fa5 100644
--- a/tests/PHPUnit/Core/AccessTest.php
+++ b/tests/PHPUnit/Core/AccessTest.php
@@ -10,6 +10,12 @@ use Piwik\AuthResult;
class AccessTest extends DatabaseTestCase
{
+ public function setUp()
+ {
+ parent::setUp();
+ Piwik_Access::setSingletonInstance(null);
+ }
+
/**
* @group Core
* @group Access
diff --git a/tests/PHPUnit/Integration/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml b/tests/PHPUnit/Integration/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
index 2f0f22356d..f025301428 100755
--- a/tests/PHPUnit/Integration/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
+++ b/tests/PHPUnit/Integration/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
@@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
<row>
- <label>New visits</label>
- <nb_visits>25</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -60,4 +56,8 @@
<label>365+ days</label>
<nb_visits>1</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>25</nb_visits>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml b/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
index ce8a1e0b00..feecee9ccf 100755
--- a/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
+++ b/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
@@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>1</nb_visits>
</row>
@@ -60,4 +56,8 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml b/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
index ce8a1e0b00..feecee9ccf 100755
--- a/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
+++ b/tests/PHPUnit/Integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
@@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>1</nb_visits>
</row>
@@ -60,4 +56,8 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitorInterest.getNumberOfVisitsByDaysSinceLast_firstSite_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitorInterest.getNumberOfVisitsByDaysSinceLast_firstSite_lastN__API.getProcessedReport_day.xml
index d0e405dae8..ed81166bf8 100644
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitorInterest.getNumberOfVisitsByDaysSinceLast_firstSite_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_VisitorInterest.getNumberOfVisitsByDaysSinceLast_firstSite_lastN__API.getProcessedReport_day.xml
@@ -35,10 +35,6 @@
<reportData>
<result prettyDate="Sunday 3 January 2010">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -94,12 +90,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result prettyDate="Monday 4 January 2010">
<row>
<label>New visits</label>
<nb_visits>1</nb_visits>
</row>
+ </result>
+ <result prettyDate="Monday 4 January 2010">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -156,12 +152,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result prettyDate="Tuesday 5 January 2010">
<row>
<label>New visits</label>
- <nb_visits>0</nb_visits>
+ <nb_visits>1</nb_visits>
</row>
+ </result>
+ <result prettyDate="Tuesday 5 January 2010">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -218,6 +214,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>0</nb_visits>
+ </row>
</result>
<result prettyDate="Wednesday 6 January 2010" />
<result prettyDate="Thursday 7 January 2010" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
index a95a21169e..676d41cf7a 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
@@ -3,10 +3,6 @@
<result idSite="1">
<result date="2010-01-03">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -62,12 +58,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result date="2010-01-04">
<row>
<label>New visits</label>
<nb_visits>1</nb_visits>
</row>
+ </result>
+ <result date="2010-01-04">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -124,12 +120,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result date="2010-01-05">
<row>
<label>New visits</label>
- <nb_visits>0</nb_visits>
+ <nb_visits>1</nb_visits>
</row>
+ </result>
+ <result date="2010-01-05">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -186,6 +182,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>0</nb_visits>
+ </row>
</result>
<result date="2010-01-06" />
<result date="2010-01-07" />
@@ -196,10 +196,6 @@
<result date="2010-01-03" />
<result date="2010-01-04">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -255,6 +251,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result>
<result date="2010-01-05" />
<result date="2010-01-06" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
index 98daa0bfc6..b16a1006e9 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
@@ -3,10 +3,6 @@
<result idSite="1">
<result date="2010-01">
<row>
- <label>New visits</label>
- <nb_visits>2</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -62,6 +58,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>2</nb_visits>
+ </row>
</result>
<result date="2010-02" />
<result date="2010-03" />
@@ -73,10 +73,6 @@
<result idSite="2">
<result date="2010-01">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -132,6 +128,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result>
<result date="2010-02" />
<result date="2010-03" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml
index 0c54e79e5e..6b96b79022 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml
@@ -3,10 +3,6 @@
<result idSite="1">
<result date="From 2009-12-28 to 2010-01-03">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -62,12 +58,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result date="From 2010-01-04 to 2010-01-10">
<row>
<label>New visits</label>
<nb_visits>1</nb_visits>
</row>
+ </result>
+ <result date="From 2010-01-04 to 2010-01-10">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -124,6 +120,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result>
<result date="From 2010-01-11 to 2010-01-17" />
<result date="From 2010-01-18 to 2010-01-24" />
@@ -135,10 +135,6 @@
<result date="From 2009-12-28 to 2010-01-03" />
<result date="From 2010-01-04 to 2010-01-10">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -194,6 +190,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result>
<result date="From 2010-01-11 to 2010-01-17" />
<result date="From 2010-01-18 to 2010-01-24" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml
index 93be345032..14a2fd61ae 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays__VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml
@@ -3,10 +3,6 @@
<result idSite="1">
<result date="2010">
<row>
- <label>New visits</label>
- <nb_visits>2</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -62,6 +58,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>2</nb_visits>
+ </row>
</result>
<result date="2011" />
<result date="2012" />
@@ -73,10 +73,6 @@
<result idSite="2">
<result date="2010">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -132,6 +128,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result>
<result date="2011" />
<result date="2012" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
index 5b43591b5b..e12aafc9ba 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_day.xml
@@ -2,10 +2,6 @@
<results>
<result date="2010-01-03">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -61,12 +57,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result date="2010-01-04">
<row>
<label>New visits</label>
<nb_visits>1</nb_visits>
</row>
+ </result>
+ <result date="2010-01-04">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -123,12 +119,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result date="2010-01-05">
<row>
<label>New visits</label>
- <nb_visits>0</nb_visits>
+ <nb_visits>1</nb_visits>
</row>
+ </result>
+ <result date="2010-01-05">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -185,6 +181,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>0</nb_visits>
+ </row>
</result>
<result date="2010-01-06" />
<result date="2010-01-07" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
index 84dba17299..73f6f4d1dd 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
@@ -2,10 +2,6 @@
<results>
<result date="2010-01">
<row>
- <label>New visits</label>
- <nb_visits>2</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -61,6 +57,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>2</nb_visits>
+ </row>
</result>
<result date="2010-02" />
<result date="2010-03" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml
index eeea14981c..10e26fda2d 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_week.xml
@@ -2,10 +2,6 @@
<results>
<result date="From 2009-12-28 to 2010-01-03">
<row>
- <label>New visits</label>
- <nb_visits>1</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -61,12 +57,12 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
- </result>
- <result date="From 2010-01-04 to 2010-01-10">
<row>
<label>New visits</label>
<nb_visits>1</nb_visits>
</row>
+ </result>
+ <result date="From 2010-01-04 to 2010-01-10">
<row>
<label>0 days</label>
<nb_visits>0</nb_visits>
@@ -123,6 +119,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>1</nb_visits>
+ </row>
</result>
<result date="From 2010-01-11 to 2010-01-17" />
<result date="From 2010-01-18 to 2010-01-24" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml
index e39684b9c8..7ae34d2648 100755
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_idSiteOne___VisitorInterest.getNumberOfVisitsByDaysSinceLast_year.xml
@@ -2,10 +2,6 @@
<results>
<result date="2010">
<row>
- <label>New visits</label>
- <nb_visits>2</nb_visits>
- </row>
- <row>
<label>0 days</label>
<nb_visits>0</nb_visits>
</row>
@@ -61,6 +57,10 @@
<label>365+ days</label>
<nb_visits>0</nb_visits>
</row>
+ <row>
+ <label>New visits</label>
+ <nb_visits>2</nb_visits>
+ </row>
</result>
<result date="2011" />
<result date="2012" />
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_month.original.html b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_month.original.html
index 1a3f2d8d62..5ee613822a 100644
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_month.original.html
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_month.original.html
@@ -3497,7 +3497,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJo0lEQVR4nO3dz4sceRkH4MovHAeTyOwh40SSTeqQTXJZiMGD4EFYPCiCoEcF8Q/wtodVwZMnbyriwZt4F9azIOole/BiDMROIDpDBnYD2UmGsMFpD83W1FRVV73dXd1V3f08h9Dd803VW29XVX+6qrv61HA4TAAAmpzuugAAYDkIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAyKJDQ5qmlQ9WPl7/vwCARTrb7uR+/rsPCo+898MvRf7jYDCI/zVN0/rxAEDrWg4ND//z8evXr7O7586d293dvXz5cvbIYDAovORLAACwFFoODUmSHB4eZrcvXry4t7eXDw3jlJNEdruQM0Z/ygaM/pofPFv5AEC19kPD7GoCRFKVIRy3AIAF6ODbE/ljA5HX+IlCgMQAAHPS/pGGzc3NGaeQpYpIAphoMAAwtZZDw7e/lu7t7s4+nVECCKaBiQYDANNpOTR866tXk+Rq47Dg4YF8GohMM/GZBgCYmz5eEXKiSzm57hMALEYfvz1R/hZl5Rcoxg1eTJEAsG5ODYfDrmsAAJZAH09PAAA9JDQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQcuLiTq6SBACMcxwaCr/a4EccAIC849MTIgIAUKP5tyd2T/7U9f7+/vb2dpIkf/rbf+dVVJNvfOWLXc0aANZWdWhoPDfx7i8/OHz1v/mU1ExoAIDFK4aG0Wch84nh8uXL+QGju6dPn06SzkLDzs5OV7MGgLVV/PaETzYAAJWOPwgpMQAANcZepyHxfQoAIOc4NIgIAEANl5EGAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEKEBgAgpBga0jRN07STUgCAPjsRGtI0HQwGXZUCAPTZidAgMQAA45xtHPH8+fP83RcvXly4cGE4HM6tpGYHBwcdzr3n/vX4WYdzv3ltq8O5AzBXzaFhb28vf/fx48dpmh4dHc2tpGaFksh89PEnv/jDvzss4Effvb79xkaHBQAwP82h4ebNm+W7Z848TJLOcsONGze6mnXPPf3wZZJ0GRrevPbm1S9c7LAAAObHVy4BgBChAQAIOXF6IrtCw+iGL1MAAJkToUFKAADGcXoCAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAkLP5O2maZrcHg8HCiwEA+us4NKRpmg8KhbsAwJpzegIACDnbPKTH/v6P3T/++WFXc3/j85999wdfHt3+2W/+evDyk64q+d43b7/91qWu5l7p9+//88Hjj7qa+9tvXfrOOzdGt7//4/eHw64KSX793jsXPveZxLr6qWxdffrhy5/86i9dlXHmzOnf/vTro9vW1RHraoF1tWC0rp4afrqSjjs9ce/evfx/e/Dgwa1bt2aZ8eHh4dOnT69fvz7LRFbM/fv3Z+zqinn06NH29vbm5mbXhfTF3t7exsbG1tZW14X0xbNnz169erWzs9N1IX1hv1pmv1rQyn61+UjD3bt3a+5O4eDg4MmTJ7dv355xOqvk6Ojozp07XVfRIxsbG1euXDl//nzXhfTF1tbW5ubmpUv9Op7Uof39/cPDw2vXrnVdSF/Yr5bZrxa0sl/1mQYAIERoAABCjk9PDAYD12kAAMY58ZkGQQEAGOf42xMAADV8pgEACBEa+iL/gZJ1pg8FGlKgIZPSsXr6k0zShNAVIUeTm+svU4ybYPb48v4WRrl7a8hnbPPK2+ea92QNG5LfLUQWv7wFrcw2lS1IthSN+8zCgMpWrEB/6per8N2FwrD56ctlpMct6pI+2ZlR1lnzJOu30Mp0IK/QjZXfXsq7hfr1obwFJXN+F7cw5cob95mFAZW7lxXY50SWK+liTxINDZXlJqUolB8z7nbln/JHFLKpJSfXj8ps3vNVoXFfMO6RSBuXRWPNU/dhWVaDSa1zQxr3M4VHlrEhkxYzRfGVL7p9a1rlc90401ZeNSP96bY5lVvBRDNtHD/dZjXTkYbK/NviBDM1cWR51b97WI1ljJi6D0vdopp3mevZkBrr0JB2j6WP2zP3sGmdnESYuj+dr1EtnqWaerOaIDSMO9hQOab8b82weA1raGV6NWNCX5k+JE0pIT6RlWlIZpZlWd6GBNeH/BbU1hmczpvW7kmEdpei8+YkpSe9vl3zqLPchMmONFTW3Xp9SdPrSnDYMmq3n70y0UGUSB9WeDUo05CC1W5IZcLOb0EzTrZG35oWfLPRSs2N/Vl8c6Z40vMjJ32rFpnLrB+EnEeuSQKvK8Fhy6VwCqbbYjoU78NKrgZla9KQeNkr35B5VLukTYvU0Eqpwf70qjmVpj7HHezAxNdpqDkylkWwbN41B3aW8Sji/DRuw0vdq+kyctmy9yGjIVNbyYY0rg+zvIUIvnteuqZlZiy+t2tU5Elv673lRE2Y6UhDIUC0kvXGTSp/XGjGs+OLlJVaPqhVWJDsvNHii5y3+vVk6j4s0WpQoCFlNbvm1WtIebdQvyOtHDDRKlSeSGNtC2ha/XKNOxFQGJCUXvMGg8Gkm1i5mEr9aU7NI1NMf6LNym9PLIelfivQIn0o0JACDZmCptXQnORkE1xGeglYa0f0oUBDCjRkCppWQ3OSUhMcaQAAQhxpAABChAYAIERoAABC/g/CsFP/+h43bAAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJjUlEQVR4nO3dT4scaR0H8MpugmOzSWT2MMOMZEnqkE1yWcgGD4IHYfGgCIJXBfHiK/CwKnjSN6DIHvbmG1hcT4LCooLEgxdjIHYGozNm0I3ESYaQSMZDszU1VV3Vv+qu6aru/nxO/ae6nuf5zTPd336qu/rM0dFRAgAwyStddwAAWAxCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQMu/QkKbp2BvH3l7/KABgns62u7sfvf/Hwi3vfvvtyAOHw2H83jRN67cHAFrXcmi49/f/vnjxIrt67ty53d3d7e3t7JbhcFh4yZcAAGAhtBwakiQ5PDzMLl+8eHFvby8fGqqUk0R2uZAzRndlG4zuzW88W/cBgPHaDw2zqwkQybgMYd0CAOagg29P5NcGIq/xjUKAxAAAp6T9lYbBYDDjHrJUEUkAjTYGAKbWcmj42hfTvd3d2fczSgDBNNBoYwBgOi2Hhq9+4Y0keWPiZsHlgXwaiOwz8ZkGADg1fTwjZKNTOTnvEwDMRx+/PVH+FuXYL1BUbTyfTgLAqjlzdHTUdR8AgAXQx8MTAEAPCQ0AQIjQAACECA0AQIjQAACECA0AQIjQAACEnDi5k7MkAQBVjkND4Vcb/IgDAJB3fHhCRAAAakz+7Yndkz91vb+/v7m5eWr9AQDG++Xv/tFV01/+/GeTqtDg2AQA9MoHHz341R/+2VXr40PD6LOQ+cSwvb2d36BwFQCYg/Ov/SdJOgsNW1tbSfnbExYYAICxjj8IKTEAADUqz9OQ+D4FAJBzHBpEBACghtNIAwAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAECI0AAAhQgMAEFIMDWmapmnaSVcAgD47ERrSNB0Oh111BQDosxOhQWIAAKqcnbjF48eP81efPHly4cKFU+vPAvvLzqOumr52eb2rpgGYj+fPn3fY+sHBQRIJDXt7e/mrOzs7PvRQ9v4v/vbX3addtf7j71zvqmkA5uPgyUGHrY/CwOTQcO3atZqrjAx+/a8k6Sw0XL16taumAZiP2/f+lyQfd9X66IXGVy4BgBChAQAIOXF4IvuwwuiCL1MAAJkToUFKAACqODwBAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNAAAIQIDQBAyNn8lTRNs8vD4XDunQEA+us4NKRpmg8KhasAwIpzeAIACDk7eZNxvvm9D4+O2u1JAz99950Lr30qSZLf/2n3g9/c66obr3/m09/91ue6an2sh/9++v2ffNRV66+++sp7P/jS6PLPP/zz3Z2Pu+rJW29ufP2dq6PL5mpycq7+8Ge/PXj6vKuefOMrN956cyMxVz9hrhaYqwX5udoHZ44+maRVhydu376df8Ddu3evX78+S5OHh4cPHz68cuXKLDtZMnfu3Jmxqkvm/v37m5ubg8Gg6470xd7e3tra2vr6etcd6YtHjx49e/Zsa2ur6470hefVMs+rBa08r05eabh161bN1SkcHBw8ePDgxo0bM+5nmbx8+fLmzZtd96JH1tbWLl26dP78+a470hfr6+uDwWBjY6PrjvTF/v7+4eHh5cuXu+5IX3heLfO8WtDK86rPNAAAIUIDABByfHhiOBw6TwMAUOXEZxoEBQCgyvG3JwAAavhMAwAQMtfQkP/MBCNqUqAgBQoSp1ZjKUuQQkVMeUbIPB+fLFOTKn7TJJNNkpUqyMR/jdEGVXctR63GFqFm4IVHjbZZ9CeZwninqElVBar+sxZx/pQr0PooqnaY3V7YYNbQ4GeuytSkiiCfWc1ZMfFfY3TL2HmyNJNnbBFqBl7zqKqr/VcY7xQ1qapAzUtgmwNYIlUzp+r2FlYa6pX/VOUYmP8z5//2hc0WxcQOr2BNkoavB8tdkIlP8atWkEzNe8pGYaL8prw/tRrb3MT50LSTkbIk3VWmsOcpatJoLWqh50+Wn6o6Wd6m6vLYu6pGlC9afsHjdENDubtJxXytf+AyWc2axMe1OgXJLtcvoq5IQWo0nTxJoFwLV6tGByOmLkv9XQuhXKilnD9VPW9rh5lyHDn1lYaI/ErUQs/XsqlHtEw1aWUIy1SQpI2DlItYkGHzM8gt6+Rp+j613VeI/G57WJl4T8plrAncU+u8SpGmC52s6vDsY+kgNERmfPbk0pN5PIVG/V/6muQHGJmsS1+QppajIDVvj2r63HTyJIFydV6r+veyp7T03fNZNLHdmohQv5yQv7yg86f8Mt9idkzCIxoOh/MODYWFjpotJ64s9VnTsLzcNWn6rnrpC9LUEhdkYj+nWJIJlqvPtTqNLvV8FkWam25BrlETyeLMn9bbDY5ofudpmDhN+/nfO4X4QFanJkEKUqAgcYtSq3bfIM7eXB8qM0UHWi9j/+dP4eheXrZIkHWypsMzjmXWlYb6g5T5e/OHUibu9pRW5+amMMb8KFa2JlVWsCAr+19TP/AkN4Tg2m+5VuVWxuqwVmOLUD/w+ofUb9+oLMm8KlMYbzLuOXOKmkycYAWLOH+ydhuNdKKaERUq06Pfnug8x/WQmhQoSIGCxKlVFZWJUKWRvvz2hL9HmZoUKEiBgsSpVRWViVClTI9WGgCAPuvLSgMA0HNCAwAQIjQAACH/B7hdkzxVH9JkAAAAAElFTkSuQmCC"
height="200"
width="700"/>
@@ -3517,15 +3517,15 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- New visits </td>
+ 0 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 2
+ 0
</td>
</tr>
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0 days </td>
+ 1 day </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3533,23 +3533,23 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1 day </td>
+ 2 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0
+ 1
</td>
</tr>
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 2 days </td>
+ 3 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1
+ 0
</td>
</tr>
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 3 days </td>
+ 4 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3557,7 +3557,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 4 days </td>
+ 5 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3565,7 +3565,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 5 days </td>
+ 6 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3573,7 +3573,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 6 days </td>
+ 7 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3581,7 +3581,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 7 days </td>
+ 8-14 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3589,7 +3589,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 8-14 days </td>
+ 15-30 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3597,7 +3597,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 15-30 days </td>
+ 31-60 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3605,7 +3605,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 31-60 days </td>
+ 61-120 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3613,7 +3613,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 61-120 days </td>
+ 121-364 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3621,7 +3621,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 121-364 days </td>
+ 365+ days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3629,9 +3629,9 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 365+ days </td>
+ New visits </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0
+ 2
</td>
</tr>
</tbody>
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__PDFReports.generateReport_month.original.html b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__PDFReports.generateReport_month.original.html
index f93a03e8e8..7485e4d875 100644
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__PDFReports.generateReport_month.original.html
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__PDFReports.generateReport_month.original.html
@@ -3373,15 +3373,15 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- New visits </td>
+ 0 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 2
+ 0
</td>
</tr>
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0 days </td>
+ 1 day </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3389,23 +3389,23 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1 day </td>
+ 2 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0
+ 1
</td>
</tr>
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 2 days </td>
+ 3 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1
+ 0
</td>
</tr>
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 3 days </td>
+ 4 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3413,7 +3413,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 4 days </td>
+ 5 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3421,7 +3421,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 5 days </td>
+ 6 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3429,7 +3429,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 6 days </td>
+ 7 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3437,7 +3437,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 7 days </td>
+ 8-14 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3445,7 +3445,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 8-14 days </td>
+ 15-30 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3453,7 +3453,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 15-30 days </td>
+ 31-60 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3461,7 +3461,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 31-60 days </td>
+ 61-120 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3469,7 +3469,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 61-120 days </td>
+ 121-364 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3477,7 +3477,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 121-364 days </td>
+ 365+ days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -3485,9 +3485,9 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 365+ days </td>
+ New visits </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0
+ 2
</td>
</tr>
</tbody>
diff --git a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_month.original.pdf b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_month.original.pdf
index 3cc8a3fbd0..498cefe433 100644
--- a/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_month.original.pdf
+++ b/tests/PHPUnit/Integration/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_month.original.pdf
Binary files differ
diff --git a/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_week.original.html b/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_week.original.html
index d15889e8f8..ea043312a3 100644
--- a/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_week.original.html
+++ b/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__PDFReports.generateReport_week.original.html
@@ -5510,7 +5510,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJE0lEQVR4nO3dT4sceR3H8Uo2YcfBbMIskmFGsiR9cEkQFmJQEDwIiwdFELwqiM9hD6uCJ5+Ainjw5hMQVjwKonvJgl4MkaWjRGdIxM3BsEMwmPHQWOmp6q7+dHd1V/95vQ5Lz6S259ffqa55d/VM97nT09MCAGCS810vAABYD6IBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAyLKjodfrjfzkyM83/18AwDJdaPfqfvSLDyqfefe7n0v+x36/n/9rr9dr3h4AaF3L0fDh3//9/Pnz8sOLFy8eHR0dHh6Wn+n3+5Uf+QoAANZCy9FQFMXJyUl5+fLly8fHx8PRME69JMrLlc4Y/FO5weBfhzeeb/kAwGjtR8P8GgKiGNUQzlsAwBJ08NcTw+cGkp/xU0WAYgCABWn/TMPu7u6c11BWRVIAU20MAMys5Wj4xpd7x0dH81/PoADCGphqYwBgNi1Hw9e/9EZRvDFxs/D0wHANJNdZ+J0GAFiYVXxFyKleysnrPgHAcqziX0/U/4py5B9QjNt4OYsEgG1z7vT0tOs1AABrYBWfngAAVpBoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIVKOh1+t5jUUAoO5MNHjjBgBgnDPRoBgAgHEmv/fE0dm3un78+PH+/n5RFL/+wz8WtahJvvrFT5eXO1xGZSUAsNlmfMOqd378wcmz/7a7lFz5o/qPf/noN+8fNW+8UK+/9uoXPvupDhcAAEszORoODw/rH54/f74oOouGg4ODwYW//bPjd9u6cuVKuRgA2Gz+5BIAiIgGACBy5umJ8hUaBhf8MQUAUDoTDSoBABjH0xMAQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AACRC8Mf9Hq98nK/31/6YgCA1fUyGnq93nAoVD4EALacpycAgMiFyZsQ+OHPfv/04/909dW/9bVbb715tSiKR//6+Ps/+V1Xy3jllfM//8FXBpd/+d6f7//1o65W8tabV7/59mcGl7/9vfdOT7taSPHTd99+7ZOvFkXx/p+OfvXbD7taxutXPvHOdz4/uGxfLeyro9hXK+yrFYN99dzp/3fScU9P3L17d/h/u3///s2bN+f5wicnJ48ePbpx48Y8V7Jh7t27N+dUN8yDBw/29/d3d3e7XsiqOD4+3tnZ2dvb63ohq+LJkyfPnj07ODjoeiGrwnG1znG1opXj6uQzDXfu3Gn4cAZPnz59+PDhrVu35ryeTfLixYvbt293vYoVsrOzc+3atUuXLnW9kFWxt7e3u7t79erVrheyKh4/fnxycnL9+vWuF7IqHFfrHFcrWjmu+p0GACAiGgCAyMunJ/r9vtdpAADGOfM7DUIBABjn5V9PAAA08DsNAEBENKyK4V8o2WbmUGEgFQYyLRNrZj7FNEOIXhFycHULfWeKcVdYfn593wujPr0t5Hdsh9Xvn1s+ky0cyPBhIbn59XvQxtynyhtS3oqJx8zKBiNHsQHzab5dlb9dqGy2OKvyMtLjbuqafrNLg9bZ8pL1Xmh1JjCsMo2Nv7/UDwvN+0P9HlQs+FHc0tRXPvGYWdlg5OFlA445ye0qujiSpNEwcrlFLYWGtxl3eeQ/DZ9RKK+tOLt/jGzzFd8VJh4Lxn0mGeO6mLjmmeewLrvBtLZ5IBOPM5XPrONApl3MDIsf+UN31YY28ns98Yu28lMzmU+3wxl5L5jqi07cfra71VxnGkb2b4tXWGrIkfXV/OhhM25jYuY5rPWIGh5lbudAGmzDQNo9lz7uyLyCQ+vkSYSZ59P5HtXis1Qz362miIZxJxtGblP/b8Nm+Rq20MbMas5C35g5FJMqIb+SjRlIaZ7bsr4DCfeH4XtQW8/gdD60dp9EaPdWdD6covZNbx7XItZZH8J0ZxpGrrv19RWTfq6Em62jdue5UqY6iZLMYYN3gzoDqdjsgYws7OF70JxX22DVhhY+2GhlzRPns/zhzPBNH95y2odqyVeZ9xchF9E1RfBzJdxsvVSegul2MR3K57CRu0HdlgwkX/bGD2QRq13ToSVraGWp4XxWajgjzfwcdziBqV+noeHMWJlg5dduOLGzjmcRF2fifXitZzVbI9et+xxKBjKzjRzIxP1hnocQ4aPntRtaac7Fr+welXzT23psOdUQ5jrTUAmIVlpv3FUNnxea89nxZSqXWj+pVbkh5fNGy1/kojXvJzPPYY12gwoDqWs4NG/eQOqHheYD6cgNptqF6lcycW1LGFrz7Rr3REBlg6L2M6/f7097F6svZqTVGU7DZ2a4/qnuVt57Yj2s9UOBFplDhYFUGMgMDK2B4RRnh+BlpNeAvXbAHCoMpMJAZmBoDQynqA3BmQYAIOJMAwAQEQ0AQEQ0AACR/wES3hr3L9vzNgAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAI/ElEQVR4nO3dQYscaR0H4Eo2wXHYGBkPM8xIlqQPLsllIQYPggdh8aAIglcF8TvsYVXw5BdQEQ/e/AIL68mDsKgg2YMXQ2DpCNEZM6ARDDsEgxkPzXZqqruqf9XdM1Xd/Tyn6u7qqvf9zzvVv36ru+vS6elpAQAwy+WuGwAArAahAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACBy0aFhMBhMvXPq/c3PAgAu0pXlbu4nv/qwcs+73/9i8sThcJg/OhgMmtcHAJZuyaHho7/958WLF+ObV69ePTw8PDg4GN8zHA4rL/kSAACshCWHhqIoTk5OxsvXr18/Ojoqh4Y6k0livFzJGaOHxiuMHi2vvFjzAYDplh8aFtcQIIppGcK8BQBcgA6+PVGeG0he41uFAIkBAM7J8mcatre3F9zCOFUkCaDVygDA3JYcGr711cHR4eHi2xklgDANtFoZAJjPkkPDN7/yRlG8MXO1cHqgnAaSbRY+0wAA56aPvwjZ6qec/O4TAFyMPn57YvJblFO/QFG38sU0EgA2zaXT09Ou2wAArIA+np4AAHpIaAAAIkIDABARGgCAiNAAAESEBgAgIjQAAJFqaBgMBn5jEQCYdCY0uHADAFDnTGiQGACAOrOvPXF49lLXx8fHe3t7RVH85g9/P69GzfL1L3++q10DQFc6f+Wd84JV7/z0w5Pn/1tqe1oQGgDYNO998Pi3f/pHV3tPQ8PBwcHkzcuXLxdFZ6Fhf3+/q10DQCeuvf7vougsNIxeeX3lEgCICA0AQOTM6YnxLzSMFnyZAgAYOxMapAQAoI7TEwBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgcqV8YzAYjJeHw+GFNwYA6K9XoWEwGJSDQuUmALDhnJ4AACJXZq/SY3/88+F7v/uoq71/7rOffud7Xxot//gXv3/28X+7asl3vnHnrTd3i6J48s+Pf/izD7pqxmuvXf7lj742Wv71+395+Nd/ddWSt97c/fbbXxgtf/cH75+edtWQ4ufvvv2Z1z9VGKufMFYrjNUKY7WiPFb74NLpJ4O07vTE/fv3y094+PDh7du3F9nlycnJkydPbt26tchG1syDBw8WrOqaefTo0d7e3vb2dtcN6Yujo6Otra2dnZ2uG9IXT58+ff78+f7+ftcN6QvH1UmOqxVLOa7Onmm4d+9ew805PHv27PHjx3fu3FlwO+vk5cuXd+/e7boVPbK1tXXjxo1r16513ZC+2NnZ2d7e3t3d7bohfXF8fHxycnLz5s2uG9IXjquTHFcrlnJc9ZkGACAiNAAAkVenJ4bDod9pAADqnPlMg6AAANR59e0JAIAGPtMAAEQuNDSUPzPBiJpUKEiFguTUaiplCSlUYgm/COnjk5PUpI5rmoyNB8lGFWTmv8ZohbqH1qNWU4vQ0PHKs0brrPpBptLfOWpSV4G6/6xVHD+TFVh6L+o2OL6/ssKiocFlriapSR1BfmwzR8XMf43RPVPHydoMnqlFaOh4w7PqbvZfpb9z1KSuAg0vgcvswBqpGzl195/7tScm/1STMbD8Zy7/7SurrYqZDd7AmhQtXw/WuyAzD/GbVpCxhveUrcLE5Jvy/tRq6u5mjoe2jUzKUnRXmcqW56hJq7molR4/4/xU18jJdeqWpz5U16Ny0coTHucbGiabW9SM1+YnrpPNrEner80pyHi5eRJ1QwrSoO3gKYJyrVytWp2MmLsszQ+thMlCreX4qWv5sjY4NhlHenGVy/JM1EqP10lz92idarKULqxTQYplnKRcxYIM2/+C3LoOnrbvU5f7ClHebA8rk7dksowNgXtunVcp2XWlkXUNXrwvHYSGZMSPDy49GcdzaNX+ta9JuYPJYF37grS1HgVpeHvU0Oa2g6cIytV5rZrfy57T1HfPR9HM/TZEhObphPLyio6fyZf5JWbHIu7RcDi86NBQmehoWHPmzFKftQ3L612Ttu+q174gba1xQWa2c44pmbBcfa7VeTSp56Mo2d18E3KtdlGszvhZ+n7DHl3c7zTMHKb9/O+dQ96RzalJSEEqFCS3KrVa7hvExXfXh8rM0YCll7H/46dydq9sPEkwbmRDgxfsy6IzDc0nKcuPlk+lzNzsOc3OXZhKH8u92Nia1NnAgmzsf01zx4tSF8K538laTe5lqg5rNbUIzR1vfkrz+q3KUlxUZSr9LaYdM+eoycwBVrGK42e831Y9namhR5XK9OjaE53nuB5SkwoFqVCQnFrVUZmEKo305doT/h6T1KRCQSoUJKdWdVQmoUpjPZppAAD6rC8zDQBAzwkNAEBEaAAAIv8HJLtYtueFjNMAAAAASUVORK5CYII="
height="200"
width="700"/>
@@ -5530,7 +5530,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- New visits </td>
+ 0 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
1
</td>
@@ -5538,15 +5538,15 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0 days </td>
+ 1 day </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1
+ 0
</td>
</tr>
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1 day </td>
+ 2 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5554,7 +5554,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 2 days </td>
+ 3 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5562,7 +5562,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 3 days </td>
+ 4 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5570,7 +5570,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 4 days </td>
+ 5 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5578,7 +5578,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 5 days </td>
+ 6 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5586,7 +5586,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 6 days </td>
+ 7 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5594,7 +5594,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 7 days </td>
+ 8-14 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5602,7 +5602,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 8-14 days </td>
+ 15-30 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5610,7 +5610,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 15-30 days </td>
+ 31-60 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5618,7 +5618,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 31-60 days </td>
+ 61-120 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5626,7 +5626,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 61-120 days </td>
+ 121-364 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5634,7 +5634,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 121-364 days </td>
+ 365+ days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5642,9 +5642,9 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 365+ days </td>
+ New visits </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0
+ 1
</td>
</tr>
</tbody>
diff --git a/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__PDFReports.generateReport_week.original.html b/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__PDFReports.generateReport_week.original.html
index 6978795392..52498edb02 100644
--- a/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__PDFReports.generateReport_week.original.html
+++ b/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__PDFReports.generateReport_week.original.html
@@ -5308,7 +5308,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- New visits </td>
+ 0 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
1
</td>
@@ -5316,15 +5316,15 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0 days </td>
+ 1 day </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1
+ 0
</td>
</tr>
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 1 day </td>
+ 2 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5332,7 +5332,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 2 days </td>
+ 3 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5340,7 +5340,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 3 days </td>
+ 4 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5348,7 +5348,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 4 days </td>
+ 5 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5356,7 +5356,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 5 days </td>
+ 6 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5364,7 +5364,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 6 days </td>
+ 7 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5372,7 +5372,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 7 days </td>
+ 8-14 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5380,7 +5380,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 8-14 days </td>
+ 15-30 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5388,7 +5388,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 15-30 days </td>
+ 31-60 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5396,7 +5396,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 31-60 days </td>
+ 61-120 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5404,7 +5404,7 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 61-120 days </td>
+ 121-364 days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5412,7 +5412,7 @@
<tr style="background-color: rgb(249,250,250)">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 121-364 days </td>
+ 365+ days </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
0
</td>
@@ -5420,9 +5420,9 @@
<tr style="">
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 365+ days </td>
+ New visits </td>
<td style="font-size: 11pt; border-bottom: 1px solid rgb(231,231,231); padding: 5px 0 5px 5px;">
- 0
+ 1
</td>
</tr>
</tbody>
diff --git a/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_week.original.pdf b/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_week.original.pdf
index ba1c591b34..44ac575503 100644
--- a/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_week.original.pdf
+++ b/tests/PHPUnit/Integration/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__PDFReports.generateReport_week.original.pdf
Binary files differ
diff --git a/tests/PHPUnit/TestingEnvironment.php b/tests/PHPUnit/TestingEnvironment.php
new file mode 100644
index 0000000000..c4c2dd6831
--- /dev/null
+++ b/tests/PHPUnit/TestingEnvironment.php
@@ -0,0 +1,26 @@
+<?php
+
+require_once realpath(dirname(__FILE__)) . "/../../core/EventDispatcher.php";
+
+/**
+ * Sets the test environment.
+ */
+class Piwik_TestingEnvironment
+{
+ public static function addHooks()
+ {
+ if (!defined('PIWIK_TEST_MODE')) {
+ define('PIWIK_TEST_MODE', true);
+ }
+
+ Piwik_AddAction('Access.createAccessSingleton', function($access) {
+ $access->setSuperUser(true);
+ });
+ Piwik_AddAction('Access.loadingSuperUserAccess', function(&$idSitesByAccess, &$login) {
+ $login = 'superUserLogin';
+ });
+ Piwik_AddAction('Config.createConfigSingleton', function($config) {
+ $config->setTestEnvironment();
+ });
+ }
+} \ No newline at end of file
diff --git a/tests/PHPUnit/UI/UIIntegrationTest.php b/tests/PHPUnit/UI/UIIntegrationTest.php
index 465a9fe171..4da2feaa62 100644
--- a/tests/PHPUnit/UI/UIIntegrationTest.php
+++ b/tests/PHPUnit/UI/UIIntegrationTest.php
@@ -201,7 +201,7 @@ class Test_Piwik_Integration_UIIntegrationTest extends IntegrationTestCase
{
$url = self::getProxyUrl() . $urlQuery;
- $cmd = "cutycapt --url=\"$url\" --out=\"$processedPath\" --min-width=1366 --delay=500 2>&1";
+ $cmd = "cutycapt --url=\"$url\" --out=\"$processedPath\" --min-width=1366 --delay=1000 2>&1";
if (self::$useXvfb) {
$cmd = 'xvfb-run --server-args="-screen 0, 1024x768x24" ' . $cmd;
}
diff --git a/tests/PHPUnit/proxy/archive.php b/tests/PHPUnit/proxy/archive.php
index 16693cabe0..56d08343ba 100644
--- a/tests/PHPUnit/proxy/archive.php
+++ b/tests/PHPUnit/proxy/archive.php
@@ -1,8 +1,8 @@
<?php
-// include archive.php, and let 'er rip
-$GLOBALS['PIWIK_CONFIG_TEST_ENVIRONMENT'] = true;
-$GLOBALS['PIWIK_ACCESS_IS_SUPERUSER'] = true;
-$GLOBALS['PIWIK_ACCESS_SUPERUSER_LOGIN'] = 'superUserLogin';
-require realpath(dirname(__FILE__)) . "/../../../misc/cron/archive.php";
+// make sure the test environment is loaded
+require realpath(dirname(__FILE__)) . "/../../../tests/PHPUnit/TestingEnvironment.php";
+Piwik_TestingEnvironment::addHooks();
+// include archive.php, and let 'er rip
+require realpath(dirname(__FILE__)) . "/../../../misc/cron/archive.php"; \ No newline at end of file
diff --git a/tests/PHPUnit/proxy/index.php b/tests/PHPUnit/proxy/index.php
index ec23250d00..2cd498fd17 100644
--- a/tests/PHPUnit/proxy/index.php
+++ b/tests/PHPUnit/proxy/index.php
@@ -4,12 +4,9 @@
* Used by tests/PHPUnit/Integration/ImportLogsTest.php and tests/PHPUnit/Integration/UITest.php
*/
-use Piwik\FrontController;
-use Piwik\Tracker;
-
-$GLOBALS['PIWIK_CONFIG_TEST_ENVIRONMENT'] = true;
-$GLOBALS['PIWIK_ACCESS_IS_SUPERUSER'] = true;
-$GLOBALS['PIWIK_ACCESS_SUPERUSER_LOGIN'] = 'superUserLogin';
+// make sure the test environment is loaded
+require realpath(dirname(__FILE__)) . "/../../../tests/PHPUnit/TestingEnvironment.php";
+Piwik_TestingEnvironment::addHooks();
// Wrapping the request inside ob_start() calls to ensure that the Test
// calling us waits for the full request to process before unblocking
diff --git a/tests/README.md b/tests/README.md
index 5fe76c5e63..0243358a49 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -54,8 +54,12 @@ Otherwise, if you didn't expect to modify the API outputs, it might be that your
<server name="HTTP_HOST" value="localhost"/>
<server name="REQUEST_URI" value="/path/to/piwik/"/>
+3. Ensure the `[database_tests]` section in `piwik/config/config.php.ini` is set up correctly,
+ i.e. with the correct password to prevent the following error:
+ `SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)`
-3. Run the tests (see the next section to run tests in the browser)
+
+4. Run the tests (see the next section to run tests in the browser)
$ cd /path/to/piwik/tests/PHPUnit
$ phpunit
@@ -68,7 +72,7 @@ Otherwise, if you didn't expect to modify the API outputs, it might be that your
to run all Core Piwik tests. You may also combine groups like
`phpunit --group Core,Plugins`
-4. Write more tests :)
+5. Write more tests :)
See ["Writing Unit tests with PHPUnit"](http://www.phpunit.de/manual/current/en/writing-tests-for-phpunit.html)
## JavaScript Tests
diff --git a/tests/lib/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php b/tests/lib/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php
index 12935dffd8..ff4cda8a91 100755
--- a/tests/lib/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php
+++ b/tests/lib/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php
@@ -905,6 +905,10 @@ function xhprof_param_init($params) {
exit();
}
+ if ($k === 'run') {
+ $p = implode(',', array_filter(explode(',', $p), 'ctype_xdigit'));
+ }
+
// create a global variable using the parameter name.
$GLOBALS[$k] = $p;
}