From 0dd0926c012f54d9a2a43249e0d11ff38394cdc7 Mon Sep 17 00:00:00 2001
From: sgiehl <stefan@piwik.org>
Date: Sat, 10 Oct 2015 21:54:02 +0200
Subject: [PATCH] use number formats for values displayed besides sparkline and
 for evolution data

---
 .../Filter/CalculateEvolutionFilter.php       |  5 ++--
 core/Metrics/Formatter.php                    |  3 +-
 core/Plugin/Controller.php                    |  4 +++
 core/Twig.php                                 |  9 ++++++
 .../Goals/templates/_listTopDimension.twig    |  4 +--
 .../templates/_titleAndEvolutionGraph.twig    | 16 +++++-----
 plugins/Goals/templates/getOverviewView.twig  |  6 ++--
 plugins/Referrers/lang/bg.json                |  2 +-
 plugins/Referrers/lang/cs.json                |  2 +-
 plugins/Referrers/lang/da.json                |  2 +-
 plugins/Referrers/lang/de.json                |  2 +-
 plugins/Referrers/lang/el.json                |  2 +-
 plugins/Referrers/lang/en.json                |  2 +-
 plugins/Referrers/lang/es.json                |  2 +-
 plugins/Referrers/lang/et.json                |  2 +-
 plugins/Referrers/lang/fi.json                |  2 +-
 plugins/Referrers/lang/fr.json                |  2 +-
 plugins/Referrers/lang/it.json                |  2 +-
 plugins/Referrers/lang/ja.json                |  2 +-
 plugins/Referrers/lang/nb.json                |  2 +-
 plugins/Referrers/lang/nl.json                |  2 +-
 plugins/Referrers/lang/pt-br.json             |  2 +-
 plugins/Referrers/lang/ro.json                |  2 +-
 plugins/Referrers/lang/ru.json                |  2 +-
 plugins/Referrers/lang/sr.json                |  2 +-
 plugins/Referrers/lang/sv.json                |  2 +-
 plugins/Referrers/lang/tl.json                |  2 +-
 plugins/Referrers/lang/zh-cn.json             |  2 +-
 plugins/Referrers/templates/index.twig        | 26 ++++++++--------
 plugins/UserCountry/templates/index.twig      |  2 +-
 .../VisitFrequency/templates/_sparklines.twig |  8 ++---
 .../VisitsSummary/templates/_sparklines.twig  | 30 +++++++++----------
 32 files changed, 85 insertions(+), 70 deletions(-)

diff --git a/core/DataTable/Filter/CalculateEvolutionFilter.php b/core/DataTable/Filter/CalculateEvolutionFilter.php
index 5af658bad6..73274c537d 100755
--- a/core/DataTable/Filter/CalculateEvolutionFilter.php
+++ b/core/DataTable/Filter/CalculateEvolutionFilter.php
@@ -11,6 +11,7 @@ namespace Piwik\DataTable\Filter;
 use Piwik\Common;
 use Piwik\DataTable;
 use Piwik\DataTable\Row;
