From 474bc28cebef439672567acc9763c391b5379a40 Mon Sep 17 00:00:00 2001
From: BeezyT <timo@ezdesign.de>
Date: Tue, 22 Nov 2011 21:40:43 +0000
Subject: [PATCH] refs #2714 column translations for html and rss export,
 general fine tuning of export column translations

git-svn-id: http://dev.piwik.org/svn/trunk@5463 59fd770c-687e-43c8-a1e3-f5a4ff64c105
---
 core/API/ResponseBuilder.php                  |  20 +-
 core/Controller.php                           |   2 +
 core/DataTable/Renderer.php                   | 122 ++++++++++++
 core/DataTable/Renderer/Csv.php               | 181 +++++-------------
 core/DataTable/Renderer/Html.php              |   4 +
 core/DataTable/Renderer/Rss.php               |   4 +
 plugins/API/API.php                           |  50 +++++
 plugins/CoreHome/templates/datatable.js       |   5 +-
 .../templates/js_global_variables.tpl         |   1 +
 plugins/VisitorInterest/VisitorInterest.php   |   5 +-
 tests/integration/Main.test.php               |   3 +-
 ...data__API.getDefaultMetricTranslations.xml |  39 ++++
 ...ortMetadata__API.getReportMetadata_day.xml |   1 +
 ...adata_year__API.getReportMetadata_year.xml |   1 +
 ...CustomVariables.getCustomVariables_day.csv | Bin 2320 -> 2336 bytes
 ...CustomVariables.getCustomVariables_day.csv | Bin 3084 -> 3104 bytes
 16 files changed, 296 insertions(+), 142 deletions(-)
 create mode 100644 tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml

diff --git a/core/API/ResponseBuilder.php b/core/API/ResponseBuilder.php
index 09803e7e93..279089aa7c 100644
--- a/core/API/ResponseBuilder.php
+++ b/core/API/ResponseBuilder.php
@@ -179,13 +179,16 @@ class Piwik_API_ResponseBuilder
 			return $dataTable;
 		}
 		
+		$method = Piwik_Common::getRequestVar('method', '', 'string', $this->request);
+		
 		$renderer = Piwik_DataTable_Renderer::factory($format);
 		$renderer->setTable($dataTable);
 		$renderer->setRenderSubTables(Piwik_Common::getRequestVar('expanded', false, 'int', $this->request));
 		$renderer->setHideIdSubDatableFromResponse(Piwik_Common::getRequestVar('hideIdSubDatable', false, 'int', $this->request));
+		
 		if($format == 'php')
 		{
-			$renderer->setSerialize( $this->caseRendererPHPSerialize());
+			$renderer->setSerialize($this->caseRendererPHPSerialize());
 			$renderer->setPrettyDisplay(Piwik_Common::getRequestVar('prettyDisplay', false, 'int', $this->request));
 		}
 		else if($format == 'html')
@@ -195,18 +198,21 @@ class Piwik_API_ResponseBuilder
 		else if($format == 'csv' || $format == 'tsv')
 		{
 			$renderer->setIncludeInnerNodes(Piwik_Common::getRequestVar('includeInnerNodes', false, 'int', $this->request));
-			$renderer->setConvertToUnicode( Piwik_Common::getRequestVar('convertToUnicode', true, 'int', $this->request) );
-			$renderer->setTranslateColumnNames( Piwik_Common::getRequestVar('translateColumnNames', false, 'int', $this->request) );
-			$renderer->setIdSite( Piwik_Common::getRequestVar('idSite', false, 'int', $this->request) );
-			
-			$method = Piwik_Common::getRequestVar('method', '', 'string', $this->request);
-			$renderer->setApiMethod($method);
+			$renderer->setConvertToUnicode(Piwik_Common::getRequestVar('convertToUnicode', true, 'int', $this->request));
 			if (substr($method, 0, 8) == 'Actions.')
 			{
 				$renderer->setRecursiveLabelSeparator('/');
 			}
 		}
 		
