PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -0,0 +1,42 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException;
/**
* API for plugin CustomPiwikJs
*
* @method static \Piwik\Plugins\CustomPiwikJs\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
/**
* Detects whether plugin trackers will be automatically added to piwik.js or not. If not, the plugin tracker files
* need to be loaded manually.
* @return bool
*/
public function doesIncludePluginTrackersAutomatically()
{
Piwik::checkUserHasSomeAdminAccess();
try {
$updater = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater');
$updater->checkWillSucceed();
return true;
} catch (AccessDeniedException $e) {
return false;
} catch (\Exception $e) {
return false;
}
}
}

View File

@ -0,0 +1,66 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs\Commands;
use Piwik\Container\StaticContainer;
use Piwik\Plugin\ConsoleCommand;
use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class UpdateTracker extends ConsoleCommand
{
protected function configure()
{
$this->setName('custom-piwik-js:update');
$this->setAliases(array('custom-matomo-js:update'));
$this->addOption('source-file', null, InputOption::VALUE_REQUIRED, 'Absolute path to source PiwikJS file.', $this->getPathOriginalPiwikJs());
$this->addOption('target-file', null, InputOption::VALUE_REQUIRED, 'Absolute path to target file. Useful if your /matomo.js is not writable and you want to replace the file manually', PIWIK_DOCUMENT_ROOT . TrackerUpdater::TARGET_MATOMO_JS);
$this->addOption('ignore-minified', null, InputOption::VALUE_NONE, 'Ignore minified tracker files, useful during development so the original source file can be debugged');
$this->setDescription('Update the Javascript Tracker with plugin tracker additions');
}
private function getPathOriginalPiwikJs()
{
return PIWIK_DOCUMENT_ROOT . TrackerUpdater::ORIGINAL_PIWIK_JS;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$sourceFile = $input->getOption('source-file');
$targetFile = $input->getOption('target-file');
$ignoreMinified = (bool)$input->getOption('ignore-minified');
$this->updateTracker($sourceFile, $targetFile, $ignoreMinified);
$output->writeln('<info>The Javascript Tracker has been updated</info>');
}
public function updateTracker($sourceFile, $targetFile, $ignoreMinified)
{
$pluginTrackerFiles = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles');
if ($ignoreMinified) {
if (empty($sourceFile) || $sourceFile === $this->getPathOriginalPiwikJs()) {
// no custom source file was requested
$sourceFile = PIWIK_DOCUMENT_ROOT . TrackerUpdater::DEVELOPMENT_PIWIK_JS;
}
$pluginTrackerFiles->ignoreMinified();
}
$updater = StaticContainer::getContainer()->make('Piwik\Plugins\CustomPiwikJs\TrackerUpdater', array(
'fromFile' => $sourceFile, 'toFile' => $targetFile
));
$updater->setTrackerFiles($pluginTrackerFiles);
$updater->checkWillSucceed();
$updater->update();
}
}

View File

@ -0,0 +1,42 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs;
use Piwik\Container\StaticContainer;
use Piwik\Log;
use Piwik\Plugin;
class CustomPiwikJs extends Plugin
{
public function getListHooksRegistered()
{
return array(
'CoreUpdater.update.end' => 'updateTracker',
'CronArchive.end' => 'updateTracker',
'PluginManager.pluginActivated' => 'updateTracker',
'PluginManager.pluginDeactivated' => 'updateTracker',
'PluginManager.pluginInstalled' => 'updateTracker',
'PluginManager.pluginUninstalled' => 'updateTracker',
'Updater.componentUpdated' => 'updateTracker',
'Controller.CoreHome.checkForUpdates.end' => 'updateTracker'
);
}
public function updateTracker()
{
try {
if (Plugin\Manager::getInstance()->isPluginActivated('CustomPiwikJs')) {
$trackerUpdater = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater');
$trackerUpdater->update();
}
} catch (\Exception $e) {
Log::error('There was an error while updating the javascript tracker: ' . $e->getMessage());
}
}
}

View File

