Skip to content

Commit

Permalink
Merge branch '4.x-dev' into m-16459-heartbeat-trigger
Browse files Browse the repository at this point in the history
  • Loading branch information
Peter Zhang committed Sep 21, 2021
2 parents dfcaad6 + 85d46c8 commit 84a8cd3
Show file tree
Hide file tree
Showing 25 changed files with 270 additions and 182 deletions.
12 changes: 6 additions & 6 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions config/global.ini.php
Expand Up @@ -835,6 +835,10 @@
; If set to 1, when rearchiving reports in the past we do not rearchive segment data with those reports. Default is 0.
rearchive_reports_in_past_exclude_segments = 0

; If set to 1, then social and search engine definitions files will be synchronised using the internet if "enable_internet_features" is enabled.
; When set to 0, the definitions will be loaded from the local definitions (updated with core).
enable_referrer_definition_syncs = 1

[Tracker]

; When enabled and a userId is set, then the visitorId will be automatically set based on the userId. This allows to
Expand Down
13 changes: 11 additions & 2 deletions core/Db.php
Expand Up @@ -420,7 +420,7 @@ public static function deleteAllRows($table, $where, $orderBy, $maxRowsPerQuery
* @param string|array $tables The name of the table to optimize or an array of tables to optimize.
* Table names must be prefixed (see {@link Piwik\Common::prefixTable()}).
* @param bool $force If true, the `OPTIMIZE TABLE` query will be run even if InnoDB tables are being used.
* @return \Zend_Db_Statement
* @return bool
*/
public static function optimizeTables($tables, $force = false)
{
Expand Down Expand Up @@ -461,7 +461,16 @@ public static function optimizeTables($tables, $force = false)
}

// optimize the tables
return self::query("OPTIMIZE TABLE " . implode(',', $tables));
$success = true;
foreach ($tables as &$t) {
$ok = self::query('OPTIMIZE TABLE ' . $t);
if (!$ok) {
$success = false;
}
}

return $success;

}

private static function getTableStatus()
Expand Down
114 changes: 57 additions & 57 deletions lang/el.json

Large diffs are not rendered by default.