+		// prepare translation of column names
+		if ($format == 'html' || $format == 'csv' || $format == 'tsv' || $format = 'rss')
+		{
+			$renderer->setApiMethod($method);
+			$renderer->setIdSite(Piwik_Common::getRequestVar('idSite', false, 'int', $this->request));
+			$renderer->setTranslateColumnNames(Piwik_Common::getRequestVar('translateColumnNames', false, 'int', $this->request));
+		}
+		
 		return $renderer->render();
 	}
 	
diff --git a/core/Controller.php b/core/Controller.php
index e12a19772c..9b16b5dded 100644
--- a/core/Controller.php
+++ b/core/Controller.php
@@ -445,6 +445,8 @@ abstract class Piwik_Controller
 			$view->startDate = $dateStart;
 			$view->endDate = $dateEnd;
 			
+			$view->language = Piwik_LanguagesManager::getLanguageForSession();
+			
 			$this->setBasicVariablesView($view);
 		} catch(Exception $e) {
 			Piwik_ExitWithMessage($e->getMessage());
diff --git a/core/DataTable/Renderer.php b/core/DataTable/Renderer.php
index 3f1f1758aa..1f8bf40ce8 100644
--- a/core/DataTable/Renderer.php
+++ b/core/DataTable/Renderer.php
@@ -28,6 +28,36 @@ abstract class Piwik_DataTable_Renderer
 	protected $renderSubTables = false;
 	protected $hideIdSubDatatable = false;
 	
+	/**
+	 * Whether to translate column names (i.e. metric names) or not
+	 * @var bool
+	 */
+	public $translateColumnNames = false;
+	
+	/**
+	 * Column translations
+	 * @var array
+	 */
+	private $columnTranslations = false;
+	
+	/**
+	 * The API method that has returned the data that should be rendered
+	 * @var string
+	 */
+	public $apiMethod = false;
+	
+	/**
+	 * API metadata for the current report
+	 * @var array
+	 */
+	private $apiMetaData = null;
+	
+	/**
+	 * The current idSite
+	 * @var int
+	 */
+	public $idSite = 'all';
+	
 	public function __construct()
 	{
 	}
@@ -168,4 +198,96 @@ abstract class Piwik_DataTable_Renderer
 		}
 		return $value;
 	}
+	
+	/**
+	 * Translate column names to the current language.
+	 * Used in subclasses.
+	 */
+	protected function translateColumnNames($names)
+	{
+		if (!$this->apiMethod)
+		{
+			return $names;
+		}
+		
+		// load the translations only once
+		// when multiple dates are requested (date=...,...&period=day), the meta data would
+		// be loaded lots of times otherwise
+		if ($this->columnTranslations === false)
+		{
+			$meta = $this->getApiMetaData();
+			if ($meta === false)
+			{
+				return $names;
+			}
+		
+			$t = Piwik_API_API::getDefaultMetricTranslations();
+			foreach (array('metrics', 'processedMetrics', 'metricsGoal', 'processedMetricsGoal') as $index)
+			{
+				if (isset($meta[$index]) && is_array($meta[$index]))
+				{
+					$t = array_merge($t, $meta[$index]);
+				}
+			}
+			
+			$this->columnTranslations = &$t;
+		}
+		
+		foreach ($names as &$name)
+		{
+			if (isset($this->columnTranslations[$name]))
+			{
+				$name = $this->columnTranslations[$name];
+			}
+		}
+		
+		return $names;
+	}
+	
+	protected function getApiMetaData()
+	{
+		if ($this->apiMetaData === null)
+		{
+			list($apiModule, $apiAction) = explode('.', $this->apiMethod);
+			
+			if(!$apiModule || !$apiAction)
+			{
+				$this->apiMetaData = false;
+			}
+			
+			$api = Piwik_API_API::getInstance();
+			$meta = $api->getMetadata($this->idSite, $apiModule, $apiAction);
+			if (is_array($meta[0]))
+			{
+				$meta = $meta[0];
+			}
+			
+			$this->apiMetaData = &$meta;
+		}
+		
+		return $this->apiMetaData;
+	}
+	
+	protected function translateColumnName($column)
+	{
+		$columns = array($column);
+		$columns = $this->translateColumnNames($columns);
+		return $columns[0];
+	}
+	
+	public function setTranslateColumnNames($bool)
+	{
+		$this->translateColumnNames = $bool;
+	}
+	
+	public function setApiMethod($method)
+	{
+		$this->apiMethod = $method;
+	}
+	
+	public function setIdSite($idSite)
+	{
+		$this->idSite = $idSite;
+	}
+	
 }