@ -0,0 +1,82 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs\Diagnostic;
use Piwik\Filechecks;
use Piwik\Filesystem;
use Piwik\Plugins\CustomPiwikJs\File;
use Piwik\Plugins\Diagnostics\Diagnostic\Diagnostic;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
use Piwik\SettingsPiwik;
use Piwik\SettingsServer;
use Piwik\Tracker\TrackerCodeGenerator;
use Piwik\Translation\Translator;
/**
* Check Piwik JS is writable
*/
class PiwikJsCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
// for users that installed matomo 3.7+ we only check for matomo.js being writable... for all other users we
// check both piwik.js and matomo.js as they can use both
$filesToCheck = array('matomo.js');
$jsCodeGenerator = new TrackerCodeGenerator();
if (SettingsPiwik::isMatomoInstalled() && $jsCodeGenerator->shouldPreferPiwikEndpoint()) {
// if matomo is not installed yet, we definitely prefer matomo.js... check for isMatomoInstalled is needed
// cause otherwise it would perform a db query before matomo DB is configured
$filesToCheck[] = 'piwik.js';
}
$notWritableFiles = array();
foreach ($filesToCheck as $fileToCheck) {
$file = new File(PIWIK_DOCUMENT_ROOT . '/' . $fileToCheck);
if (!$file->hasWriteAccess()) {
$notWritableFiles[] = $fileToCheck;
}
}
$label = $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsWritable', $this->makeFilesTitles($filesToCheck));
if (empty($notWritableFiles)) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, ''));
}
$comment = $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsNotWritable', $this->makeFilesTitles($notWritableFiles));
if (!SettingsServer::isWindows()) {
$command = '';
foreach ($notWritableFiles as $notWritableFile) {
$realpath = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/' . $notWritableFile);
$command .= "<br/><code> chmod +w $realpath<br/> chown ". Filechecks::getUserAndGroup() ." " . $realpath . "</code><br />";
}
$comment .= $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsMakeWritable', array($this->makeFilesTitles($notWritableFiles), $command));
}
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
}
private function makeFilesTitles($files)
{
return '"/'. implode('" & "/', $files) .'"';
}
}

View File

@ -0,0 +1,15 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs\Exception;
use Exception;
class AccessDeniedException extends Exception
{
}

View File

@ -0,0 +1,85 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs;
use Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException;
class File
{
/**
* @var string
*/
private $file;
public function __construct($file)
{
$this->file = $file;
}
public function checkReadable()
{
if (!$this->hasReadAccess()) {
throw new AccessDeniedException(sprintf('The file %s is not readable', $this->file));
}
}
public function checkWritable()
{
if (!$this->hasWriteAccess()) {
throw new AccessDeniedException(sprintf('The file %s is not writable', $this->file));
}
}
public function save($content)
{
if(false === file_put_contents($this->file, $content)) {
throw new AccessDeniedException(sprintf("Could not write to %s", $this->file));
}
}
public function getContent()
{
if (!$this->hasReadAccess()) {
return null;
}
return file_get_contents($this->file);
}
public function getPath()
{
return $this->file;
}
public function getName()
{
return basename($this->file);
}
/**
* @return bool
*/
public function hasWriteAccess()
{
if (file_exists($this->file) && !is_writable($this->file)) {
return false;
}
return is_writable(dirname($this->file)) || is_writable($this->file);
}
/**
* @return bool
*/
public function hasReadAccess()
{
return file_exists($this->file) && is_readable($this->file);
}
}

View File

@ -0,0 +1,25 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs;
use Piwik\Container\StaticContainer;
class Tasks extends \Piwik\Plugin\Tasks
{
public function schedule()
{
$this->hourly('updateTracker');
}
public function updateTracker()
{
$updater = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater');
$updater->update();
}
}

View File