Expand Up @@ -263,6 +263,7 @@
<row>Safari</row>
<row>Safe Exam Browser</row>
<row>SalamWeb</row>
<row>Secure Browser</row>
<row>SFive</row>
<row>Shiira</row>
<row>SimpleBrowser</row>
Expand All @@ -272,6 +273,7 @@
<row>Sleipnir</row>
<row>Slimjet</row>
<row>SP Browser</row>
<row>Stampy Browser</row>
<row>7Star</row>
<row>Smart Lenovo Browser</row>
<row>Smooz</row>
Expand Down
Expand Up @@ -3,7 +3,7 @@
<row>AIX</row>
<row>Android</row>
<row>AmigaOS</row>
<row>Apple TV</row>
<row>tvOS</row>
<row>Arch Linux</row>
<row>BackTrack</row>
<row>Bada</row>
Expand Down Expand Up @@ -31,6 +31,8 @@
<row>Google TV</row>
<row>HP-UX</row>
<row>Haiku OS</row>
<row>iPadOS</row>
<row>HarmonyOS</row>
<row>HasCodingOS</row>
<row>IRIX</row>
<row>Inferno</row>
Expand Down
8 changes: 4 additions & 4 deletions plugins/CoreAdminHome/lang/de.json
Expand Up @@ -27,19 +27,19 @@
"ImageTracking": "Tracking mithilfe eines Bildes",
"ImageTrackingIntro1": "Für den Fall, dass ein Besucher JavaScript deaktiviert hat, oder JavaScript nicht verwendet werden kann, können Sie das Tracking mithilfe eines Bildes nutzen um Besucher zu tracken.",
"ImageTrackingIntro2": "Generieren Sie den Link unten und kopieren Sie den generierten HTML-Code in Ihre Seite. Sollten Sie dies als Fallback für das JavaScript Tracking verwenden, umschließen sie es mit einem %1$s Tag.",
"ImageTrackingIntro3": "Eine vollständige Liste an Möglichkeiten, die Ihnen das Tracking mit einem Bild bietet, finden Sie in der %1$sTracking API Dokumentation%2$s",
"ImageTrackingIntro3": "Eine vollständige Liste an Möglichkeiten, die Ihnen das Tracking mit einem Bild bietet, finden Sie in der %1$sTracking API Dokumentation%2$s.",
"ImageTrackingLink": "Link zum Tracking mithilfe eines Bildes",
"ImportFromGoogleAnalytics": "Von Google Analytics importieren",
"ImportFromGoogleAnalyticsDescription": "Wenn Sie über ein Google Analytics-Konto verfügen und zu Matomo wechseln, können Sie Ihre vorhandenen Daten mithilfe des %1$sGoogleAnalyticsImporter-Plugins%2$s importieren.",
"ImportingServerLogs": "Server Log-Dateien importieren",
"ImportingServerLogsDesc": "Eine Alternative zum Tracken der Besucher im Browser (entweder mit JavaScript oder mit einem Bild-Link) ist der kontinuierliche Import von Server Logdateien. Erfahren Sie mehr über %1$sServer Logdatei Analyse%2$s",
"InvalidPluginsWarning": "Folgende Plugins sind nicht kompatibel mit %1$s und konnten nicht geladen werden: %2$s",
"ImportingServerLogsDesc": "Eine Alternative zum Tracken der Besucher im Browser (entweder mit JavaScript oder mit einem Bild-Link) ist der kontinuierliche Import von Server Logdateien. Erfahren Sie mehr über %1$sServer Logdatei Analyse%2$s.",
"InvalidPluginsWarning": "Folgende Plugins sind nicht kompatibel mit %1$s und konnten nicht geladen werden: %2$s.",
"InvalidPluginsYouCanUninstall": "Sie können diese Plugins auf der %1$sPlugins verwalten%2$s Seite aktualisieren oder deinstallieren.",
"JSTrackingIntro1": "Es gibt viele verschiedene Möglichkeiten, Besucher Ihrer Webseite zu tracken. Die empfohlene Art und Weise dies zu tun, ist die Verwendung von JavaScript. Um diese Methode zu nutzen, müssen Sie sicher stellen, dass auf jeder Seite Ihrer Webseite der entsprechende JavaScript-Code eingebunden ist. Diesen können Sie hier generieren.",
"JSTrackingIntro2": "Sobald Sie den JavaScript Tracking Code für Ihre Webseite haben, fügen Sie ihn auf allen Seiten ein, die Sie mit Matomo überwachen möchten.",
"JSTrackingIntro3a": "Für die meisten Webseiten, Blogs, CMS usw. können Sie ein Plugin verwenden, das die Implementierung für Sie erledigt. (Siehe unsere %1$sListe der zur Integration von Matomo vorhandenen Plugins%2$s.)",
"JSTrackingIntro3b": "Wenn kein Plugin vorhanden ist, können Sie Ihre Webseitenvorlagen bearbeiten und den JavaScript-Tracking-Code zum &lt;/head&gt; Tag hinzufügen, welcher häufig in einer 'header.php', 'header.tpl' oder einer ähnlichen Vorlagendatei definiert ist.",
"JSTrackingIntro4": "Falls Sie kein JavaScript nutzen möchten um Ihre Besucher zu tracken, %1$sgenerieren Sie einen Link zum Tracking mithilfe eines Bildes unterhalb.%2$s",
"JSTrackingIntro4": "Falls Sie kein JavaScript nutzen möchten um Ihre Besucher zu tracken, %1$sgenerieren Sie einen Link zum Tracking mithilfe eines Bildes unterhalb%2$s.",
"JSTrackingIntro5": "Sollte Sie mehr als nur Seitenaufrufe aufzeichnen wollen, werfen Sie einen Blick in die %1$sMatomo Javascript Tracking Dokumentation%2$s für eine Liste an verfügbaren Funktionen. Mit der Verwendung dieser Funktionen können Sie Ziele, benutzerdefinierte Variablen, Ecommerce Bestellungen, verlassene Warenkörbe und mehr aufzeichnen.",
"JSTracking_CampaignKwdParam": "Kampagnen Suchbegriff Parameter",
"JSTracking_CampaignNameParam": "Parameter für Kampagnenname",
Expand Down
3 changes: 3 additions & 0 deletions plugins/CoreAdminHome/lang/nb.json
Expand Up @@ -84,8 +84,11 @@
"UseCustomLogo": "Bruk din egen logo",
"ValidPiwikHostname": "Gyldig Matomo-vertsnavn",
"WithOptionalRevenue": "med valgfri inntjening",
"YouAreNotOptedOut": "Du har ikke meldt deg ut.",
"YouAreOptedOut": "Du deltar ikke i analysegrunnlaget.",
"YouMayOptOut": "Du kan velge å ikke få tildelt en unik ID for nettanalyse på din datamaskin, slik at din aktivitet ikke spores på dette nettstedet.",
"YouMayOptOut2": "Du kan velge å forhindre at dette nettstedet samler og analyserer handlingene du gjør her.",
"YouMayOptOut3": "Dette vil beskytte personvernet ditt, men vil også forhindre at eieren lærer av handlingene dine og skaper en bedre opplevelse for deg og andre brukere.",
"YouMayOptOutBis": "Hvis du ønsker at din aktivitet ikke lagres, klikk under for å motta en blank informasjonskapsel, så vil du unngå å bli registrert."
}
}
2 changes: 1 addition & 1 deletion plugins/CustomAlerts
2 changes: 1 addition & 1 deletion plugins/DeviceDetectorCache
25 changes: 17 additions & 8 deletions plugins/DevicesDetection/functions.php
Expand Up @@ -37,6 +37,9 @@ function getBrowserFamilyFullName($label)
function getBrowserFamilyLogo($label)
{
$browserFamilies = BrowserParser::getAvailableBrowserFamilies();
if (!empty($label) && in_array($label, BrowserParser::getAvailableBrowsers())) {
return getBrowserLogo($label);
}
if (!empty($label) && array_key_exists($label, $browserFamilies)) {
return getBrowserLogo($browserFamilies[$label][0]);
}
Expand Down Expand Up @@ -97,22 +100,28 @@ function getBrowserLogo($short)
}
}