diff --git a/core/DataTable/Renderer/Csv.php b/core/DataTable/Renderer/Csv.php
index 3ec62c78d0..2313e388aa 100644
--- a/core/DataTable/Renderer/Csv.php
+++ b/core/DataTable/Renderer/Csv.php
@@ -60,20 +60,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 	 */
 	public $includeInnerNodes = false;
 	
-	/**
-	 * Whether to translate column names (i.e. metric names) or not
-	 * 
-	 * @var bool
-	 */
-	public $translateColumnNames = false;
-	
-	/**
-	 * Column translations
-	 * 
-	 * @var array
-	 */
-	private $columnTranslations = false;
-	
 	/**
 	 * Separator for building recursive labels (or paths)
 	 * 
@@ -81,20 +67,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 	 */
 	public $recursiveLabelSeparator = ' - ';
 	
-	/**
-	 * The API method that has returned the data that should be rendered
-	 * 
-	 * @var string
-	 */
-	public $apiMethod = false;
-	
-	/**
-	 * The current idSite
-	 * 
-	 * @var int
-	 */
-	public $idSite = 'all';
-	
 	/**
 	 * idSubtable will be exported in a column called 'idsubdatatable'
 	 *
@@ -110,7 +82,7 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 			return 'No data available';
 		}
 
-		self::renderHeader();
+		self::renderHeader($this);
 
 		if($this->convertToUnicode 
 			&& function_exists('mb_convert_encoding'))
@@ -136,11 +108,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 		$this->includeInnerNodes = $bool;
 	}
 	
-	public function setTranslateColumnNames($bool)
-	{
-		$this->translateColumnNames = $bool;
-	}
-	
 	public function setSeparator($separator)
 	{
 		$this->separator = $separator;
@@ -151,22 +118,17 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 		$this->recursiveLabelSeparator = $separator;
 	}
 	
-	public function setApiMethod($method)
-	{
-		$this->apiMethod = $method;
-	}
-	
-	public function setIdSite($idSite)
-	{
-		$this->idSite = $idSite;
-	}
-	
 	protected function renderTable($table)
 	{
 		if($table instanceof Piwik_DataTable_Array)
 		{
 			$str = $header = '';
-			$prefixColumns = $table->getKeyName() . $this->separator;
+			$keyName = $table->getKeyName();
+			if ($this->translateColumnNames)
+			{
+				$keyName = $this->translateColumnName($keyName);
+			}
+			$prefixColumns = $keyName . $this->separator;
 			foreach($table->getArray() as $currentLinePrefix => $dataTable)
 			{
 				$returned = explode("\n",$this->renderTable($dataTable));
@@ -233,8 +195,18 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 						{
 							foreach($subValues as $subKey => $subValue)
 							{
-								// goals_idgoal=1
-								$columnName = $name . "_" . $key . "_" . $subKey;
+								if ($this->translateColumnNames)
+								{
+									$subName = $name != 'goals' ? $name . ' ' . $key
+											: Piwik_Translate('Goals_GoalX', $key);
+									$columnName = $this->translateColumnName($subKey)
+											.' ('. $subName . ')';
+								}
+								else
+								{
+									// goals_idgoal=1
+									$columnName = $name . "_" . $key . "_" . $subKey;
+								}
 								$allColumns[$columnName] = true;
 								$csvRow[$columnName] = $subValue;
 							}
@@ -370,89 +342,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 		$str = substr($str, 0, -strlen($this->lineEnd));
 		return $str;
 	}
-	
-	protected function translateColumnNames($names)
-	{
-		if (!$this->apiMethod)
-		{
-			return $names;
-		}
-		
-		// load the translations only once
-		// when multiple dates are requested (date=...,...&period=day), the meta data would
-		// be loaded lots of times otherwise
-		if ($this->columnTranslations === false)
-		{
-			list($apiModule, $apiAction) = explode('.', $this->apiMethod);
-		
-			if(!$apiModule || !$apiAction)
-			{
-				return $names;
-			}
-			
-			$api = Piwik_API_API::getInstance();
-			$meta = $api->getMetadata($this->idSite, $apiModule, $apiAction);
-			if (is_array($meta[0]))
-			{
-				$meta = $meta[0];
-			}
-			
-			$t = array_merge($api->getDefaultMetrics(), $api->getDefaultProcessedMetrics(), array(
-				'label' => 'General_ColumnLabel',
-				'avg_time_on_page' => 'General_ColumnAverageTimeOnPage',
-				'sum_time_spent' => 'General_ColumnSumVisitLength',
-				'sum_visit_length' => 'General_ColumnSumVisitLength',
-				'bounce_count' => 'General_ColumnBounces',
-				'bounce_count_returning' => 'VisitFrequency_ColumnBounceCountForReturningVisits',
-				'max_actions' => 'General_ColumnMaxActions',
-				'max_actions_returning' => 'VisitFrequency_ColumnMaxActionsInReturningVisit',
-				'nb_visits_converted_returning' => 'VisitFrequency_ColumnNbReturningVisitsConverted',
-				'sum_visit_length_returning' => 'VisitFrequency_ColumnSumVisitLengthReturning',
-				'nb_visits_converted' => 'General_ColumnVisitsWithConversions',
-				'nb_conversions' => 'Goals_ColumnConversions',
-				'revenue' => 'Goals_ColumnRevenue',
-				'nb_hits' => 'General_ColumnPageviews',
-				'entry_nb_visits' => 'General_ColumnEntrances',
-				'entry_nb_uniq_visitors' => 'General_ColumnUniqueEntrances',
-				'exit_nb_visits' => 'General_ColumnExits',
-				'exit_nb_uniq_visitors' => 'General_ColumnUniqueExits',
-				'entry_bounce_count' => 'General_ColumnBounces',
-				'exit_bounce_count' => 'General_ColumnBounces',
-				'exit_rate' => 'General_ColumnExitRate'
-			));
-			
-			$t = array_map('Piwik_Translate', $t);
-			
-			$dailySum = ' ('.Piwik_Translate('General_DailySum').')';
-			$afterEntry = ' '.Piwik_Translate('General_AfterEntry');
-			
-			$t['sum_daily_nb_uniq_visitors'] = Piwik_Translate('General_ColumnNbUniqVisitors').$dailySum;
-			$t['sum_daily_entry_nb_uniq_visitors'] = Piwik_Translate('General_ColumnUniqueEntrances').$dailySum;
-			$t['sum_daily_exit_nb_uniq_visitors'] = Piwik_Translate('General_ColumnUniqueExits').$dailySum;
-			$t['entry_nb_actions'] = Piwik_Translate('General_ColumnNbActions').$afterEntry;
-			$t['entry_sum_visit_length'] = Piwik_Translate('General_ColumnSumVisitLength').$afterEntry;
-			
-			foreach (array('metrics', 'processedMetrics', 'metricsGoal', 'processedMetricsGoal') as $index)
-			{
-				if (isset($meta[$index]) && is_array($meta[$index]))
-				{
-					$t = array_merge($t, $meta[$index]);
-				}
-			}
-			
-			$this->columnTranslations = &$t;
-		}
-		
-		foreach ($names as &$name)
-		{
-			if (isset($this->columnTranslations[$name]))
-			{
-				$name = $this->columnTranslations[$name];
-			}
-		}
-		
-		return $names;
-	}
 
 	protected function formatValue($value)
 	{
@@ -484,11 +373,39 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer
 		return $value;
 	}
 	
-	protected static function renderHeader()
+	protected static function renderHeader($instance)
 	{
+		$fileName = 'Piwik '.Piwik_Translate('General_Export');
+		
+		$period = Piwik_Common::getRequestVar('period', false);
+		$date = Piwik_Common::getRequestVar('date', false);
+		if ($period || $date) // in test cases, there are no request params set
+		{
+			if ($period == 'range')
+			{
+				$period = new Piwik_Period_Range($period, $date);
+			}
+			else if (strpos($date, ',') !== false)
+			{
+				$period = new Piwik_Period_Range('range', $date);
+			}
+			else
+			{
+				$period = Piwik_Period::factory($period, Piwik_Date::factory($date));
+			}
+			
+			$prettyDate = $period->getLocalizedLongString();
+			
+			$meta = $instance->getApiMetaData();
+			
+			$fileName .= ' _ '.$meta['name']
+					.' _ '.$prettyDate.'.csv';
+		}
+		
 		// silent fail otherwise unit tests fail
 		@header('Content-Type: application/vnd.ms-excel');
-		@header('Content-Disposition: attachment; filename=piwik-report-export.csv');
+		@header('Content-Disposition: attachment; filename='.$fileName);
 		Piwik::overrideCacheControlHeaders();
 	}
+	
 }
diff --git a/core/DataTable/Renderer/Html.php b/core/DataTable/Renderer/Html.php
index e2676c7046..cd5f22cc88 100644
--- a/core/DataTable/Renderer/Html.php
+++ b/core/DataTable/Renderer/Html.php
@@ -139,6 +139,10 @@ class Piwik_DataTable_Renderer_Html extends Piwik_DataTable_Renderer
 				{
 					$name = 'value';
 				}
+				if($this->translateColumnNames)
+				{
+					$name = $this->translateColumnName($name);
+				}
 				$html .= "\t\t<th>$name</th>\n";
 			}
 		}
diff --git a/core/DataTable/Renderer/Rss.php b/core/DataTable/Renderer/Rss.php
index 18622260e1..accd5e5376 100644
--- a/core/DataTable/Renderer/Rss.php
+++ b/core/DataTable/Renderer/Rss.php
@@ -143,6 +143,10 @@ class Piwik_DataTable_Renderer_Rss extends Piwik_DataTable_Renderer
 		{
 			if($toDisplay !== false)
 			{
+				if($this->translateColumnNames)
+				{
+					$name = $this->translateColumnName($name);
+				}
 				$html .= "\n\t<td><b>$name</b></td>";
 			}
 		}
diff --git a/plugins/API/API.php b/plugins/API/API.php
index dffb9d2315..6360be06ee 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -90,6 +90,56 @@ class Piwik_API_API
 		}
 		return self::$instance;
 	}
+	
+	/**
+	 * Default translations for many core metrics.
+	 * This is used for exports with translated labels. The exports contain columns that
+	 * are not visible in the UI and not present in the API meta data. These columns are
+	 * translated here.
+	 */
+	static public function getDefaultMetricTranslations()
+	{
+		$trans = array(
+			'label' => 'General_ColumnLabel',
+			'date' => 'General_Date',
+			'avg_time_on_page' => 'General_ColumnAverageTimeOnPage',
+			'sum_time_spent' => 'General_ColumnSumVisitLength',
+			'sum_visit_length' => 'General_ColumnSumVisitLength',
+			'bounce_count' => 'General_ColumnBounces',
+			'bounce_count_returning' => 'VisitFrequency_ColumnBounceCountForReturningVisits',
+			'max_actions' => 'General_ColumnMaxActions',
+			'max_actions_returning' => 'VisitFrequency_ColumnMaxActionsInReturningVisit',
+			'nb_visits_converted_returning' => 'VisitFrequency_ColumnNbReturningVisitsConverted',
+			'sum_visit_length_returning' => 'VisitFrequency_ColumnSumVisitLengthReturning',
+			'nb_visits_converted' => 'General_ColumnVisitsWithConversions',
+			'nb_conversions' => 'Goals_ColumnConversions',
+			'revenue' => 'Goals_ColumnRevenue',
+			'nb_hits' => 'General_ColumnPageviews',
+			'entry_nb_visits' => 'General_ColumnEntrances',
+			'entry_nb_uniq_visitors' => 'General_ColumnUniqueEntrances',
+			'exit_nb_visits' => 'General_ColumnExits',
+			'exit_nb_uniq_visitors' => 'General_ColumnUniqueExits',
+			'entry_bounce_count' => 'General_ColumnBounces',
+			'exit_bounce_count' => 'General_ColumnBounces',
+			'exit_rate' => 'General_ColumnExitRate'
+		);
+		
+		$trans = array_map('Piwik_Translate', $trans);
+		
+		$dailySum = ' ('.Piwik_Translate('General_DailySum').')';
+		$afterEntry = ' '.Piwik_Translate('General_AfterEntry');
+		
+		$trans['sum_daily_nb_uniq_visitors'] = Piwik_Translate('General_ColumnNbUniqVisitors').$dailySum;
+		$trans['sum_daily_entry_nb_uniq_visitors'] = Piwik_Translate('General_ColumnUniqueEntrances').$dailySum;
+		$trans['sum_daily_exit_nb_uniq_visitors'] = Piwik_Translate('General_ColumnUniqueExits').$dailySum;
+		$trans['entry_nb_actions'] = Piwik_Translate('General_ColumnNbActions').$afterEntry;
+		$trans['entry_sum_visit_length'] = Piwik_Translate('General_ColumnSumVisitLength').$afterEntry;
+		
+		$api = self::getInstance();
+		$trans = array_merge($api->getDefaultMetrics(), $api->getDefaultProcessedMetrics(), $trans);
+		
+		return $trans;
+	}
 
 	public function getDefaultMetrics()
 	{
diff --git a/plugins/CoreHome/templates/datatable.js b/plugins/CoreHome/templates/datatable.js
index 9757fcf0d2..a5dae88a59 100644
--- a/plugins/CoreHome/templates/datatable.js
+++ b/plugins/CoreHome/templates/datatable.js
@@ -567,7 +567,10 @@ dataTable.prototype =
 						+'&token_auth='+piwik.token_auth
 						+'&expanded=1';
 				if (format == 'CSV' || format == 'TSV') {
-					str += '&translateColumnNames=1';
+					str += '&includeInnerNodes=1';
+				}
+				if (format == 'CSV' || format == 'TSV' || format == 'RSS') {
+					str += '&translateColumnNames=1&language='+piwik.language;
 				}
 				if(typeof segment != 'undefined') {
 					str += '&segment='+segment;
diff --git a/plugins/CoreHome/templates/js_global_variables.tpl b/plugins/CoreHome/templates/js_global_variables.tpl
index 7e60ad234e..ec58ad1b79 100644
--- a/plugins/CoreHome/templates/js_global_variables.tpl
+++ b/plugins/CoreHome/templates/js_global_variables.tpl
@@ -20,4 +20,5 @@
 	{if isset($maxDateYear)}piwik.maxDateYear = {$maxDateYear};{/if}
 	{if isset($maxDateMonth)}piwik.maxDateMonth = parseInt("{$maxDateMonth}", 10);{/if}
 	{if isset($maxDateDay)}piwik.maxDateDay = parseInt("{$maxDateDay}", 10);{/if}
+	{if isset($language)}piwik.language = "{$language}";{/if}
 </script>
diff --git a/plugins/VisitorInterest/VisitorInterest.php b/plugins/VisitorInterest/VisitorInterest.php
index 5875679560..d06d586c8d 100644
--- a/plugins/VisitorInterest/VisitorInterest.php
+++ b/plugins/VisitorInterest/VisitorInterest.php
@@ -76,7 +76,10 @@ class Piwik_VisitorInterest extends Piwik_Plugin
 			'module' => 'VisitorInterest',
 			'action' => 'getNumberOfVisitsByVisitCount',
 			'dimension' => Piwik_Translate('VisitorInterest_visitsByVisitCount'),
-			'metrics' => array( 'nb_visits' ),
+			'metrics' => array(
+				'nb_visits',
+				'nb_visits_percentage' => Piwik_Translate('General_ColumnPercentageVisits')
+			),
 			'processedMetrics' => false,
 			'constantRowsCount' => true,
 			'documentation' => Piwik_Translate('VisitorInterest_WidgetVisitsByNumDocumentation')
diff --git a/tests/integration/Main.test.php b/tests/integration/Main.test.php
index 3e7ddba98d..20fb76011f 100644
--- a/tests/integration/Main.test.php
+++ b/tests/integration/Main.test.php
@@ -1112,8 +1112,9 @@ class Test_Piwik_Integration_Main extends Test_Integration
 		
 		// changing the language within one request is a bit fancy
 		// in order to keep the core clean, we need a little hack here
-		Piwik_Translate::reset();
 		$_GET['language'] = 'de';
+		Piwik_Translate::reset();
+		Piwik_Translate::getInstance()->reloadLanguage('de');
 		
 		$this->callGetApiCompareOutput(__FUNCTION__.'_xp1_inner1_trans-de', 'csv', 
 				$idSite, $dateTime, $periods = false, $setDateLastN = false, $language = false,
diff --git a/tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml b/tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml
new file mode 100644
index 0000000000..cadf49662a
--- /dev/null
+++ b/tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<nb_visits>Visits</nb_visits>
+		<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+		<nb_actions>Actions</nb_actions>
+		<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+		<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+		<bounce_rate>Bounce Rate</bounce_rate>
+		<conversion_rate>Conversion Rate</conversion_rate>
+		<label>Label</label>
+		<date>Date</date>
+		<avg_time_on_page>Avg. time on page</avg_time_on_page>
+		<sum_time_spent>Total time spent by visitors (in seconds)</sum_time_spent>
+		<sum_visit_length>Total time spent by visitors (in seconds)</sum_visit_length>
+		<bounce_count>Bounces</bounce_count>
+		<bounce_count_returning>Bounce Count for Returning Visits</bounce_count_returning>
+		<max_actions>Maximum actions in one visit</max_actions>
+		<max_actions_returning>Maximum actions in one returning visit</max_actions_returning>
+		<nb_visits_converted_returning>Number of converted returning visits</nb_visits_converted_returning>
+		<sum_visit_length_returning>Total time spent by returning visitors (in seconds)</sum_visit_length_returning>
+		<nb_visits_converted>Visits with Conversions</nb_visits_converted>
+		<nb_conversions>Conversions</nb_conversions>
+		<revenue>Revenue</revenue>
+		<nb_hits>Pageviews</nb_hits>
+		<entry_nb_visits>Entrances</entry_nb_visits>
+		<entry_nb_uniq_visitors>Unique entrances</entry_nb_uniq_visitors>
+		<exit_nb_visits>Exits</exit_nb_visits>
+		<exit_nb_uniq_visitors>Unique exits</exit_nb_uniq_visitors>
+		<entry_bounce_count>Bounces</entry_bounce_count>
+		<exit_bounce_count>Bounces</exit_bounce_count>
+		<exit_rate>Exit rate</exit_rate>
+		<sum_daily_nb_uniq_visitors>Unique visitors (daily sum)</sum_daily_nb_uniq_visitors>
+		<sum_daily_entry_nb_uniq_visitors>Unique entrances (daily sum)</sum_daily_entry_nb_uniq_visitors>
+		<sum_daily_exit_nb_uniq_visitors>Unique exits (daily sum)</sum_daily_exit_nb_uniq_visitors>
+		<entry_nb_actions>Actions after entereing here</entry_nb_actions>
+		<entry_sum_visit_length>Total time spent by visitors (in seconds) after entereing here</entry_sum_visit_length>
+	</row>
+</result>
\ No newline at end of file
diff --git a/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml b/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
index 99af9c8995..ba722fd1c9 100644
--- a/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
+++ b/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
@@ -1134,6 +1134,7 @@
 		<dimension>Visits by visit number</dimension>
 		<metrics>
 			<nb_visits>Visits</nb_visits>
+			<nb_visits_percentage>% Visits</nb_visits_percentage>
 
 		</metrics>
 		<constantRowsCount>1</constantRowsCount>
diff --git a/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml b/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml
index f0640715a3..16a458d03d 100644
--- a/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml
+++ b/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml
@@ -782,6 +782,7 @@
 		<dimension>Visits by visit number</dimension>
 		<metrics>
 			<nb_visits>Visits</nb_visits>
+			<nb_visits_percentage>% Visits</nb_visits_percentage>
 
 		</metrics>
 		<constantRowsCount>1</constantRowsCount>
diff --git a/tests/integration/expected/test_csvExport_xp1_inner0_trans-en__CustomVariables.getCustomVariables_day.csv b/tests/integration/expected/test_csvExport_xp1_inner0_trans-en__CustomVariables.getCustomVariables_day.csv
index 7a19c4a33e44aaa8463962566847bd88a8e041b4..6c1e4521dc0f13f89603dde1b90ca2f904fcf221 100644
GIT binary patch
delta 321
zcmbOrv_NRWD@NzZ{EVX33Je+y?hN@1i3~Xm3JjSHDGcdQo-KnRgC>IxLl{FQLoq`p
zLkUAMg91Z2n3chxzyQ`COjv&qLn=cVLn=caLn%Wl17Y=GbMd;%h(dQk^b_wch<cE_
L#5X4~tz!cK-#$18

delta 367
zcmZ1=G(l*>tNL_?e1=4Z9EM_sc!o@d6b2aImcfuAo*|DRi6NdLnIWGckD-hqm7$2C
zm?0C)D`wDvtHr0cj3E=Orvz*RvPmTjsSGLg1dS<TNCjJ+$56_UidVG}84iwz_}-QQ
Xp_zb-2|5AA!IS4RN^UM-+Q0??6?RM(

diff --git a/tests/integration/expected/test_csvExport_xp1_inner1_trans-de__CustomVariables.getCustomVariables_day.csv b/tests/integration/expected/test_csvExport_xp1_inner1_trans-de__CustomVariables.getCustomVariables_day.csv
index e9bf1d8d3267c5e24f017cb63474f97d253898de..210c660c425da7b57de3cc96635190c339871cd1 100644
GIT binary patch
delta 342
zcmeB?SRk=MgmH2SlSI7&g9bwsLncEiLk@!iLncECLpnn~Ln1>CgDrz0gC>IxgA+q4
zLoq`sLo!1KLn?y;LoP!mLkWWdgEvDyLmopJLn=cNLoq`pn3u|s$3WP`P=;KFVunP9
i5{4=TLdqu>GD+igq!HB}2{DmqM;b9`ZZ2e+%?SYOW<AXS

delta 349
zcmZ1=(Ic@zgi$q}A)g_UA%~%uA)X<VA%y|Pw`DM7h-b)SNMeX*NS>_7BwSz2paYl1
zr@D+GlcAU)lc5A`W->!QLmopJLn=cNLkUAFLkdAtiWpMC>hl;%8B!6d<-o?FI?;$E
bCn8i+;zW=s=uY&8cyh8dqu}NRObwg>Ef_{x

-- 
GitLab