@ -0,0 +1,160 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\Plugins\CustomPiwikJs\TrackingCode\PiwikJsManipulator;
use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
use Piwik\Piwik;
/**
* Updates the Piwik JavaScript Tracker "piwik.js" in case plugins extend the tracker.
*
* Usage:
* StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater')->update();
*/
class TrackerUpdater
{
const DEVELOPMENT_PIWIK_JS = '/js/piwik.js';
const ORIGINAL_PIWIK_JS = '/js/piwik.min.js';
const TARGET_MATOMO_JS = '/matomo.js';
/**
* @var File
*/
private $fromFile;
/**
* @var File
*/
private $toFile;
private $trackerFiles = array();
/**
* @param string|null $fromFile If null then the minified JS tracker file in /js fill be used
* @param string|null $toFile If null then the minified JS tracker will be updated.
*/
public function __construct($fromFile = null, $toFile = null)
{
if (!isset($fromFile)) {
$fromFile = PIWIK_DOCUMENT_ROOT . self::ORIGINAL_PIWIK_JS;
}
if (!isset($toFile)) {
$toFile = PIWIK_DOCUMENT_ROOT . self::TARGET_MATOMO_JS;
}
$this->setFromFile($fromFile);
$this->setToFile($toFile);
$this->trackerFiles = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles');
}
public function setFromFile($fromFile)
{
if (is_string($fromFile)) {
$fromFile = new File($fromFile);
}
$this->fromFile = $fromFile;
}
public function getFromFile()
{
return $this->fromFile;
}
public function setToFile($toFile)
{
if (is_string($toFile)) {
$toFile = new File($toFile);
}
$this->toFile = $toFile;
}
public function getToFile()
{
return $this->toFile;
}
public function setTrackerFiles(PluginTrackerFiles $trackerFiles)
{
$this->trackerFiles = $trackerFiles;
}
/**
* Checks whether the Piwik JavaScript tracker file "piwik.js" is writable.
* @throws \Exception In case the piwik.js file is not writable.
*
* @api
*/
public function checkWillSucceed()
{
$this->fromFile->checkReadable();
$this->toFile->checkWritable();
}
public function getCurrentTrackerFileContent()
{
return $this->toFile->getContent();
}
public function getUpdatedTrackerFileContent()
{
$trackingCode = new PiwikJsManipulator($this->fromFile->getContent(), $this->trackerFiles);
$newContent = $trackingCode->manipulateContent();
return $newContent;
}
/**
* Updates / re-generates the Piwik JavaScript tracker "piwik.js".
*
* It may not be possible to update the "piwik.js" tracker file if the file is not writable. It won't throw
* an exception in such a case and instead just to nothing. To check if the update would succeed, call
* {@link checkWillSucceed()}.
*
* @api
*/
public function update()
{
if (!$this->toFile->hasWriteAccess() || !$this->fromFile->hasReadAccess()) {
return;
}
$newContent = $this->getUpdatedTrackerFileContent();
if ($newContent !== $this->getCurrentTrackerFileContent()) {
$this->toFile->save($newContent);
/**
* Triggered after the tracker JavaScript content (the content of the piwik.js file) is changed.
*
* @param string $absolutePath The path to the new piwik.js file.
*/
Piwik::postEvent('CustomPiwikJs.piwikJsChanged', [$this->toFile->getPath()]);
}
// we need to make sure to sync matomo.js / piwik.js
$this->updateAlternative('piwik.js', 'matomo.js', $newContent);
$this->updateAlternative('matomo.js', 'piwik.js', $newContent);
}
private function updateAlternative($fromFile, $toFile, $newContent)
{
if (Common::stringEndsWith($this->toFile->getName(), $fromFile)) {
$alternativeFilename = dirname($this->toFile->getPath()) . DIRECTORY_SEPARATOR . $toFile;
$file = new File($alternativeFilename);
if ($file->hasWriteAccess() && $file->getContent() !== $newContent) {
$file->save($newContent);
Piwik::postEvent('CustomPiwikJs.piwikJsChanged', [$file->getPath()]);
}
}
}
}

View File

@ -0,0 +1,27 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
/**
* Used for when running Piwik tracker tests. We simply include all custom tracker files there.
*/
class JsTestPluginTrackerFiles extends PluginTrackerFiles
{
public function __construct()
{
parent::__construct();
$this->ignoreMinified = true;
}
protected function isPluginActivated($pluginName)
{
return true;
}
}

View File

