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:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/API/lang/pt.json1
-rw-r--r--plugins/Actions/lang/pt.json22
-rw-r--r--plugins/Annotations/lang/pt.json20
-rw-r--r--plugins/Contents/lang/cs.json12
-rw-r--r--plugins/Contents/lang/da.json12
-rw-r--r--plugins/Contents/lang/de.json12
-rw-r--r--plugins/Contents/lang/el.json12
-rw-r--r--plugins/Contents/lang/es.json6
-rw-r--r--plugins/Contents/lang/et.json9
-rw-r--r--plugins/Contents/lang/it.json10
-rw-r--r--plugins/Contents/lang/pl.json7
-rw-r--r--plugins/Contents/lang/pt.json9
-rw-r--r--plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml4
-rw-r--r--plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml4
-rw-r--r--plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml4
-rw-r--r--plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml4
-rw-r--r--plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml4
-rw-r--r--plugins/CoreAdminHome/Commands/RunScheduledTasks.php42
-rw-r--r--plugins/CoreAdminHome/lang/es.json4
-rw-r--r--plugins/CoreAdminHome/lang/pt.json28
-rw-r--r--plugins/CoreAdminHome/stylesheets/generalSettings.less1
-rw-r--r--plugins/CoreConsole/Commands/ClearCaches.php1
-rw-r--r--plugins/CoreConsole/Commands/DevelopmentEnable.php10
-rw-r--r--plugins/CoreConsole/Commands/DevelopmentSyncUITestScreenshots.php2
-rw-r--r--plugins/CoreHome/CoreHome.php5
-rw-r--r--plugins/CoreHome/angularjs/ajax-form/ajax-form.controller.js85
-rw-r--r--plugins/CoreHome/angularjs/ajax-form/ajax-form.directive.js142
-rw-r--r--plugins/CoreHome/javascripts/dataTable.js17
-rw-r--r--plugins/CoreHome/lang/cs.json2
-rw-r--r--plugins/CoreHome/lang/da.json2
-rw-r--r--plugins/CoreHome/lang/de.json2
-rw-r--r--plugins/CoreHome/lang/el.json2
-rw-r--r--plugins/CoreHome/lang/et.json1
-rw-r--r--plugins/CoreHome/lang/it.json2
-rw-r--r--plugins/CoreHome/lang/pt.json6
-rw-r--r--plugins/CoreUpdater/Commands/Update.php8
-rw-r--r--plugins/CoreUpdater/lang/es.json2
-rw-r--r--plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig5
-rw-r--r--plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml2
-rw-r--r--plugins/CustomVariables/tests/System/processed/test_CustomVariablesIntegrationTest__Live.getLastVisitsDetails_day.xml2
-rw-r--r--plugins/DevicesDetection/lang/de.json4
-rw-r--r--plugins/Events/lang/pl.json1
-rw-r--r--plugins/Goals/lang/es.json1
-rw-r--r--plugins/Goals/lang/et.json1
-rw-r--r--plugins/Goals/lang/ja.json6
-rw-r--r--plugins/ImageGraph/lang/ja.json1
-rw-r--r--plugins/Insights/lang/et.json5
-rw-r--r--plugins/Insights/lang/ja.json10
-rw-r--r--plugins/Installation/lang/es.json2
-rw-r--r--plugins/Installation/lang/ja.json25
-rw-r--r--plugins/LeftMenu/lang/es.json5
-rw-r--r--plugins/Login/lang/pl.json1
-rw-r--r--plugins/MobileMessaging/MobileMessaging.php3
-rw-r--r--plugins/MobileMessaging/lang/pl.json2
-rw-r--r--plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php2
-rw-r--r--plugins/Morpheus/stylesheets/general/_forms.less1
-rw-r--r--plugins/Morpheus/templates/javascriptCode.tpl4
-rw-r--r--plugins/MultiSites/lang/pl.json1
-rw-r--r--plugins/PrivacyManager/javascripts/privacySettings.js5
-rw-r--r--plugins/Provider/API.php2
-rw-r--r--plugins/Provider/Reports/GetProvider.php14
-rw-r--r--plugins/Provider/Visitor.php3
-rw-r--r--plugins/Provider/functions.php15
-rw-r--r--plugins/Provider/lang/en.json3
-rw-r--r--plugins/ScheduledReports/API.php11
-rw-r--r--plugins/ScheduledReports/ScheduledReports.php412
-rw-r--r--plugins/ScheduledReports/javascripts/pdf.js1
-rw-r--r--plugins/ScheduledReports/tests/Integration/ApiTest.php5
-rw-r--r--plugins/SegmentEditor/API.php44
-rw-r--r--plugins/UserCountryMap/lang/pl.json1
-rw-r--r--plugins/UsersManager/API.php7
-rw-r--r--plugins/UsersManager/Menu.php2
-rw-r--r--plugins/UsersManager/Model.php7
-rw-r--r--plugins/UsersManager/javascripts/usersManager.js8
-rw-r--r--plugins/UsersManager/templates/index.twig2
m---------plugins/VisitorGenerator0
76 files changed, 854 insertions, 288 deletions
diff --git a/plugins/API/lang/pt.json b/plugins/API/lang/pt.json
index fe74fdfb6d..80c635a7a0 100644
--- a/plugins/API/lang/pt.json
+++ b/plugins/API/lang/pt.json
@@ -6,6 +6,7 @@
"MoreInformation": "Para mais informação sobre os APIs de Piwik, por favor dê uma vista de olhos na %s Introdução ao API Piwik %s e a %s Referência do API Piwik %s.",
"PluginDescription": "Todos os dados em Piwik estão disponíveis através de APIs simples. Este plugin é o ponto de entrada do serviço web, que pode chamar para receber os seus dados das Analíticas Web em xml, json, php, csv, etc.",
"QuickDocumentationTitle": "Documentação rápida do API",
+ "TopLinkTooltip": "Aceda programaticamente à sua informação através de uma simples API em json, xml, etc.",
"UserAuthentication": "Autenticação do utilizador",
"UsingTokenAuth": "Se quer %s pedir dados através de um script, crontab, etc. %s tem que adicionar o parâmetro %s aos URLs das chamadas do API que necessitam de autenticação."
}
diff --git a/plugins/Actions/lang/pt.json b/plugins/Actions/lang/pt.json
index 8a64eddb44..751f721d5d 100644
--- a/plugins/Actions/lang/pt.json
+++ b/plugins/Actions/lang/pt.json
@@ -9,12 +9,16 @@
"ColumnEntryPageURL": "URL da Página de Entrada",
"ColumnExitPageTitle": "Título da Página de Saída",
"ColumnExitPageURL": "URL da Página de Saída",
- "ColumnPageName": "Nome da Páginal",
+ "ColumnNoResultKeyword": "Palavra Chave sem Resultado de Pesquisa",
+ "ColumnPageName": "Nome da Página",
"ColumnPagesPerSearch": "Páginas de resultados",
"ColumnPageURL": "Endereço da Página",
"ColumnSearchCategory": "Pesquisar Categoria",
+ "ColumnSearches": "Pesquisas",
"ColumnSearchesDocumentation": "O número de visitas que procurou esta palavra-chave no motor de busca do seu site.",
+ "ColumnSearchExits": "% Saídas de Pesquisa",
"ColumnSearchExitsDocumentation": "A percentagem de visitas que deixou o site após a pesquisa por esta palavra-chave no motor de busca do seu Site.",
+ "ColumnSearchResultsCount": "Contagem de Resultados de Pesquisa",
"ColumnSiteSearchKeywords": "Palavra Chave Única",
"ColumnUniqueClicks": "Cliques Únicos",
"ColumnUniqueClicksDocumentation": "O número de visitas que envolveu um clique neste link. Se um link foi clicado várias vezes durante uma visita, só é contado uma vez.",
@@ -22,8 +26,10 @@
"ColumnUniqueOutlinks": "Links de saída únicos",
"DownloadsReportDocumentation": "Neste relatório, você pode ver quais os arquivos que os visitantes têm feito download.%s O que o Piwik entende como um download é clicar num link de download. Se o download foi concluído ou não, não é conhecido pelo Piwik.",
"EntryPagesReportDocumentation": "Este relatório contém informações sobre as páginas de entrada que foram utilizadas durante o período especificado. Uma página de entrada é a primeira página que um utilizador visualiza durante a sua visita. %s As URLs de entrada são exibidas como uma estrutura de pastas.",
+ "EntryPageTitles": "Títulos das páginas de entrada",
"EntryPageTitlesReportDocumentation": "Este relatório contém informações sobre os títulos das páginas de entrada que foram usados ​​durante o período especificado.",
"ExitPagesReportDocumentation": "Este relatório contém informações sobre as páginas de saída que ocorreram durante o período especificado. Uma página de saída é a última página que um utilizador visualiza durante a sua visita. %s Os URLs de saída são exibidos como uma estrutura de pastas.",
+ "ExitPageTitles": "Títulos das páginas de saída",
"ExitPageTitlesReportDocumentation": "Este relatório contém informações sobre os títulos de páginas de saída que ocorreram durante o período especificado.",
"OneSearch": "1 Pesquisa",
"OutlinkDocumentation": "Um outlink é um link que leva o visitante para fora do seu website (para outro domínio).",
@@ -31,12 +37,24 @@
"PagesReportDocumentation": "Este relatório contém informações sobre URLs das páginas que foram visitadas. %s A tabela está organizada hierarquicamente, as URLs são exibidas como uma estrutura de pastas.",
"PageUrls": "URLs de páginas",
"PluginDescription": "Relatórios sobre páginas vistas, ligações de saída e downloads. O rastreio de ligações de saída e downloads é automático.",
+ "SiteSearchCategories1": "Este relatório lista as Categorias que os visitantes selecionaram quando realizaram uma Pesquisa na sua página.",
"SiteSearchCategories2": "Por exemplo, os sites de comércio electrónico têm tipicamente uma \"Categoria\" seleccionada de modo que os visitantes podem restringir suas pesquisas a todos os produtos em uma categoria específica.",
"SiteSearchIntro": "Rastrear pesquisas que os visitantes fazem em seu site é uma maneira muito eficaz de aprender mais sobre o que o seu público está procurando, ele pode ajudar a encontrar ideias para novos conteúdos, novos produtos de comércio electrónico que os potenciais clientes podem estar procurando, e em geral, melhorar os visitantes experiência em seu site.",
+ "SiteSearchKeyword": "Palavra Chave (Pesquisa)",
"SiteSearchKeywordsDocumentation": "Este relatório lista as palavras-chave de pesquisa que os visitantes procuraram em sua busca interna do motor.",
+ "SiteSearchKeywordsNoResultDocumentation": "Este relatório lista as Pesquisas de Palavras Chave que não devolveram resultado de Pesquisa algum: talvez o algoritmo do motor de busca pode ser melhorado, ou talvez os seus visitantes encontram-se à procura de conteúdo que (ainda) não consta na sua página.",
"SubmenuPagesEntry": "Páginas de entrada",
"SubmenuPagesExit": "Páginas de saída",
"SubmenuPageTitles": "Títulos das páginas",
- "SubmenuSitesearch": "Pesquisar Site"
+ "SubmenuSitesearch": "Pesquisar Site",
+ "WidgetEntryPageTitles": "Títulos de Páginas de Entrada",
+ "WidgetExitPageTitles": "Títulos de Páginas de Saída",
+ "WidgetPagesEntry": "Páginas de Entrada",
+ "WidgetPagesExit": "Páginas de Saída",
+ "WidgetPageTitles": "Títulos de Página",
+ "WidgetPageTitlesFollowingSearch": "Títulos de Páginas Resultantes de uma Pesquisa de Página",
+ "WidgetPageUrlsFollowingSearch": "Páginas Resultantes de uma Pesquisa de Página",
+ "WidgetSearchCategories": "Categorias de Pesquisa",
+ "WidgetSearchNoResultKeywords": "Palavras Chaves de Pesquisa Sem Resultados"
}
} \ No newline at end of file
diff --git a/plugins/Annotations/lang/pt.json b/plugins/Annotations/lang/pt.json
new file mode 100644
index 0000000000..313a153901
--- /dev/null
+++ b/plugins/Annotations/lang/pt.json
@@ -0,0 +1,20 @@
+{
+ "Annotations": {
+ "AddAnnotationsFor": "Adicionar anotações para %s...",
+ "Annotations": "Anotações",
+ "ClickToDelete": "Clique para eliminar esta anotação.",
+ "ClickToEdit": "Clique para editar esta anotação.",
+ "ClickToEditOrAdd": "Clique para editar ou adicionar uma nova anotação.",
+ "CreateNewAnnotation": "Criar uma nova anotação...",
+ "EnterAnnotationText": "Introduza a sua nota...",
+ "HideAnnotationsFor": "Esconder anotações para %s...",
+ "IconDesc": "Ver notas para este intervalo de datas.",
+ "IconDescHideNotes": "Esconder notas para este intervalo de datas.",
+ "InlineQuickHelp": "Você pode criar anotações para marcar eventos especiais (como uma nova publicação no blogue, ou alteração no aspeto do sítio de internet), para salvar a sua informação ou para salvar algo que julgue ser importante.",
+ "LoginToAnnotate": "Entre para criar uma anotação.",
+ "NoAnnotations": "Não existem anotações para este intervalo de datas.",
+ "PluginDescription": "Permite que anexe notas a dias diferentes para marcar alterações realizadas à sua página de internet, salvar análises que realizou com respeito à sua informação e partilhar os seus pensamentos com os seus colegas. Ao anotar a sua informação, terá a certeza que se lembrará a razão pela qual esta tem o aspeto que tem.",
+ "ViewAndAddAnnotations": "Ver e adicionar anotações para %s...",
+ "YouCannotModifyThisNote": "Você não pode modificar esta anotação, porque você não a criou, nem possui previlégios de administração para este sítio de internet."
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/cs.json b/plugins/Contents/lang/cs.json
new file mode 100644
index 0000000000..e06fabbf47
--- /dev/null
+++ b/plugins/Contents/lang/cs.json
@@ -0,0 +1,12 @@
+{
+ "Contents": {
+ "ContentName": "Jméno obsahu",
+ "ContentPiece": "Část obsahu",
+ "Contents": "Obsah",
+ "ContentTarget": "Cíl obsahu",
+ "Impressions": "Dojmy",
+ "Interaction": "Interakce",
+ "InteractionRate": "Rychlost interakcí",
+ "Interactions": "Interakce"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/da.json b/plugins/Contents/lang/da.json
new file mode 100644
index 0000000000..725e9a55f2
--- /dev/null
+++ b/plugins/Contents/lang/da.json
@@ -0,0 +1,12 @@
+{
+ "Contents": {
+ "ContentName": "Indholdsnavn",
+ "ContentPiece": "Indholdsstykke",
+ "Contents": "Indhold",
+ "ContentTarget": "Indholdsmål",
+ "Impressions": "Indtryk",
+ "Interaction": "Interaktion",
+ "InteractionRate": "Interaktionsfrekvens",
+ "Interactions": "Interaktioner"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/de.json b/plugins/Contents/lang/de.json
new file mode 100644
index 0000000000..11ecd6e985
--- /dev/null
+++ b/plugins/Contents/lang/de.json
@@ -0,0 +1,12 @@
+{
+ "Contents": {
+ "ContentName": "Inhaltsname",
+ "ContentPiece": "Inhaltsteil",
+ "Contents": "Inhalte",
+ "ContentTarget": "Inhaltsziel",
+ "Impressions": "Impressionen",
+ "Interaction": "Interaktion",
+ "InteractionRate": "Interaktionsrate",
+ "Interactions": "Interaktionen"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/el.json b/plugins/Contents/lang/el.json
new file mode 100644
index 0000000000..00eeeb0578
--- /dev/null
+++ b/plugins/Contents/lang/el.json
@@ -0,0 +1,12 @@
+{
+ "Contents": {
+ "ContentName": "Όνομα Περιεχομένου",
+ "ContentPiece": "Κομμάτι Περιεχομένου",
+ "Contents": "Περιεχόμενα",
+ "ContentTarget": "Στόχος Περιεχομένου",
+ "Impressions": "Αποτυπώσεις",
+ "Interaction": "Αλληλεπίδραση",
+ "InteractionRate": "Ρυθμός αλληλεπίδρασης",
+ "Interactions": "Αλληλεπιδράσεις"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/es.json b/plugins/Contents/lang/es.json
new file mode 100644
index 0000000000..3eb3bec9e7
--- /dev/null
+++ b/plugins/Contents/lang/es.json
@@ -0,0 +1,6 @@
+{
+ "Contents": {
+ "ContentName": "Nombre del contenido",
+ "Interactions": "Interacciones"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/et.json b/plugins/Contents/lang/et.json
new file mode 100644
index 0000000000..9d6a1f3e9d
--- /dev/null
+++ b/plugins/Contents/lang/et.json
@@ -0,0 +1,9 @@
+{
+ "Contents": {
+ "ContentName": "Sisu nimi",
+ "ContentPiece": "Sisu tükk",
+ "Contents": "Sisud",
+ "InteractionRate": "Koostoime mõju",
+ "Interactions": "Koostoime"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/it.json b/plugins/Contents/lang/it.json
new file mode 100644
index 0000000000..f040e21bfe
--- /dev/null
+++ b/plugins/Contents/lang/it.json
@@ -0,0 +1,10 @@
+{
+ "Contents": {
+ "ContentName": "Nome Contenuto",
+ "Contents": "Contenuti",
+ "Impressions": "Impressioni",
+ "Interaction": "Interazione",
+ "InteractionRate": "Rapporto di Interazione",
+ "Interactions": "Interazioni"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/pl.json b/plugins/Contents/lang/pl.json
new file mode 100644
index 0000000000..846b76db09
--- /dev/null
+++ b/plugins/Contents/lang/pl.json
@@ -0,0 +1,7 @@
+{
+ "Contents": {
+ "ContentName": "Nazwa treści",
+ "Contents": "Treści",
+ "Interactions": "Interakcje"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/lang/pt.json b/plugins/Contents/lang/pt.json
new file mode 100644
index 0000000000..4efc05c515
--- /dev/null
+++ b/plugins/Contents/lang/pt.json
@@ -0,0 +1,9 @@
+{
+ "Contents": {
+ "Contents": "Conteúdos",
+ "ContentTarget": "Conteúdo de Destino",
+ "Impressions": "Impressões",
+ "Interaction": "Interação",
+ "Interactions": "Interações"
+ }
+} \ No newline at end of file
diff --git a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml
index 989f816722..241be92f2f 100644
--- a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml
+++ b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml
@@ -47,7 +47,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -147,7 +147,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
diff --git a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml
index 989f816722..241be92f2f 100644
--- a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml
+++ b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml
@@ -47,7 +47,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -147,7 +147,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml
index 989f816722..241be92f2f 100644
--- a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml
+++ b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml
@@ -47,7 +47,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -147,7 +147,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml
index 989f816722..241be92f2f 100644
--- a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml
+++ b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml
@@ -47,7 +47,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -147,7 +147,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
diff --git a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml
index 989f816722..241be92f2f 100644
--- a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml
+++ b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml
@@ -47,7 +47,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -147,7 +147,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
diff --git a/plugins/CoreAdminHome/Commands/RunScheduledTasks.php b/plugins/CoreAdminHome/Commands/RunScheduledTasks.php
index 3dbccfdc2d..1e73c1d626 100644
--- a/plugins/CoreAdminHome/Commands/RunScheduledTasks.php
+++ b/plugins/CoreAdminHome/Commands/RunScheduledTasks.php
@@ -23,7 +23,6 @@ class RunScheduledTasks extends ConsoleCommand
$this->setName('core:run-scheduled-tasks');
$this->setDescription('Will run all scheduled tasks due to run at this time.');
$this->addOption('force', null, InputOption::VALUE_NONE, 'If set, it will execute all tasks even the ones not due to run at this time.');
- $this->addOption('token-auth', null, InputOption::VALUE_REQUIRED, 'The API token of a user that has super user access, see http://piwik.org/faq/general/#faq_114');
}
/**
@@ -31,41 +30,20 @@ class RunScheduledTasks extends ConsoleCommand
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
- $_GET['token_auth'] = $this->askForTokenAuth($input, $output);
$this->forceRunAllTasksIfRequested($input);
FrontController::getInstance()->init();
- API::getInstance()->runScheduledTasks();
-
- $this->writeSuccessMessage($output, array('Scheduled Tasks executed'));
- }
-
- /**
- * @param InputInterface $input
- * @param OutputInterface $output
- * @return string
- * @throws \RuntimeException
- */
- private function askForTokenAuth(InputInterface $input, OutputInterface $output)
- {
- $validate = function ($tokenAuth) {
- if (empty($tokenAuth)) {
- throw new \InvalidArgumentException('You have to specify a token_auth');
- }
-
- return $tokenAuth;
- };
-
- $tokenAuth = $input->getOption('token-auth');
-
- if (empty($tokenAuth)) {
- $dialog = $this->getHelperSet()->get('dialog');
- $tokenAuth = $dialog->askAndValidate($output, 'Enter the token_auth of a user having super user access: ', $validate);
- } else {
- $validate($tokenAuth);
+ $scheduledTasksResults = API::getInstance()->runScheduledTasks();
+
+ foreach ($scheduledTasksResults as $scheduledTasksResult) {
+ $output->writeln(sprintf(
+ '<comment>%s</comment> - %s',
+ $scheduledTasksResult['task'],
+ $scheduledTasksResult['output']
+ ));
}
- return $tokenAuth;
+ $this->writeSuccessMessage($output, array('Scheduled Tasks executed'));
}
private function forceRunAllTasksIfRequested(InputInterface $input)
@@ -76,4 +54,4 @@ class RunScheduledTasks extends ConsoleCommand
$GLOBALS['PIWIK_TRACKER_DEBUG_FORCE_SCHEDULED_TASKS'] = true;
}
}
-}
+} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/es.json b/plugins/CoreAdminHome/lang/es.json
index 2df924f218..6b034059f4 100644
--- a/plugins/CoreAdminHome/lang/es.json
+++ b/plugins/CoreAdminHome/lang/es.json
@@ -10,6 +10,8 @@
"CustomLogoHelpText": "Puede personalizar el logo de Piwik que será mostrado en la interfaz de usuario y los reportes por email.",
"DevelopmentProcess": "Mientras que nuestro %sproceso de desarrollo%s incluye miles de pruebas automatizadas, Beta Testers juegan un papel clave en el logro de la \"política de no error\" en Piwik.",
"EmailServerSettings": "Configuración del servidor de email",
+ "FaviconUpload": "Selecciona un Favicon para subir",
+ "FileUploadDisabled": "La subida de archivos no está habilitada en tu configuración de PHP. Para subir tu logo personalizado por favor pon %s en php.ini y reinicia tu servidor web.",
"ForBetaTestersOnly": "Para betatesters sólo",
"ImageTracking": "Seguimiento mediante Imagen",
"ImageTrackingIntro1": "Cuando un visitante se ha inhabilitado JavaScript o JavaScript que no se puede utilizar, puede utilizar un vínculo de seguimiento en la imagen para rastrear a los visitantes.",
@@ -49,6 +51,7 @@
"LogoNotWriteableInstruction": "Para utilizar tu logo personalizado en lugar del logo estándar de Piwik puedes conceder permisos de escritura a este directorio: %1$s Piwik necesita el permiso de escritura para sus logos salvados en los archivos %2$s.",
"LogoUpload": "Seleccione un logo para subir",
"LogoUploadHelp": "Sube un archivo en formato %s con un alto mínimo de %s píxeles.",
+ "MenuDevelopment": "Desarrollo",
"MenuDiagnostic": "diagnóstico",
"MenuGeneralSettings": "Configuración General",
"MenuManage": "gestionar",
@@ -60,6 +63,7 @@
"PiwikIsInstalledAt": "Piwik está instalado en",
"PluginDescription": "Área de Administración de Piwik",
"PluginSettingChangeNotAllowed": "No está permitido cambiar el valor de configuración \"%s\" en el plugin \"%s\"",
+ "PluginSettingReadNotAllowed": "No está permitido que leas el valor de la opción \"%s\" en el plugin \"%s\"",
"PluginSettings": "Configuración del plugin",
"PluginSettingsIntro": "Aquí puedes cambiar la configuración de los siguientes plugins de terceros:",
"PluginSettingsValueNotAllowed": "El valor del campo \"%s\" del plugin \"%s\" no es permitido.",
diff --git a/plugins/CoreAdminHome/lang/pt.json b/plugins/CoreAdminHome/lang/pt.json
index 95e90e281c..a85b4e6d36 100644
--- a/plugins/CoreAdminHome/lang/pt.json
+++ b/plugins/CoreAdminHome/lang/pt.json
@@ -1,19 +1,47 @@
{
"CoreAdminHome": {
"Administration": "Administração",
+ "ArchivingSettings": "A arquivar definições",
"BrandingSettings": "Definições de Marca",
+ "CheckReleaseGetVersion": "Ao procurar por novas versões do Piwik, obter sempre",
"ClickHereToOptIn": "Clique aqui para fazer opt-in.",
"ClickHereToOptOut": "Clique aqui para fazer opt-out.",
"CustomLogoHelpText": "Você pode personalizar o logotipo Piwik que será exibido na interface do utilizador e relatórios de e-mail.",
"EmailServerSettings": "Definições do servidor de email",
+ "FaviconUpload": "Selecione um Favicon para carregar",
+ "FileUploadDisabled": "Carregar ficheiros não se encontra ativo nas sua configuração PHP. Para carregar o seu logótipo personalizado por favor defina %s em php.ini e reinicie o seu servidor.",
+ "ForBetaTestersOnly": "Para testadores de versões beta apenas",
+ "ImportingServerLogs": "A Importar Relatórios de Servidor",
+ "InvalidPluginsWarning": "Os seguintes plugins não são compatíveis com %1$s e não puderam ser carregados: %2$s.",
+ "JSTracking_CampaignKwdParam": "Parâmetro da Palavra Chave da Campanha",
+ "JSTracking_CodeNote": "Certifique-se que este código se encontra em todas as páginas do seu sítio de internet antes da etiqueta %1$s.",
+ "JSTracking_EnableDoNotTrack": "Ativar deteção NãoSeguir do lado do cliente",
+ "JSTracking_MergeSubdomains": "Seguir visitantes através todos os subdomínios de",
+ "JSTracking_PageCustomVars": "Siga uma variável personalizada para cada visualização de página",
+ "JSTracking_PageCustomVarsDesc": "Por exemplo, com nome de variável \"Categoria\" e valor \"Documentos Brancos\".",
+ "JSTracking_VisitorCustomVars": "Siga variáveis personalizadas para este visitante.",
+ "JSTracking_VisitorCustomVarsDesc": "Por exemplo, com nome de variável \"Tipo\" e valor \"Cliente\".",
+ "LatestBetaRelease": "A mais recente publicação beta",
+ "LatestStableRelease": "A mais recente versão estável",
"LogoUpload": "Selecione um logo para fazer upload",
+ "MenuDevelopment": "Desenvolvimento",
"MenuGeneralSettings": "Definições gerais",
+ "MenuManage": "Gerir",
"OptOutComplete": "Opt-out completo; as suas visitas a este site não serão gravadas pela ferramenta de Web Analytics.",
"OptOutCompleteBis": "Note que se você apagar os cookies, apagar o cookie de opt-out, ou se você mudar de computador ou navegadores Web, vai precisar de realizar o procedimento de opt-out novamente.",
"OptOutExplanation": "O Piwik é dedicado a fornecer privacidade na Internet. Para apresentar aos seus visitantes a escolha de opting-out da Web Analytics Piwik, você pode adicionar o seguinte código HTML em uma das páginas do seu site, por exemplo, numa página de Política de Privacidade.",
"OptOutExplanationBis": "Este código irá exibir um iFrame contendo um link para que seus visitantes possam fazer opt-out do Piwik definindo um cookie de opt-out nos navegadores do utilizador. %s Clique aqui%s para ver o conteúdo que será exibido pelo iFrame.",
"OptOutForYourVisitors": "opt-out do Piwik para os seus visitantes",
+ "PiwikIsInstalledAt": "Piwik encontra-se instalado em",
"PluginDescription": "Área de administração de Piwik.",
+ "PluginSettingChangeNotAllowed": "Não lhe é permitido alterar o valor da definição \"%s\" no plugin \"%s\"",
+ "PluginSettingReadNotAllowed": "Não lhe é permitido ler o valor da definição \"%s\" no plugin \"%s\"",
+ "PluginSettings": "Definições de Plugin",
+ "PluginSettingsIntro": "Aqui pode alterar as definições dos seguintes plugins de terceiros:",
+ "PluginSettingsValueNotAllowed": "O valor para o campo \"%s\" no plugin \"%s\" não é permitido",
+ "SendPluginUpdateCommunication": "Envie-me uma notificação para o correio eletrónico quando existir uma nova atualização para um plugin",
+ "SendPluginUpdateCommunicationHelp": "Será enviado correio eletrónico para os Super Utilizadores quando existir uma nova versão disponível para um plugin.",
+ "StableReleases": "Se o Piwik é uma parte crítica do seu negócio, recomendamos que utilize a versão estável mais recente. Se você usa a mais recente versão beta e julga que encontrou um erro ou possui uma sugestão, por favor %sveja aqui%s.",
"UseCustomLogo": "Use um logo personalizado.",
"YouAreOptedIn": "Actualmente está activa a opção opt-in",
"YouAreOptedOut": "Actualmente está activa a opção opt-out",
diff --git a/plugins/CoreAdminHome/stylesheets/generalSettings.less b/plugins/CoreAdminHome/stylesheets/generalSettings.less
index 2a056e070d..f4af53c901 100644
--- a/plugins/CoreAdminHome/stylesheets/generalSettings.less
+++ b/plugins/CoreAdminHome/stylesheets/generalSettings.less
@@ -4,6 +4,7 @@
.admin a {
color: black;
+ text-decoration: underline;
}
#content.admin {
diff --git a/plugins/CoreConsole/Commands/ClearCaches.php b/plugins/CoreConsole/Commands/ClearCaches.php
index 35d9691706..13413c62b7 100644
--- a/plugins/CoreConsole/Commands/ClearCaches.php
+++ b/plugins/CoreConsole/Commands/ClearCaches.php
@@ -30,6 +30,7 @@ class ClearCaches extends ConsoleCommand
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
+ // Note: the logic for this command must be refactored in this helper function below.
Filesystem::deleteAllCacheOnUpdate();
$this->writeSuccessMessage($output, array('Caches cleared'));
diff --git a/plugins/CoreConsole/Commands/DevelopmentEnable.php b/plugins/CoreConsole/Commands/DevelopmentEnable.php
index 5ee80610d6..51ae722662 100644
--- a/plugins/CoreConsole/Commands/DevelopmentEnable.php
+++ b/plugins/CoreConsole/Commands/DevelopmentEnable.php
@@ -25,29 +25,23 @@ class DevelopmentEnable extends ConsoleCommand
$this->setName('development:enable');
$this->setAliases(array('development:disable'));
$this->setDescription('Enable or disable development mode. See config/global.ini.php in section [Development] for more information');
- $this->addOption('full', null, InputOption::VALUE_NONE, 'If set, it will enable/disable more developer options such as disable merged assets as well and not only the [Development:enabled] option.');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$commandName = $input->getFirstArgument();
$enable = (false !== strpos($commandName, 'enable'));
- $full = $input->getOption('full');
$config = Config::getInstance();
$development = $config->Development;
if ($enable) {
$development['enabled'] = 1;
- if ($full) {
- $development['disable_merged_assets'] = 1;
- }
+ $development['disable_merged_assets'] = 1;
$message = 'Development mode enabled';
} else {
$development['enabled'] = 0;
- if ($full) {
- $development['disable_merged_assets'] = 0;
- }
+ $development['disable_merged_assets'] = 0;
$message = 'Development mode disabled';
}
diff --git a/plugins/CoreConsole/Commands/DevelopmentSyncUITestScreenshots.php b/plugins/CoreConsole/Commands/DevelopmentSyncUITestScreenshots.php
index 593faf0f17..69f0ab46e4 100644
--- a/plugins/CoreConsole/Commands/DevelopmentSyncUITestScreenshots.php
+++ b/plugins/CoreConsole/Commands/DevelopmentSyncUITestScreenshots.php
@@ -100,8 +100,8 @@ git commit -m'' # WRITE A COMMIT MESSAGE
git push
cd ..
git add UI
-git commit -m'' #WRITE A COMMIT MESSAGE
git pull
+git commit -m'' #WRITE A COMMIT MESSAGE
git push";
$output->writeln($commands);
}
diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php
index f833b1e5cc..a2f5195fa3 100644
--- a/plugins/CoreHome/CoreHome.php
+++ b/plugins/CoreHome/CoreHome.php
@@ -153,6 +153,9 @@ class CoreHome extends \Piwik\Plugin
$jsFiles[] = "plugins/CoreHome/angularjs/notification/notification.controller.js";
$jsFiles[] = "plugins/CoreHome/angularjs/notification/notification.directive.js";
+
+ $jsFiles[] = "plugins/CoreHome/angularjs/ajax-form/ajax-form.controller.js";
+ $jsFiles[] = "plugins/CoreHome/angularjs/ajax-form/ajax-form.directive.js";
}
public function getClientSideTranslationKeys(&$translationKeys)
@@ -243,7 +246,9 @@ class CoreHome extends \Piwik\Plugin
$translationKeys[] = 'General_Default';
$translationKeys[] = 'General_LoadingData';
$translationKeys[] = 'General_ErrorRequest';
+ $translationKeys[] = 'General_YourChangesHaveBeenSaved';
$translationKeys[] = 'CoreHome_UndoPivotBySubtable';
$translationKeys[] = 'CoreHome_PivotBySubtable';
+ $translationKeys[] = 'General_LearnMore';
}
}
diff --git a/plugins/CoreHome/angularjs/ajax-form/ajax-form.controller.js b/plugins/CoreHome/angularjs/ajax-form/ajax-form.controller.js
new file mode 100644
index 0000000000..4f6bd77d69
--- /dev/null
+++ b/plugins/CoreHome/angularjs/ajax-form/ajax-form.controller.js
@@ -0,0 +1,85 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+(function () {
+ angular.module('piwikApp').controller('AjaxFormController', AjaxFormController);
+
+ AjaxFormController.$inject = ['piwikApi', '$filter'];
+
+ function AjaxFormController(piwikApi, $filter) {
+ var vm = this;
+
+ /**
+ * Set to non-null when a form submit request returns successfully. When successful, it will
+ * be the entire JSON parsed response of the request.
+ *
+ * @type {null|string}
+ */
+ vm.successfulPostResponse = null;
+
+ /**
+ * Set to non-null when a form submit request results in an error. When an error occurs,
+ * it will be set to the string error message.
+ *
+ * @type {null|string}
+ */
+ vm.errorPostResponse = null;
+
+ /**
+ * true if currently submitting a POST request, false if otherwise.
+ *
+ * @type {bool}
+ */
+ vm.isSubmitting = false;
+
+ vm.submitForm = submitForm;
+
+ /**
+ * Sends a POST to the configured API method.
+ */
+ function submitForm() {
+ var postParams;
+
+ vm.successfulPostResponse = null;
+ vm.errorPostResponse = null;
+
+ if (vm.sendJsonPayload) {
+ postParams = {data: JSON.stringify(vm.data)};
+ } else {
+ postParams = vm.data;
+ }
+
+ vm.isSubmitting = true;
+ piwikApi.post(
+ { // GET params
+ module: 'API',
+ method: vm.submitApiMethod
+ },
+ postParams,
+ { // request options
+ createErrorNotification: !vm.noErrorNotification
+ }
+ ).then(function (response) {
+ vm.successResponse = response;
+
+ if (!vm.noSuccessNotification) {
+ var UI = require('piwik/UI');
+ var notification = new UI.Notification();
+ notification.show($filter('translate')('General_YourChangesHaveBeenSaved'), {
+ context: 'success',
+ type: 'toast',
+ id: 'ajaxHelper'
+ });
+ notification.scrollToNotification();
+ }
+ }).catch(function (errorMessage) {
+ vm.errorPostResponse = errorMessage;
+ })['finally'](function () {
+ vm.isSubmitting = false;
+ });
+ }
+ }
+})(); \ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/ajax-form/ajax-form.directive.js b/plugins/CoreHome/angularjs/ajax-form/ajax-form.directive.js
new file mode 100644
index 0000000000..89d572cedf
--- /dev/null
+++ b/plugins/CoreHome/angularjs/ajax-form/ajax-form.directive.js
@@ -0,0 +1,142 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+/**
+ * AngularJS directive that manages an AJAX form.
+ *
+ * This directive will detect inputs & selects defined within an element and when a
+ * submit button is clicked, will post data from the inputs & selects to a Piwik API method.
+ *
+ * When the POST request is finished the result will, by default, be displayed as a
+ * notification.
+ *
+ * This directive accepts the following attributes:
+ *
+ * - **save-api-method**: **required** The Piwik API method that handles the POST request.
+ * - **send-json-payload**: Whether to send the data as a form encoded URL or to send it as JSON.
+ * If sending as JSON, the payload will still be a form encoded value,
+ * but will contain a JSON object like `{data: {...form data...}}`.
+ *
+ * This is for forms with lots of fields where having the same number
+ * of parameters in an API method would not be desired.
+ * - **no-error-notification**: If true, does not display an error notification if the AJAX post
+ * fails.
+ * - **no-success-notification**: If true, does not display an error notification if the AJAX
+ * results in success.
+ *
+ * **Custom Success/Error Handling**
+ *
+ * On success/failure, the response will be stored in controller scope. Child elements of a
+ * piwik-ajax-form element can access this data, and thus, can customize what happens when
+ * a form submit succeeds/fails.
+ *
+ * See the ajax-form.controller.js file for more info.
+ *
+ * Usage:
+ *
+ * <div piwik-ajax-form
+ * save-api-method="'MyPlugin.myFormSaveMethod'"
+ * send-json-payload="true"
+ * ng-model="myFormData">
+ *
+ * <h2>My Form</h2>
+ * <input name="myOption" value="myDefaultValue" type="text" />
+ * <input name="myOtherOption" type="checkbox" checked="checked" />
+ * <input type="submit" value="Submit" ng-disabled="ajaxForm.isSubmitting" />
+ *
+ * <div piwik-notification context='error' ng-show="errorPostResponse">ERROR!</div>
+ * </div>
+ */
+(function () {
+ angular.module('piwikApp').directive('piwikAjaxForm', piwikAjaxForm);
+
+ piwikAjaxForm.$inject = ['$parse'];
+
+ function piwikAjaxForm($parse) {
+ return {
+ restrict: 'A',
+ scope: {
+ submitApiMethod: '=',
+ sendJsonPayload: '=',
+ noErrorNotification: '=',
+ noSuccessNotification: '=',
+ useCustomDataBinding: '='
+ },
+ require: '?ngModel',
+ controller: 'AjaxFormController',
+ controllerAs: 'ajaxForm',
+ transclude: true,
+ compile: function (element, attrs) {
+ attrs.noErrorNotification = !! attrs.noErrorNotification;
+
+ return function (scope, element, attrs, ngModel, transclude) {
+ if (!scope.submitApiMethod) {
+ throw new Error("submitApiMethod is required");
+ }
+
+ scope.ajaxForm.submitApiMethod = scope.submitApiMethod;
+ scope.ajaxForm.sendJsonPayload = scope.sendJsonPayload;
+ scope.ajaxForm.noErrorNotification = scope.noErrorNotification;
+ scope.ajaxForm.noSuccessNotification = scope.noSuccessNotification;
+
+ scope.ajaxForm.data = {};
+
+ // if a model is supplied, initiate form data w/ model value
+ if (ngModel) {
+ var ngModelGetter = $parse(attrs.ngModel); // probably redundant, but I cannot find another way to
+ // get the ng model value here
+ scope.ajaxForm.data = ngModelGetter(scope.$parent);
+ }
+
+ // on change of any input, change appropriate value in model, but only if requested
+ if (!scope.useCustomDataBinding) {
+ element.on('change', 'input,select', function () {
+ setFormValueFromInput(this);
+ });
+ }
+
+ // on submit call controller submit method
+ element.on('click', 'input[type=submit]', function () {
+ scope.ajaxForm.submitForm();
+ });
+
+ // make sure child elements can access this directive's scope
+ transclude(scope, function(clone, scope) {
+ if (!scope.useCustomDataBinding) {
+ var $inputs = clone.find('input,select').not('[type=submit]');
+
+ // initialize form data to input values (include <select>s
+ $inputs.each(function () {
+ setFormValueFromInput(this, true);
+ });
+ }
+
+ element.append(clone);
+ });
+
+ function setFormValueFromInput(inputElement, skipScopeApply) {
+ var $ = angular.element,
+ name = $(inputElement).attr('name'),
+ val;
+
+ if ($(inputElement).attr('type') == 'checkbox') {
+ val = $(inputElement).is(':checked');
+ } else {
+ val = $(inputElement).val();
+ }
+
+ scope.ajaxForm.data[name] = val;
+
+ if (!skipScopeApply) {
+ scope.$apply();
+ }
+ }
+ };
+ }
+ };
+ }
+})(); \ No newline at end of file
diff --git a/plugins/CoreHome/javascripts/dataTable.js b/plugins/CoreHome/javascripts/dataTable.js
index 205ec70023..a65ffd8519 100644
--- a/plugins/CoreHome/javascripts/dataTable.js
+++ b/plugins/CoreHome/javascripts/dataTable.js
@@ -312,6 +312,7 @@ $.extend(DataTable.prototype, UIControl.prototype, {
self.handleColumnHighlighting(domElem);
self.handleExpandFooter(domElem);
self.setFixWidthToMakeEllipsisWork(domElem);
+ self.handleSummaryRow(domElem);
},
setFixWidthToMakeEllipsisWork: function (domElem) {
@@ -1700,6 +1701,22 @@ $.extend(DataTable.prototype, UIControl.prototype, {
});
},
+ handleSummaryRow: function (domElem) {
+ var details = _pk_translate('General_LearnMore', [' (<a href="http://piwik.org/faq/how-to/faq_54/" target="_blank">', '</a>)']);
+
+ domElem.find('tr.summaryRow').each(function () {
+ var labelSpan = $(this).find('.label .value');
+ var defaultLabel = labelSpan.text();
+
+ $(this).hover(function() {
+ labelSpan.html(defaultLabel + details);
+ },
+ function() {
+ labelSpan.text(defaultLabel);
+ });
+ });
+ },
+
// also used in action data table
doHandleRowActions: function (trs) {
var self = this;
diff --git a/plugins/CoreHome/lang/cs.json b/plugins/CoreHome/lang/cs.json
index 7a4067cc40..70341bdd0f 100644
--- a/plugins/CoreHome/lang/cs.json
+++ b/plugins/CoreHome/lang/cs.json
@@ -39,6 +39,7 @@
"PeriodWeeks": "týdnů",
"PeriodYear": "Rok",
"PeriodYears": "let",
+ "PivotBySubtable": "Toto hlášení není zaměřené %s Zaměřit na %s",
"PluginDescription": "Struktura hlášení",
"ReportGeneratedOn": "Hlášení vygenerované %s",
"ReportGeneratedXAgo": "Hlášení vygenerováno před %s",
@@ -54,6 +55,7 @@
"SupportPiwik": "Podpořte Piwik!",
"TableNoData": "Žádná data",
"ThereIsNoDataForThisReport": "Pro toto hlášení nejsou k dispozici žádná data",
+ "UndoPivotBySubtable": "Toto hlášení bylo zaměřeno %s Vrátit zpět",
"UnFlattenDataTable": "Hlášení je ploché %s Vytvořit hierarchický",
"ViewAllPiwikVideoTutorials": "Zobrazit všechny návody Piwik",
"WebAnalyticsReports": "Hlášení",
diff --git a/plugins/CoreHome/lang/da.json b/plugins/CoreHome/lang/da.json
index f19966cd1d..e62b9fd950 100644
--- a/plugins/CoreHome/lang/da.json
+++ b/plugins/CoreHome/lang/da.json
@@ -41,6 +41,7 @@
"PeriodWeeks": "uger",
"PeriodYear": "År",
"PeriodYears": "år",
+ "PivotBySubtable": "Rapporten er ikke pivoteret %s Pivoter med %s.",
"PluginDescription": "Struktur for webanalyse-rapporter.",
"ReportGeneratedOn": "Rapport genereret på %s",
"ReportGeneratedXAgo": "Rapport genereret %s siden",
@@ -56,6 +57,7 @@
"SupportPiwik": "Støt Piwik!",
"TableNoData": "Ingen data til denne tabel.",
"ThereIsNoDataForThisReport": "Der er ingen data for denne rapport.",
+ "UndoPivotBySubtable": "Rapporten er blevet pivoteret %s Fortryd pivot.",
"UnFlattenDataTable": "Rapporten er ikke hierarkisk %s lav den hierakisk",
"ViewAllPiwikVideoTutorials": "Vis alle Piwik videoselvstudier",
"WebAnalyticsReports": "Webanalyse-rapporter",
diff --git a/plugins/CoreHome/lang/de.json b/plugins/CoreHome/lang/de.json
index 90a7cb7f41..24ca6e25a1 100644
--- a/plugins/CoreHome/lang/de.json
+++ b/plugins/CoreHome/lang/de.json
@@ -41,6 +41,7 @@
"PeriodWeeks": "Wochen",
"PeriodYear": "Jahr",
"PeriodYears": "Jahre",
+ "PivotBySubtable": "Kein Pivot erstellt für diesen Bericht %s Pivot erstellen mit %s",
"PluginDescription": "Webanalytik Berichts-Struktur",
"ReportGeneratedOn": "Bericht erzeugt am %s",
"ReportGeneratedXAgo": "Bericht erzeugt vor %s",
@@ -56,6 +57,7 @@
"SupportPiwik": "Unterstützen Sie Piwik!",
"TableNoData": "Keine Daten für diese Tabelle.",
"ThereIsNoDataForThisReport": "Es stehen keine Daten für diesen Bericht zur Verfügung.",
+ "UndoPivotBySubtable": "Pivot erstellt für diesen Bericht %s Pivot rückgängig machen",
"UnFlattenDataTable": "Der Bericht ist flach %s Hierarchisch anzeigen",
"ViewAllPiwikVideoTutorials": "Zeige alle Piwik Video Tutorials an",
"WebAnalyticsReports": "Webanalytik Berichte",
diff --git a/plugins/CoreHome/lang/el.json b/plugins/CoreHome/lang/el.json
index edbac45aec..3251141515 100644
--- a/plugins/CoreHome/lang/el.json
+++ b/plugins/CoreHome/lang/el.json
@@ -41,6 +41,7 @@
"PeriodWeeks": "εβδομάδων",
"PeriodYear": "Έτος",
"PeriodYears": "ετών",
+ "PivotBySubtable": "Η αναφορά αυτή δεν είναι θεμελιωμένη %s Να θεμελιωθεί από %s",
"PluginDescription": "Δομή Αναφορών Ανάλυσης Ιστού.",
"ReportGeneratedOn": "Η αναφορά δημιουργήθηκε στις %s",
"ReportGeneratedXAgo": "Η αναφορά δημιουργήθηκε πριν από %s",
@@ -56,6 +57,7 @@
"SupportPiwik": "Στηρίξτε το Piwik!",
"TableNoData": "Δεν υπάρχουν δεδομένα για τον πίνακα.",
"ThereIsNoDataForThisReport": "Δεν υπάρχουν δεδομένα για αυτή την αναφορά.",
+ "UndoPivotBySubtable": "Η αναφορά θεμελιώθηκε %s Αναίρεση της θεμελίωσης",
"UnFlattenDataTable": "Η αναφορά είναι επίπεδη %s Κάντε την ιεραρχημένη",
"ViewAllPiwikVideoTutorials": "Δείτε όλα τα βίντεο εκμάθησης του Piwik",
"WebAnalyticsReports": "Αναφορές Στατιστικών Ιστού",
diff --git a/plugins/CoreHome/lang/et.json b/plugins/CoreHome/lang/et.json
index 41bcc820ed..a91581a1af 100644
--- a/plugins/CoreHome/lang/et.json
+++ b/plugins/CoreHome/lang/et.json
@@ -7,6 +7,7 @@
"DateFormat": "%longDay% %day% %longMonth% %longYear%",
"Default": "vaikimisi",
"ExcludeRowsWithLowPopulation": "Kuvatakse kõiki ridu %s Eemalda ebapopulaarsemad",
+ "ExternalHelp": "Abi (avaneb uues aknas)",
"FlattenDataTable": "Antud raport on hierarhiline %s Tee see lamedaks",
"HowMuchIsPiwikWorth": "Kui palju on Piwik sulle väärt?",
"IncludeRowsWithLowPopulation": "Ebapopulaarsed read on peidetud %s Kuva kõik read",
diff --git a/plugins/CoreHome/lang/it.json b/plugins/CoreHome/lang/it.json
index 1e36eeb330..704abae336 100644
--- a/plugins/CoreHome/lang/it.json
+++ b/plugins/CoreHome/lang/it.json
@@ -41,6 +41,7 @@
"PeriodWeeks": "settimane",
"PeriodYear": "Anno",
"PeriodYears": "anni",
+ "PivotBySubtable": "Questo report non è imperniato al Pivot %s da %s",
"PluginDescription": "Struttura di base per i report di Web Analytics.",
"ReportGeneratedOn": "Report generato il %s",
"ReportGeneratedXAgo": "Report generato %s fa",
@@ -56,6 +57,7 @@
"SupportPiwik": "Sostieni Piwik!",
"TableNoData": "nessun dato per questa tabella.",
"ThereIsNoDataForThisReport": "Non c'è nessun dato in questo report.",
+ "UndoPivotBySubtable": "Questo report è stato imperniato al Pivot %s Undo",
"UnFlattenDataTable": "Il report è piatto %s Rendilo gerarchico",
"ViewAllPiwikVideoTutorials": "Vedi tutti i Video Tutorial di Piwik",
"WebAnalyticsReports": "Report Web Analytics",
diff --git a/plugins/CoreHome/lang/pt.json b/plugins/CoreHome/lang/pt.json
index fbb65ea1c1..e111bdcb06 100644
--- a/plugins/CoreHome/lang/pt.json
+++ b/plugins/CoreHome/lang/pt.json
@@ -1,6 +1,12 @@
{
"CoreHome": {
"CategoryNoData": "Sem dados nesta categoria. Tente o \"Incluir toda a população\".",
+ "DataTableExcludeAggregateRows": "Linhas agregadas encontram-se visíveis %s Esconda-as",
+ "DataTableIncludeAggregateRows": "Linhas agregadas encontram-se escondidas %s Mostre-as",
+ "Default": "defeito",
+ "DonateCall1": "O Piwik nunca lhe custará nada para usar, mas isso não quer dizer que não nos custe nada para o criar.",
+ "DonateCall2": "O Piwik presisa do seu contínuo suporte para crescer e brilhar.",
+ "DonateCall3": "Se você sente que o Piwik adicionou um valor significante ao seu negócio, %1$spor favor considere realizar um donativo!%2$s",
"JavascriptDisabled": "JavaScript tem que estar activado para poder usar Piwik no esquema padrão.<br \/>No entanto, parece que JavaScript está desactivado ou não é suportado pelo seu navegador.<br \/>Para usar o esquema padrão, active JavaScript nas opções do seu navegador, depois %1$stente de novo%2$s.<br \/>",
"PageOf": "%1$s de %2$s",
"PeriodDay": "Dia",
diff --git a/plugins/CoreUpdater/Commands/Update.php b/plugins/CoreUpdater/Commands/Update.php
index 108281c460..900de31a3d 100644
--- a/plugins/CoreUpdater/Commands/Update.php
+++ b/plugins/CoreUpdater/Commands/Update.php
@@ -8,6 +8,7 @@
*/
namespace Piwik\Plugins\CoreUpdater\Commands;
+use Piwik\Filesystem;
use Piwik\Plugin\ConsoleCommand;
use Piwik\Plugins\CoreUpdater\Controller;
use Piwik\Plugins\CoreUpdater\NoUpdatesFoundException;
@@ -35,6 +36,8 @@ class Update extends ConsoleCommand
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
+ $this->executeClearCaches();
+
$doDryRun = (bool) $input->getOption('dry-run');
try {
@@ -54,6 +57,11 @@ class Update extends ConsoleCommand
}
}
+ protected function executeClearCaches()
+ {
+ Filesystem::deleteAllCacheOnUpdate();
+ }
+
protected function makeUpdate(InputInterface $input, OutputInterface $output, $doDryRun)
{
$this->checkAllRequiredOptionsAreNotEmpty($input);
diff --git a/plugins/CoreUpdater/lang/es.json b/plugins/CoreUpdater/lang/es.json
index 0a71529f2c..b3210a311b 100644
--- a/plugins/CoreUpdater/lang/es.json
+++ b/plugins/CoreUpdater/lang/es.json
@@ -38,7 +38,7 @@
"PiwikUpdatedSuccessfully": "¡Piwik actualizado con éxito!",
"PiwikWillBeUpgradedFromVersionXToVersionY": "La base de datos de Piwik será actualizada desde la versión %1$s a la nueva versión %2$s.",
"PluginDescription": "mecanismo de actualización de Piwik",
- "ReadyToGo": "Listo?",
+ "ReadyToGo": "¿Listo?",
"TheFollowingPluginsWillBeUpgradedX": "Los siguientes plugins serán actualizados: %s.",
"ThereIsNewPluginVersionAvailableForUpdate": "Algunos plugins que utilizas han sido actualizados en el Marketplace:",
"ThereIsNewVersionAvailableForUpdate": "Hay una nueva versión de Piwik disponible para actualizar",
diff --git a/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig b/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
index 13c153f89c..f6fe938c6a 100644
--- a/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
+++ b/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
@@ -18,7 +18,8 @@
{% else %}
{%- for rowId, row in dataTable.getRows() -%}
{%- set rowHasSubtable = not subtablesAreDisabled and row.getIdSubDataTable() and properties.subtable_controller_action is not null -%}
- {%- set shouldHighlightRow = rowId == constant('Piwik\\DataTable::ID_SUMMARY_ROW') and properties.highlight_summary_row -%}
+ {%- set isSummaryRow = rowId == constant('Piwik\\DataTable::ID_SUMMARY_ROW') -%}
+ {%- set shouldHighlightRow = isSummaryRow 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 #}
{%- set showRow = subtablesAreDisabled
@@ -28,7 +29,7 @@
{% if showRow %}
<tr {% if rowHasSubtable %}id="{{ row.getIdSubDataTable() }}"{% endif %}
- class="{{ row.getMetadata('css_class') }} {% if rowHasSubtable %}subDataTable{% endif %}{% if shouldHighlightRow %} highlight{% endif %}"
+ class="{{ row.getMetadata('css_class') }} {% if rowHasSubtable %}subDataTable{% endif %}{% if shouldHighlightRow %} highlight{% endif %}{% if isSummaryRow %} summaryRow{% endif %}"
{% if rowHasSubtable %}title="{{ 'CoreHome_ClickRowToExpandOrContract'|translate }}"{% endif %}>
{% for column in properties.columns_to_display %}
<td>
diff --git a/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml b/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml
index a61cb11554..a02dc66b3a 100644
--- a/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml
+++ b/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml
@@ -120,7 +120,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>search</referrerType>
<referrerTypeName>Search Engines</referrerTypeName>
<referrerName>Google</referrerName>
diff --git a/plugins/CustomVariables/tests/System/processed/test_CustomVariablesIntegrationTest__Live.getLastVisitsDetails_day.xml b/plugins/CustomVariables/tests/System/processed/test_CustomVariablesIntegrationTest__Live.getLastVisitsDetails_day.xml
index a61cb11554..a02dc66b3a 100644
--- a/plugins/CustomVariables/tests/System/processed/test_CustomVariablesIntegrationTest__Live.getLastVisitsDetails_day.xml
+++ b/plugins/CustomVariables/tests/System/processed/test_CustomVariablesIntegrationTest__Live.getLastVisitsDetails_day.xml
@@ -120,7 +120,7 @@
<events>0</events>
<provider>Unknown</provider>
<providerName>Unknown</providerName>
- <providerUrl>http://piwik.org/faq/general/#faq_52</providerUrl>
+ <providerUrl />
<referrerType>search</referrerType>
<referrerTypeName>Search Engines</referrerTypeName>
<referrerName>Google</referrerName>
diff --git a/plugins/DevicesDetection/lang/de.json b/plugins/DevicesDetection/lang/de.json
index 431728a5bb..34f16e5736 100644
--- a/plugins/DevicesDetection/lang/de.json
+++ b/plugins/DevicesDetection/lang/de.json
@@ -16,8 +16,8 @@
"DevicesDetection": "Geräte der Besucher",
"DeviceType": "Gerätetyp",
"FeaturePhone": "Feature-Phone",
- "OperatingSystemFamilies": "Betriebssystem Familie",
- "OperatingSystemVersions": "Betriebssystem Familien",
+ "OperatingSystemFamilies": "Betriebssystem Familien",
+ "OperatingSystemVersions": "Betriebssystem Versionen",
"PluginDescription": "Dieses Plugin stellt erweiterte Informationen über mobile Geräte, wie Marke (Hersteller), Modell (Geräteversion), bessere Gerätetyperkennung (TV, Konsolen, Smartphones, Desktop, etc) und mehr bereit. Dieses Plugin fügt einen neuen Bericht unter 'Besucher > Geräte' hinzu.",
"SmartDisplay": "Smart Display",
"Smartphone": "Smartphone",
diff --git a/plugins/Events/lang/pl.json b/plugins/Events/lang/pl.json
index 24ff7eb981..9fc090435d 100644
--- a/plugins/Events/lang/pl.json
+++ b/plugins/Events/lang/pl.json
@@ -16,6 +16,7 @@
"MaxValueDocumentation": "Maksymalna wartość dla tego zdarzenia",
"MinValue": "Minimalna wartość",
"MinValueDocumentation": "Minimalna wartość tego wydarzenia",
+ "SecondaryDimension": "Drugi wymiar to %s.",
"TopEvents": "Najważniejsze wydarzenia",
"TotalEvents": "Liczba zdarzeń",
"TotalEventsDocumentation": "Łączna liczba zdarzeń",
diff --git a/plugins/Goals/lang/es.json b/plugins/Goals/lang/es.json
index 48d0d23238..bd78837b19 100644
--- a/plugins/Goals/lang/es.json
+++ b/plugins/Goals/lang/es.json
@@ -10,6 +10,7 @@
"BestKeywords": "Tus mejores palabras de búsqueda son:",
"BestReferrers": "Tus mejores palabras de búsqueda son:",
"CaseSensitive": "Coincidir mayúsculas y minúsculas",
+ "ChooseGoal": "Elegir Objetivo",
"ClickOutlink": "Clic en un Enlace a un sitio web externo",
"ColumnAverageOrderRevenueDocumentation": "Valor Medio del Pedido (VMP) es el valor obtenido dividiendo los ingresos totales de todos los pedidos entre el número de pedidos.",
"ColumnAveragePriceDocumentation": "El promedio de ingresos para este %s.",
diff --git a/plugins/Goals/lang/et.json b/plugins/Goals/lang/et.json
index 1e015d9940..32a485f663 100644
--- a/plugins/Goals/lang/et.json
+++ b/plugins/Goals/lang/et.json
@@ -10,6 +10,7 @@
"BestKeywords": "Sinu parimad tulutoovad märksõnad on:",
"BestReferrers": "Sinu parimad tulutoovad veebilehtede suunajad on:",
"CaseSensitive": "Tähtede tõusutundlik võrdlus",
+ "ChooseGoal": "Vali eesmärk",
"ClickOutlink": "Klikivad välise lehe lingile",
"ColumnConversions": "Tulu tekitamised",
"ColumnVisits": "Külastuste koguarv, hoolimata sellest, kas eesmärgini jõuti või ei.",
diff --git a/plugins/Goals/lang/ja.json b/plugins/Goals/lang/ja.json
index 6c7c37bd80..71be9dc192 100644
--- a/plugins/Goals/lang/ja.json
+++ b/plugins/Goals/lang/ja.json
@@ -65,7 +65,12 @@
"Manually": "手動",
"ManuallyTriggeredUsingJavascriptFunction": "JavaScript API の trackGoal() を使用した手動トリガー",
"MatchesExpression": "正規表現 %s に一致する",
+ "NewGoalDescription": "Piwik での目標とは、あなたの戦略や優先事項のことです。例えば、以下を含みます。:「パンフレットのダウンロード」、「ニュースレターの登録」、「services.html ページへの訪問」等",
+ "NewGoalIntro": "目標コンバージョントラッキングは、あなたのビジネス目標の測定や改善のために、最も効率的な方法の一つです。",
+ "NewGoalYouWillBeAbleTo": "各目標に対するパフォーマンスの確認や分析を行い、コンバージョンやコンバージョンレート、訪問数あたりの収益を上げる方法を知ることができます。",
"NewVisitorsConversionRateIs": "新規ビジターのコンバージョン率は %s です",
+ "NewWhatDoYouWantUsersToDo": "ウェブサイトビジターに、何をしてもらいたいですか?",
+ "NoGoalsNeedAccess": "管理者またはスーパーユーザーアクセス権限を持つユーザーのみが、指定のウェブサイトに目標を追加できます。ウェブサイトに目標を設定するには、Piwik 管理者にお問い合わせください。<br> 目標の追跡は、あなたのウェブサイトへの理解を深め、パフォーマンスを最大化させるために、非常に良い方法です。",
"Optional": "(オプション)",
"OverallConversionRate": "%s 総コンバージョン率(目標達成ビジット)",
"OverallRevenue": "%s 総収益",
@@ -77,6 +82,7 @@
"Products": "製品",
"ProductSKU": "製品番号",
"ReturningVisitorsConversionRateIs": "リピーターのコンバージョン率は %s です",
+ "SendEvent": "イベントを送信",
"SingleGoalOverviewDocumentation": "これは単一の目標のコンバージョンの概観です。 %s グラフの下のスパークラインは、クリックして拡大できます。",
"UpdateGoal": "目標を更新",
"URL": "URL",
diff --git a/plugins/ImageGraph/lang/ja.json b/plugins/ImageGraph/lang/ja.json
index 6b3aad8c3d..492ff339e0 100644
--- a/plugins/ImageGraph/lang/ja.json
+++ b/plugins/ImageGraph/lang/ja.json
@@ -1,5 +1,6 @@
{
"ImageGraph": {
+ "ColumnOrdinateMissing": "列 '%s' は、このレポートで見つかりませんでした。%s のいずれかをお試しください。",
"PluginDescription": "Piwikリポートの美しい静的PNGグラフ画像を生成します。"
}
} \ No newline at end of file
diff --git a/plugins/Insights/lang/et.json b/plugins/Insights/lang/et.json
new file mode 100644
index 0000000000..6a83802c17
--- /dev/null
+++ b/plugins/Insights/lang/et.json
@@ -0,0 +1,5 @@
+{
+ "Insights": {
+ "Filter": "Filter"
+ }
+} \ No newline at end of file
diff --git a/plugins/Insights/lang/ja.json b/plugins/Insights/lang/ja.json
index ce74cdcf84..93d1bf2325 100644
--- a/plugins/Insights/lang/ja.json
+++ b/plugins/Insights/lang/ja.json
@@ -1,6 +1,8 @@
{
"Insights": {
"ControlComparedToDescription": "比較する実績値は",
+ "ControlFilterByDescription": "すべて、変動のみ、新規のみ、削除のみを表示",
+ "DatePeriodCombinationNotSupported": "この日付と期間の組み合わせに対するインサイトは作成できません。",
"DayComparedToPreviousDay": "前の日",
"DayComparedToPreviousWeek": "前週の同じ日",
"DayComparedToPreviousYear": "去年の同じ日",
@@ -11,9 +13,17 @@
"FilterOnlyIncreaser": "増加した値のみ",
"FilterOnlyMovers": "変化のあった値のみ",
"FilterOnlyNew": "新しい値のみ",
+ "IgnoredChanges": "訪問数 %s 未満の影響を及ぼす変更は無視されました。",
"MonthComparedToPreviousMonth": "前の月",
"MonthComparedToPreviousYear": "去年の同じ月",
+ "MoversAndShakersWidgetTitle": "変動レポート",
+ "NoResultMatchesCriteria": "基準に一致する列がありません。",
"OverviewWidgetTitle": "インサイトの概要",
+ "TitleConsideredInsightsChanges": "列が少なくとも %1$s 訪問 ( 合計訪問数 %3$s の %2$s%% ) 増加または減少しました。",
+ "TitleConsideredInsightsGrowth": "次の列は %2$s に比べて少なくとも %1$s%% の成長があります。",
+ "TitleRowDisappearedDetails": "%2$s によって '%1$s' は減少し、%4$s に比べ、%3$s で消滅した",
+ "TitleRowMoverAndShaker": "この列は、平均より高い影響を与えました。",
+ "TitleRowNewDetails": "'%2$s によって '%1$s' が増加し、%3$s に比べて新しい",
"WeekComparedToPreviousWeek": "前の週",
"WidgetCategory": "インサイト",
"YearComparedToPreviousYear": "前の年"
diff --git a/plugins/Installation/lang/es.json b/plugins/Installation/lang/es.json
index 74b759f550..84d8bec7e1 100644
--- a/plugins/Installation/lang/es.json
+++ b/plugins/Installation/lang/es.json
@@ -1,5 +1,6 @@
{
"Installation": {
+ "CannotConnectToDb": "No se puedo conectar con la base de datos",
"CollaborativeProject": "Piwik es un proyecto de colaboración, creado con amor por personas de todo el mundo",
"ConfigurationHelp": "Su archivo de configuración de Piwik parece estar desconfigurado. Puede remover el archivo config\/config.ini.php y seguir la instalación, o corregir la configuración de conexión de la base de datos.",
"ConfirmDeleteExistingTables": "¿Está seguro de que desea borrar las tablas: %s de su base de datos? ADVERTENCIA: ¡LOS DATOS DE ESTAS TABLAS NO SE PUEDEN RECUPERAR!",
@@ -34,6 +35,7 @@
"NfsFilesystemWarningSuffixAdmin": "Esto significa que Piwik será extremadamente lento cuando se utilice sesiones basadas en archivos.",
"NfsFilesystemWarningSuffixInstall": "Utilizando sesiones basadas en archivos sobre NFS es extremadamente lento, por lo tanto, Piwik utilizará sesiones basada en base de datos. Si tiene varios usuarios de panel, puede que necesite incrementar el número máximo de conexiones de clientes al servidor de la base de datos.",
"NoConfigFound": "El archivo de configuración de Piwik no se ha encontrado y está intentando acceder a una página de Piwik.<br \/><b>  » Puede <a href='index.php'>instalar Piwik ahora<\/a><\/b><br \/><small>¡Si ha instalado Piwik antes y tiene algunas tablas en su BD, no se preocupe, usted puede reutilizar las mismas tablas y mantener sus datos existentes!<\/small>",
+ "NotSupported": "no soportado",
"Optional": "Opcional",
"Password": "Contraseña",
"PasswordDoNotMatch": "las contraseñas no coinciden",
diff --git a/plugins/Installation/lang/ja.json b/plugins/Installation/lang/ja.json
index 51945d8fed..2a3052923c 100644
--- a/plugins/Installation/lang/ja.json
+++ b/plugins/Installation/lang/ja.json
@@ -1,9 +1,13 @@
{
"Installation": {
+ "CannotConnectToDb": "データベースに接続できません。",
+ "CannotConnectToDbResolvingExplanation": "これは一時的な問題の可能性があります。%1$srefreshing the page%2$s をお試しください。問題が続く場合、Piwik 管理者にお問い合わせください。",
+ "CollaborativeProject": "Piwik は、世界中の人々に愛され、構築されている共同プロジェクトです。",
"ConfigurationHelp": "Piwik 設定ファイルが誤設定されているようです。 config\/config.ini.php を削除してインストールを再開するか、データベースの接続設定を修正してください。",
"ConfirmDeleteExistingTables": "本当にデータベースからテーブル %s を削除しますか? 警告: これらのテーブルのデータを復旧することはできません!",
"Congratulations": "おめでとうございます",
"CongratulationsHelp": "<p>おめでとうございます! Piwik のインストールは完了しました。<\/p><p>javascript コードをウェブサイトのページに埋め込み、最初のビジターをお待ちください!<\/p>",
+ "DatabaseAbilities": "データベースアビリティ",
"DatabaseCreation": "データベースの作成",
"DatabaseErrorConnect": "データベースサーバーへの接続中にエラーが発生しました",
"DatabaseServerVersion": "データベースサーバーのバージョン",
@@ -16,13 +20,23 @@
"Email": "メールアドレス",
"Extension": "エクステンション",
"Filesystem": "ファイルシステム",
+ "GetInvolved": "もし Piwik を気にって頂けたら、是非 %1$sget involved%2$s 。",
"GoBackAndDefinePrefix": "戻って、Piwik テーブルのプレフィックスを定義する",
"HappyAnalysing": "ハッピーな解析を!",
"Installation": "インストール",
"InstallationStatus": "インストール状況",
"InsufficientPrivilegesHelp": "phpMyAdminのようなツールを使用するか、正しいSQLクエリを実行することにより、これらの権限を追加できます。やり方がわからない場合は、システム管理者に依頼して、権限を付与してもらってください。",
+ "InsufficientPrivilegesMain": "データベースが存在しない ( および作成できない ) 、または具体的なユーザーが十分な権限を持っていない可能性があります。データベースユーザーは、次の権限を有する必要があります。: %s",
+ "JsTagArchivingHelp1": "中~高トラフィックのウェブサイトのために、Piwik をより早く(例えば %1$ssetting up auto-archiving%2$s のように) 実行するための最適化の手段があります。",
+ "JSTracking_EndNote": "注:インストールの処理後、%1$sTracking Code%2$s の管理セクションで、トラッキングコードのカスタマイズを行うことができます。",
+ "JSTracking_Intro": "Piwik でウェブトラフィックの追跡をするには、一部の特別なコードが各 web ページに追加されているかどうかを確認する必要があります。",
"LargePiwikInstances": "高トラフィック環境で Piwik を使用するためのヒント",
"Legend": "説明",
+ "LoadDataInfileRecommended": "あなたの Piwik サーバーが高いトラフィックのウェブサイト ( 例、1 ヶ月あたり 100,000 ページ以上 ) を追跡している場合、この問題の解決をお勧めします。",
+ "LoadDataInfileUnavailableHelp": "%1$s を使用すると、Piwik のアーカイブプロセスを大幅に高速化させます。それを Piwik で利用可能にするには、お使いの PHP と MySQL ソフトウェアのアップデートをお試しください。またデータベースユーザーが %2$s 権限を持っているかどうかご確認ください。",
+ "NfsFilesystemWarning": "あなたのサーバーは、NFS ファイルシステムを使用しています。",
+ "NfsFilesystemWarningSuffixAdmin": "これは、ファイルベースのセッションを利用する際、Piwik が極端に遅くなることを意味します。",
+ "NfsFilesystemWarningSuffixInstall": "NFS 上でファイルベースのセッションを利用すると極端に遅いので、Piwik はデータベースセッションを使用します。同時に多くのダッシュボードユーザーがいる場合、データベースサーバーへのクライアント接続の最大数を増やす必要があります。",
"NoConfigFound": "Piwik の設定ファイルを見つけることができませんでしたが、あなたは Piwik ページにアクセスしようとしています。<br \/><b>  »<a href='index.php'>ただちに Piwik をインストール<\/a>することができます。<\/b><br \/><small>以前に Piwik をインストールしたことがあり、DB に多少のデータがある場合でも心配しないでください。 既存のデータを保持したまま、同じテーブルを再利用することができます!<\/small>",
"NotSupported": "サポートされていません",
"Optional": "オプション",
@@ -30,22 +44,30 @@
"PasswordDoNotMatch": "パスワードが一致しませんでした",
"PasswordRepeat": "パスワード(再入力)",
"PercentDone": "%s %% 完了",
+ "PiwikOrgNewsletter": "私に Piwik コミュニティの最新情報をメールで送る",
+ "PiwikProNewsletter": "%sPiwik PRO%s サービス( 月1回以下のメール受信 ) に興味があります。",
"PleaseFixTheFollowingErrors": "次のエラーを修正してください",
"PluginDescription": "Piwik のインストール処理を行います。 インストールは通常1回のみですが、設定ファイル(config\/config.inc.php)が削除された場合は、インストールが再度開始されます。",
"Requirements": "Piwik の動作環境",
"RestartWebServer": "この変更を行った後、ウェブサーバーを再起動してください。",
+ "ReusingTables": "表の再利用",
+ "SeeBelowForMoreInfo": "詳細は、以下をご確認ください。",
"SetupWebsite": "ウェブサイトのセットアップ",
"SetupWebsiteError": "ウェブサイトを追加する際にエラーが発生しました",
"SetupWebSiteName": "ウェブサイトの名前",
"SetupWebsiteSetupSuccess": "ウェブサイト %s は正常に作成されました!",
"SetupWebSiteURL": "ウェブサイトの URL",
+ "SiteSetup": "Piwik で追跡・分析したい初めのウェブサイトを設定してください。",
+ "SiteSetupFootnote": "注: Piwik のインストールが完了すると、さらに追跡対象のウェブサイトを追加することができるようになります!",
"SuperUser": "スーパーユーザー",
"SuperUserLogin": "スーパーユーザーのログイン",
+ "SuperUserSetupError": "スーパーユーザーの追加時に、エラーが発生しました。",
"SuperUserSetupSuccess": "スーパーユーザーの作成に成功しました!",
"SystemCheck": "システムの確認",
"SystemCheckAutoUpdateHelp": "注意: Piwik のワンクリックアップデートには、Piwik のフォルダとその内容に書き込み権限が必要となります。",
"SystemCheckCreateFunctionHelp": "Piwik はコールバックに匿名関数を使用します。",
"SystemCheckCronArchiveProcess": "アーカイブ cron",
+ "SystemCheckCronArchiveProcessCLI": "CLI を経由して処理を管理する",
"SystemCheckDatabaseHelp": "Piwik には、mysqli エクステンションか、PDO と pdo_mysql エクステンションの両方の、どちらかが必要です。",
"SystemCheckDebugBacktraceHelp": "View::factory はコール側モジュールのビューを作成することができません。",
"SystemCheckError": "エラー発生 - 次の処理へ進む前に修正する必要があります。",
@@ -53,13 +75,16 @@
"SystemCheckExtensions": "その他の必須エクステンション",
"SystemCheckFileIntegrity": "ファイルの整合性",
"SystemCheckFunctions": "必須関数",
+ "SystemCheckGDFreeType": "GD > 2.x + Freetype (graphics)",
"SystemCheckGDHelp": "スパークライン(小さなグラフ)は動作しません。",
"SystemCheckGlobHelp": "この組み込み関数はホストで無効化されています。 Piwik はこの関数のエミュレートを試みますが、さらなるセキュリティ制限に遭遇する場合があります。 また、機能性にも影響を与える場合があります。",
"SystemCheckGzcompressHelp": "zlib エクステンションと gzcompress() 関数を有効にする必要があります。",
"SystemCheckGzuncompressHelp": "zlib エクステンションと gzuncompress() 関数を有効にする必要があります。",
"SystemCheckIconvHelp": "\"iconv\" のサポートを有効にして、PHP の再構築と設定を行う必要があります(--with-iconv)。",
+ "SystemCheckJsonHelp": "JSON データの読取と書込には、Piwik に php5-json の拡張モジュールが必要です。",
"SystemCheckMailHelp": "mail() 関数がない場合、フィードバックとパスワード紛失のメッセージを送信することができません。",
"SystemCheckMbstring": "mbstring",
+ "SystemCheckMbstringHelp": "拡張モジュール mbstring は、ユーザインタフェースと API レスポンスで、マルチバイト文字を処理するために必要です。また、php.ini で mbstring.func_overload が「 0 」に設定されていることを確認してください。",
"SystemCheckMemoryLimit": "メモリー制限",
"SystemCheckMemoryLimitHelp": "アクセス数の多いウェブサイトでは、アーカイブ処理の実行に、現在許可されている以上に多くのメモリを必要とする場合があります。<br \/>必要であれば、php.ini ファイルのディレクティブ memory_limit を参照してください。",
"SystemCheckOpenURL": "オープン URL",
diff --git a/plugins/LeftMenu/lang/es.json b/plugins/LeftMenu/lang/es.json
new file mode 100644
index 0000000000..e4156feb2e
--- /dev/null
+++ b/plugins/LeftMenu/lang/es.json
@@ -0,0 +1,5 @@
+{
+ "LeftMenu": {
+ "GlobalSettingTitle": "Menú izquierdo activado por defecto"
+ }
+} \ No newline at end of file
diff --git a/plugins/Login/lang/pl.json b/plugins/Login/lang/pl.json
index e277d958b5..8a43531505 100644
--- a/plugins/Login/lang/pl.json
+++ b/plugins/Login/lang/pl.json
@@ -3,6 +3,7 @@
"ConfirmationLinkSent": "Potwierdzenie zostało wysłane na skrzynkę odbiorczą. Sprawdź swój e-mail i odwiedzić link do autoryzacji żądania zmiany hasła.",
"ContactAdmin": "Prawdopodobny powód: twój host mógł wyłączyć działanie funkcji mail(). <br \/>Skontaktuj się w tej sprawie ze swoim administratorem statystyk Piwik.",
"ExceptionPasswordMD5HashExpected": "Oczekiwanym parametrem hasła jest hash z MD5 uzyskany z hasła.",
+ "InvalidNonceOrHeadersOrReferrer": "Błąd zabezpieczeń formularza. Proszę przeładować stronę z formularzem i upewnić się, że obsługa ciasteczek jest włączona. Jeśli korzystasz z serwera proxy, należy %s skonfigurować Piwik, tak aby akceptował nagłówek serwera proxy%s, który przekazuje nagłówek serwera docelowego. Ponadto sprawdź, czy naglówek Referrer jest poprawnie wysyłany.",
"InvalidOrExpiredToken": "Token jest błędny lub już wygasł.",
"InvalidUsernameEmail": "Błędna nazwa użytkownika i\/lub adres e-mail",
"LogIn": "Zaloguj się",
diff --git a/plugins/MobileMessaging/MobileMessaging.php b/plugins/MobileMessaging/MobileMessaging.php
index 884ff9b63a..ed57c259f9 100644
--- a/plugins/MobileMessaging/MobileMessaging.php
+++ b/plugins/MobileMessaging/MobileMessaging.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\MobileMessaging;
use Piwik\Option;
+use Piwik\Period;
use Piwik\Piwik;
use Piwik\Plugins\API\API as APIPlugins;
use Piwik\Plugins\MobileMessaging\API as APIMobileMessaging;
@@ -177,7 +178,7 @@ class MobileMessaging extends \Piwik\Plugin
}
public function sendReport($reportType, $report, $contents, $filename, $prettyDate, $reportSubject, $reportTitle,
- $additionalFiles)
+ $additionalFiles, Period $period = null, $force)
{
if (self::manageEvent($reportType)) {
$parameters = $report['parameters'];
diff --git a/plugins/MobileMessaging/lang/pl.json b/plugins/MobileMessaging/lang/pl.json
index eaf82a7798..859635f564 100644
--- a/plugins/MobileMessaging/lang/pl.json
+++ b/plugins/MobileMessaging/lang/pl.json
@@ -1,11 +1,13 @@
{
"MobileMessaging": {
"PhoneNumbers": "Numery telefonu",
+ "Settings_APIKey": "Klucz API",
"Settings_CountryCode": "Kod Państwa",
"Settings_DeleteAccountConfirm": "Czy jesteś pewny, że chcesz skasowac to konto SMS?",
"Settings_ManagePhoneNumbers": "Zarządzaj numerami telefonów",
"Settings_PhoneNumber": "Numer telefonu",
"Settings_PhoneNumbers_Add": "Dodaj nowy numer telefonu",
+ "Settings_SMSProvider": "Dostawca usługi SMS",
"Settings_ValidatePhoneNumber": "Zatwierdź",
"SMS_Content_Too_Long": "[zbyt długie]",
"TopMenu": "Raporty Email & SMS"
diff --git a/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php b/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php
index 6d2eb9849b..f387534bf3 100644
--- a/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php
+++ b/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php
@@ -255,7 +255,7 @@ class MobileMessagingTest extends IntegrationTestCase
\Piwik\Plugins\MobileMessaging\API::setSingletonInstance($stubbedAPIMobileMessaging);
$mobileMessaging = new MobileMessaging();
- $mobileMessaging->sendReport(MobileMessaging::MOBILE_TYPE, $report, $reportContent, null, null, $reportSubject, null, null);
+ $mobileMessaging->sendReport(MobileMessaging::MOBILE_TYPE, $report, $reportContent, null, null, $reportSubject, null, null, null, false);
\Piwik\Plugins\MobileMessaging\API::unsetInstance();
}
diff --git a/plugins/Morpheus/stylesheets/general/_forms.less b/plugins/Morpheus/stylesheets/general/_forms.less
index ea75691a78..475c72d9f7 100644
--- a/plugins/Morpheus/stylesheets/general/_forms.less
+++ b/plugins/Morpheus/stylesheets/general/_forms.less
@@ -23,6 +23,7 @@ button[type="button"],
font-weight: normal;
padding: 5px 15px !important;
text-align: center;
+ text-decoration: none !important;
cursor: pointer;
border: 0px !important;
&:hover {
diff --git a/plugins/Morpheus/templates/javascriptCode.tpl b/plugins/Morpheus/templates/javascriptCode.tpl
index 344e6d0311..125259b807 100644
--- a/plugins/Morpheus/templates/javascriptCode.tpl
+++ b/plugins/Morpheus/templates/javascriptCode.tpl
@@ -5,11 +5,11 @@
_paq.push(['enableLinkTracking']);
(function() {
{$setTrackerUrl}
- _paq.push(['setTrackerUrl', u+'piwik.php']);
+ {$optionsBeforeTrackerUrl}_paq.push(['setTrackerUrl', u+'piwik.php']);
_paq.push(['setSiteId', {$idSite}]);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
</script>
-<noscript><p><img src="//{$piwikUrl}/piwik.php?idsite={$idSite}" style="border:0;" alt="" /></p></noscript>
+<noscript><p><img src="{$protocol}{$piwikUrl}/piwik.php?idsite={$idSite}" style="border:0;" alt="" /></p></noscript>
<!-- End Piwik Code -->
diff --git a/plugins/MultiSites/lang/pl.json b/plugins/MultiSites/lang/pl.json
index 2999d348d5..a3557cd8a8 100644
--- a/plugins/MultiSites/lang/pl.json
+++ b/plugins/MultiSites/lang/pl.json
@@ -2,6 +2,7 @@
"MultiSites": {
"Evolution": "Postęp",
"LoadingWebsites": "Ładowanie stron",
+ "Pagination": "%s - %s z %s",
"PluginDescription": "Wyświetla wielostronicowe podsumowania\/statystyki. Obecnie zastosowane jako wtyczka jądra Piwik."
}
} \ No newline at end of file
diff --git a/plugins/PrivacyManager/javascripts/privacySettings.js b/plugins/PrivacyManager/javascripts/privacySettings.js
index 4f0260e7d6..f40985b984 100644
--- a/plugins/PrivacyManager/javascripts/privacySettings.js
+++ b/plugins/PrivacyManager/javascripts/privacySettings.js
@@ -93,7 +93,10 @@ $(document).ready(function () {
toggleBlock("deleteLogSettings", $("input[name=deleteEnable]:checked").val());
toggleBlock("anonymizeIPenabled", $("input[name=anonymizeIPEnable]:checked").val());
toggleBlock("deleteReportsSettings", $("input[name=deleteReportsEnable]:checked").val());
- toggleBlock("deleteOldReportsMoreInfo", $("input[name=deleteReportsEnable]:checked").val());
+ // This one is in an AngularJS directive, so is generated later
+ setTimeout(function () {
+ toggleBlock("deleteOldReportsMoreInfo", $("input[name=deleteReportsEnable]:checked").val());
+ }, 500);
toggleOtherDeleteSections();
});
diff --git a/plugins/Provider/API.php b/plugins/Provider/API.php
index dd367fc21b..c7e7cd11c8 100644
--- a/plugins/Provider/API.php
+++ b/plugins/Provider/API.php
@@ -34,7 +34,7 @@ class API extends \Piwik\Plugin\API
$dataTable->queueFilter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\getPrettyProviderName'));
$dataTable->queueFilter('ReplaceColumnNames');
$dataTable->queueFilter('ReplaceSummaryRowLabel');
+ $dataTable->queueFilter('GroupBy', array('label'));
return $dataTable;
}
}
-
diff --git a/plugins/Provider/Reports/GetProvider.php b/plugins/Provider/Reports/GetProvider.php
index 9323deccf1..739124088c 100644
--- a/plugins/Provider/Reports/GetProvider.php
+++ b/plugins/Provider/Reports/GetProvider.php
@@ -8,11 +8,13 @@
*/
namespace Piwik\Plugins\Provider\Reports;
+use Piwik\Common;
use Piwik\Piwik;
+use Piwik\Plugin\Report;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\Provider\Columns\Provider;
-class GetProvider extends \Piwik\Plugin\Report
+class GetProvider extends Report
{
protected function init()
{
@@ -28,6 +30,14 @@ class GetProvider extends \Piwik\Plugin\Report
{
$view->requestConfig->filter_limit = 5;
$view->config->addTranslation('label', $this->dimension->getName());
- }
+ $message = Piwik::translate("General_Note") . ': ' . Piwik::translate('Provider_ProviderReportFooter', '');
+ if (! Common::getRequestVar('disableLink', 0, 'int')) {
+ $message .= ' ' . Piwik::translate(
+ 'General_SeeThisFaq',
+ array('<a href="http://piwik.org/faq/general/faq_52/" target="_blank">', '</a>')
+ );
+ }
+ $view->config->show_footer_message = $message;
+ }
}
diff --git a/plugins/Provider/Visitor.php b/plugins/Provider/Visitor.php
index 0efbb92eb3..c11f1e3a9b 100644
--- a/plugins/Provider/Visitor.php
+++ b/plugins/Provider/Visitor.php
@@ -25,9 +25,8 @@ class Visitor
{
if (isset($this->details['location_provider'])) {
return $this->details['location_provider'];
- } else {
- return Piwik::translate('General_Unknown');
}
+ return Piwik::translate('General_Unknown');
}
public function getProviderName()
diff --git a/plugins/Provider/functions.php b/plugins/Provider/functions.php
index 110b54a359..3e2c4a2da8 100644
--- a/plugins/Provider/functions.php
+++ b/plugins/Provider/functions.php
@@ -20,12 +20,9 @@ use Piwik\Piwik;
*/
function getHostnameName($in)
{
- if (empty($in)) {
+ if (empty($in) || strtolower($in) === 'ip') {
return Piwik::translate('General_Unknown');
}
- if (strtolower($in) === 'ip') {
- return "IP";
- }
if (($positionDot = strpos($in, '.')) !== false) {
return ucfirst(substr($in, 0, $positionDot));
}
@@ -40,14 +37,8 @@ function getHostnameName($in)
*/
function getHostnameUrl($in)
{
- if ($in == DataTable::LABEL_SUMMARY_ROW) {
- return false;
- }
- if (empty($in)
- || strtolower($in) === 'ip'
- ) {
- // link to "what does 'IP' mean?"
- return "http://piwik.org/faq/general/#faq_52";
+ if ($in == DataTable::LABEL_SUMMARY_ROW || empty($in) || strtolower($in) === 'ip') {
+ return null;
}
// if the name looks like it can be used in a URL, use it in one, otherwise link to startpage
diff --git a/plugins/Provider/lang/en.json b/plugins/Provider/lang/en.json
index d27bb96363..f634e2eda7 100644
--- a/plugins/Provider/lang/en.json
+++ b/plugins/Provider/lang/en.json
@@ -4,6 +4,7 @@
"PluginDescription": "Reports the Provider of the visitors.",
"ProviderReportDocumentation": "This report shows which Internet Service Providers your visitors used to access the website. You can click on a provider name for more details. %s If Piwik can't determine a visitor's provider, it is listed as IP.",
"SubmenuLocationsProvider": "Locations & Provider",
- "WidgetProviders": "Providers"
+ "WidgetProviders": "Providers",
+ "ProviderReportFooter": "Unknown provider means the IP address could not be looked up."
}
} \ No newline at end of file
diff --git a/plugins/ScheduledReports/API.php b/plugins/ScheduledReports/API.php
index a42b5bb209..92acbd2c8d 100644
--- a/plugins/ScheduledReports/API.php
+++ b/plugins/ScheduledReports/API.php
@@ -466,7 +466,7 @@ class API extends \Piwik\Plugin\API
}
}
- public function sendReport($idReport, $period = false, $date = false)
+ public function sendReport($idReport, $period = false, $date = false, $force = false)
{
Piwik::checkUserIsNotAnonymous();
@@ -527,6 +527,9 @@ class API extends \Piwik\Plugin\API
* @param string $reportTitle The scheduled report's given title (given by a Piwik user).
* @param array $additionalFiles The list of additional files that should be
* sent with this report.
+ * @param \Piwik\Period $period The period for which the report has been generated.
+ * @param boolean $force A report can only be sent once per period. Setting this to true
+ * will force to send the report even if it has already been sent.
*/
Piwik::postEvent(
self::SEND_REPORT_EVENT,
@@ -538,7 +541,9 @@ class API extends \Piwik\Plugin\API
$prettyDate,
$reportSubject,
$reportTitle,
- $additionalFiles
+ $additionalFiles,
+ \Piwik\Period\Factory::build($report['period'], $date),
+ $force
)
);
@@ -560,7 +565,7 @@ class API extends \Piwik\Plugin\API
private static function getReportSubjectAndReportTitle($websiteName, $reports)
{
// if the only report is "All websites", we don't display the site name
- $reportTitle = Piwik::translate('General_Website') . " " . $websiteName;
+ $reportTitle = $websiteName;
$reportSubject = $websiteName;
if (count($reports) == 1
&& $reports[0] == 'MultiSites_getAll'
diff --git a/plugins/ScheduledReports/ScheduledReports.php b/plugins/ScheduledReports/ScheduledReports.php
index e59e9140ab..4b8190fead 100644
--- a/plugins/ScheduledReports/ScheduledReports.php
+++ b/plugins/ScheduledReports/ScheduledReports.php
@@ -10,7 +10,10 @@ namespace Piwik\Plugins\ScheduledReports;
use Exception;
use Piwik\Db;
+use Piwik\Log;
use Piwik\Mail;
+use Piwik\Option;
+use Piwik\Period;
use Piwik\Piwik;
use Piwik\Plugins\MobileMessaging\MobileMessaging;
use Piwik\Plugins\UsersManager\API as APIUsersManager;
@@ -63,6 +66,8 @@ class ScheduledReports extends \Piwik\Plugin
ReportRenderer::CSV_FORMAT => 'plugins/Morpheus/images/export.png',
);
+ const OPTION_KEY_LAST_SENT_DATERANGE = 'report_last_sent_daterange_';
+
/**
* @see Piwik\Plugin::getListHooksRegistered
*/
@@ -117,37 +122,39 @@ class ScheduledReports extends \Piwik\Plugin
public function validateReportParameters(&$parameters, $reportType)
{
- if (self::manageEvent($reportType)) {
- $reportFormat = $parameters[self::DISPLAY_FORMAT_PARAMETER];
- $availableDisplayFormats = array_keys(self::getDisplayFormats());
- if (!in_array($reportFormat, $availableDisplayFormats)) {
- throw new Exception(
- Piwik::translate(
- // General_ExceptionInvalidAggregateReportsFormat should be named General_ExceptionInvalidDisplayFormat
- 'General_ExceptionInvalidAggregateReportsFormat',
- array($reportFormat, implode(', ', $availableDisplayFormats))
- )
- );
- }
+ if (! self::manageEvent($reportType)) {
+ return;
+ }
- // emailMe is an optional parameter
- if (!isset($parameters[self::EMAIL_ME_PARAMETER])) {
- $parameters[self::EMAIL_ME_PARAMETER] = self::EMAIL_ME_PARAMETER_DEFAULT_VALUE;
- } else {
- $parameters[self::EMAIL_ME_PARAMETER] = self::valueIsTrue($parameters[self::EMAIL_ME_PARAMETER]);
- }
+ $reportFormat = $parameters[self::DISPLAY_FORMAT_PARAMETER];
+ $availableDisplayFormats = array_keys(self::getDisplayFormats());
+ if (!in_array($reportFormat, $availableDisplayFormats)) {
+ throw new Exception(
+ Piwik::translate(
+ // General_ExceptionInvalidAggregateReportsFormat should be named General_ExceptionInvalidDisplayFormat
+ 'General_ExceptionInvalidAggregateReportsFormat',
+ array($reportFormat, implode(', ', $availableDisplayFormats))
+ )
+ );
+ }
- // evolutionGraph is an optional parameter
- if (!isset($parameters[self::EVOLUTION_GRAPH_PARAMETER])) {
- $parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::EVOLUTION_GRAPH_PARAMETER_DEFAULT_VALUE;
- } else {
- $parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::valueIsTrue($parameters[self::EVOLUTION_GRAPH_PARAMETER]);
- }
+ // emailMe is an optional parameter
+ if (!isset($parameters[self::EMAIL_ME_PARAMETER])) {
+ $parameters[self::EMAIL_ME_PARAMETER] = self::EMAIL_ME_PARAMETER_DEFAULT_VALUE;
+ } else {
+ $parameters[self::EMAIL_ME_PARAMETER] = self::valueIsTrue($parameters[self::EMAIL_ME_PARAMETER]);
+ }
- // additionalEmails is an optional parameter
- if (isset($parameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
- $parameters[self::ADDITIONAL_EMAILS_PARAMETER] = self::checkAdditionalEmails($parameters[self::ADDITIONAL_EMAILS_PARAMETER]);
- }
+ // evolutionGraph is an optional parameter
+ if (!isset($parameters[self::EVOLUTION_GRAPH_PARAMETER])) {
+ $parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::EVOLUTION_GRAPH_PARAMETER_DEFAULT_VALUE;
+ } else {
+ $parameters[self::EVOLUTION_GRAPH_PARAMETER] = self::valueIsTrue($parameters[self::EVOLUTION_GRAPH_PARAMETER]);
+ }
+
+ // additionalEmails is an optional parameter
+ if (isset($parameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
+ $parameters[self::ADDITIONAL_EMAILS_PARAMETER] = self::checkAdditionalEmails($parameters[self::ADDITIONAL_EMAILS_PARAMETER]);
}
}
@@ -159,22 +166,26 @@ class ScheduledReports extends \Piwik\Plugin
public function getReportMetadata(&$reportMetadata, $reportType, $idSite)
{
- if (self::manageEvent($reportType)) {
- $availableReportMetadata = \Piwik\Plugins\API\API::getInstance()->getReportMetadata($idSite);
+ if (! self::manageEvent($reportType)) {
+ return;
+ }
- $filteredReportMetadata = array();
- foreach ($availableReportMetadata as $reportMetadata) {
- // removing reports from the API category and MultiSites.getOne
- if (
- $reportMetadata['category'] == 'API' ||
- $reportMetadata['category'] == Piwik::translate('General_MultiSitesSummary') && $reportMetadata['name'] == Piwik::translate('General_SingleWebsitesDashboard')
- ) continue;
+ $availableReportMetadata = \Piwik\Plugins\API\API::getInstance()->getReportMetadata($idSite);
- $filteredReportMetadata[] = $reportMetadata;
+ $filteredReportMetadata = array();
+ foreach ($availableReportMetadata as $reportMetadata) {
+ // removing reports from the API category and MultiSites.getOne
+ if (
+ $reportMetadata['category'] == 'API' ||
+ $reportMetadata['category'] == Piwik::translate('General_MultiSitesSummary') && $reportMetadata['name'] == Piwik::translate('General_SingleWebsitesDashboard')
+ ) {
+ continue;
}
- $reportMetadata = $filteredReportMetadata;
+ $filteredReportMetadata[] = $reportMetadata;
}
+
+ $reportMetadata = $filteredReportMetadata;
}
public function getReportTypes(&$reportTypes)
@@ -198,53 +209,57 @@ class ScheduledReports extends \Piwik\Plugin
public function processReports(&$processedReports, $reportType, $outputType, $report)
{
- if (self::manageEvent($reportType)) {
- $displayFormat = $report['parameters'][self::DISPLAY_FORMAT_PARAMETER];
- $evolutionGraph = $report['parameters'][self::EVOLUTION_GRAPH_PARAMETER];
+ if (! self::manageEvent($reportType)) {
+ return;
+ }
- foreach ($processedReports as &$processedReport) {
- $metadata = $processedReport['metadata'];
+ $displayFormat = $report['parameters'][self::DISPLAY_FORMAT_PARAMETER];
+ $evolutionGraph = $report['parameters'][self::EVOLUTION_GRAPH_PARAMETER];
- $isAggregateReport = !empty($metadata['dimension']);
+ foreach ($processedReports as &$processedReport) {
+ $metadata = $processedReport['metadata'];
- $processedReport['displayTable'] = $displayFormat != self::DISPLAY_FORMAT_GRAPHS_ONLY;
+ $isAggregateReport = !empty($metadata['dimension']);
- $processedReport['displayGraph'] =
- ($isAggregateReport ?
- $displayFormat == self::DISPLAY_FORMAT_GRAPHS_ONLY || $displayFormat == self::DISPLAY_FORMAT_TABLES_AND_GRAPHS
- :
- $displayFormat != self::DISPLAY_FORMAT_TABLES_ONLY)
- && \Piwik\SettingsServer::isGdExtensionEnabled()
- && \Piwik\Plugin\Manager::getInstance()->isPluginActivated('ImageGraph')
- && !empty($metadata['imageGraphUrl']);
+ $processedReport['displayTable'] = $displayFormat != self::DISPLAY_FORMAT_GRAPHS_ONLY;
- $processedReport['evolutionGraph'] = $evolutionGraph;
+ $processedReport['displayGraph'] =
+ ($isAggregateReport ?
+ $displayFormat == self::DISPLAY_FORMAT_GRAPHS_ONLY || $displayFormat == self::DISPLAY_FORMAT_TABLES_AND_GRAPHS
+ :
+ $displayFormat != self::DISPLAY_FORMAT_TABLES_ONLY)
+ && \Piwik\SettingsServer::isGdExtensionEnabled()
+ && \Piwik\Plugin\Manager::getInstance()->isPluginActivated('ImageGraph')
+ && !empty($metadata['imageGraphUrl']);
- // remove evolution metrics from MultiSites.getAll
- if ($metadata['module'] == 'MultiSites') {
- $columns = $processedReport['columns'];
+ $processedReport['evolutionGraph'] = $evolutionGraph;
- foreach (\Piwik\Plugins\MultiSites\API::getApiMetrics($enhanced = true) as $metricSettings) {
- unset($columns[$metricSettings[\Piwik\Plugins\MultiSites\API::METRIC_EVOLUTION_COL_NAME_KEY]]);
- }
+ // remove evolution metrics from MultiSites.getAll
+ if ($metadata['module'] == 'MultiSites') {
+ $columns = $processedReport['columns'];
- $processedReport['metadata'] = $metadata;
- $processedReport['columns'] = $columns;
+ foreach (\Piwik\Plugins\MultiSites\API::getApiMetrics($enhanced = true) as $metricSettings) {
+ unset($columns[$metricSettings[\Piwik\Plugins\MultiSites\API::METRIC_EVOLUTION_COL_NAME_KEY]]);
}
+
+ $processedReport['metadata'] = $metadata;
+ $processedReport['columns'] = $columns;
}
}
}
public function getRendererInstance(&$reportRenderer, $reportType, $outputType, $report)
{
- if (self::manageEvent($reportType)) {
- $reportFormat = $report['format'];
+ if (! self::manageEvent($reportType)) {
+ return;
+ }
- $reportRenderer = ReportRenderer::factory($reportFormat);
+ $reportFormat = $report['format'];
- if ($reportFormat == ReportRenderer::HTML_FORMAT) {
- $reportRenderer->setRenderImageInline($outputType != API::OUTPUT_SAVE_ON_DISK);
- }
+ $reportRenderer = ReportRenderer::factory($reportFormat);
+
+ if ($reportFormat == ReportRenderer::HTML_FORMAT) {
+ $reportRenderer->setRenderImageInline($outputType != API::OUTPUT_SAVE_ON_DISK);
}
}
@@ -256,132 +271,148 @@ class ScheduledReports extends \Piwik\Plugin
}
public function sendReport($reportType, $report, $contents, $filename, $prettyDate, $reportSubject, $reportTitle,
- $additionalFiles)
+ $additionalFiles, Period $period = null, $force)
{
- if (self::manageEvent($reportType)) {
- $periods = self::getPeriodToFrequencyAsAdjective();
- $message = Piwik::translate('ScheduledReports_EmailHello');
- $subject = Piwik::translate('General_Report') . ' ' . $reportTitle . " - " . $prettyDate;
-
- $mail = new Mail();
- $mail->setDefaultFromPiwik();
- $mail->setSubject($subject);
- $attachmentName = $subject;
-
- $this->setReplyToAsSender($mail, $report);
-
- $displaySegmentInfo = false;
- $segmentInfo = null;
- $segment = API::getSegment($report['idsegment']);
- if ($segment != null) {
- $displaySegmentInfo = true;
- $segmentInfo = Piwik::translate('ScheduledReports_SegmentAppliedToReports', $segment['name']);
- }
+ if (! self::manageEvent($reportType)) {
+ return;
+ }
- switch ($report['format']) {
- case 'html':
+ // Safeguard against sending the same report twice to the same email (unless $force is true)
+ if (!$force && $this->reportAlreadySent($report, $period)) {
+ Log::warning(
+ 'Preventing the same scheduled report from being sent again (report #%s for period "%s")',
+ $report['idreport'],
+ $prettyDate
+ );
+ return;
+ }
- // Needed when using images as attachment with cid
- $mail->setType(Zend_Mime::MULTIPART_RELATED);
- $message .= "<br/>" . Piwik::translate('ScheduledReports_PleaseFindBelow', array($periods[$report['period']], $reportTitle));
+ $periods = self::getPeriodToFrequencyAsAdjective();
+ $message = Piwik::translate('ScheduledReports_EmailHello');
+ $subject = Piwik::translate('General_Report') . ' ' . $reportTitle . " - " . $prettyDate;
- if ($displaySegmentInfo) {
- $message .= " " . $segmentInfo;
- }
+ $mail = new Mail();
+ $mail->setDefaultFromPiwik();
+ $mail->setSubject($subject);
+ $attachmentName = $subject;
- $mail->setBodyHtml($message . "<br/><br/>" . $contents);
- break;
+ $this->setReplyToAsSender($mail, $report);
- case 'csv':
- $message .= "\n" . Piwik::translate('ScheduledReports_PleaseFindAttachedFile', array($periods[$report['period']], $reportTitle));
+ $displaySegmentInfo = false;
+ $segmentInfo = null;
+ $segment = API::getSegment($report['idsegment']);
+ if ($segment != null) {
+ $displaySegmentInfo = true;
+ $segmentInfo = Piwik::translate('ScheduledReports_SegmentAppliedToReports', $segment['name']);
+ }
- if ($displaySegmentInfo) {
- $message .= " " . $segmentInfo;
- }
+ switch ($report['format']) {
+ case 'html':
- $mail->setBodyText($message);
- $mail->createAttachment(
- $contents,
- 'application/csv',
- Zend_Mime::DISPOSITION_INLINE,
- Zend_Mime::ENCODING_BASE64,
- $attachmentName . '.csv'
- );
- break;
+ // Needed when using images as attachment with cid
+ $mail->setType(Zend_Mime::MULTIPART_RELATED);
+ $message .= "<br/>" . Piwik::translate('ScheduledReports_PleaseFindBelow', array($periods[$report['period']], $reportTitle));
- default:
- case 'pdf':
- $message .= "\n" . Piwik::translate('ScheduledReports_PleaseFindAttachedFile', array($periods[$report['period']], $reportTitle));
+ if ($displaySegmentInfo) {
+ $message .= " " . $segmentInfo;
+ }
- if ($displaySegmentInfo) {
- $message .= " " . $segmentInfo;
- }
+ $mail->setBodyHtml($message . "<br/><br/>" . $contents);
+ break;
- $mail->setBodyText($message);
- $mail->createAttachment(
- $contents,
- 'application/pdf',
- Zend_Mime::DISPOSITION_INLINE,
- Zend_Mime::ENCODING_BASE64,
- $attachmentName . '.pdf'
- );
- break;
- }
+ case 'csv':
+ $message .= "\n" . Piwik::translate('ScheduledReports_PleaseFindAttachedFile', array($periods[$report['period']], $reportTitle));
- foreach ($additionalFiles as $additionalFile) {
- $fileContent = $additionalFile['content'];
- $at = $mail->createAttachment(
- $fileContent,
- $additionalFile['mimeType'],
+ if ($displaySegmentInfo) {
+ $message .= " " . $segmentInfo;
+ }
+
+ $mail->setBodyText($message);
+ $mail->createAttachment(
+ $contents,
+ 'application/csv',
Zend_Mime::DISPOSITION_INLINE,
- $additionalFile['encoding'],
- $additionalFile['filename']
+ Zend_Mime::ENCODING_BASE64,
+ $attachmentName . '.csv'
);
- $at->id = $additionalFile['cid'];
+ break;
- unset($fileContent);
- }
+ default:
+ case 'pdf':
+ $message .= "\n" . Piwik::translate('ScheduledReports_PleaseFindAttachedFile', array($periods[$report['period']], $reportTitle));
- // Get user emails and languages
- $reportParameters = $report['parameters'];
- $emails = array();
+ if ($displaySegmentInfo) {
+ $message .= " " . $segmentInfo;
+ }
- if (isset($reportParameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
- $emails = $reportParameters[self::ADDITIONAL_EMAILS_PARAMETER];
- }
+ $mail->setBodyText($message);
+ $mail->createAttachment(
+ $contents,
+ 'application/pdf',
+ Zend_Mime::DISPOSITION_INLINE,
+ Zend_Mime::ENCODING_BASE64,
+ $attachmentName . '.pdf'
+ );
+ break;
+ }
- if ($reportParameters[self::EMAIL_ME_PARAMETER] == 1) {
- if (Piwik::getCurrentUserLogin() == $report['login']) {
- $emails[] = Piwik::getCurrentUserEmail();
- } else {
- try {
- $user = APIUsersManager::getInstance()->getUser($report['login']);
- } catch (Exception $e) {
- return;
- }
- $emails[] = $user['email'];
- }
- }
+ foreach ($additionalFiles as $additionalFile) {
+ $fileContent = $additionalFile['content'];
+ $at = $mail->createAttachment(
+ $fileContent,
+ $additionalFile['mimeType'],
+ Zend_Mime::DISPOSITION_INLINE,
+ $additionalFile['encoding'],
+ $additionalFile['filename']
+ );
+ $at->id = $additionalFile['cid'];
+
+ unset($fileContent);
+ }
- foreach ($emails as $email) {
- if (empty($email)) {
- continue;
- }
- $mail->addTo($email);
+ // Get user emails and languages
+ $reportParameters = $report['parameters'];
+ $emails = array();
+
+ if (isset($reportParameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
+ $emails = $reportParameters[self::ADDITIONAL_EMAILS_PARAMETER];
+ }
+ if ($reportParameters[self::EMAIL_ME_PARAMETER] == 1) {
+ if (Piwik::getCurrentUserLogin() == $report['login']) {
+ $emails[] = Piwik::getCurrentUserEmail();
+ } else {
try {
- $mail->send();
+ $user = APIUsersManager::getInstance()->getUser($report['login']);
} catch (Exception $e) {
+ return;
+ }
+ $emails[] = $user['email'];
+ }
+ }
- // If running from piwik.php with debug, we ignore the 'email not sent' error
- if (!isset($GLOBALS['PIWIK_TRACKER_DEBUG']) || !$GLOBALS['PIWIK_TRACKER_DEBUG']) {
- throw new Exception("An error occured while sending '$filename' " .
- " to " . implode(', ', $mail->getRecipients()) .
- ". Error was '" . $e->getMessage() . "'");
- }
+ if (! $force) {
+ $this->markReportAsSent($report, $period);
+ }
+
+ foreach ($emails as $email) {
+ if (empty($email)) {
+ continue;
+ }
+ $mail->addTo($email);
+
+ try {
+ $mail->send();
+ } catch (Exception $e) {
+
+ // If running from piwik.php with debug, we ignore the 'email not sent' error
+ if (!isset($GLOBALS['PIWIK_TRACKER_DEBUG']) || !$GLOBALS['PIWIK_TRACKER_DEBUG']) {
+ throw new Exception("An error occured while sending '$filename' " .
+ " to " . implode(', ', $mail->getRecipients()) .
+ ". Error was '" . $e->getMessage() . "'");
}
- $mail->clearRecipients();
}
+ $mail->clearRecipients();
}
}
@@ -429,20 +460,22 @@ class ScheduledReports extends \Piwik\Plugin
public function getReportRecipients(&$recipients, $reportType, $report)
{
- if (self::manageEvent($reportType)) {
- $parameters = $report['parameters'];
- $eMailMe = $parameters[self::EMAIL_ME_PARAMETER];
+ if (! self::manageEvent($reportType)) {
+ return;
+ }
- if ($eMailMe) {
- $recipients[] = Piwik::getCurrentUserEmail();
- }
+ $parameters = $report['parameters'];
+ $eMailMe = $parameters[self::EMAIL_ME_PARAMETER];
- if (isset($parameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
- $additionalEMails = $parameters[self::ADDITIONAL_EMAILS_PARAMETER];
- $recipients = array_merge($recipients, $additionalEMails);
- }
- $recipients = array_filter($recipients);
+ if ($eMailMe) {
+ $recipients[] = Piwik::getCurrentUserEmail();
+ }
+
+ if (isset($parameters[self::ADDITIONAL_EMAILS_PARAMETER])) {
+ $additionalEMails = $parameters[self::ADDITIONAL_EMAILS_PARAMETER];
+ $recipients = array_merge($recipients, $additionalEMails);
}
+ $recipients = array_filter($recipients);
}
public static function template_reportParametersScheduledReports(&$out)
@@ -492,7 +525,6 @@ class ScheduledReports extends \Piwik\Plugin
}
$this->throwExceptionReportsAreUsingSegment($reportsNeedSegment);
-
}
public function segmentDeactivation($idSegment)
@@ -618,4 +650,20 @@ class ScheduledReports extends \Piwik\Plugin
}
}
}
+
+ private function reportAlreadySent($report, Period $period)
+ {
+ $key = self::OPTION_KEY_LAST_SENT_DATERANGE . $report['idreport'];
+
+ $previousDate = Option::get($key);
+
+ return $previousDate === $period->getRangeString();
+ }
+
+ private function markReportAsSent($report, Period $period)
+ {
+ $key = self::OPTION_KEY_LAST_SENT_DATERANGE . $report['idreport'];
+
+ Option::set($key, $period->getRangeString());
+ }
}
diff --git a/plugins/ScheduledReports/javascripts/pdf.js b/plugins/ScheduledReports/javascripts/pdf.js
index 59b16c9d08..da23deb4fd 100644
--- a/plugins/ScheduledReports/javascripts/pdf.js
+++ b/plugins/ScheduledReports/javascripts/pdf.js
@@ -142,6 +142,7 @@ function initManagePdf() {
var idReport = $(this).attr('idreport');
var parameters = getReportAjaxRequest(idReport, 'ScheduledReports.sendReport');
parameters.idReport = idReport;
+ parameters.force = true;
var ajaxHandler = new ajaxHelper();
ajaxHandler.addParams(parameters, 'POST');
diff --git a/plugins/ScheduledReports/tests/Integration/ApiTest.php b/plugins/ScheduledReports/tests/Integration/ApiTest.php
index 419834a0e7..be13cb2b10 100644
--- a/plugins/ScheduledReports/tests/Integration/ApiTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ApiTest.php
@@ -30,6 +30,7 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/ScheduledReports/ScheduledReports.ph
* Class Plugins_ScheduledReportsTest
*
* @group Plugins
+ * @group ScheduledReportsTest
*/
class ApiTest extends IntegrationTestCase
{
@@ -405,8 +406,8 @@ class ApiTest extends IntegrationTestCase
public function getGetReportSubjectAndReportTitleTestCases()
{
return array(
- array('Piwik.org', 'General_Website Piwik.org', 'Piwik.org', array('UserSettings_getBrowserType')),
- array('Piwik.org', 'General_Website Piwik.org', 'Piwik.org', array('MultiSites_getAll', 'UserSettings_getBrowserType')),
+ array('<Piwik.org>', '<Piwik.org>', '<Piwik.org>', array('UserSettings_getBrowserType')),
+ array('Piwik.org', 'Piwik.org', 'Piwik.org', array('MultiSites_getAll', 'UserSettings_getBrowserType')),
array('General_MultiSitesSummary', 'General_MultiSitesSummary', 'Piwik.org', array('MultiSites_getAll')),
);
}
diff --git a/plugins/SegmentEditor/API.php b/plugins/SegmentEditor/API.php
index 699ad3a4ea..c08f302e73 100644
--- a/plugins/SegmentEditor/API.php
+++ b/plugins/SegmentEditor/API.php
@@ -77,22 +77,38 @@ class API extends \Piwik\Plugin\API
protected function checkAutoArchive($autoArchive, $idSite)
{
$autoArchive = (int)$autoArchive;
- if ($autoArchive) {
- $exception = new Exception(
- "Please contact Support to make these changes on your behalf. ".
- " To update (or create) a pre-processed segment, a user must have admin access or super user access. "
- );
-
- if (empty($idSite)) {
- if (!Piwik::hasUserSuperUserAccess()) {
- throw $exception;
- }
- } else {
- if (!Piwik::isUserHasAdminAccess($idSite)) {
- throw $exception;
- }
+ if (!$autoArchive) {
+ return $autoArchive;
+ }
+
+ $exception = new Exception(
+ "Please contact Support to make these changes on your behalf. ".
+ " To modify a pre-processed segment, a user must have admin access or super user access. "
+ );
+
+ // Segment 'All websites' and pre-processed requires Super User
+ if (empty($idSite)) {
+ if (!Piwik::hasUserSuperUserAccess()) {
+ throw $exception;
}
+ return $autoArchive;
}
+
+ // if real-time segments are disabled, then allow user to create pre-processed report
+ $realTimeSegmentsDisabled = !Config::getInstance()->General['enable_create_realtime_segments'];
+ if($realTimeSegmentsDisabled) {
+ // User is at least view
+ if(!Piwik::isUserHasViewAccess($idSite)) {
+ throw $exception;
+ }
+ return $autoArchive;
+ }
+
+ // pre-processed segment for a given website requires admin access
+ if(!Piwik::isUserHasAdminAccess($idSite)) {
+ throw $exception;
+ }
+
return $autoArchive;
}
diff --git a/plugins/UserCountryMap/lang/pl.json b/plugins/UserCountryMap/lang/pl.json
index c948f51bf0..1319e7f781 100644
--- a/plugins/UserCountryMap/lang/pl.json
+++ b/plugins/UserCountryMap/lang/pl.json
@@ -10,6 +10,7 @@
"Minutes": "minut",
"None": "Brak",
"NoVisit": "Brak wizyt",
+ "RealTimeMap": "Mapa czasu rzeczywistego",
"Regions": "Regiony",
"Searches": "%s wyszukań",
"Seconds": "sekund",
diff --git a/plugins/UsersManager/API.php b/plugins/UsersManager/API.php
index 7a1c9faf7a..2281f36513 100644
--- a/plugins/UsersManager/API.php
+++ b/plugins/UsersManager/API.php
@@ -397,7 +397,12 @@ class API extends \Piwik\Plugin\API
{
Piwik::checkUserIsNotAnonymous();
- return $this->model->getUsersHavingSuperUserAccess();
+ $users = $this->model->getUsersHavingSuperUserAccess();
+ foreach($users as &$user) {
+ // remove token_auth in API response
+ unset($user['token_auth']);
+ }
+ return $users;
}
/**
diff --git a/plugins/UsersManager/Menu.php b/plugins/UsersManager/Menu.php
index 88aeb051f5..cf36392603 100644
--- a/plugins/UsersManager/Menu.php
+++ b/plugins/UsersManager/Menu.php
@@ -25,7 +25,7 @@ class Menu extends \Piwik\Plugin\Menu
public function configureUserMenu(MenuUser $menu)
{
if (!Piwik::isUserIsAnonymous()) {
- $menu->addItem('', 'General_Settings', $this->urlForAction('index'), 0);
+ $menu->addItem('', 'General_Settings', $this->urlForAction('userSettings'), 0);
}
}
}
diff --git a/plugins/UsersManager/Model.php b/plugins/UsersManager/Model.php
index 3d62ca61fd..1729d51c7d 100644
--- a/plugins/UsersManager/Model.php
+++ b/plugins/UsersManager/Model.php
@@ -190,9 +190,14 @@ class Model
);
}
+ /**
+ * Note that this returns the token_auth which is as private as the password!
+ *
+ * @return returns login, email and token_auth
+ */
public function getUsersHavingSuperUserAccess()
{
- $users = $this->getDb()->fetchAll("SELECT login, email
+ $users = $this->getDb()->fetchAll("SELECT login, email, token_auth
FROM " . Common::prefixTable("user") . "
WHERE superuser_access = 1
ORDER BY date_registered ASC");
diff --git a/plugins/UsersManager/javascripts/usersManager.js b/plugins/UsersManager/javascripts/usersManager.js
index b7e8ed04f3..51be3f8063 100644
--- a/plugins/UsersManager/javascripts/usersManager.js
+++ b/plugins/UsersManager/javascripts/usersManager.js
@@ -303,4 +303,12 @@ $(document).ready(function () {
piwik.broadcast.propagateNewPage('segment=&idSite=' + site.id, false);
}
});
+
+ // Show the token_auth
+ $('.token_auth').click(function () {
+ var token = $(this).data('token');
+ if ($(this).text() != token) {
+ $(this).text(token);
+ }
+ });
});
diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig
index d411b6e02b..f102bce7e1 100644
--- a/plugins/UsersManager/templates/index.twig
+++ b/plugins/UsersManager/templates/index.twig
@@ -135,7 +135,7 @@
<td id="password" class="editable">-</td>
<td id="email" class="editable">{{ user.email }}</td>
<td id="alias" class="editable">{{ user.alias|raw }}</td>
- <td id="token_auth">{{ user.token_auth }}</td>
+ <td id="token_auth" class="token_auth" data-token="{{ user.token_auth }}">{{ user.token_auth|slice(0, 8) }}…</td>
{% if user.last_seen is defined %}
<td id="last_seen">{% if user.last_seen is empty %}-{% else %}{{ 'General_TimeAgo'|translate(user.last_seen)|raw }}{% endif %}</td>
{% endif %}
diff --git a/plugins/VisitorGenerator b/plugins/VisitorGenerator
-Subproject 5385c1cf4f30878ddb9bc7f92fda3d1614e9779
+Subproject aea836e8702778a52a22c3453061c8066fd34cd