if (empty($short)) {
return sprintf($path, 'UNK');
}

$family = getBrowserFamilyFullName($short);

$browserFamilies = BrowserParser::getAvailableBrowserFamilies();

if (!empty($short) &&
array_key_exists($short, BrowserParser::getAvailableBrowsers()) &&
if (array_key_exists($short, BrowserParser::getAvailableBrowsers()) &&
file_exists(PIWIK_INCLUDE_PATH.'/'.sprintf($path, $short))) {

return sprintf($path, $short);
}

} elseif (!empty($short) &&
array_key_exists($family, $browserFamilies) &&
file_exists(PIWIK_INCLUDE_PATH.'/'.sprintf($path, $browserFamilies[$family][0]))) {

return sprintf($path, $browserFamilies[$family][0]);
if (array_key_exists($family, $browserFamilies)) {
foreach ($browserFamilies[$family] as $browserShort) {
if (file_exists(PIWIK_INCLUDE_PATH.'/'.sprintf($path, $browserShort))) {
return sprintf($path, $browserShort);
}
}
}

return sprintf($path, 'UNK');
}

Expand Down Expand Up @@ -212,7 +221,7 @@ function getDeviceTypeLogo($label)
function getModelName($label)
{
if (strpos($label, ';') !== false) {
list($brand, $model) = explode(';', $label, 2);
[$brand, $model] = explode(';', $label, 2);
} else {
$brand = null;
$model = $label;
Expand Down
6 changes: 3 additions & 3 deletions plugins/MobileAppMeasurable/lang/zh-tw.json
@@ -1,7 +1,7 @@
{
"MobileAppMeasurable": {
"MobileApp": "行動應用程式",
"MobileApps": "行動應用程式",
"MobileAppDescription": "一個原生的 iOS、Android 或其他行動作業系統的行動應用程式。"
"MobileAppDescription": "一個原生的移动应用,适配 iOS、Android 或其他移动操作系统。",
"MobileApps": "行動應用程式"
}
}
}
3 changes: 2 additions & 1 deletion plugins/MultiSites/lang/zh-tw.json
@@ -1,8 +1,9 @@
{
"MultiSites": {
"AllWebsitesDashboardDocumentation": "此报表提供你每个网站的信息预览,包括关于访客的最常用指标。",
"Evolution": "發展趨勢",
"LoadingWebsites": "網站載入中",
"PluginDescription": "在這個方便的「所有網站」展示板中查看並比較你所有的網站和應用程式。",
"TopLinkTooltip": "比較你所有網站的網頁分析統計。"
}
}
}
3 changes: 2 additions & 1 deletion plugins/Overlay/lang/pt.json
Expand Up @@ -3,6 +3,7 @@
"Clicks": "%s cliques",
"ClicksFromXLinks": "%1$s cliques de uma destas %2$s ligações",
"Domain": "Domínio",
"ErrorNoSiteUrls": "ATENÇÃO: este site não tem URLs de sites definidos na Matomo. Isso pode fazer com que a Overlay e outras características se quebrem ou se comportem de forma estranha. Para corrigi-lo, adicione um URL nas configurações para este site na secção Administração Matomo.",
"ErrorNotLoading": "A sessão de Sobreposição na página ainda não pode ser lançada.",
"ErrorNotLoadingDetails": "Talvez a página carregada à direita não tem o código de acompanhamento do Matomo. Neste caso, tente executar a Sobreposição para um página diferente no relatório de páginas.",
"ErrorNotLoadingDetailsSSL": "Se estiver a utilizar o Matomo sob https, o motivo mais comum é que o seu site não suporta SSL. Tente utilizar o Matomo sob http.",
Expand All @@ -18,4 +19,4 @@
"RedirectUrlErrorAdmin": "Pode adicionar o domínio como um endereço adicional %1$snas definições%2$s.",
"RedirectUrlErrorUser": "Peça ao seu administrador para adicionar o domínio como um endereço adicional."
}
}
}
39 changes: 31 additions & 8 deletions plugins/Referrers/SearchEngine.php
Expand Up @@ -10,6 +10,7 @@