@ -0,0 +1,77 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
use Piwik\Piwik;
class PiwikJsManipulator
{
const HOOK = '/*!!! pluginTrackerHook */';
/**
* @var string
*/
private $content;
/** @var PluginTrackerFiles */
private $pluginTrackerFiles;
public function __construct($content, PluginTrackerFiles $pluginTrackerFiles)
{
$this->content = $content;
$this->pluginTrackerFiles = $pluginTrackerFiles;
}
public function manipulateContent()
{
$files = $this->pluginTrackerFiles->find();
foreach ($files as $file) {
$trackerExtension = $this->getSignatureWithContent($file->getName(), $file->getContent());
// for some reasons it is /*!!! in piwik.js minified and /*!! in js/piwik.js unminified
$this->content = str_replace(array(self::HOOK, '/*!! pluginTrackerHook */'), self::HOOK . $trackerExtension, $this->content);
}
$content = $this->content;
/**
* Triggered after the Matomo JavaScript tracker has been generated and shortly before the tracker file
* is written to disk. You can listen to this event to for example automatically append some code to the JS
* tracker file.
*
* **Example**
*
* function onManipulateJsTracker (&$content) {
* $content .= "\nPiwik.DOM.onLoad(function () { console.log('loaded'); });";
* }
*
* @param string $content the generated JavaScript tracker code
*/
Piwik::postEvent('CustomMatomoJs.manipulateJsTracker', array(&$content));
$this->content = $content;
return $this->content;
}
/**
* @param string $name
* @param string $content
* @return string
*/
private function getSignatureWithContent($name, $content)
{
return sprintf(
"\n\n/* GENERATED: %s */\n%s\n/* END GENERATED: %s */\n",
$name,
$content,
$name
);
}
}

View File

@ -0,0 +1,110 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\Plugins\CustomPiwikJs\File;
class PluginTrackerFiles
{
const TRACKER_FILE = 'tracker.js';
const MIN_TRACKER_FILE = 'tracker.min.js';
/**
* @var string
*/
protected $dir;
/**
* @var Plugin\Manager
*/
private $pluginManager;
/**
* @var bool
*/
protected $ignoreMinified = false;
public function __construct()
{
$this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/';
$this->pluginManager = Plugin\Manager::getInstance();
}
public function ignoreMinified()
{
$this->ignoreMinified = true;
}
/**
* @return File[]
*/
public function find()
{
$jsFiles = array();
if (!$this->ignoreMinified) {
$trackerFiles = \_glob($this->dir . '*/' . self::MIN_TRACKER_FILE);
foreach ($trackerFiles as $trackerFile) {
$plugin = $this->getPluginNameFromFile($trackerFile);
if ($this->isPluginActivated($plugin)) {
$jsFiles[$plugin] = new File($trackerFile);
}
}
}
$trackerFiles = \_glob($this->dir . '*/' . self::TRACKER_FILE);
foreach ($trackerFiles as $trackerFile) {
$plugin = $this->getPluginNameFromFile($trackerFile);
if (!isset($jsFiles[$plugin])) {
if ($this->isPluginActivated($plugin)) {
$jsFiles[$plugin] = new File($trackerFile);
}
}
}
foreach ($jsFiles as $plugin => $file) {
if (!$this->shouldIncludeFile($plugin)) {
unset($jsFiles[$plugin]);
}
}
return $jsFiles;
}
protected function shouldIncludeFile($pluginName)
{
$shouldAddFile = true;
/**
* Detect if a custom tracker file should be added to the piwik.js tracker or not.
*
* This is useful for example if a plugin only wants to add its tracker file when the plugin is configured.
*
* @param bool &$shouldAddFile Decides whether the tracker file belonging to the given plugin should be added or not.
* @param string $pluginName The name of the plugin this file belongs to
*/
Piwik::postEvent('CustomPiwikJs.shouldAddTrackerFile', array(&$shouldAddFile, $pluginName));
return $shouldAddFile;
}
protected function isPluginActivated($pluginName)
{
return $this->pluginManager->isPluginActivated($pluginName);
}
protected function getPluginNameFromFile($file)
{
$file = str_replace(array($this->dir, self::TRACKER_FILE, self::MIN_TRACKER_FILE), '', $file);
return trim($file, '/');
}
}

View File

@ -0,0 +1,7 @@
<?php
return array(
'diagnostics.optional' => DI\add(array(
DI\get('Piwik\Plugins\CustomPiwikJs\Diagnostic\PiwikJsCheck'),
)),
);

View File

@ -0,0 +1,7 @@
{
"CustomPiwikJs": {
"PluginDescription": "Umožňuje libovolnému zásuvnému modulu rozšířit javascriptový sledovací soubor (piwik.js) o nové funkce a měření webových stránek.",
"DiagnosticPiwikJsWritable": "Zapisovatelný JavaScript záznam (\"\/piwik.js\")",
"DiagnosticPiwikJsMakeWritable": "Doporučujeme povolit zápis do piwik.js například pomocí příkazu: %s"
}
}