+use Piwik\NumberFormatter;
 use Piwik\Site;
 
 /**
@@ -157,10 +158,10 @@ class CalculateEvolutionFilter extends ColumnCallbackAddColumnPercentage
     {
         $number = self::getPercentageValue($currentValue - $pastValue, $pastValue, $quotientPrecision);
         if ($appendPercentSign) {
-            $number = self::appendPercentSign($number);
+            return NumberFormatter::getInstance()->formatPercent($number, $quotientPrecision);
         }
 
-        return $number;
+        return NumberFormatter::getInstance()->format($number, $quotientPrecision);
     }
 
     public static function appendPercentSign($number)
diff --git a/core/Metrics/Formatter.php b/core/Metrics/Formatter.php
index 69d32bc628..8fbe5cbb89 100644
--- a/core/Metrics/Formatter.php
+++ b/core/Metrics/Formatter.php
@@ -11,6 +11,7 @@ use Piwik\Common;
 use Piwik\Container\StaticContainer;
 use Piwik\DataTable;
 use Piwik\Intl\Data\Provider\CurrencyDataProvider;
+use Piwik\NumberFormatter;
 use Piwik\Piwik;
 use Piwik\Plugin\Metric;
 use Piwik\Plugin\ProcessedMetric;
@@ -98,7 +99,7 @@ class Formatter
 
         $seconds   = $minusDaysAndHours - $minutes * 60;
         $precision = ($seconds > 0 && $seconds < 0.01 ? 3 : 2);
-        $seconds   = round($seconds, $precision);
+        $seconds   = NumberFormatter::getInstance()->formatNumber(round($seconds, $precision), $precision);
 
         if ($years > 0) {
             $return = sprintf(Piwik::translate('General_YearsDays'), $years, $days);
diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php
index be874c6224..cf38fbd570 100644
--- a/core/Plugin/Controller.php
+++ b/core/Plugin/Controller.php
@@ -24,6 +24,7 @@ use Piwik\Menu\MenuTop;
 use Piwik\Menu\MenuUser;
 use Piwik\NoAccessException;
 use Piwik\Notification\Manager as NotificationManager;
+use Piwik\NumberFormatter;
 use Piwik\Period\Month;
 use Piwik\Period;
 use Piwik\Period\PeriodValidator;
@@ -984,6 +985,9 @@ abstract class Controller
             $titleEvolutionPercent = '+' . $titleEvolutionPercent;
         }
 
+        $currentValue = NumberFormatter::getInstance()->format($currentValue);
+        $pastValue    = NumberFormatter::getInstance()->format($pastValue);
+
         $title = Piwik::translate('General_EvolutionSummaryGeneric', array(
                                                                          Piwik::translate('General_NVisits', $currentValue),
                                                                          $date,
diff --git a/core/Twig.php b/core/Twig.php
index 90b9643622..6d5b91a24c 100755
--- a/core/Twig.php
+++ b/core/Twig.php
@@ -85,6 +85,7 @@ class Twig
         $this->addFilter_truncate();
         $this->addFilter_notification();
         $this->addFilter_percentage();
+        $this->addFilter_percent();
         $this->addFilter_prettyDate();
         $this->addFilter_safeDecodeRaw();
         $this->addFilter_number();
@@ -279,6 +280,14 @@ class Twig
         $this->twig->addFilter($percentage);
     }
 
+    protected function addFilter_percent()
+    {
+        $percentage = new Twig_SimpleFilter('percent', function ($string, $precision = 1) {
+            return NumberFormatter::getInstance()->formatPercent($string, $precision);
+        });
+        $this->twig->addFilter($percentage);
+    }
+
     protected function addFilter_number()
     {
         $formatter = new Twig_SimpleFilter('number', function ($string, $minFractionDigits = 0, $maxFractionDigits = 0) {
diff --git a/plugins/Goals/templates/_listTopDimension.twig b/plugins/Goals/templates/_listTopDimension.twig
index 8de4594f58..2d63e077b5 100644
--- a/plugins/Goals/templates/_listTopDimension.twig
+++ b/plugins/Goals/templates/_listTopDimension.twig
@@ -1,8 +1,8 @@
 {% for element in topDimension %}
     {% set goal_nb_conversion=element.nb_conversions %}
     {% set goal_conversion_rate=element.conversion_rate %}
-    <span class='goalTopElement' title='{{ 'Goals_Conversions'|translate("<b>"~goal_nb_conversion~"</b>")|raw }},
-		{{ 'Goals_ConversionRate'|translate("<b>"~goal_conversion_rate~"</b>")|raw }}'>
+    <span class='goalTopElement' title='{{ 'Goals_Conversions'|translate("<b>"~goal_nb_conversion|number~"</b>")|raw }},
+		{{ 'Goals_ConversionRate'|translate("<b>"~goal_conversion_rate|number~"</b>")|raw }}'>
 	    {{ element.name }}
     </span>
 
diff --git a/plugins/Goals/templates/_titleAndEvolutionGraph.twig b/plugins/Goals/templates/_titleAndEvolutionGraph.twig
index 0a2fdc1e31..59657778a6 100644
--- a/plugins/Goals/templates/_titleAndEvolutionGraph.twig
+++ b/plugins/Goals/templates/_titleAndEvolutionGraph.twig
@@ -13,14 +13,14 @@
 <div id='leftcolumn' style="clear:both;{% if not isWidget and ecommerce is defined %}width:33%;'{% endif %}">
     <div class="sparkline">{{ sparkline(urlSparklineConversions) }}
         {% if ecommerce is defined %}
-            <strong>{{ nb_conversions }}</strong>
+            <strong>{{ nb_conversions|number }}</strong>
             {{ 'General_EcommerceOrders'|translate }}
             <img src='plugins/Morpheus/images/ecommerceOrder.gif'>
         {% else %}
-            {{ 'Goals_Conversions'|translate("<strong>"~nb_conversions~"</strong>")|raw }}
+            {{ 'Goals_Conversions'|translate("<strong>"~nb_conversions|number~"</strong>")|raw }}
         {% endif %}
         {% if goalAllowMultipleConversionsPerVisit is defined and goalAllowMultipleConversionsPerVisit %}
-            ({{ 'General_NVisits'|translate("<strong>"~nb_visits_converted~"</strong>")|raw }})
+            ({{ 'General_NVisits'|translate("<strong>"~nb_visits_converted|number~"</strong>")|raw }})
         {% endif %}
     </div>
     {% if revenue != 0 or ecommerce is defined %}
@@ -46,14 +46,14 @@
     <div class="sparkline">{{ sparkline(urlSparklineConversionRate) }}
         {% if ecommerce is defined %}
             {% set ecommerceOrdersText %}{{ 'General_EcommerceOrders'|translate }}{% endset %}
-            {{ 'Goals_ConversionRate'|translate("<strong>"~conversion_rate~"</strong> "~ecommerceOrdersText)|raw }}
+            {{ 'Goals_ConversionRate'|translate("<strong>"~conversion_rate|percent~"</strong> "~ecommerceOrdersText)|raw }}
         {% else %}
-            {{ 'Goals_OverallConversionRate'|translate("<strong>"~conversion_rate~"</strong>")|raw }}
+            {{ 'Goals_OverallConversionRate'|translate("<strong>"~conversion_rate|percent~"</strong>")|raw }}
         {% endif %}
     </div>
     {% if ecommerce is defined %}
         <div class="sparkline">{{ sparkline(urlSparklinePurchasedProducts) }}
-            <strong>{{ items }}</strong> {{ 'General_PurchasedProducts'|translate }}</div>
+            <strong>{{ items|number }}</strong> {{ 'General_PurchasedProducts'|translate }}</div>
     {% endif %}
 </div>
 {% if ecommerce is defined %}
@@ -65,7 +65,7 @@
         <div class="sparkline">
             {{ sparkline(cart_urlSparklineConversions) }}
             {% set ecommerceAbandonedCartsText %}{{ 'Goals_AbandonedCart'|translate }}{% endset %}
-            <strong>{{ cart_nb_conversions }}</strong> {{ 'General_VisitsWith'|translate(ecommerceAbandonedCartsText) }}
+            <strong>{{ cart_nb_conversions|number }}</strong> {{ 'General_VisitsWith'|translate(ecommerceAbandonedCartsText) }}
         </div>
 
         <div class="sparkline">
@@ -77,7 +77,7 @@
 
         <div class="sparkline">
             {{ sparkline(cart_urlSparklineConversionRate) }}
-            <strong>{{ cart_conversion_rate }}</strong>
+            <strong>{{ cart_conversion_rate|percent }}</strong>
             {{ 'General_VisitsWith'|translate(ecommerceAbandonedCartsText) }}
         </div>
     </div>
diff --git a/plugins/Goals/templates/getOverviewView.twig b/plugins/Goals/templates/getOverviewView.twig
index 909fd01711..ce828a8b54 100644
--- a/plugins/Goals/templates/getOverviewView.twig
+++ b/plugins/Goals/templates/getOverviewView.twig
@@ -21,9 +21,9 @@
         {% endif %}
 
                 <div class="sparkline">{{ sparkline(goal.urlSparklineConversions) }}
-                    {{ 'Goals_Conversions'|translate("<strong>"~nb_conversions~"</strong>")|raw }}
+                    {{ 'Goals_Conversions'|translate("<strong>"~nb_conversions|number~"</strong>")|raw }}
                     {% if goal.goalAllowMultipleConversionsPerVisit %}
-                        ({{ 'General_NVisits'|translate("<strong>"~nb_visits_converted~"</strong>") | raw }})
+                        ({{ 'General_NVisits'|translate("<strong>"~nb_visits_converted|number~"</strong>") | raw }})
                     {% endif %}
                 </div>
 
@@ -33,7 +33,7 @@
         {% endif %}
 
                 <div class="sparkline">{{ sparkline(goal.urlSparklineConversionRate) }}
-                    {{ 'Goals_ConversionRate'|translate("<strong>"~conversion_rate~"</strong>")|raw }}
+                    {{ 'Goals_ConversionRate'|translate("<strong>"~conversion_rate|percent~"</strong>")|raw }}
                 </div>
 
         {% if not isWidget %}
diff --git a/plugins/Referrers/lang/bg.json b/plugins/Referrers/lang/bg.json
index 937703c8e3..886aaa52a3 100644
--- a/plugins/Referrers/lang/bg.json
+++ b/plugins/Referrers/lang/bg.json
@@ -45,6 +45,6 @@
         "WidgetGetAll": "Всички препоръчители",
         "WidgetSocials": "Списък на социалните мрежи",
         "WidgetTopKeywordsForPages": "Най-използваните ключови думи",
-        "XPercentOfVisits": "%s%% от посещения"
+        "XPercentOfVisits": "%s от посещения"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/cs.json b/plugins/Referrers/lang/cs.json
index f9640a6869..740d25a38b 100644
--- a/plugins/Referrers/lang/cs.json
+++ b/plugins/Referrers/lang/cs.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Všechny referrery",
         "WidgetSocials": "Seznam sociálních sítí",
         "WidgetTopKeywordsForPages": "Nejčastější klíčová slova pro URL stránky",
-        "XPercentOfVisits": "%s%% návštěv"
+        "XPercentOfVisits": "%s návštěv"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/da.json b/plugins/Referrers/lang/da.json
index e48a828521..3701ba1942 100644
--- a/plugins/Referrers/lang/da.json
+++ b/plugins/Referrers/lang/da.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Alle henvisninger",
         "WidgetSocials": "Liste af sociale netværk",
         "WidgetTopKeywordsForPages": "Top søgeord til side URL",
-        "XPercentOfVisits": "%s%% af besøg"
+        "XPercentOfVisits": "%s af besøg"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/de.json b/plugins/Referrers/lang/de.json
index f1aebccedc..ea22dcfc62 100644
--- a/plugins/Referrers/lang/de.json
+++ b/plugins/Referrers/lang/de.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Alle Verweise",
         "WidgetSocials": "Liste Sozialer Netzwerke",
         "WidgetTopKeywordsForPages": "Top-Suchbegriffe für Seiten-URL",
-        "XPercentOfVisits": "%s%% aller Besuche"
+        "XPercentOfVisits": "%s aller Besuche"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/el.json b/plugins/Referrers/lang/el.json
index d6533c4c68..ec0a844319 100644
--- a/plugins/Referrers/lang/el.json
+++ b/plugins/Referrers/lang/el.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Όλες οι Παραπομπές",
         "WidgetSocials": "Λίστα κοινωνικών δικτύων",
         "WidgetTopKeywordsForPages": "Δημοφιλέστερες Λέξεις-Κλειδιά για τη Διεύθυνση URL της σελίδας",
-        "XPercentOfVisits": "%s%% των επισκέψεων"
+        "XPercentOfVisits": "%s των επισκέψεων"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/en.json b/plugins/Referrers/lang/en.json
index 1d33552996..14f106b9d0 100644
--- a/plugins/Referrers/lang/en.json
+++ b/plugins/Referrers/lang/en.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "All Referrers",
         "WidgetSocials": "List of social networks",
         "WidgetTopKeywordsForPages": "Top Keywords for Page URL",
-        "XPercentOfVisits": "%s%% of visits"
+        "XPercentOfVisits": "%s of visits"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/es.json b/plugins/Referrers/lang/es.json
index 32c8cb3a7b..9d38b45cc8 100644
--- a/plugins/Referrers/lang/es.json
+++ b/plugins/Referrers/lang/es.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Todas las referencias",
         "WidgetSocials": "Lista de redes sociales",
         "WidgetTopKeywordsForPages": "Principales palabras clave para el URL de página",
-        "XPercentOfVisits": "%s%% de visitas"
+        "XPercentOfVisits": "%s de visitas"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/et.json b/plugins/Referrers/lang/et.json
index f2d0d0dc8a..a91f3185bc 100644
--- a/plugins/Referrers/lang/et.json
+++ b/plugins/Referrers/lang/et.json
@@ -29,6 +29,6 @@
         "WidgetGetAll": "Kõik viitajad",
         "WidgetSocials": "Nimekiri sotsiaalvõrgustikest",
         "WidgetTopKeywordsForPages": "Lehe URL peamised võtmesõnad",
-        "XPercentOfVisits": "%s%% külastustest"
+        "XPercentOfVisits": "%s külastustest"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/fi.json b/plugins/Referrers/lang/fi.json
index 8131fe33a8..7e2ac0ed16 100644
--- a/plugins/Referrers/lang/fi.json
+++ b/plugins/Referrers/lang/fi.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Kaikki viittaukset",
         "WidgetSocials": "Sosiaalisten verkostojen lista",
         "WidgetTopKeywordsForPages": "Käytetyimmät avainsanat sivun URL:lle",
-        "XPercentOfVisits": "%s%% kävijöistä"
+        "XPercentOfVisits": "%s kävijöistä"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/fr.json b/plugins/Referrers/lang/fr.json
index ff7aa07f75..864f8b31a3 100644
--- a/plugins/Referrers/lang/fr.json
+++ b/plugins/Referrers/lang/fr.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Tous les référents",
         "WidgetSocials": "Liste des réseaux sociaux",
         "WidgetTopKeywordsForPages": "Meilleurs mots-clés pour l'URL",
-        "XPercentOfVisits": "%s%% des visites"
+        "XPercentOfVisits": "%s des visites"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/it.json b/plugins/Referrers/lang/it.json
index 94396a0dcd..5343975d95 100644
--- a/plugins/Referrers/lang/it.json
+++ b/plugins/Referrers/lang/it.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Tutti i Referenti",
         "WidgetSocials": "Elenco di social network",
         "WidgetTopKeywordsForPages": "Top Keyword per URL Pagina",
-        "XPercentOfVisits": "%s%% di visite"
+        "XPercentOfVisits": "%s di visite"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/ja.json b/plugins/Referrers/lang/ja.json
index db6978a8f1..f5b1e178a4 100644
--- a/plugins/Referrers/lang/ja.json
+++ b/plugins/Referrers/lang/ja.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "全参照元",
         "WidgetSocials": "ソーシャルネットワークのリスト",
         "WidgetTopKeywordsForPages": "ページ URL のトップキーワード",
-        "XPercentOfVisits": "訪問の %s%%"
+        "XPercentOfVisits": "訪問の %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/nb.json b/plugins/Referrers/lang/nb.json
index ee64f7ba5a..c521750718 100644
--- a/plugins/Referrers/lang/nb.json
+++ b/plugins/Referrers/lang/nb.json
@@ -32,6 +32,6 @@
         "WidgetExternalWebsites": "Liste over eksterne nettsteder",
         "WidgetGetAll": "Alle henvisere",
         "WidgetSocials": "Liste over sosiale nettverk",
-        "XPercentOfVisits": "%s%% av besøk"
+        "XPercentOfVisits": "%s av besøk"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/nl.json b/plugins/Referrers/lang/nl.json
index 9063068582..648c1f51a1 100644
--- a/plugins/Referrers/lang/nl.json
+++ b/plugins/Referrers/lang/nl.json
@@ -47,6 +47,6 @@
         "WidgetGetAll": "Alle Referers",
         "WidgetSocials": "Lijst van sociale netwerken",
         "WidgetTopKeywordsForPages": "Top sleutelwoorden voor pagina URL",
-        "XPercentOfVisits": "%s%% van de bezoeken"
+        "XPercentOfVisits": "%s van de bezoeken"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/pt-br.json b/plugins/Referrers/lang/pt-br.json
index 64174e7f01..7204ca6069 100644
--- a/plugins/Referrers/lang/pt-br.json
+++ b/plugins/Referrers/lang/pt-br.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Todos os Referenciadores",
         "WidgetSocials": "Lista de redes sociais",
         "WidgetTopKeywordsForPages": "Principais Palavras-chave para a URL da página",
-        "XPercentOfVisits": "%s%% de visitas"
+        "XPercentOfVisits": "%s de visitas"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/ro.json b/plugins/Referrers/lang/ro.json
index bd6b9f538f..ea2c7aec82 100644
--- a/plugins/Referrers/lang/ro.json
+++ b/plugins/Referrers/lang/ro.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Toti Referalii",
         "WidgetSocials": "Listă de reţele sociale",
         "WidgetTopKeywordsForPages": "Cuvinte cheie de top pentru URL-ul paginii",
-        "XPercentOfVisits": "%s%% de vizite"
+        "XPercentOfVisits": "%s de vizite"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/ru.json b/plugins/Referrers/lang/ru.json
index 50dd18267d..1a93015fc2 100644
--- a/plugins/Referrers/lang/ru.json
+++ b/plugins/Referrers/lang/ru.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Все источники трафика",
         "WidgetSocials": "Список социальных сетей",
         "WidgetTopKeywordsForPages": "Топ ключевых слов для страницы URL",
-        "XPercentOfVisits": "%s%% посещений"
+        "XPercentOfVisits": "%s посещений"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/sr.json b/plugins/Referrers/lang/sr.json
index 20949babe9..1766549e62 100644
--- a/plugins/Referrers/lang/sr.json
+++ b/plugins/Referrers/lang/sr.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Sve reference",
         "WidgetSocials": "Spisak društvenih mreža",
         "WidgetTopKeywordsForPages": "Najbolje ključne reči za URL",
-        "XPercentOfVisits": "%s%% poseta"
+        "XPercentOfVisits": "%s poseta"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/sv.json b/plugins/Referrers/lang/sv.json
index 3deca31006..99319376dd 100644
--- a/plugins/Referrers/lang/sv.json
+++ b/plugins/Referrers/lang/sv.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Alla hänvisningar",
         "WidgetSocials": "Lista över sociala nätverk",
         "WidgetTopKeywordsForPages": "Toppnyckelord för sid-URL",
-        "XPercentOfVisits": "%s%% av besökare"
+        "XPercentOfVisits": "%s av besökare"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/tl.json b/plugins/Referrers/lang/tl.json
index bd973da30a..cd2b2f5adc 100644
--- a/plugins/Referrers/lang/tl.json
+++ b/plugins/Referrers/lang/tl.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Lahat ng mga Referrer",
         "WidgetSocials": "Listahan ng mga social network",
         "WidgetTopKeywordsForPages": "Nangungunang mga keyword para sa URL ng Pahina",
-        "XPercentOfVisits": "%s%% ng mga pagbisita"
+        "XPercentOfVisits": "%s ng mga pagbisita"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/zh-cn.json b/plugins/Referrers/lang/zh-cn.json
index 7fdef3a5f0..983f89210b 100644
--- a/plugins/Referrers/lang/zh-cn.json
+++ b/plugins/Referrers/lang/zh-cn.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "所有来源",
         "WidgetSocials": "社交网络",
         "WidgetTopKeywordsForPages": "主要关键词",
-        "XPercentOfVisits": "%s%% 个访问"
+        "XPercentOfVisits": "%s 个访问"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/templates/index.twig b/plugins/Referrers/templates/index.twig
index c629431210..74851c3b37 100644
--- a/plugins/Referrers/templates/index.twig
+++ b/plugins/Referrers/templates/index.twig
@@ -7,18 +7,18 @@
 <div class="row">
     <div class="col-md-6">
         <div class="sparkline" style="padding-left: 12px;">{{ sparkline(urlSparklineDirectEntry) }}
-            {{ 'Referrers_TypeDirectEntries'|translate("<strong>"~visitorsFromDirectEntry~"</strong>")|raw }}
+            {{ 'Referrers_TypeDirectEntries'|translate("<strong>"~visitorsFromDirectEntry|number~"</strong>")|raw }}
             {% if visitorsFromDirectEntryPercent|default is not empty %},
-                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromDirectEntryPercent~"</strong>")|raw }}
+                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromDirectEntryPercent|percent~"</strong>")|raw }}
             {% endif %}
             {% if visitorsFromDirectEntryEvolution|default is not empty %}
                 {{ visitorsFromDirectEntryEvolution|raw }}
             {% endif %}
         </div>
         <div class="sparkline" style="padding-left: 12px;">{{ sparkline(urlSparklineSearchEngines) }}
-            {{ 'Referrers_TypeSearchEngines'|translate("<strong>"~visitorsFromSearchEngines~"</strong>")|raw }}
+            {{ 'Referrers_TypeSearchEngines'|translate("<strong>"~visitorsFromSearchEngines|number~"</strong>")|raw }}
             {% if visitorsFromSearchEnginesPercent|default is not empty %},
-                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromSearchEnginesPercent~"</strong>")|raw }}
+                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromSearchEnginesPercent|percent~"</strong>")|raw }}
             {% endif %}
             {% if visitorsFromSearchEnginesEvolution|default is not empty %}
                 {{ visitorsFromSearchEnginesEvolution|raw }}
@@ -27,18 +27,18 @@
     </div>
     <div class="col-md-6">
         <div class="sparkline">{{ sparkline(urlSparklineWebsites) }}
-            {{ 'Referrers_TypeWebsites'|translate("<strong>"~visitorsFromWebsites~"</strong>")|raw }}
+            {{ 'Referrers_TypeWebsites'|translate("<strong>"~visitorsFromWebsites|number~"</strong>")|raw }}
             {% if visitorsFromWebsitesPercent|default is not empty %},
-                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromWebsitesPercent~"</strong>")|raw }}
+                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromWebsitesPercent|percent~"</strong>")|raw }}
             {% endif %}
             {% if visitorsFromWebsitesEvolution|default is not empty %}
                 {{ visitorsFromWebsitesEvolution|raw }}
             {% endif %}
         </div>
         <div class="sparkline">{{ sparkline(urlSparklineCampaigns) }}
-            {{ 'Referrers_TypeCampaigns'|translate("<strong>"~visitorsFromCampaigns~"</strong>")|raw }}
+            {{ 'Referrers_TypeCampaigns'|translate("<strong>"~visitorsFromCampaigns|number~"</strong>")|raw }}
             {% if visitorsFromCampaignsPercent|default is not empty %},
-                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromCampaignsPercent~"</strong>")|raw }}
+                {{ 'Referrers_XPercentOfVisits'|translate("<strong>"~visitorsFromCampaignsPercent|percent~"</strong>")|raw }}
             {% endif %}
             {% if visitorsFromCampaignsEvolution|default is not empty %}
                 {{ visitorsFromCampaignsEvolution|raw }}
@@ -50,13 +50,13 @@
 <div id="distinctReferrersByType" class="row">
     <div class="col-md-6">
         <div class="sparkline" style="padding-left: 12px;">{{ sparkline(urlSparklineDistinctSearchEngines) }}
-            <strong>{{ numberDistinctSearchEngines }}</strong> {{ 'Referrers_DistinctSearchEngines'|translate }}
+            <strong>{{ numberDistinctSearchEngines|number }}</strong> {{ 'Referrers_DistinctSearchEngines'|translate }}
             {% if numberDistinctSearchEnginesEvolution|default is not empty %}
                 {{ numberDistinctSearchEnginesEvolution|raw }}
             {% endif %}
         </div>
         <div class="sparkline" style="padding-left: 12px;">{{ sparkline(urlSparklineDistinctKeywords) }}
-            <strong>{{ numberDistinctKeywords }}</strong> {{ 'Referrers_DistinctKeywords'|translate }}
+            <strong>{{ numberDistinctKeywords|number }}</strong> {{ 'Referrers_DistinctKeywords'|translate }}
             {% if numberDistinctKeywordsEvolution|default is not empty %}
                 {{ numberDistinctKeywordsEvolution|raw }}
             {% endif %}
@@ -64,14 +64,14 @@
     </div>
     <div class="col-md-6">
         <div class="sparkline">{{ sparkline(urlSparklineDistinctWebsites) }}
-            <strong>{{ numberDistinctWebsites }}</strong> {{ 'Referrers_DistinctWebsites'|translate }}
-            {{ 'Referrers_UsingNDistinctUrls'|translate("<strong>"~numberDistinctWebsitesUrls~"</strong>")|raw }}
+            <strong>{{ numberDistinctWebsites|number }}</strong> {{ 'Referrers_DistinctWebsites'|translate }}
+            {{ 'Referrers_UsingNDistinctUrls'|translate("<strong>"~numberDistinctWebsitesUrls|number~"</strong>")|raw }}
             {% if numberDistinctWebsitesEvolution|default is not empty %}
                 {{ numberDistinctWebsitesEvolution|raw }}
             {% endif %}
         </div>
         <div class="sparkline">{{ sparkline(urlSparklineDistinctCampaigns) }}
-            <strong>{{ numberDistinctCampaigns }}</strong> {{ 'Referrers_DistinctCampaigns'|translate }}
+            <strong>{{ numberDistinctCampaigns|number }}</strong> {{ 'Referrers_DistinctCampaigns'|translate }}
             {% if numberDistinctCampaignsEvolution|default is not empty %}
                 {{ numberDistinctCampaignsEvolution|raw }}
             {% endif %}
diff --git a/plugins/UserCountry/templates/index.twig b/plugins/UserCountry/templates/index.twig
index fe1a6735dd..01708f5bce 100644
--- a/plugins/UserCountry/templates/index.twig
+++ b/plugins/UserCountry/templates/index.twig
@@ -8,7 +8,7 @@
 
         <div class="sparkline">
             {{ sparkline(urlSparklineCountries) }}
-            {{ 'UserCountry_DistinctCountries'|translate("<strong>"~numberDistinctCountries~"</strong>")|raw }}
+            {{ 'UserCountry_DistinctCountries'|translate("<strong>"~numberDistinctCountries|number~"</strong>")|raw }}
         </div>
         <div style="clear:left"></div>
 
diff --git a/plugins/VisitFrequency/templates/_sparklines.twig b/plugins/VisitFrequency/templates/_sparklines.twig
index c6c123c5e2..9c59efb811 100644
--- a/plugins/VisitFrequency/templates/_sparklines.twig
+++ b/plugins/VisitFrequency/templates/_sparklines.twig
@@ -6,15 +6,15 @@
 
         <div class="sparkline">
             {{ sparkline(urlSparklineNbVisitsReturning) }}
-            {{ 'VisitFrequency_ReturnVisits'|translate("<strong>"~nbVisitsReturning~"</strong>")|raw }}
+            {{ 'VisitFrequency_ReturnVisits'|translate("<strong>"~nbVisitsReturning|number~"</strong>")|raw }}
         </div>
         <div class="sparkline">
             {{ sparkline(urlSparklineNbActionsReturning) }}
-            {{ 'VisitFrequency_ReturnActions'|translate("<strong>"~nbActionsReturning~"</strong>")|raw }}
+            {{ 'VisitFrequency_ReturnActions'|translate("<strong>"~nbActionsReturning|number~"</strong>")|raw }}
         </div>
         <div class="sparkline">
             {{ sparkline(urlSparklineActionsPerVisitReturning) }}
-            {{ 'VisitFrequency_ReturnAvgActions'|translate("<strong>"~nbActionsPerVisitReturning~"</strong>")|raw }}
+            {{ 'VisitFrequency_ReturnAvgActions'|translate("<strong>"~nbActionsPerVisitReturning|number(1)~"</strong>")|raw }}
         </div>
 
     {% if not isWidget %}
@@ -29,7 +29,7 @@
         </div>
         <div class="sparkline">
             {{ sparkline(urlSparklineBounceRateReturning) }}
-            {{ 'VisitFrequency_ReturnBounceRate'|translate("<strong>"~bounceRateReturning~"</strong>")|raw }}
+            {{ 'VisitFrequency_ReturnBounceRate'|translate("<strong>"~bounceRateReturning|percent~"</strong>")|raw }}
         </div>
         {% include "_sparklineFooter.twig" %}
 
diff --git a/plugins/VisitsSummary/templates/_sparklines.twig b/plugins/VisitsSummary/templates/_sparklines.twig
index 94682a928c..b00ba537a1 100644
--- a/plugins/VisitsSummary/templates/_sparklines.twig
+++ b/plugins/VisitsSummary/templates/_sparklines.twig
@@ -5,14 +5,14 @@
 
         <div class="sparkline">
             {{ sparkline(urlSparklineNbVisits)|raw }}
-            {{ 'General_NVisits'|translate("<strong>"~nbVisits~"</strong>")|raw }}{% if displayUniqueVisitors %},
-                {{ 'VisitsSummary_NbUniqueVisitors'|translate("<strong>"~nbUniqVisitors~"</strong>")|raw }}{% endif %}
+            {{ 'General_NVisits'|translate("<strong>"~nbVisits|number~"</strong>")|raw }}{% if displayUniqueVisitors %},
+                {{ 'VisitsSummary_NbUniqueVisitors'|translate("<strong>"~nbUniqVisitors|number~"</strong>")|raw }}{% endif %}
         </div>
         {% if nbUsers > 0 %}
             {# Most of users will not have used `setUserId` so this would be confusingly zero #}
             <div class="sparkline">
                 {{ sparkline(urlSparklineNbUsers)|raw }}
-                {{ 'General_NUsers'|translate("<strong>"~nbUsers~"</strong>")|raw }}
+                {{ 'General_NUsers'|translate("<strong>"~nbUsers|number~"</strong>")|raw }}
             </div>
         {% endif %}
         <div class="sparkline">
@@ -22,11 +22,11 @@
         </div>
         <div class="sparkline">
             {{ sparkline(urlSparklineBounceRate)|raw }}
-            {{ 'VisitsSummary_NbVisitsBounced'|translate("<strong>"~bounceRate~"</strong>")|raw }}
+            {{ 'VisitsSummary_NbVisitsBounced'|translate("<strong>"~bounceRate|percent~"</strong>")|raw }}
         </div>
         <div class="sparkline">
             {{ sparkline(urlSparklineActionsPerVisit)|raw }}
-            {{ 'VisitsSummary_NbActionsPerVisit'|translate("<strong>"~nbActionsPerVisit~"</strong>")|raw }}
+            {{ 'VisitsSummary_NbActionsPerVisit'|translate("<strong>"~nbActionsPerVisit|number(1)~"</strong>")|raw }}
         </div>
         {% if showActionsPluginReports|default(false) %}
         <div class="sparkline">
@@ -45,36 +45,36 @@
             {% if showOnlyActions %}
                 <div class="sparkline">
                     {{ sparkline(urlSparklineNbActions)|raw }}
-                    {{ 'VisitsSummary_NbActionsDescription'|translate("<strong>"~nbActions~"</strong>")|raw }}
+                    {{ 'VisitsSummary_NbActionsDescription'|translate("<strong>"~nbActions|number~"</strong>")|raw }}
                 </div>
             {% else %}
                 <div class="sparkline">
                     {{ sparkline(urlSparklineNbPageviews)|raw }}
-                    {{ 'VisitsSummary_NbPageviewsDescription'|translate("<strong>"~nbPageviews~"</strong>")|trim|raw }},
-                    {{ 'VisitsSummary_NbUniquePageviewsDescription'|translate("<strong>"~nbUniquePageviews~"</strong>")|raw }}
+                    {{ 'VisitsSummary_NbPageviewsDescription'|translate("<strong>"~nbPageviews|number~"</strong>")|trim|raw }},
+                    {{ 'VisitsSummary_NbUniquePageviewsDescription'|translate("<strong>"~nbUniquePageviews|number~"</strong>")|raw }}
                 </div>
                 {% if displaySiteSearch %}
                     <div class="sparkline">
                         {{ sparkline(urlSparklineNbSearches)|raw }}
-                        {{ 'VisitsSummary_NbSearchesDescription'|translate("<strong>"~nbSearches~"</strong>")|trim|raw }},
-                        {{ 'VisitsSummary_NbKeywordsDescription'|translate("<strong>"~nbKeywords~"</strong>")|raw }}
+                        {{ 'VisitsSummary_NbSearchesDescription'|translate("<strong>"~nbSearches|number~"</strong>")|trim|raw }},
+                        {{ 'VisitsSummary_NbKeywordsDescription'|translate("<strong>"~nbKeywords|number~"</strong>")|raw }}
                     </div>
                 {% endif %}
                 <div class="sparkline">
                         {{ sparkline(urlSparklineNbDownloads)|raw }}
-                        {{ 'VisitsSummary_NbDownloadsDescription'|translate("<strong>"~nbDownloads~"</strong>")|trim|raw }},
-                        {{ 'VisitsSummary_NbUniqueDownloadsDescription'|translate("<strong>"~nbUniqueDownloads~"</strong>")|raw }}
+                        {{ 'VisitsSummary_NbDownloadsDescription'|translate("<strong>"~nbDownloads|number~"</strong>")|trim|raw }},
+                        {{ 'VisitsSummary_NbUniqueDownloadsDescription'|translate("<strong>"~nbUniqueDownloads|number~"</strong>")|raw }}
                 </div>
                 <div class="sparkline">
                         {{ sparkline(urlSparklineNbOutlinks)|raw }}
-                        {{ 'VisitsSummary_NbOutlinksDescription'|translate("<strong>"~nbOutlinks~"</strong>")|trim|raw }},
-                        {{ 'VisitsSummary_NbUniqueOutlinksDescription'|translate("<strong>"~nbUniqueOutlinks~"</strong>")|raw }}
+                        {{ 'VisitsSummary_NbOutlinksDescription'|translate("<strong>"~nbOutlinks|number~"</strong>")|trim|raw }},
+                        {{ 'VisitsSummary_NbUniqueOutlinksDescription'|translate("<strong>"~nbUniqueOutlinks|number~"</strong>")|raw }}
                 </div>
                 {% endif %}
         {% endif %}
         <div class="sparkline">
                 {{ sparkline(urlSparklineMaxActions)|raw }}
-                {{ 'VisitsSummary_MaxNbActions'|translate("<strong>"~maxActions~"</strong>")|raw }}
+                {{ 'VisitsSummary_MaxNbActions'|translate("<strong>"~maxActions|number~"</strong>")|raw }}
         </div>
 
         {{ postEvent('Template.VisitsSummaryOverviewSparklines') }}
-- 
GitLab