use Piwik\Cache;
use Piwik\Common;
use Piwik\Config;
use Piwik\Option;
use Piwik\Piwik;
use Piwik\SettingsPiwik;
Expand Down Expand Up @@ -51,16 +52,12 @@ public function getDefinitions()
private function loadDefinitions()
{
if (empty($this->definitionList)) {
// Read first from the auto-updated list in database
$list = Option::get(self::OPTION_STORAGE_NAME);
$referrerDefinitionSyncOpt = Config::getInstance()->General['enable_referrer_definition_syncs'];

if ($list && SettingsPiwik::isInternetEnabled()) {
$this->definitionList = Common::safe_unserialize(base64_decode($list));
if( $referrerDefinitionSyncOpt == 1) {
$this->loadRemoteDefinitions();
} else {
// Fallback to reading the bundled list
$yml = file_get_contents(PIWIK_INCLUDE_PATH . self::DEFINITION_FILE);
$this->definitionList = $this->loadYmlData($yml);
Option::set(self::OPTION_STORAGE_NAME, base64_encode(serialize($this->definitionList)));
$this->loadLocalYmlData();
}
}

Expand All @@ -69,6 +66,32 @@ private function loadDefinitions()
return $this->definitionList;
}

/**
* Loads definitions sourced from remote yaml with a local fallback
*/
private function loadRemoteDefinitions()
{
// Read first from the auto-updated list in database
$list = Option::get(self::OPTION_STORAGE_NAME);

if ($list && SettingsPiwik::isInternetEnabled()) {
$this->definitionList = Common::safe_unserialize(base64_decode($list));
} else {
// Fallback to reading the bundled list
$this->loadLocalYmlData();
Option::set(self::OPTION_STORAGE_NAME, base64_encode(serialize($this->definitionList)));
}
}

/**
* Loads the definition data from the local definitions file
*/
private function loadLocalYmlData()
{
$yml = file_get_contents(PIWIK_INCLUDE_PATH . self::DEFINITION_FILE);
$this->definitionList = $this->loadYmlData($yml);
}

/**
* Parses the given YML string and caches the resulting definitions
*
Expand Down
39 changes: 31 additions & 8 deletions plugins/Referrers/Social.php
Expand Up @@ -9,6 +9,7 @@
namespace Piwik\Plugins\Referrers;
use Piwik\Cache;
use Piwik\Common;
use Piwik\Config;
use Piwik\Option;
use Piwik\Piwik;
use Piwik\SettingsPiwik;
Expand Down Expand Up @@ -49,16 +50,12 @@ public function getDefinitions()
private function loadDefinitions()
{
if ($this->definitionList === null) {
// Read first from the auto-updated list in database
$list = Option::get(self::OPTION_STORAGE_NAME);
$referrerDefinitionSyncOpt = Config::getInstance()->General['enable_referrer_definition_syncs'];

if ($list && SettingsPiwik::isInternetEnabled()) {
$this->definitionList = Common::safe_unserialize(base64_decode($list));
if( $referrerDefinitionSyncOpt == 1) {
$this->loadRemoteDefinitions();
} else {
// Fallback to reading the bundled list
$yml = file_get_contents(PIWIK_INCLUDE_PATH . self::DEFINITION_FILE);
$this->definitionList = $this->loadYmlData($yml);
Option::set(self::OPTION_STORAGE_NAME, base64_encode(serialize($this->definitionList)));
$this->loadLocalYmlData();
}
}

Expand All @@ -67,6 +64,32 @@ private function loadDefinitions()
return $this->definitionList;
}

/**
* Loads definitions sourced from remote yaml with a local fallback
*/
private function loadRemoteDefinitions()
{
// Read first from the auto-updated list in database
$list = Option::get(self::OPTION_STORAGE_NAME);

if ($list && SettingsPiwik::isInternetEnabled()) {
$this->definitionList = Common::safe_unserialize(base64_decode($list));
} else {
// Fallback to reading the bundled list
$this->loadLocalYmlData();
Option::set(self::OPTION_STORAGE_NAME, base64_encode(serialize($this->definitionList)));
}
}

/**
* Loads the definition data from the local definitions file
*/
private function loadLocalYmlData()
{
$yml = file_get_contents(PIWIK_INCLUDE_PATH . self::DEFINITION_FILE);
$this->definitionList = $this->loadYmlData($yml);
}

/**
* Parses the given YML string and caches the resulting definitions
*
Expand Down
4 changes: 3 additions & 1 deletion plugins/Referrers/Tasks.php
Expand Up @@ -9,6 +9,7 @@
namespace Piwik\Plugins\Referrers;


use Piwik\Config;
use Piwik\Http;
use Piwik\Option;
use Piwik\SettingsPiwik;
Expand All @@ -17,7 +18,8 @@ class Tasks extends \Piwik\Plugin\Tasks
{
public function schedule()
{
if(SettingsPiwik::isInternetEnabled() === true){
if(SettingsPiwik::isInternetEnabled() === true &&
Config::getInstance()->General['enable_referrer_definition_syncs'] == 1){
$this->weekly('updateSearchEngines');
$this->weekly('updateSocials');
}
Expand Down
2 changes: 1 addition & 1 deletion plugins/Referrers/lang/de.json
Expand Up @@ -34,7 +34,7 @@
"DistinctCampaigns": "verschiedene Kampagnen",
"DistinctKeywords": "verschiedene Suchbegriffe",
"DistinctSearchEngines": "verschiedene Suchmaschinen",
"DistinctSocialNetworks": "ausgeprägt soziale Netzwerke",
"DistinctSocialNetworks": "verschiedene soziale Netzwerke",
"DistinctWebsiteUrls": "verschiedene Webseiten URLs",
"DistinctWebsites": "verschiedene Websites",
"EcommerceLogSubcategoryHelp1": "Das Ecommerce Log enthält detaillierte sessionbezogene Daten, so dass Sie die komplette Session jedes Benutzers nachverfolgen können, der einen Kauf getätigt oder abgebrochen hat. Dies kann helfen zu verstehen was Benutzer machen, bevor und nachdem Sie etwas kaufen, für die Verkaufsmöglichkeitenoptimierung.",
Expand Down

0 comments on commit 84a8cd3

Please sign in to comment.