View File

@ -0,0 +1,6 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "JavaScript-sporingsfiler (%s) skrivbare",
"DiagnosticPiwikJsMakeWritable": "Vi anbefaler at gøre %1$s skrivbare ved at køre denne kommando: %2$s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Ermöglicht es jedem Plugin, die Matomo-JavaScript-Tracking-Datei (matomo.js) zu erweitern und neue Funktionalitäts- und Website-Messfunktionen hinzuzufügen.",
"DiagnosticPiwikJsWritable": "Schreibbarer JavaScript-Tracker (%s)",
"DiagnosticPiwikJsNotWritable": "Für die Matomo JavaScript-Tracker-Datei %s sind keine Schreibrechte vorhanden , das bedeutet, dass andere Plugins den JavaScript-Tracker nicht erweitern können. In Zukunft könnten sogar einige Kernfunktionen nicht wie erwartet funktionieren.",
"DiagnosticPiwikJsMakeWritable": "Wir empfehlen, %1$sbeschreibbar zu machen, indem Sie folgenden Befehl ausführen: %2$s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Επιτρέπει σε οποιοδήποτε πρόσθετο να επεκτείνει το αρχείο ιχνηλάτησης σε JavaScript του Matomo (matomo.js) και να προσθέτει νέα λειτουργικότητα και δυνατότητες μετρήσεων των ιστοτόπων.",
"DiagnosticPiwikJsWritable": "Εγγράψιμο Αρχείο Ιχνηλάτησης JavaScript (%s)",
"DiagnosticPiwikJsNotWritable": "Το αρχείο ιχνηλάτησης της JavaScript του Matomo %s δεν είναι εγγράψιμο, που σημαίνει ότι άλλα πρόσθετα δεν μπορούν να επεκτείνουν την ιχνηλάτηση. Μελλοντικά ενδέχεται ορισμένα χαρακτηριστικά του πυρήνα να μην λειτουργούν όπως πρέπει.",
"DiagnosticPiwikJsMakeWritable": "Προτείνουμε να κάνετε το %1$s εγγράψιμο με εκτέλεση της εντολής: %2$s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Allows any plugin to extend the Matomo JavaScript Tracking file (matomo.js) and add new functionality and website measurement capabilities.",
"DiagnosticPiwikJsWritable": "Writable JavaScript Tracker (%s)",
"DiagnosticPiwikJsNotWritable": "The Matomo JavaScript tracker file %s is not writable which means other plugins cannot extend the JavaScript tracker. In the future even some core features might not work as expected. ",
"DiagnosticPiwikJsMakeWritable": "We recommend to make %1$s writable by running this command: %2$s"
}
}

View File

@ -0,0 +1,7 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "Skribebla Sekvanta JavaSkripto (%s)",
"DiagnosticPiwikJsNotWritable": "La JavaSkriptan sekvanta dosiero %sne stas skriblebla. Pro tio aliaj kromprogramoj ne povas etendi la JavaSkriptan sekvanto. Estontece eĉ kelkaj kernaj funkcioj povus ne funkcii kiel atendite.",
"DiagnosticPiwikJsMakeWritable": "Ni rekomendas fari %1$sskribebla per funkciado de ĉi tiu komando: %2$s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Permite a cualquier módulo ampliar el archivo de seguimiento Javascript Matomo (matomo.js) y agregar nuevas funcionalidades y capacidades de medición de desempeño a un sitio web.",
"DiagnosticPiwikJsWritable": "Archivo de seguimiento Javascript con permiso de escritura (%s)",
"DiagnosticPiwikJsNotWritable": "El archivo Javascript de seguimiento Matomo %s no posee permisos de escritura, lo que significa que los otros módulos no pueden enriquecerlo. Más aun, en un futuro, algunas funciones básicas podrían no funcionar como debieran.",
"DiagnosticPiwikJsMakeWritable": "Recomendamos que %1$s posea permisos de escritura simplemente ejecutando este comando: %2$s"
}
}

View File

@ -0,0 +1,5 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "Kirjoitettava Javascript-seuranta (\"\/piwik.js\")"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Autorise n'importe quel composant à mettre à jour le fichier de suivi Matomo (matomo.js) et à ajouter de nouvelles fonctionnalités ainsi que des capacités de suivi de site web.",
"DiagnosticPiwikJsWritable": "Traceur JavaScript inscriptible (%s)",
"DiagnosticPiwikJsNotWritable": "Le fichier traceur JavaScript Matomo %sinscriptible ce qui veut dit que d'autres composants ne peuvent pas le modifier. Dans le futur il se pourrait même que certaines fonctionnalités principales ne fonctionnent pas comme prévu.",
"DiagnosticPiwikJsMakeWritable": "Nous recommandons de rendre %1$s inscriptible en exécutant la commande suivante : %2$s"
}
}

View File

@ -0,0 +1,5 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "Pelacak JavaScript yang Dapat Ditulis (\"\/piwik.js\")"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Consente a qualsiasi plug-in di estendere il file di tracking JavaScript di Matomo (matomo.js) e di aggiungere nuove funzionalità e capacità di misurazione del sito web.",
"DiagnosticPiwikJsWritable": "JavaScript Tracker scrivibile (%s)",
"DiagnosticPiwikJsNotWritable": "Il file tracker JavaScript di Matomo %s non è scrivibile, il che significa che altri plugin non possono estendere il tracker JavaScript. In futuro anche alcune funzionalità di base potrebbero non funzionare come previsto.",
"DiagnosticPiwikJsMakeWritable": "Ci raccomandiamo di rendere scrivibile %1$s eseguendo questo comando: %2$s"
}
}

View File

@ -0,0 +1,7 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "書き込み可能な JavaScript トラッカー(%s",
"DiagnosticPiwikJsNotWritable": "Matomo JavaScriptトラッカーファイル %s は書き込み可能ではありません。これは、他のプラグインが JavaScriptトラッカー を拡張できないことを意味します。 将来的には、一部のコア機能も期待どおりに機能しない可能性があります。",
"DiagnosticPiwikJsMakeWritable": "次のコマンドを実行して、%1$s を書き込み可能にすることを推奨します。: %2$s"
}
}

View File

@ -0,0 +1,6 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "Skrivbar JavaScript-tracker (\"\/piwik.js\")",
"DiagnosticPiwikJsMakeWritable": "Vi anbefaler å gjøre piwik.js skrivbar ved å kjøre denne kommandoen: %s"
}
}

View File

@ -0,0 +1,6 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "Schrijfbare JavaScript-tracker (\"\/piwik.js\")",
"DiagnosticPiwikJsMakeWritable": "We adviseren piwik.js beschrijfbaar te maken door het uitvoeren van het volgende commando: %s"
}
}

View File

@ -0,0 +1,5 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "Zapisywalny Traker JavaScript (%s)"
}
}

View File

@ -0,0 +1,7 @@
{
"CustomPiwikJs": {
"DiagnosticPiwikJsWritable": "Permissões de escrita no JavaScript de acompanhamento (%s)",
"DiagnosticPiwikJsNotWritable": "O ficheiro JavaScript de acompanhamento do Matomo %snão tem permissões de escrita, o que significa que outras extensões não conseguem complementar o tracker JavaScript. É possível que no futuro certas funcionalidades centrais não funcionem como o esperado.",
"DiagnosticPiwikJsMakeWritable": "Recomendamos que dê permissões de escrita a %1$s, executando o seguinte comando %2$s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Разрешить любому плагину дополнять JavaScript-код отслеживания Matomo (matomo.js), добавляя новую функциональность и расширяя возможности мониторинга сайтов.",
"DiagnosticPiwikJsWritable": "Записываемый JavaScript Tracker (%s)",
"DiagnosticPiwikJsNotWritable": "Файл трекера JavaScript Matomo %s недоступен для записи, это означает, что другие плагины не могут расширять трекер JavaScript. В будущем даже некоторые основные функции могут работать не так, как ожидалось.",
"DiagnosticPiwikJsMakeWritable": "Мы рекомендуем сделать %1$s доступным для записи, выполнив эту команду: %2$s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "I lejon cilësdo shtojcë të zgjerojë kartelën Matomo JavaScript Tracking (matomo.js) dhe të shtojë aftësi të reja funksionimi dhe matjesh në sajt.",
"DiagnosticPiwikJsWritable": "Ndjekës JavaScript i Shkrueshëm (%s)",
"DiagnosticPiwikJsNotWritable": "Kartela e ndjekësit JavaScript të Matomo-s %s sështë e shkrueshme, çka do të thotë se shtojcat e tjera smund ta zgjerojnë ndjekësin JavaScript. Në të ardhmen mund të mos punojnë siç pritet madje edhe disa veçori bazë.",
"DiagnosticPiwikJsMakeWritable": "Këshillojmë bërjen e %1$s të shkrueshme, duke xhiruar urdhrin: %2$s"
}
}

View File

@ -0,0 +1,7 @@
{
"CustomPiwikJs": {
"PluginDescription": "Omogućuje bilo kom Matomo dodatku da proširi Matomo JavaScript datoteku za praćenje (piwik.js) i doda nove funkcionalnosti i mogućnosti za praćenje sajtova.",
"DiagnosticPiwikJsWritable": "JavaScript treker u koji je moguće pisati (\"\/piwik.js\")",
"DiagnosticPiwikJsMakeWritable": "Predlažemo da omogućite pisanje u piwik.js sledećom komandom: %s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Låter alla plugins utöka Matomos trackfil (piwik.js) med ny funktionalitet och webbplatsmätningsmöjligheter.",
"DiagnosticPiwikJsWritable": "Skrivbar javskript-tracker (\"\/piwik.js\")",
"DiagnosticPiwikJsNotWritable": "Matomos JavaScriptsbaserade spårningsfil \"\/piwik.js\" har inte skrivrättighet vilket innebär att andra plugins inte kan utöka den. Det är möjligt att framtida funktionalitet i Matomo inte fungerar som förväntat.",
"DiagnosticPiwikJsMakeWritable": "Vi rekommenderar att göra piwik.js skrivbar genom att köra detta kommando: %s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Matomo JavaScript İzleme dosyasına (matomo.js) tüm uygulama eklerinin katkıda bulunmasını sağlayarak yeni özellik ve web sitesi ölçüm yetenekleri ekler.",
"DiagnosticPiwikJsWritable": "Yazılabilir JavaScript İzleyici (%s)",
"DiagnosticPiwikJsNotWritable": "%s Matomo JavaScript izleyici dosyası yazılabilir olmadığından diğer uygulama ekleri JavaScript İzleyiciyi kullanamaz. İleride bazı temel özellikler de beklendiği gibi çalışmayabilir.",
"DiagnosticPiwikJsMakeWritable": "Şu komutu kullanarak %1$s dosyasını yazılabilir yapmanız önerilir: %2$s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "Дозволяє будь-якому плагіну розширювати Matomo JavaScript код відстеження (piwik.js) і додавати нові можливості функціонування та можливості вимірювання веб-сайту.",
"DiagnosticPiwikJsWritable": "Доступний для запису JavaScript трекер (\"\/piwik.js\")",
"DiagnosticPiwikJsNotWritable": "Відстеження файлів Matomo через JavaScript \"\/piwik.js\" не підлягає запису, це означає, що інші плагіни не можуть розширити трекер JavaScript. Надалі навіть деякі основні функції можуть не працювати, як очікується.",
"DiagnosticPiwikJsMakeWritable": "Ми рекомендуємо piwik.js зробити доступним для запису, виконавши команду: %s"
}
}

View File

@ -0,0 +1,7 @@
{
"CustomPiwikJs": {
"PluginDescription": "允许任意插件扩展 Matomo Javascript 追踪文件piwik.js并添加新的功能及网站测度能力。",
"DiagnosticPiwikJsWritable": "可写的 Javascript 追踪器(“\/piwik.js”",
"DiagnosticPiwikJsMakeWritable": "我们建议通过运行这条命令来使 Piwki.js 文件可写:%s"
}
}

View File

@ -0,0 +1,8 @@
{
"CustomPiwikJs": {
"PluginDescription": "允許任何外掛擴展 Matomo JavaScript 追蹤檔案piwik.js來增加新功能和網站追蹤能力。",
"DiagnosticPiwikJsWritable": "JavaScript 追蹤檔案可寫入(%s",
"DiagnosticPiwikJsNotWritable": "Matomo 的 JavaScript 追蹤檔案 %s 無法寫入,這代表其他外掛無法擴展 JavaScript 追蹤功能。未來甚至有些核心功能會無法正常運作。",
"DiagnosticPiwikJsMakeWritable": "我們推薦讓它%1$s可寫入請執行此指令%2$s"
}
}