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,250 @@
<?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\PrivacyManager;
use Piwik\Piwik;
use Piwik\Config as PiwikConfig;
use Piwik\Plugins\PrivacyManager\Model\DataSubjects;
use Piwik\Plugins\PrivacyManager\Dao\LogDataAnonymizer;
use Piwik\Plugins\PrivacyManager\Model\LogDataAnonymizations;
use Piwik\Plugins\PrivacyManager\Validators\VisitsDataSubject;
use Piwik\Site;
use Piwik\Validators\BaseValidator;
/**
* API for plugin PrivacyManager
*
* @method static \Piwik\Plugins\PrivacyManager\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
/**
* @var DataSubjects
*/
private $gdpr;
/**
* @var LogDataAnonymizations
*/
private $logDataAnonymizations;
/**
* @var LogDataAnonymizer
*/
private $logDataAnonymizer;
public function __construct(DataSubjects $gdpr, LogDataAnonymizations $logDataAnonymizations, LogDataAnonymizer $logDataAnonymizer)
{
$this->gdpr = $gdpr;
$this->logDataAnonymizations = $logDataAnonymizations;
$this->logDataAnonymizer = $logDataAnonymizer;
}
private function checkDataSubjectVisits($visits)
{
BaseValidator::check('visits', $visits, [new VisitsDataSubject()]);
$idSites = array();
foreach ($visits as $index => $visit) {
$idSites[] = $visit['idsite'];
}
Piwik::checkUserHasAdminAccess($idSites);
}
public function deleteDataSubjects($visits)
{
Piwik::checkUserHasSomeAdminAccess();
$this->checkDataSubjectVisits($visits);
return $this->gdpr->deleteDataSubjects($visits);
}
public function exportDataSubjects($visits)
{
Piwik::checkUserHasSomeAdminAccess();
$this->checkDataSubjectVisits($visits);
return $this->gdpr->exportDataSubjects($visits);
}
public function anonymizeSomeRawData($idSites, $date, $anonymizeIp = false, $anonymizeLocation = false, $anonymizeUserId = false, $unsetVisitColumns = [], $unsetLinkVisitActionColumns = [])
{
Piwik::checkUserHasSuperUserAccess();
if ($idSites === 'all' || empty($idSites)) {
$idSites = null; // all websites
} else {
$idSites = Site::getIdSitesFromIdSitesString($idSites);
}
$requester = Piwik::getCurrentUserLogin();
$this->logDataAnonymizations->scheduleEntry($requester, $idSites, $date, $anonymizeIp, $anonymizeLocation, $anonymizeUserId, $unsetVisitColumns, $unsetLinkVisitActionColumns);
}
public function getAvailableVisitColumnsToAnonymize()
{
Piwik::checkUserHasSuperUserAccess();
$columns = $this->logDataAnonymizer->getAvailableVisitColumnsToAnonymize();
return $this->formatAvailableColumnsToAnonymize($columns);
}
public function getAvailableLinkVisitActionColumnsToAnonymize()
{
Piwik::checkUserHasSuperUserAccess();
$columns = $this->logDataAnonymizer->getAvailableLinkVisitActionColumnsToAnonymize();
return $this->formatAvailableColumnsToAnonymize($columns);
}
private function formatAvailableColumnsToAnonymize($columns)
{
ksort($columns);
$formatted = array();
foreach ($columns as $column => $default) {
$formatted[] = array(
'column_name' => $column,
'default_value' => $default
);
}
return $formatted;
}
/**
* @internal
*/
public function setAnonymizeIpSettings($anonymizeIPEnable, $maskLength, $useAnonymizedIpForVisitEnrichment, $anonymizeUserId = false, $anonymizeOrderId = false)
{
Piwik::checkUserHasSuperUserAccess();
if ($anonymizeIPEnable == '1') {
IPAnonymizer::activate();
} else if ($anonymizeIPEnable == '0') {
IPAnonymizer::deactivate();
} else {
// pass
}
$privacyConfig = new Config();
$privacyConfig->ipAddressMaskLength = (int) $maskLength;
$privacyConfig->useAnonymizedIpForVisitEnrichment = (bool) $useAnonymizedIpForVisitEnrichment;
if (false !== $anonymizeUserId) {
$privacyConfig->anonymizeUserId = (bool) $anonymizeUserId;
}
if (false !== $anonymizeOrderId) {
$privacyConfig->anonymizeOrderId = (bool) $anonymizeOrderId;
}
return true;
}
/**
* @internal
*/
public function deactivateDoNotTrack()
{
Piwik::checkUserHasSuperUserAccess();
$dntChecker = new DoNotTrackHeaderChecker();
$dntChecker->deactivate();
return true;
}
/**
* @internal
*/
public function activateDoNotTrack()
{
Piwik::checkUserHasSuperUserAccess();
$dntChecker = new DoNotTrackHeaderChecker();
$dntChecker->activate();
return true;
}
/**
* @internal
*/
public function setScheduleReportDeletionSettings($deleteLowestInterval = 7)
{
return $this->savePurgeDataSettings(array(
'delete_logs_schedule_lowest_interval' => (int) $deleteLowestInterval
));
}
/**
* @internal
*/
public function setDeleteLogsSettings($enableDeleteLogs = '0', $deleteLogsOlderThan = 180)
{
$deleteLogsOlderThan = (int) $deleteLogsOlderThan;
if ($deleteLogsOlderThan < 1) {
$deleteLogsOlderThan = 1;
}
return $this->savePurgeDataSettings(array(
'delete_logs_enable' => !empty($enableDeleteLogs),
'delete_logs_older_than' => $deleteLogsOlderThan,
));
}
/**
* @internal
*/
public function setDeleteReportsSettings($enableDeleteReports = 0, $deleteReportsOlderThan = 3,
$keepBasic = 0, $keepDay = 0, $keepWeek = 0, $keepMonth = 0,
$keepYear = 0, $keepRange = 0, $keepSegments = 0)
{
$settings = array();
// delete reports settings
$settings['delete_reports_enable'] = !empty($enableDeleteReports);
$deleteReportsOlderThan = (int) $deleteReportsOlderThan;
if ($deleteReportsOlderThan < 2) {
$deleteReportsOlderThan = 2;
}
$settings['delete_reports_older_than'] = $deleteReportsOlderThan;
$settings['delete_reports_keep_basic_metrics'] = (int) $keepBasic;
$settings['delete_reports_keep_day_reports'] = (int) $keepDay;
$settings['delete_reports_keep_week_reports'] = (int) $keepWeek;
$settings['delete_reports_keep_month_reports'] = (int) $keepMonth;
$settings['delete_reports_keep_year_reports'] = (int) $keepYear;
$settings['delete_reports_keep_range_reports'] = (int) $keepRange;
$settings['delete_reports_keep_segment_reports'] = (int) $keepSegments;
$settings['delete_logs_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_max_rows_per_query'];
return $this->savePurgeDataSettings($settings);
}
private function savePurgeDataSettings($settings)
{
Piwik::checkUserHasSuperUserAccess();
$this->checkDataPurgeAdminSettingsIsEnabled();
PrivacyManager::savePurgeDataSettings($settings);
return true;
}
private function checkDataPurgeAdminSettingsIsEnabled()
{
if (!Controller::isDataPurgeSettingsEnabled()) {
throw new \Exception("Configuring deleting raw data and report data has been disabled by Matomo admins.");
}
}
}

View File

@ -0,0 +1,119 @@
<?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\PrivacyManager\Commands;
use Piwik\Container\StaticContainer;
use Piwik\Date;
use Piwik\Plugin\ConsoleCommand;
use Piwik\Site;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class AnonymizeRawData extends ConsoleCommand
{
protected function configure()
{
// by default we want to anonymize as many (if not all) logs as possible.
$defaultDate = '1996-01-01,' . Date::now()->toString();
$this->setName('privacymanager:anonymize-some-raw-data');
$this->setDescription('Anonymize some of the stored raw data (logs). The reason it only anonymizes "some" data is that personal data can be present in many various data collection points, for example some of your page URLs or page titles may include personal data and these will not be anonymized by this command as it is not possible to detect personal data for example in a URL automatically.');
$this->addOption('date', null, InputOption::VALUE_REQUIRED, 'Date or date range to invalidate raw data for (UTC). Either a date like "2015-01-03" or a range like "2015-01-05,2015-02-12". By default, all data including today will be anonymized.', $defaultDate);
$this->addOption('unset-visit-columns', null, InputOption::VALUE_REQUIRED, 'Comma seperated list of log_visit columns that you want to unset. Each value for that column will be set to its default value. If the same column exists in "log_conversion" table as well, the column will be unset there as well. This action cannot be undone.', '');
$this->addOption('unset-link-visit-action-columns', null, InputOption::VALUE_REQUIRED, 'Comma seperated list of log_link_visit_action columns that you want to unset. Each value for that column will be set to its default value. This action cannot be undone.', '');
$this->addOption('anonymize-ip', null, InputOption::VALUE_NONE, 'If set, the IP will be anonymized with a mask of at least 2. This action cannot be undone.');
$this->addOption('anonymize-location', null, InputOption::VALUE_NONE, 'If set, the location will be re-evaluated based on the anonymized IP. This action cannot be undone.');
$this->addOption('anonymize-userid', null, InputOption::VALUE_NONE, 'If set, any set user-id will be anonymized. This action cannot be undone.');
$this->addOption('idsites', null, InputOption::VALUE_REQUIRED, 'By default, the data of all idSites will be anonymized or unset. However, you can specify a set of idSites to execute this command only on these idsites.');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$date = $input->getOption('date');
$visitColumnsToUnset = $input->getOption('unset-visit-columns');
if (!empty($visitColumnsToUnset)) {
$visitColumnsToUnset = explode(',', $visitColumnsToUnset);
}
$linkVisitActionColumns = $input->getOption('unset-link-visit-action-columns');
if (!empty($linkVisitActionColumns)) {
$linkVisitActionColumns = explode(',', $linkVisitActionColumns);
}
$idSites = $input->getOption('idsites');
if (!empty($idSites)) {
$idSites = Site::getIdSitesFromIdSitesString($idSites);
} else {
$idSites = null;
}
$anonymizeIp = $input->getOption('anonymize-ip');
$anonymizeLocation = $input->getOption('anonymize-location');
$anonymizeUserId = $input->getOption('anonymize-userid');
$logDataAnonymizations = StaticContainer::get('Piwik\Plugins\PrivacyManager\Model\LogDataAnonymizations');
list($startDate, $endDate) = $logDataAnonymizations->getStartAndEndDate($date);
$output->writeln(sprintf('Start date is "%s", end date is "%s"', $startDate, $endDate));
if ($anonymizeIp
&& !$this->confirmAnonymize($input, $output, $startDate, $endDate, 'anonymize visit IP')) {
$anonymizeIp = false;
$output->writeln('<info>SKIPPING anonymizing IP.</info>');
}
if ($anonymizeLocation
&& !$this->confirmAnonymize($input, $output, $startDate, $endDate, 'anonymize visit location')) {
$anonymizeLocation = false;
$output->writeln('<info>SKIPPING anonymizing location.</info>');
}
if ($anonymizeUserId
&& !$this->confirmAnonymize($input, $output, $startDate, $endDate, 'anonymize user id')) {
$anonymizeUserId = false;
$output->writeln('<info>SKIPPING anonymizing user id.</info>');
}
if (!empty($visitColumnsToUnset)
&& !$this->confirmAnonymize($input, $output, $startDate, $endDate, 'unset the log_visit columns "' . implode(', ', $visitColumnsToUnset) . '"')) {
$visitColumnsToUnset = false;
$output->writeln('<info>SKIPPING unset log_visit columns.</info>');
}
if (!empty($linkVisitActionColumns)
&& !$this->confirmAnonymize($input, $output, $startDate, $endDate, 'unset the log_link_visit_action columns "' . implode(', ', $linkVisitActionColumns) . '"')) {
$linkVisitActionColumns = false;
$output->writeln('<info>SKIPPING unset log_link_visit_action columns.</info>');
}
$logDataAnonymizations->setCallbackOnOutput(function ($message) use ($output) {
$output->writeln($message);
});
$idLogData = $logDataAnonymizations->scheduleEntry('Command line', $idSites, $date, $anonymizeIp, $anonymizeLocation, $anonymizeUserId, $visitColumnsToUnset, $linkVisitActionColumns, $isStarted = true);
$logDataAnonymizations->executeScheduledEntry($idLogData);
$output->writeln('Done');
}
private function confirmAnonymize(InputInterface $input, OutputInterface $output, $startDate, $endDate, $action)
{
$noInteraction = $input->getOption('no-interaction');
if ($noInteraction) {
return true;
}
$dialog = $this->getHelperSet()->get('dialog');
$value = $dialog->ask(
$output,
sprintf('<question>Are you sure you want to %s for all visits between "%s" to "%s"? This action cannot be undone. Type "OK" to confirm this section.</question>', $action, $startDate, $endDate),
false
);
if ($value !== 'OK') {
return false;
}
return true;
}
}

View File

@ -0,0 +1,113 @@
<?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\PrivacyManager;
use Piwik\Option;
use Piwik\Tracker\Cache;
/**
* @property bool $doNotTrackEnabled Enable / Disable Do Not Track {@see DoNotTrackHeaderChecker}
* @property bool $ipAnonymizerEnabled Enable / Disable IP Anonymizer {@see IPAnonymizer}
* @property bool $useAnonymizedIpForVisitEnrichment Set this setting to 0 to let plugins use the full
* non-anonymized IP address when enriching visitor information.
* When set to 1, by default, Geo Location via geoip and Provider reverse name lookups
* will use the anonymized IP address when anonymization is enabled.
* @property int $ipAddressMaskLength Anonymize a visitor's IP address after testing for "Ip exclude"
* This value is the level of anonymization Piwik will use; if the IP
* anonymization is deactivated, this value is ignored. For IPv4/IPv6 addresses,
* valid values are the number of octets in IP address to mask (from 0 to 4).
* For IPv6 addresses 0..4 means that 0, 64, 80, 104 or all bits are masked.
* @property int $anonymizeUserId If enabled, it will pseudo anonymize the User ID
* @property int $anonymizeOrderId If enabled, it will anonymize the Order ID
*/
class Config
{
private $properties = array(
'useAnonymizedIpForVisitEnrichment' => array('type' => 'boolean', 'default' => false),
'ipAddressMaskLength' => array('type' => 'integer', 'default' => 2),
'doNotTrackEnabled' => array('type' => 'boolean', 'default' => true),
'ipAnonymizerEnabled' => array('type' => 'boolean', 'default' => true),
'anonymizeUserId' => array('type' => 'boolean', 'default' => false),
'anonymizeOrderId' => array('type' => 'boolean', 'default' => false),
);
public function __set($name, $value)
{
if (!array_key_exists($name, $this->properties)) {
throw new \Exception(sprintf('Property %s does not exist', $name));
}
$this->set($name, $value, $this->properties[$name]);
}
public function __get($name)
{
if (!array_key_exists($name, $this->properties)) {
throw new \Exception(sprintf('Property %s does not exist', $name));
}
return $this->getFromTrackerCache($name, $this->properties[$name]);
}
private function prefix($optionName)
{
return 'PrivacyManager.' . $optionName;
}
private function getFromTrackerCache($name, $config)
{
$name = $this->prefix($name);
$cache = Cache::getCacheGeneral();
if (array_key_exists($name, $cache)) {
$value = $cache[$name];
settype($value, $config['type']);
return $value;
}
return $config['default'];
}
private function getFromOption($name, $config)
{
$name = $this->prefix($name);
$value = Option::get($name);
if (false !== $value) {
settype($value, $config['type']);
} else {
$value = $config['default'];
}
return $value;
}
private function set($name, $value, $config)
{
if ('boolean' == $config['type']) {
$value = $value ? '1' : '0';
} else {
settype($value, $config['type']);
}
Option::set($this->prefix($name), $value);
Cache::clearCacheGeneral();
}
public function setTrackerCacheGeneral($cacheContent)
{
foreach ($this->properties as $name => $config) {
$cacheContent[$this->prefix($name)] = $this->getFromOption($name, $config);
}
return $cacheContent;
}
}

View File

@ -0,0 +1,372 @@
<?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\PrivacyManager;
use Piwik\Common;
use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
use Piwik\DataTable\Renderer\Json;
use Piwik\Date;
use Piwik\Db;
use Piwik\Metrics\Formatter;
use Piwik\Nonce;
use Piwik\Notification;
use Piwik\Option;
use Piwik\Piwik;
use Piwik\Plugins\LanguagesManager\LanguagesManager;
use Piwik\Scheduler\Scheduler;
use Piwik\View;
/**
*
*/
class Controller extends \Piwik\Plugin\ControllerAdmin
{
const OPTION_LAST_DELETE_PIWIK_LOGS = "lastDelete_piwik_logs";
const ACTIVATE_DNT_NONCE = 'PrivacyManager.activateDnt';
const DEACTIVATE_DNT_NONCE = 'PrivacyManager.deactivateDnt';
private function checkDataPurgeAdminSettingsIsEnabled()
{
if (!self::isDataPurgeSettingsEnabled()) {
throw new \Exception("Configuring deleting raw data and report data has been disabled by Piwik admins.");
}
}
/**
* Utility function. Gets the delete logs/reports settings from the request and uses
* them to populate config arrays.
*
* @return array An array containing the data deletion settings.
*/
private function getPurgeSettingsFromRequest()
{
$settings = array();
// delete logs settings
$settings['delete_logs_enable'] = Common::getRequestVar("enableDeleteLogs", 0);
$settings['delete_logs_schedule_lowest_interval'] = Common::getRequestVar("deleteLowestInterval", 7);
$settings['delete_logs_older_than'] = ((int)Common::getRequestVar("deleteLogsOlderThan", 180) < 1) ?
1 : Common::getRequestVar("deleteOlderThan", 180);
// delete reports settings
$settings['delete_reports_enable'] = Common::getRequestVar("enableDeleteReports", 0);
$deleteReportsOlderThan = Common::getRequestVar("deleteReportsOlderThan", 3);
$settings['delete_reports_older_than'] = $deleteReportsOlderThan < 2 ? 2 : $deleteReportsOlderThan;
$settings['delete_reports_keep_basic_metrics'] = Common::getRequestVar("keepBasic", 0);
$settings['delete_reports_keep_day_reports'] = Common::getRequestVar("keepDay", 0);
$settings['delete_reports_keep_week_reports'] = Common::getRequestVar("keepWeek", 0);
$settings['delete_reports_keep_month_reports'] = Common::getRequestVar("keepMonth", 0);
$settings['delete_reports_keep_year_reports'] = Common::getRequestVar("keepYear", 0);
$settings['delete_reports_keep_range_reports'] = Common::getRequestVar("keepRange", 0);
$settings['delete_reports_keep_segment_reports'] = Common::getRequestVar("keepSegments", 0);
$settings['delete_logs_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_max_rows_per_query'];
return $settings;
}
public function gdprOverview()
{
Piwik::checkUserHasSomeAdminAccess();
$purgeDataSettings = PrivacyManager::getPurgeDataSettings();
$reportRetention = '';
if ($purgeDataSettings['delete_reports_older_than'] > 12) {
$years = floor($purgeDataSettings['delete_reports_older_than']/12);
$reportRetention .= $years . ' ' . Piwik::translate($years > 1 ? 'Intl_PeriodYears' : 'Intl_PeriodYear') . ' ';
}
if ($purgeDataSettings['delete_reports_older_than'] % 12 > 0) {
$months = floor($purgeDataSettings['delete_reports_older_than']%12);
$reportRetention .= $months . ' ' . Piwik::translate($months > 1 ? 'Intl_PeriodMonths' : 'Intl_PeriodMonth');
}
$rawDataRetention = '';
if ($purgeDataSettings['delete_logs_older_than'] > 30) {
$months = floor($purgeDataSettings['delete_logs_older_than']/30);
$rawDataRetention .= $months . ' ' . Piwik::translate($months > 1 ? 'Intl_PeriodMonths' : 'Intl_PeriodMonth') . ' ';
}
if ($purgeDataSettings['delete_logs_older_than'] % 30 > 0) {
$days = floor($purgeDataSettings['delete_logs_older_than']%30);
$rawDataRetention .= $days . ' ' . Piwik::translate($days > 1 ? 'Intl_PeriodDays' : 'Intl_PeriodDay');
}
return $this->renderTemplate('gdprOverview', [
'reportRetention' => trim($reportRetention),
'rawDataRetention' => trim($rawDataRetention),
'deleteLogsEnable' => $purgeDataSettings['delete_logs_enable'],
'deleteReportsEnable' => $purgeDataSettings['delete_reports_enable'],
]);
}
public function usersOptOut()
{
Piwik::checkUserHasSomeAdminAccess();
$language = LanguagesManager::getLanguageCodeForCurrentUser();
$doNotTrackOptions = array(
array('key' => '1',
'value' => Piwik::translate('PrivacyManager_DoNotTrack_Enable'),
'description' => Piwik::translate('General_Recommended')),
array('key' => '0',
'value' => Piwik::translate('PrivacyManager_DoNotTrack_Disable'),
'description' => Piwik::translate('General_NotRecommended'))
);
$dntChecker = new DoNotTrackHeaderChecker();
return $this->renderTemplate('usersOptOut', array(
'language' => $language,
'doNotTrackOptions' => $doNotTrackOptions,
'dntSupport' => $dntChecker->isActive()
));
}
public function consent()
{
Piwik::checkUserHasSomeAdminAccess();
return $this->renderTemplate('askingForConsent');
}
public function gdprTools()
{
Piwik::checkUserHasSomeAdminAccess();
return $this->renderTemplate('gdprTools');
}
/**
* Echo's an HTML chunk describing the current database size, and the estimated space
* savings after the scheduled data purge is run.
*/
public function getDatabaseSize()
{
Piwik::checkUserHasSuperUserAccess();
$view = new View('@PrivacyManager/getDatabaseSize');
$forceEstimate = Common::getRequestVar('forceEstimate', 0);
$view->dbStats = $this->getDeleteDBSizeEstimate($getSettingsFromQuery = true, $forceEstimate);
$view->language = LanguagesManager::getLanguageCodeForCurrentUser();
return $view->render();
}
public function privacySettings()
{
Piwik::checkUserHasSuperUserAccess();
$view = new View('@PrivacyManager/privacySettings');
if (Piwik::hasUserSuperUserAccess()) {
$view->deleteData = $this->getDeleteDataInfo();
$view->anonymizeIP = $this->getAnonymizeIPInfo();
$view->canDeleteLogActions = Db::isLockPrivilegeGranted();
$view->dbUser = PiwikConfig::getInstance()->database['username'];
$view->deactivateNonce = Nonce::getNonce(self::DEACTIVATE_DNT_NONCE);
$view->activateNonce = Nonce::getNonce(self::ACTIVATE_DNT_NONCE);
$view->maskLengthOptions = array(
array('key' => '1',
'value' => Piwik::translate('PrivacyManager_AnonymizeIpMaskLength', array("1","192.168.100.xxx")),
'description' => ''),
array('key' => '2',
'value' => Piwik::translate('PrivacyManager_AnonymizeIpMaskLength', array("2","192.168.xxx.xxx")),
'description' => Piwik::translate('General_Recommended')),
array('key' => '3',
'value' => Piwik::translate('PrivacyManager_AnonymizeIpMaskLength', array("3","192.xxx.xxx.xxx")),
'description' => '')
);
$view->useAnonymizedIpForVisitEnrichmentOptions = array(
array('key' => '1',
'value' => Piwik::translate('General_Yes'),
'description' => Piwik::translate('PrivacyManager_RecommendedForPrivacy')),
array(
'key' => '0',
'value' => Piwik::translate('General_No'),
'description' => ''
)
);
$view->scheduleDeletionOptions = array(
array('key' => '1',
'value' => Piwik::translate('Intl_PeriodDay')),
array('key' => '7',
'value' => Piwik::translate('Intl_PeriodWeek')),
array('key' => '30',
'value' => Piwik::translate('Intl_PeriodMonth'))
);
}
$view->language = LanguagesManager::getLanguageCodeForCurrentUser();
$this->setBasicVariablesView($view);
$logDataAnonymizations = StaticContainer::get('Piwik\Plugins\PrivacyManager\Model\LogDataAnonymizations');
$view->anonymizations = $logDataAnonymizations->getAllEntries();
return $view->render();
}
/**
* Executes a data purge, deleting raw data and report data using the current config
* options. Echo's the result of getDatabaseSize after purging.
*/
public function executeDataPurge()
{
$this->checkDataPurgeAdminSettingsIsEnabled();
Piwik::checkUserHasSuperUserAccess();
$this->checkTokenInUrl();
// if the request isn't a POST, redirect to index
if ($_SERVER["REQUEST_METHOD"] != "POST"
&& !Common::isPhpCliMode()
) {
$this->redirectToIndex('PrivacyManager', 'privacySettings');
return;
}
$settings = PrivacyManager::getPurgeDataSettings();
if ($settings['delete_logs_enable']) {
/** @var LogDataPurger $logDataPurger */
$logDataPurger = StaticContainer::get('Piwik\Plugins\PrivacyManager\LogDataPurger');
$logDataPurger->purgeData($settings['delete_logs_older_than'], true);
}
if ($settings['delete_reports_enable']) {
$reportsPurger = ReportsPurger::make($settings, PrivacyManager::getAllMetricsToKeep());
$reportsPurger->purgeData(true);
}
}
private function getDeleteDBSizeEstimate($getSettingsFromQuery = false, $forceEstimate = false)
{
$this->checkDataPurgeAdminSettingsIsEnabled();
// get the purging settings & create two purger instances
if ($getSettingsFromQuery) {
$settings = $this->getPurgeSettingsFromRequest();
} else {
$settings = PrivacyManager::getPurgeDataSettings();
}
$doDatabaseSizeEstimate = PiwikConfig::getInstance()->Deletelogs['enable_auto_database_size_estimate'];
// determine the DB size & purged DB size
$metadataProvider = StaticContainer::get('Piwik\Plugins\DBStats\MySQLMetadataProvider');
$tableStatuses = $metadataProvider->getAllTablesStatus();
$totalBytes = 0;
foreach ($tableStatuses as $status) {
$totalBytes += $status['Data_length'] + $status['Index_length'];
}
$formatter = new Formatter();
$result = array(
'currentSize' => $formatter->getPrettySizeFromBytes($totalBytes)
);
// if the db size estimate feature is enabled, get the estimate
if ($doDatabaseSizeEstimate || $forceEstimate == 1) {
// maps tables whose data will be deleted with number of rows that will be deleted
// if a value is -1, it means the table will be dropped.
$deletedDataSummary = PrivacyManager::getPurgeEstimate($settings);
$totalAfterPurge = $totalBytes;
foreach ($tableStatuses as $status) {
$tableName = $status['Name'];
if (isset($deletedDataSummary[$tableName])) {
$tableTotalBytes = $status['Data_length'] + $status['Index_length'];
// if dropping the table
if ($deletedDataSummary[$tableName] === ReportsPurger::DROP_TABLE) {
$totalAfterPurge -= $tableTotalBytes;
} else // if just deleting rows
{
if ($status['Rows'] > 0) {
$totalAfterPurge -= ($tableTotalBytes / $status['Rows']) * $deletedDataSummary[$tableName];
}
}
}
}
$result['sizeAfterPurge'] = $formatter->getPrettySizeFromBytes($totalAfterPurge);
$result['spaceSaved'] = $formatter->getPrettySizeFromBytes($totalBytes - $totalAfterPurge);
}
return $result;
}
private function getAnonymizeIPInfo()
{
Piwik::checkUserHasSuperUserAccess();
$anonymizeIP = array();
$privacyConfig = new Config();
$anonymizeIP["enabled"] = IPAnonymizer::isActive();
$anonymizeIP["maskLength"] = $privacyConfig->ipAddressMaskLength;
$anonymizeIP["anonymizeOrderId"] = $privacyConfig->anonymizeOrderId;
$anonymizeIP["anonymizeUserId"] = $privacyConfig->anonymizeUserId;
$anonymizeIP["useAnonymizedIpForVisitEnrichment"] = $privacyConfig->useAnonymizedIpForVisitEnrichment;
if (!$anonymizeIP["useAnonymizedIpForVisitEnrichment"]) {
$anonymizeIP["useAnonymizedIpForVisitEnrichment"] = '0';
}
return $anonymizeIP;
}
private function getDeleteDataInfo()
{
Piwik::checkUserHasSuperUserAccess();
$deleteDataInfos = array();
$deleteDataInfos["config"] = PrivacyManager::getPurgeDataSettings();
$deleteDataInfos["deleteTables"] =
"<br/>" . implode(", ", LogDataPurger::getDeleteTableLogTables());
/** @var Scheduler $scheduler */
$scheduler = StaticContainer::getContainer()->get('Piwik\Scheduler\Scheduler');
$scheduleTimetable = $scheduler->getScheduledTimeForMethod("PrivacyManager", "deleteLogTables");
$optionTable = Option::get(self::OPTION_LAST_DELETE_PIWIK_LOGS);
//If task was already rescheduled, read time from taskTimetable. Else, calculate next possible runtime.
if (!empty($scheduleTimetable) && ($scheduleTimetable - time() > 0)) {
$nextPossibleSchedule = (int)$scheduleTimetable;
} else {
$date = Date::factory("today");
$nextPossibleSchedule = $date->addDay(1)->getTimestamp();
}
//deletion schedule did not run before
if (empty($optionTable)) {
$deleteDataInfos["lastRun"] = false;
//next run ASAP (with next schedule run)
$date = Date::factory("today");
$deleteDataInfos["nextScheduleTime"] = $nextPossibleSchedule;
} else {
$deleteDataInfos["lastRun"] = $optionTable;
$deleteDataInfos["lastRunPretty"] = Date::factory((int)$optionTable)->getLocalized(Date::DATE_FORMAT_SHORT);
//Calculate next run based on last run + interval
$nextScheduleRun = (int)($deleteDataInfos["lastRun"] + $deleteDataInfos["config"]["delete_logs_schedule_lowest_interval"] * 24 * 60 * 60);
//is the calculated next run in the past? (e.g. plugin was disabled in the meantime or something) -> run ASAP
if (($nextScheduleRun - time()) <= 0) {
$deleteDataInfos["nextScheduleTime"] = $nextPossibleSchedule;
} else {
$deleteDataInfos["nextScheduleTime"] = $nextScheduleRun;
}
}
$formatter = new Formatter();
$deleteDataInfos["nextRunPretty"] = $formatter->getPrettyTimeFromSeconds($deleteDataInfos["nextScheduleTime"] - time());
return $deleteDataInfos;
}
}

View File

@ -0,0 +1,274 @@
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\PrivacyManager\Dao;
use Piwik\Common;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Network\IP;
use Piwik\Plugins\PrivacyManager\Config;
use Piwik\Plugins\PrivacyManager\IPAnonymizer;
use Piwik\Plugins\PrivacyManager\Tracker\RequestProcessor;
use Piwik\Plugins\UserCountry\LocationProvider;
use Piwik\Plugins\UserCountry\VisitorGeolocator;
use Piwik\SettingsPiwik;
use Piwik\Tracker\Model;
use Exception;
class LogDataAnonymizer
{
const NUM_ROWS_UPDATE_AT_ONCE = 10000;
protected $COLUMNS_BLACKLISTED = array('idvisit', 'idvisitor', 'idsite', 'visit_last_action_time', 'config_id', 'location_ip', 'idlink_va', 'server_time', 'idgoal', 'buster', 'idorder');
/**
* @var string
*/
private $logVisitTable;
public function __construct()
{
$this->logVisitTable = Common::prefixTable('log_visit');
}
public function anonymizeVisitInformation($idSites, $startDate, $endDate, $anonymizeIp, $anonimizeLocation, $anonymizeUserId)
{
if (!$anonymizeIp && !$anonimizeLocation && !$anonymizeUserId) {
return 0; // nothing to do
}
if (empty($idSites)) {
$idSites = $this->getAllIdSitesString($this->logVisitTable);
} else {
$idSites = array_map('intval', $idSites);
}
if (empty($idSites)) {
return 0; // no visit tracked yet, the idsite in() would otherwise fail
}
$idSites = implode(', ', $idSites);
$numVisitsToUpdate = $this->getNumVisitsInTimeRange($idSites, $startDate, $endDate);
if (empty($numVisitsToUpdate)) {
return 0;
}
$privacyConfig = new Config();
$minimumIpAddressMaskLength = 2;
$ipMask = max($minimumIpAddressMaskLength, $privacyConfig->ipAddressMaskLength);
$numRecordsUpdated = 0;
$trackerModel = new Model();
$geolocator = new VisitorGeolocator();
for ($i = 0; $i < $numVisitsToUpdate; $i = $i + self::NUM_ROWS_UPDATE_AT_ONCE) {
$offset = $i;
$limit = self::NUM_ROWS_UPDATE_AT_ONCE;
if (($offset + $limit) > $numVisitsToUpdate) {
$limit = $numVisitsToUpdate % $limit;
}
$sql = sprintf('SELECT idsite, idvisit, location_ip, user_id, location_longitude, location_latitude, location_city, location_region, location_country FROM %s WHERE idsite in (%s) and visit_last_action_time >= ? and visit_last_action_time <= ? ORDER BY idsite, visit_last_action_time, idvisit LIMIT %d OFFSET %d', $this->logVisitTable, $idSites, $limit, $offset);
$rows = Db::query($sql, array($startDate, $endDate))->fetchAll();
foreach ($rows as $row) {
$ipObject = IP::fromBinaryIP($row['location_ip']);
$ipString = $ipObject->toString();
$ipAnonymized = IPAnonymizer::applyIPMask($ipObject, $ipMask);
$update = array();
if ($anonymizeIp) {
if ($ipString !== $ipAnonymized->toString()) {
// needs updating
$update['location_ip'] = $ipAnonymized->toBinary();
}
}
if ($anonymizeUserId && isset($row['user_id']) && $row['user_id'] !== false && $row['user_id'] !== '') {
$update['user_id'] = RequestProcessor::anonymizeUserId($row['user_id']);
}
if ($anonimizeLocation) {
$location = $geolocator->getLocation(array('ip' => $ipAnonymized->toString()));
$keys = array(
'location_longitude' => LocationProvider::LONGITUDE_KEY,
'location_latitude' => LocationProvider::LATITUDE_KEY,
'location_city' => LocationProvider::CITY_NAME_KEY,
'location_region' => LocationProvider::REGION_CODE_KEY,
'location_country' => LocationProvider::COUNTRY_CODE_KEY,
);
foreach ($keys as $name => $val) {
$newLocationData = null;
if (isset($location[$val]) && $location[$val] !== false) {
$newLocationData = $location[$val];
}
if ($newLocationData !== $row[$name]) {
$update[$name] = $newLocationData;
}
}
}
if (!empty($update)) {
$trackerModel->updateVisit($row['idsite'], $row['idvisit'], $update);
$numRecordsUpdated++;
}
}
unset($rows);
}
return $numRecordsUpdated;
}
public function unsetLogVisitTableColumns($idSites, $startDate, $endDate, $columns)
{
return $this->unsetLogTableColumns('log_visit', 'visit_last_action_time', $idSites, $startDate, $endDate, $columns);
}
public function unsetLogConversionTableColumns($idSites, $startDate, $endDate, $visitColumns)
{
$columnsToUnset = array();
$table = 'log_conversion';
$logTableFields = $this->getAvailableColumnsWithDefaultValue(Common::prefixTable($table));
foreach ($visitColumns as $column) {
// we do not fail if a specified column does not exist here as this is applied to visit columns
// and some visit columns may not exist in log_conversion. We do not want to fail in this case
if (array_key_exists($column, $logTableFields)) {
$columnsToUnset[] = $column;
}
}
return $this->unsetLogTableColumns($table, 'server_time', $idSites, $startDate, $endDate, $columnsToUnset);
}
public function unsetLogLinkVisitActionColumns($idSites, $startDate, $endDate, $columns)
{
return $this->unsetLogTableColumns('log_link_visit_action', 'server_time', $idSites, $startDate, $endDate, $columns);
}
public function checkAllVisitColumns($visitColumns)
{
$this->areAllColumnsValid('log_visit', $visitColumns);
return null;
}
public function checkAllLinkVisitActionColumns($linkVisitActionColumns)
{
$this->areAllColumnsValid('log_link_visit_action', $linkVisitActionColumns);
return null;
}
public function getAvailableVisitColumnsToAnonymize()
{
return $this->getAvailableColumnsWithDefaultValue(Common::prefixTable('log_visit'));
}
public function getAvailableLinkVisitActionColumnsToAnonymize()
{
return $this->getAvailableColumnsWithDefaultValue(Common::prefixTable('log_link_visit_action'));
}
private function areAllColumnsValid($table, $columns)
{
if (empty($columns)) {
return;
}
$table = Common::prefixTable($table);
$logTableFields = $this->getAvailableColumnsWithDefaultValue($table);
foreach ($columns as $column) {
if (!array_key_exists($column, $logTableFields)) {
throw new Exception(sprintf('The column "%s" seems to not exist in %s or cannot be unset. Use one of %s', $column, $table, implode(', ', array_keys($logTableFields))));
}
}
}
private function unsetLogTableColumns($table, $dateColumn, $idSites, $startDate, $endDate, $columns)
{
if (empty($columns)) {
return 0;
}
$table = Common::prefixTable($table);
if (empty($idSites)) {
$idSites = $this->getAllIdSitesString($table);
} else {
$idSites = array_map('intval', $idSites);
}
if (empty($idSites)) {
return 0; // no visit tracked yet, the idsite in() would otherwise fail
}
$idSites = implode(', ', $idSites);
$logTableFields = $this->getAvailableColumnsWithDefaultValue($table);
$col = [];
$bind = [];
foreach ($columns as $column) {
if (!array_key_exists($column, $logTableFields)) {
throw new Exception(sprintf('The column "%s" cannot be unset because it has no default value or it does not exist in "%s". Use one of %s', $column, $table, implode(', ', array_keys($logTableFields))));
}
$col[] = $column . ' = ?';
$bind[] = $logTableFields[$column];
}
$col = implode(',', $col);
$bind[] = $startDate;
$bind[] = $endDate;
$sql = sprintf('UPDATE %s SET %s WHERE idsite in (%s) and %s >= ? and %s <= ?', $table, $col, $idSites, $dateColumn, $dateColumn);
return Db::query($sql, $bind)->rowCount();
}
private function getNumVisitsInTimeRange($idSites, $startDate, $endDate)
{
$sql = sprintf('SELECT count(*) FROM %s WHERE idsite in (%s) and visit_last_action_time >= ? and visit_last_action_time <= ?', $this->logVisitTable, $idSites);
$numVisits = Db::query($sql, array($startDate, $endDate))->fetchColumn();
return $numVisits;
}
private function getAvailableColumnsWithDefaultValue($table)
{
$columns = DbHelper::getTableColumns($table);
$values = array();
foreach ($columns as $column => $config) {
$hasDefaultKey = array_key_exists('Default', $config);
if (in_array($column, $this->COLUMNS_BLACKLISTED, true)) {
continue;
} elseif (strtoupper($config['Null']) === 'NO' && $hasDefaultKey && $config['Default'] === null) {
// we cannot unset this column as it may result in an error or random data
continue;
} elseif ($hasDefaultKey) {
$values[$column] = $config['Default'];
} elseif (strtoupper($config['Null']) === 'YES') {
$values[$column] = null;
}
}
return $values;
}
private function getAllIdSitesString($table)
{
// we need the idSites in order to use the index
$sites = Db::query(sprintf('SELECT DISTINCT idsite FROM %s', $table))->fetchAll();
$idSites = array();
foreach ($sites as $site) {
$idSites[] = (int) $site['idsite'];
}
return $idSites;
}
}

View File

@ -0,0 +1,155 @@
<?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\PrivacyManager;
use Piwik\Common;
use Piwik\Tracker\IgnoreCookie;
use Piwik\Tracker\Request;
/**
* Excludes visits where user agent's request contains either:
*
* - X-Do-Not-Track header (used by AdBlockPlus and NoScript)
* - DNT header (used by Mozilla)
*
* Note: visits from Internet Explorer and other browsers that have DoNoTrack enabled by default will be tracked anyway.
*/
class DoNotTrackHeaderChecker
{
/**
* @param Config $config
*/
public function __construct($config = null)
{
$this->config = $config ?: new Config();
}
/**
* Checks for DoNotTrack headers and if found, sets `$exclude` to `true`.
*/
public function checkHeaderInTracker(&$exclude)
{
if ($exclude) {
Common::printDebug("Visit is already excluded, no need to check DoNotTrack support.");
return;
}
$exclude = $this->isDoNotTrackFound();
if($exclude) {
IgnoreCookie::deleteThirdPartyCookieUIDIfExists();
// this is an optional supplement to the site's tracking status resource at:
// /.well-known/dnt
// per Tracking Preference Expression
//Tracking Perference Expression has been updated to require Tk: N rather than Tk: 1
Common::sendHeader('Tk: N');
}
}
/**
* @return bool
*/
public function isDoNotTrackFound()
{
if (!$this->isActive()) {
Common::printDebug("DoNotTrack support is not enabled, skip check");
return false;
}
if (!$this->isHeaderDntFound()) {
Common::printDebug("DoNotTrack header not found");
return false;
}
$request = new Request($_REQUEST);
$userAgent = $request->getUserAgent();
if ($this->isUserAgentWithDoNotTrackAlwaysEnabled($userAgent)) {
Common::printDebug("INTERNET EXPLORER enable DoNotTrack by default; so Piwik ignores DNT IE browsers...");
return false;
}
Common::printDebug("DoNotTrack header found!");
return true;
}
/**
* Deactivates DoNotTrack header checking. This function will not be called by the Tracker.
*/
public function deactivate()
{
$this->config->doNotTrackEnabled = false;
}
/**
* Activates DoNotTrack header checking. This function will not be called by the Tracker.
*/
public function activate()
{
$this->config->doNotTrackEnabled = true;
}
/**
* Returns true if server side DoNotTrack support is enabled, false if otherwise.
*
* @return bool
*/
public function isActive()
{
return $this->config->doNotTrackEnabled;
}
/**
* @return bool
*/
protected function isHeaderDntFound()
{
return (isset($_SERVER['HTTP_X_DO_NOT_TRACK']) && $_SERVER['HTTP_X_DO_NOT_TRACK'] === '1')
|| (isset($_SERVER['HTTP_DNT']) && substr($_SERVER['HTTP_DNT'], 0, 1) === '1');
}
/**
*
* @param $userAgent
* @return bool
*/
protected function isUserAgentWithDoNotTrackAlwaysEnabled($userAgent)
{
$browsersWithDnt = $this->getBrowsersWithDNTAlwaysEnabled();
foreach($browsersWithDnt as $userAgentBrowserFragment) {
if (stripos($userAgent, $userAgentBrowserFragment) !== false) {
return true;
}
}
return false;
}
/**
* Some browsers have DNT enabled by default. For those we will ignore DNT and always track those users.
*
* @return array
*/
protected function getBrowsersWithDNTAlwaysEnabled()
{
return array(
// IE
'MSIE',
'Trident',
// Maxthon
'Maxthon',
// Epiphany - https://github.com/piwik/piwik/issues/8682
'Epiphany',
);
}
}

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\PrivacyManager;
use Piwik\Common;
use Piwik\Network\IP;
/**
* Anonymize visitor IP addresses to comply with the privacy laws/guidelines in countries, such as Germany.
*/
class IPAnonymizer
{
/**
* Internal function to mask portions of the visitor IP address
*
* @param IP $ip
* @param int $maskLength Number of octets to reset
* @return IP
*/
public static function applyIPMask(IP $ip, $maskLength)
{
$newIpObject = $ip->anonymize($maskLength);
return $newIpObject;
}
/**
* Hook on Tracker.Visit.setVisitorIp to anomymize visitor IP addresses
* @param string $ip IP address in binary format (network format)
*/
public function setVisitorIpAddress(&$ip)
{
$ipObject = IP::fromBinaryIP($ip);
if (!$this->isActive()) {
Common::printDebug("Visitor IP was _not_ anonymized: ". $ipObject->toString());
return;
}
$privacyConfig = new Config();
$newIpObject = self::applyIPMask($ipObject, $privacyConfig->ipAddressMaskLength);
$ip = $newIpObject->toBinary();
Common::printDebug("Visitor IP (was: ". $ipObject->toString() .") has been anonymized: ". $newIpObject->toString());
}
/**
* Deactivates IP anonymization. This function will not be called by the Tracker.
*/
public static function deactivate()
{
$privacyConfig = new Config();
$privacyConfig->ipAnonymizerEnabled = false;
}
/**
* Activates IP anonymization. This function will not be called by the Tracker.
*/
public static function activate()
{
$privacyConfig = new Config();
$privacyConfig->ipAnonymizerEnabled = true;
}
/**
* Returns true if IP anonymization support is enabled, false if otherwise.
*
* @return bool
*/
public static function isActive()
{
$privacyConfig = new Config();
return $privacyConfig->ipAnonymizerEnabled;
}
}

View File

@ -0,0 +1,188 @@
<?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\PrivacyManager;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\DataAccess\RawLogDao;
use Piwik\Date;
use Piwik\Db;
use Piwik\Log;
use Piwik\LogDeleter;
use Piwik\Piwik;
/**
* Purges the log_visit, log_conversion and related tables of old visit data.
*/
class LogDataPurger
{
/**
* The max set of rows each table scan select should query at one time.
*/
public static $selectSegmentSize = 100000;
/**
* LogDeleter service used to delete visits.
*
* @var LogDeleter
*/
private $logDeleter;
/**
* DAO class that is used to delete unused actions.
*
* @var RawLogDao
*/
private $rawLogDao;
/**
* Constructor.
*/
public function __construct(LogDeleter $logDeleter, RawLogDao $rawLogDao)
{
$this->logDeleter = $logDeleter;
$this->rawLogDao = $rawLogDao;
}
/**
* Purges old data from the following tables:
* - log_visit
* - log_link_visit_action
* - log_conversion
* - log_conversion_item
* - log_action
*
* @param int $deleteLogsOlderThan The number of days after which log entires are considered old.
* Visits and related data whose age is greater than this number
* will be purged.
* @param bool $deleteUnusedLogActions Whether to delete unused log actions or not
*/
public function purgeData($deleteLogsOlderThan, $deleteUnusedLogActions)
{
$dateUpperLimit = Date::factory("today")->subDay($deleteLogsOlderThan);
$this->logDeleter->deleteVisitsFor($start = null, $dateUpperLimit->getDatetime());
$logTables = self::getDeleteTableLogTables();
// delete unused actions from the log_action table (but only if we can lock tables)
if ($deleteUnusedLogActions && Db::isLockPrivilegeGranted()) {
$this->rawLogDao->deleteUnusedLogActions();
} else {
$logMessage = get_class($this) . ": LOCK TABLES privilege not granted; skipping unused actions purge";
Log::warning($logMessage);
}
/**
* Triggered when a plugin is supposed to delete log/raw data that is older than a certain amount of days.
*
* **Example**
*
* public function deleteLogsOlderThan($dateUpperLimit, $deleteLogsOlderThan)
* {
* Db::query('DELETE FROM mytable WHERE creation_date < ' . $dateUpperLimit->getDateTime());
* }
*
* @param \Piwik\Date $dateUpperLimit A date where visits that occur before this time should be deleted.
* @param int $deleteLogsOlderThan The number of days after which log entires are considered old.
* Visits and related data whose age is greater than this number will be purged.
*/
Piwik::postEvent('PrivacyManager.deleteLogsOlderThan', array($dateUpperLimit, $deleteLogsOlderThan));
// optimize table overhead after deletion
Db::optimizeTables($logTables);
}
/**
* Returns an array describing what data would be purged if purging were invoked.
*
* This function returns an array that maps table names with the number of rows
* that will be deleted.
*
* @param int $deleteLogsOlderThan The number of days after which log entires are considered old.
* Visits and related data whose age is greater than this number
* will be purged.
* @return array
*
* TODO: purge estimate uses max idvisit w/ time, but purge does not, so estimate may be less accurate.
* to be more accurate, it should use the same strategy as purgeData(), but this could be very slow.
*/
public function getPurgeEstimate($deleteLogsOlderThan)
{
$result = array();
// deal w/ log tables that will be purged
$maxIdVisit = $this->getDeleteIdVisitOffset($deleteLogsOlderThan);
if (!empty($maxIdVisit)) {
foreach (self::getDeleteTableLogTables() as $table) {
// getting an estimate for log_action is not supported since it can take too long
if ($table != Common::prefixTable('log_action')) {
$rowCount = $this->getLogTableDeleteCount($table, $maxIdVisit);
if ($rowCount > 0) {
$result[$table] = $rowCount;
}
}
}
}
return $result;
}
/**
* get highest idVisit to delete rows from
* @return string
*/
private function getDeleteIdVisitOffset($deleteLogsOlderThan)
{
$logVisit = Common::prefixTable("log_visit");
// get max idvisit
$maxIdVisit = Db::fetchOne("SELECT MAX(idvisit) FROM $logVisit");
if (empty($maxIdVisit)) {
return false;
}
// select highest idvisit to delete from
$dateStart = Date::factory("today")->subDay($deleteLogsOlderThan);
$sql = "SELECT idvisit
FROM $logVisit
WHERE '" . $dateStart->toString('Y-m-d H:i:s') . "' > visit_last_action_time
AND idvisit <= ?
AND idvisit > ?
ORDER BY idvisit DESC
LIMIT 1";
return Db::segmentedFetchFirst($sql, $maxIdVisit, 0, -self::$selectSegmentSize);
}
private function getLogTableDeleteCount($table, $maxIdVisit)
{
$sql = "SELECT COUNT(*) FROM $table WHERE idvisit <= ?";
return (int) Db::fetchOne($sql, array($maxIdVisit));
}
// let's hardcode, since these are not dynamically created tables
public static function getDeleteTableLogTables()
{
$provider = StaticContainer::get('Piwik\Plugin\LogTablesProvider');
$result = array();
foreach ($provider->getAllLogTables() as $logTable) {
if ($logTable->getColumnToJoinOnIdVisit()) {
$result[] = Common::prefixTable($logTable->getName());
}
}
if (Db::isLockPrivilegeGranted()) {
$result[] = Common::prefixTable('log_action');
}
return $result;
}
}

View File

@ -0,0 +1,33 @@
<?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\PrivacyManager;
use Piwik\Menu\MenuAdmin;
use Piwik\Piwik;
class Menu extends \Piwik\Plugin\Menu
{
public function configureAdminMenu(MenuAdmin $menu)
{
if (Piwik::isUserHasSomeAdminAccess()) {
$category = 'PrivacyManager_MenuPrivacySettings';
$menu->registerMenuIcon($category, 'icon-locked-4');
$menu->addItem($category, null, array(), 2);
if (Piwik::hasUserSuperUserAccess()) {
$menu->addItem($category, 'PrivacyManager_AnonymizeData', $this->urlForAction('privacySettings'), 5);
}
$menu->addItem($category, 'PrivacyManager_UsersOptOut', $this->urlForAction('usersOptOut'), 10);
$menu->addItem($category, 'PrivacyManager_AskingForConsent', $this->urlForAction('consent'), 15);
$menu->addItem($category, 'PrivacyManager_GdprOverview', $this->urlForAction('gdprOverview'), 20);
$menu->addItem($category, 'PrivacyManager_GdprTools', $this->urlForAction('gdprTools'), 25);
}
}
}

View File

@ -0,0 +1,466 @@
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\PrivacyManager\Model;
use Piwik\Columns\Dimension;
use Piwik\Columns\Join\ActionNameJoin;
use Piwik\Common;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\LogTablesProvider;
use Piwik\Tracker\LogTable;
use Piwik\Tracker\PageUrl;
class DataSubjects
{
/**
* @var LogTablesProvider
*/
private $logTablesProvider;
public function __construct(LogTablesProvider $logTablesProvider)
{
$this->logTablesProvider = $logTablesProvider;
}
private function getDistinctIdSitesInTable($tableName, $maxIdSite)
{
$tableName = Common::prefixTable($tableName);
$idSitesLogTable = Db::fetchAll('SELECT DISTINCT idsite FROM ' . $tableName);
$idSitesLogTable = array_column($idSitesLogTable, 'idsite');
$idSitesLogTable = array_map('intval', $idSitesLogTable);
$idSitesLogTable = array_filter($idSitesLogTable, function ($idSite) use ($maxIdSite) {
return !empty($idSite) && $idSite <= $maxIdSite;
});
return $idSitesLogTable;
}
public function deleteDataSubjectsForDeletedSites($allExistingIdSites)
{
if (empty($allExistingIdSites)) {
return array();
}
$allExistingIdSites = array_map('intval', $allExistingIdSites);
$maxIdSite = max($allExistingIdSites);
$results = [];
$idSitesLogVisit = $this->getDistinctIdSitesInTable('log_visit', $maxIdSite);
$idSitesLogVisitAction = $this->getDistinctIdSitesInTable('log_link_visit_action', $maxIdSite);
$idSitesLogConversion = $this->getDistinctIdSitesInTable('log_conversion', $maxIdSite);
$idSitesUsed = array_unique(array_merge($idSitesLogVisit, $idSitesLogVisitAction, $idSitesLogConversion));
$idSitesNoLongerExisting = array_diff($idSitesUsed, $allExistingIdSites);
if (empty($idSitesNoLongerExisting)) {
// nothing to be deleted... if there is no entry for that table in log_visit or log_link_visit_action
// then there shouldn't be anything to be deleted in other tables either
return array();
}
$logTables = $this->getLogTablesToDeleteFrom();
$results = array_merge($results, $this->deleteLogDataFrom($logTables, function ($tableToSelectFrom) use ($idSitesNoLongerExisting) {
$idSitesNoLongerExisting = array_map('intval', $idSitesNoLongerExisting);
return [$tableToSelectFrom . '.idsite in ('. implode(',', $idSitesNoLongerExisting).')', []];
}));
krsort($results); // make sure test results are always in same order
return $results;
}
public function deleteDataSubjects($visits)
{
if (empty($visits)) {
return array();
}
$results = array();
/**
* Lets you delete data subjects to make your plugin GDPR compliant.
* This can be useful if you have developed a plugin which stores any data for visits but doesn't
* use any core logic to store this data. If core API's are used, for example log tables, then the data may
* be deleted automatically.
*
* **Example**
*
* public function deleteDataSubjects(&$result, $visitsToDelete)
* {
* $numDeletes = $this->deleteVisits($visitsToDelete)
* $result['myplugin'] = $numDeletes;
* }
*
* @param array &$results An array storing the result of how much data was deleted for .
* @param array &$visits An array with multiple visit entries containing an idvisit and idsite each. The data
* for these visits is requested to be deleted.
*/
Piwik::postEvent('PrivacyManager.deleteDataSubjects', array(&$results, $visits));
$logTables = $this->getLogTablesToDeleteFrom();
$deleteCounts = $this->deleteLogDataFrom($logTables, function ($tableToSelectFrom) use ($visits) {
return $this->visitsToWhereAndBind($tableToSelectFrom, $visits);
});
$results = array_merge($results, $deleteCounts);
krsort($results); // make sure test results are always in same order
return $results;
}
private function getLogTablesToDeleteFrom()
{
$logTables = $this->logTablesProvider->getAllLogTables();
// log_action will be deleted via cron job automatically if the action is no longer in use
$logTables = array_filter($logTables, function (LogTable $table) {
return $table->getName() != 'log_action';
});
$logTables = $this->sortLogTablesToEnsureDataErasureFromAllTablesIsPossible($logTables);
return $logTables;
}
/**
* @param LogTable[] $logTables
* @param callable $generateWhere
* @throws \Zend_Db_Statement_Exception
*/
private function deleteLogDataFrom($logTables, callable $generateWhere)
{
$results = [];
foreach ($logTables as $logTable) {
$logTableName = $logTable->getName();
$from = array($logTableName);
$tableToSelect = $this->findNeededTables($logTable, $from);
if (!$tableToSelect) {
throw new \Exception('Cannot join table ' . $logTable->getName());
}
list($where, $bind) = $generateWhere($tableToSelect);
$sql = "DELETE $logTableName FROM " . $this->makeFromStatement($from) . " WHERE $where";
$result = Db::query($sql, $bind)->rowCount();
$results[$logTableName] = $result;
}
return $results;
}
/**
* @param LogTable[] $logTables
* @return LogTable[]
*/
private function sortLogTablesToEnsureDataErasureFromAllTablesIsPossible($logTables)
{
// we need to make sure to delete eg first entries from a table log_form_field before log_form...
// otherwise when deleting log_form entries first, the log_form_field entries that belong to a requested visit
// cannot be deleted anymore as the links would be all gone. We need to make sure to delete from log_visit last
// and log_link_visit_action second to last.
usort($logTables, function ($a, $b) {
/** @var LogTable $a */
/** @var LogTable $b */
$aName = $a->getName();
$bName = $b->getName();
if ($bName === 'log_visit') {
return -1;
} else if ($aName === 'log_visit') {
return 1;
} else if ($bName === 'log_link_visit_action') {
return -1;
} else if ($aName === 'log_link_visit_action') {
return 1;
}
$aWays = $a->getWaysToJoinToOtherLogTables();
foreach ($aWays as $table => $column) {
if ($table === $bName) {
return -1;
}
}
$bWays = $b->getWaysToJoinToOtherLogTables();
foreach ($bWays as $table => $column) {
if ($table === $aName) {
return 1;
}
}
if ($bWays && !$aWays) {
return 1;
}
if (!$bWays && $aWays) {
return -1;
}
return 0;
});
return $logTables;
}
public function exportDataSubjects($visits)
{
if (empty($visits)) {
return array();
}
$logTables = $this->logTablesProvider->getAllLogTables();
$logTables = $this->sortLogTablesToEnsureDataErasureFromAllTablesIsPossible($logTables);
$logTables = array_reverse($logTables); // we want to list most important tables first
/** @var LogTable[] $logTables */
$dimensions = Dimension::getAllDimensions();
$results = array();
foreach ($logTables as $logTable) {
$logTableName = $logTable->getName();
if ('log_action' === $logTableName) {
continue; // we export these entries further below
}
$from = array($logTableName);
$tableToSelect = $this->findNeededTables($logTable, $from);
if (!$tableToSelect) {
// cannot join this table automatically, we do not fail as this would break the feature entirely
// when eg not all third party plugins are updated to latest version etc
continue;
}
list($where, $bind) = $this->visitsToWhereAndBind($tableToSelect, $visits);
$select = array();
$cols = DbHelper::getTableColumns(Common::prefixTable($logTableName));
ksort($cols); // make sure test results will be always in same order
$binaryFields = array();
$dimensionPerCol = array();
foreach ($cols as $col => $config) {
foreach ($dimensions as $dimension) {
if ($dimension->getDbTableName() === $logTableName && $dimension->getColumnName() === $col) {
if ($dimension->getType() === Dimension::TYPE_BINARY) {
$binaryFields[] = $col;
}
$dimensionPerCol[$col] = $dimension;
break;
}
}
if (!empty($config['Type']) && strpos(strtolower($config['Type']), 'binary') !== false) {
$binaryFields[] = $col;
}
$select[] = sprintf('`%s`.`%s`', $logTableName, $col);
}
if (!isset($cols['idsite'])) {
$select[] = sprintf('`%s`.`idsite`', $tableToSelect);
}
$binaryFields = array_unique($binaryFields);
$select = implode(',', $select);
$sql = "SELECT $select FROM " . $this->makeFromStatement($from) . ' WHERE ' . $where;
$idFields = $logTable->getIdColumn();
if (!empty($idFields)) {
if (!is_array($idFields)) {
$idFields = array($idFields);
}
$sql .= ' ORDER BY ';
foreach ($idFields as $field) {
$sql .= " `$logTableName`.`$field`,";
}
$sql = rtrim($sql, ',');
}
$result = Db::fetchAll($sql, $bind);
$numResults = count($result);
for ($index = 0; $index < $numResults; $index++) {
foreach ($binaryFields as $binaryField) {
if (isset($result[$index][$binaryField])) {
$result[$index][$binaryField] = bin2hex($result[$index][$binaryField]);
}
}
foreach ($result[$index] as $rowColumn => $rowValue) {
if (isset($dimensionPerCol[$rowColumn])) {
$result[$index][$rowColumn] = $dimensionPerCol[$rowColumn]->formatValue($rowValue, $result[$index]['idsite'], new Formatter());
} else if (!empty($rowValue)) {
// we try to auto detect uncompressed values so plugins have to do less themselves. makes it a bit slower but should be fine
$testValue = @gzuncompress($rowValue);
if ($testValue !== false) {
$result[$index][$rowColumn] = $testValue;
}
}
if ($result[$index][$rowColumn] === null) {
unset($result[$index][$rowColumn]);
}
}
}
$results[$logTableName] = $result;
}
foreach ($dimensions as $dimension) {
$join = $dimension->getDbColumnJoin();
$dimensionColumn = $dimension->getColumnName();
$dimensionTable = $dimension->getDbTableName();
$dimensionLogTable = $this->logTablesProvider->getLogTable($dimensionTable);
if ($join && $join instanceof ActionNameJoin && $dimensionColumn && $dimensionTable && $dimensionLogTable && $dimensionLogTable->getColumnToJoinOnIdVisit()) {
$from = array('log_action', array('table' => $dimensionTable, 'joinOn' => "log_action.idaction = `$dimensionTable`.`$dimensionColumn`"));
$tableToSelect = $this->findNeededTables($dimensionLogTable, $from);
list($where, $bind) = $this->visitsToWhereAndBind($tableToSelect, $visits);
$from = $this->makeFromStatement($from);
$sql = "SELECT log_action.idaction, log_action.name, log_action.url_prefix FROM $from WHERE $where";
$result = Db::fetchAll($sql, $bind);
if (!empty($result)) {
foreach ($result as $index => $val) {
if (isset($val['url_prefix'])) {
$result[$index]['name'] = PageUrl::reconstructNormalizedUrl($val['name'], $val['url_prefix']);
}
unset($result[$index]['url_prefix']);
}
$result = array_values(array_unique($result, SORT_REGULAR));
usort($result, function ($a1, $a2) {
return $a1['idaction'] > $a2['idaction'] ? 1 : -1;
});
$results['log_action_' . $dimensionTable.'_' . $dimensionColumn] = $result;
}
}
}
/**
* Lets you enrich the data export for one or multiple data subjects to make your plugin GDPR compliant.
* This can be useful if you have developed a plugin which stores any data for visits but doesn't
* use any core logic to store this data. If core API's are used, for example log tables, then the data may
* be exported automatically.
*
* **Example**
*
* public function exportDataSubjects(&export, $visitsToExport)
* {
* $export['myplugin'] = array();
* foreach($visitsToExport as $visit) {
* $export['myplugin'][] = 'exported data';
* }
* }
*
* @param array &$results An array containing the exported data subjects.
* @param array &$visits An array with multiple visit entries containing an idvisit and idsite each. The data
* for these visits is requested to be exported.
*/
Piwik::postEvent('PrivacyManager.exportDataSubjects', array(&$results, $visits));
krsort($results); // make sure test results are always in same order
return $results;
}
private function findNeededTables(LogTable $logTable, &$from)
{
$logTableName = $logTable->getName();
if ($logTable->getColumnToJoinOnIdVisit()) {
$tableToSelect = 'log_visit';
if ($logTableName !== 'log_visit') {
$from[] = array('table' => 'log_visit', 'joinOn' => sprintf('%s.%s = %s.%s', $logTableName, $logTable->getColumnToJoinOnIdVisit(), 'log_visit', 'idvisit'));
}
} elseif ($logTable->getColumnToJoinOnIdAction()) {
$tableToSelect = 'log_link_visit_action';
if ($logTableName !== 'log_link_visit_action') {
$from[] = array('table' => 'log_link_visit_action', 'joinOn' => sprintf('%s.%s = %s.%s', $logTableName, $logTable->getColumnToJoinOnIdAction(), 'log_link_visit_action', 'idaction_url'));
}
} else {
$tableToSelect = $this->joinNonCoreTable($logTable, $from);
}
return $tableToSelect;
}
private function makeFromStatement($from)
{
$firstTable = array_shift($from);
$fromStatement = Common::prefixTable($firstTable) . ' ' . $firstTable;
foreach ($from as $tbl) {
if (is_array($tbl)) {
$fromStatement .= ' LEFT JOIN ' . Common::prefixTable($tbl['table']) . ' ' . $tbl['table'] . ' ON ' . $tbl['joinOn'] . ' ';
} else {
$fromStatement .= Common::prefixTable($firstTable) . ' ' . $firstTable;
}
}
return $fromStatement;
}
private function visitsToWhereAndBind($tableToSelect, $visits)
{
$where = array();
$bind = array();
foreach ($visits as $visit) {
$where[] = '(' . $tableToSelect . '.idsite = ? AND ' . $tableToSelect . '.idvisit = ?)';
$bind[] = $visit['idsite'];
$bind[] = $visit['idvisit'];
}
$where = implode(' OR ', $where);
return array($where, $bind);
}
private function joinNonCoreTable(LogTable $logTable, &$from)
{
$logTableName = $logTable->getName();
$nonCoreTables = $logTable->getWaysToJoinToOtherLogTables();
if (empty($nonCoreTables)) {
return;
}
foreach ($nonCoreTables as $tableName => $joinColumn) {
$joinTable = $this->logTablesProvider->getLogTable($tableName);
if ($joinTable->getColumnToJoinOnIdVisit()) {
$from[] = array(
'table' => $joinTable->getName(),
'joinOn' => sprintf('%s.%s = %s.%s', $logTableName, $joinColumn, $joinTable->getName(), $joinColumn)
);
if ($joinTable->getName() !== 'log_visit') {
$from[] = array(
'table' => 'log_visit',
'joinOn' => sprintf('%s.%s = %s.%s', $joinTable->getName(), $joinTable->getColumnToJoinOnIdVisit(), 'log_visit', $joinTable->getColumnToJoinOnIdVisit())
);
}
$tableToSelect = 'log_visit';
return $tableToSelect;
} else {
$subFroms = array();
$tableToSelect = $this->joinNonCoreTable($joinTable, $subFroms);
if ($tableToSelect) {
$from[] = array(
'table' => $joinTable->getName(),
'joinOn' => sprintf('%s.%s = %s.%s', $logTableName, $joinColumn, $joinTable->getName(), $joinColumn)
);
foreach ($subFroms as $subFrom) {
$from[] = $subFrom;
}
return $tableToSelect;
}
}
}
}
}

View File

@ -0,0 +1,305 @@
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\PrivacyManager\Model;
use Piwik\Common;
use Piwik\Date;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Period\Factory as PeriodFactory;
use Piwik\Plugins\PrivacyManager\Dao\LogDataAnonymizer;
use Piwik\Site;
use Piwik\Validators\BaseValidator;
use Piwik\Validators\NotEmpty;
class LogDataAnonymizations
{
/**
* @var null|callable
*/
private $onOutputCallback;
/**
* @var LogDataAnonymizer
*/
private $logDataAnonymizer;
private $tablePrefixed;
public function __construct(LogDataAnonymizer $logDataAnonymizer)
{
$this->logDataAnonymizer = $logDataAnonymizer;
$this->tablePrefixed = Common::prefixTable(self::getDbTableName());
}
public static function getDbTableName()
{
return 'privacy_logdata_anonymizations';
}
public function install()
{
DbHelper::createTable(self::getDbTableName(), "
`idlogdata_anonymization` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`idsites` TEXT NULL DEFAULT NULL,
`date_start` DATETIME NOT NULL,
`date_end` DATETIME NOT NULL,
`anonymize_ip` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
`anonymize_location` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
`anonymize_userid` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
`unset_visit_columns` TEXT NOT NULL DEFAULT '',
`unset_link_visit_action_columns` TEXT NOT NULL DEFAULT '',
`output` MEDIUMTEXT NULL DEFAULT NULL,
`scheduled_date` DATETIME NULL,
`job_start_date` DATETIME NULL,
`job_finish_date` DATETIME NULL,
`requester` VARCHAR(100) NOT NULL DEFAULT '',
PRIMARY KEY(`idlogdata_anonymization`), KEY(`job_start_date`)");
}
public function uninstall()
{
Db::query(sprintf('DROP TABLE IF EXISTS `%s`', $this->tablePrefixed));
}
public function getAllEntries()
{
$entries = Db::fetchAll(sprintf('SELECT * FROM %s', $this->tablePrefixed));
return $this->enrichEntries($entries);
}
public function getEntry($idLogData)
{
$scheduled = Db::fetchRow(sprintf('SELECT * FROM %s WHERE idlogdata_anonymization = ?', $this->tablePrefixed), array($idLogData));
return $this->enrichEntry($scheduled);
}
public function getNextScheduledAnonymizationId()
{
$scheduled = Db::fetchOne(sprintf('SELECT idlogdata_anonymization FROM %s WHERE job_start_date is null ORDER BY idlogdata_anonymization asc LIMIT 1', $this->tablePrefixed));
if (!empty($scheduled)) {
return (int) $scheduled;
}
return $scheduled;
}
private function enrichEntries($entries)
{
if (empty($entries)) {
return array();
}
foreach ($entries as $index => $entry) {
$entries[$index] = $this->enrichEntry($entry);
}
return $entries;
}
private function enrichEntry($entry)
{
if (empty($entry)) {
return $entry;
}
$entry['sites'] = array();
if (!empty($entry['idsites'])) {
$entry['idsites'] = json_decode($entry['idsites'], true);
foreach ($entry['idsites'] as $idSite) {
try {
$entry['sites'][] = Site::getNameFor($idSite);
} catch (\Exception$e) {
// site might be deleted
$entry['sites'][] = 'Site ID: '. $idSite;
}
}
} else {
$entry['idsites'] = null;
$entry['sites'][] = 'All Websites';
}
if (!empty($entry['unset_visit_columns'])) {
$entry['unset_visit_columns'] = json_decode($entry['unset_visit_columns'], true);
} else {
$entry['unset_visit_columns'] = array();
}
if (!empty($entry['unset_link_visit_action_columns'])) {
$entry['unset_link_visit_action_columns'] = json_decode($entry['unset_link_visit_action_columns'], true);
} else {
$entry['unset_link_visit_action_columns'] = array();
}
$entry['anonymize_ip'] = !empty($entry['anonymize_ip']);
$entry['anonymize_location'] = !empty($entry['anonymize_location']);
$entry['anonymize_userid'] = !empty($entry['anonymize_userid']);
$entry['idlogdata_anonymization'] = (int) $entry['idlogdata_anonymization'];
return $entry;
}
public function scheduleEntry($requester, $idSites, $dateString, $anonymizeIp, $anonymizeLocation, $anonymizeUserId, $unsetVisitColumns, $unsetLinkVisitActionColumns, $willBeStartedNow = false)
{
BaseValidator::check('date', $dateString, [new NotEmpty()]);
list($startDate, $endDate) = $this->getStartAndEndDate($dateString); // make sure valid date
if (!empty($unsetVisitColumns)) {
$this->logDataAnonymizer->checkAllVisitColumns($unsetVisitColumns);
} else {
$unsetVisitColumns = array();
}
if (!empty($unsetLinkVisitActionColumns)) {
$this->logDataAnonymizer->checkAllLinkVisitActionColumns($unsetLinkVisitActionColumns);
} else {
$unsetLinkVisitActionColumns = array();
}
if (!empty($idSites) && $idSites !== 'all') {
$idSites = array_map('intval', $idSites);
$idSites = json_encode($idSites);
} else {
$idSites = null;
}
if (!$anonymizeIp && !$anonymizeLocation && !$anonymizeUserId && empty($unsetVisitColumns) && empty($unsetLinkVisitActionColumns)) {
throw new \Exception('Nothing is selected to be anonymized');
}
$db = Db::get();
$now = Date::now()->getDatetime();
$values = array(
'idsites' => $idSites,
'date_start' => $startDate,
'date_end' => $endDate,
'anonymize_ip' => !empty($anonymizeIp) ? 1 : 0,
'anonymize_location' => !empty($anonymizeLocation) ? 1 : 0,
'anonymize_userid' => !empty($anonymizeUserId) ? 1 : 0,
'unset_visit_columns' => json_encode($unsetVisitColumns),
'unset_link_visit_action_columns' => json_encode($unsetLinkVisitActionColumns),
'scheduled_date' => Date::now()->getDatetime(),
'job_start_date' => $willBeStartedNow ? $now : null, // we set a start_date when executing from CLI to avoid a race condition to prevent a task from operating a scheduled entry
'requester' => $requester,
);
$columns = implode('`,`', array_keys($values));
$fields = Common::getSqlStringFieldsArray($values);
$sql = sprintf('INSERT INTO %s (`%s`) VALUES(%s)', $this->tablePrefixed, $columns, $fields);
$bind = array_values($values);
$db->query($sql, $bind);
$id = $db->lastInsertId();
return (int) $id;
}
private function updateEntry($idLogDataAnonymization, $field, $value)
{
$query = sprintf('UPDATE %s SET %s = ? WHERE idlogdata_anonymization = ?', $this->tablePrefixed, $field);
Db::query($query, array($value, $idLogDataAnonymization));
}
public function setCallbackOnOutput($callback)
{
$this->onOutputCallback = $callback;
}
private function appendToOutput($index, &$schedule, $message)
{
$schedule['output'] .= $message . "\n";
$this->updateEntry($index, 'output', $schedule['output']);
if ($this->onOutputCallback && is_callable($this->onOutputCallback)) {
call_user_func($this->onOutputCallback, $message);
}
}
public function getStartAndEndDate($date)
{
if (strpos($date, ',') === false) {
$period = PeriodFactory::build('day', $date);
} else {
$period = PeriodFactory::build('range', $date);
}
$startDate = $period->getDateTimeStart()->getDatetime();
$endDate = $period->getDateTimeEnd()->getDatetime();
return array($startDate, $endDate);
}
public function executeScheduledEntry($idLogData)
{
$schedule = $this->getEntry($idLogData);
if (empty($schedule)) {
throw new \Exception('Entry not found');
}
$this->updateEntry($idLogData, 'job_start_date', Date::now()->getDatetime());
$idSites = $schedule['idsites'];
$startDate = $schedule['date_start'];
$endDate = $schedule['date_end'];
if (empty($idSites)) {
$idSites = null;
$this->appendToOutput($idLogData, $schedule, "Running behaviour on all sites.");
} else {
$this->appendToOutput($idLogData, $schedule, 'Running behaviour on these sites: ' . implode(', ', $idSites));
}
$this->appendToOutput($idLogData, $schedule, sprintf("Applying this to visits between '%s' and '%s'.", $startDate, $endDate));
if ($schedule['anonymize_ip'] || $schedule['anonymize_location'] || $schedule['anonymize_userid']) {
$this->appendToOutput($idLogData, $schedule, 'Starting to anonymize visit information.');
try {
$numAnonymized = $this->logDataAnonymizer->anonymizeVisitInformation($idSites, $startDate, $endDate, $schedule['anonymize_ip'], $schedule['anonymize_location'], $schedule['anonymize_userid']);
$this->appendToOutput($idLogData, $schedule, 'Number of anonymized IP and/or location and/or User ID: ' . $numAnonymized);
} catch (\Exception $e) {
$this->appendToOutput($idLogData, $schedule, 'Failed to anonymize IP and/or location and/or User ID:' . $e->getMessage());
}
}
if (!empty($schedule['unset_visit_columns'])) {
try {
$this->appendToOutput($idLogData, $schedule, 'Starting to unset log_visit table entries.');
$numColumnsUnset = $this->logDataAnonymizer->unsetLogVisitTableColumns($idSites, $startDate, $endDate, $schedule['unset_visit_columns']);
$this->appendToOutput($idLogData, $schedule, 'Number of unset log_visit table entries: ' . $numColumnsUnset);
} catch (\Exception $e) {
$this->appendToOutput($idLogData, $schedule, 'Failed to unset log_visit table entries:' . $e->getMessage());
}
try {
$this->appendToOutput($idLogData, $schedule, 'Starting to unset log_conversion table entries (if possible).');
$numColumnsUnset = $this->logDataAnonymizer->unsetLogConversionTableColumns($idSites, $startDate, $endDate, $schedule['unset_visit_columns']);
$this->appendToOutput($idLogData, $schedule, 'Number of unset log_conversion table entries: ' . $numColumnsUnset);
} catch (\Exception $e) {
$this->appendToOutput($idLogData, $schedule, 'Failed to unset log_conversion table entries:' . $e->getMessage());
}
}
if (!empty($schedule['unset_link_visit_action_columns'])) {
try {
$this->appendToOutput($idLogData, $schedule, 'Starting to unset log_link_visit_action table entries.');
$numColumnsUnset = $this->logDataAnonymizer->unsetLogLinkVisitActionColumns($idSites, $startDate, $endDate, $schedule['unset_link_visit_action_columns']);
$this->appendToOutput($idLogData, $schedule, 'Number of unset log_link_visit_action table entries: ' . $numColumnsUnset);
} catch (\Exception $e) {
$this->appendToOutput($idLogData, $schedule, 'Failed to unset log_link_visit_action table entries:' . $e->getMessage());
}
}
$this->updateEntry($idLogData, 'job_finish_date', Date::now()->getDatetime());
}
}

View File

@ -0,0 +1,650 @@
<?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\PrivacyManager;
use HTML_QuickForm2_DataSource_Array;
use Piwik\Common;
use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
use Piwik\DataTable;
use Piwik\DataTable\DataTableInterface;
use Piwik\Date;
use Piwik\Db;
use Piwik\Metrics;
use Piwik\Option;
use Piwik\Period;
use Piwik\Period\Range;
use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\Plugins\Goals\Archiver;
use Piwik\Plugins\Installation\FormDefaultSettings;
use Piwik\Site;
use Piwik\Tracker\GoalManager;
use Piwik\View;
/**
* Specifically include this for Tracker API (which does not use autoloader)
*/
require_once PIWIK_INCLUDE_PATH . '/plugins/PrivacyManager/DoNotTrackHeaderChecker.php';
require_once PIWIK_INCLUDE_PATH . '/plugins/PrivacyManager/IPAnonymizer.php';
/**
*/
class PrivacyManager extends Plugin
{
const OPTION_LAST_DELETE_PIWIK_LOGS = "lastDelete_piwik_logs";
const OPTION_LAST_DELETE_UNUSED_LOG_ACTIONS = "lastDelete_piwik_unused_log_actions";
const OPTION_LAST_DELETE_PIWIK_REPORTS = 'lastDelete_piwik_reports';
const OPTION_LAST_DELETE_PIWIK_LOGS_INITIAL = "lastDelete_piwik_logs_initial";
const OPTION_USERID_SALT = 'useridsalt';
// options for data purging feature array[configName => configSection]
public static $purgeDataOptions = array(
'delete_logs_enable' => 'Deletelogs',
'delete_logs_schedule_lowest_interval' => 'Deletelogs',
'delete_logs_older_than' => 'Deletelogs',
'delete_logs_max_rows_per_query' => 'Deletelogs',
'delete_logs_unused_actions_schedule_lowest_interval' => 'Deletelogs',
'enable_auto_database_size_estimate' => 'Deletelogs',
'enable_database_size_estimate' => 'Deletelogs',
'delete_reports_enable' => 'Deletereports',
'delete_reports_older_than' => 'Deletereports',
'delete_reports_keep_basic_metrics' => 'Deletereports',
'delete_reports_keep_day_reports' => 'Deletereports',
'delete_reports_keep_week_reports' => 'Deletereports',
'delete_reports_keep_month_reports' => 'Deletereports',
'delete_reports_keep_year_reports' => 'Deletereports',
'delete_reports_keep_range_reports' => 'Deletereports',
'delete_reports_keep_segment_reports' => 'Deletereports',
);
private $dntChecker = null;
private $ipAnonymizer = null;
/**
* Constructor.
*/
public function __construct()
{
parent::__construct();
$this->dntChecker = new DoNotTrackHeaderChecker();
$this->ipAnonymizer = new IPAnonymizer();
}
public function install()
{
StaticContainer::get('Piwik\Plugins\PrivacyManager\Model\LogDataAnonymizations')->install();
}
public function uninstall()
{
StaticContainer::get('Piwik\Plugins\PrivacyManager\Model\LogDataAnonymizations')->install();
}
/**
* Returns true if it is likely that the data for this report has been purged and if the
* user should be told about that.
*
* In order for this function to return true, the following must also be true:
* - The data table for this report must either be empty or not have been fetched.
* - The period of this report is not a multiple period.
* - The date of this report must be older than the delete_reports_older_than config option.
* @param DataTableInterface $dataTable
* @return bool
*/
public static function hasReportBeenPurged($dataTable)
{
$strPeriod = Common::getRequestVar('period', false);
$strDate = Common::getRequestVar('date', false);
if (false !== $strPeriod
&& false !== $strDate
&& (is_null($dataTable)
|| (!empty($dataTable) && $dataTable->getRowsCount() == 0))
) {
$reportDate = self::getReportDate($strPeriod, $strDate);
if (empty($reportDate)) {
return false;
}
$reportYear = $reportDate->toString('Y');
$reportMonth = $reportDate->toString('m');
if (static::shouldReportBePurged($reportYear, $reportMonth)) {
return true;
}
}
return false;
}
/**
* @param DataTable $dataTable
* @param int|null $logsOlderThan If set, it is assumed that log deletion is enabled with the given amount of days
* @return bool|void
*/
public static function haveLogsBeenPurged($dataTable, $logsOlderThan = null)
{
if (!empty($dataTable) && $dataTable->getRowsCount() != 0) {
return false;
}
if ($logsOlderThan === null) {
$settings = PrivacyManager::getPurgeDataSettings();
if ($settings['delete_logs_enable'] == 0) {
return false;
}
$logsOlderThan = $settings['delete_logs_older_than'];
}
$logsOlderThan = (int) $logsOlderThan;
$strPeriod = Common::getRequestVar('period', false);
$strDate = Common::getRequestVar('date', false);
if (false === $strPeriod || false === $strDate) {
return false;
}
$logsOlderThan = Date::now()->subDay(1 + $logsOlderThan);
$reportDate = self::getReportDate($strPeriod, $strDate);
if (empty($reportDate)) {
return false;
}
return $reportDate->isEarlier($logsOlderThan);
}
/**
* @see Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
return array(
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
'Tracker.setTrackerCacheGeneral' => 'setTrackerCacheGeneral',
'Tracker.isExcludedVisit' => array($this->dntChecker, 'checkHeaderInTracker'),
'Tracker.setVisitorIp' => array($this->ipAnonymizer, 'setVisitorIpAddress'),
'Installation.defaultSettingsForm.init' => 'installationFormInit',
'Installation.defaultSettingsForm.submit' => 'installationFormSubmit',
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
'Template.pageFooter' => 'renderPrivacyPolicyLinks',
);
}
public function isTrackerPlugin()
{
return true;
}
public function getClientSideTranslationKeys(&$translationKeys)
{
$translationKeys[] = 'CoreAdminHome_SettingsSaveSuccess';
$translationKeys[] = 'CoreAdminHome_OptOutExplanation';
$translationKeys[] = 'CoreAdminHome_OptOutExplanationIntro';
}
public function setTrackerCacheGeneral(&$cacheContent)
{
$config = new Config();
$cacheContent = $config->setTrackerCacheGeneral($cacheContent);
$cacheContent[self::OPTION_USERID_SALT] = self::getUserIdSalt();
}
public function getJsFiles(&$jsFiles)
{
$jsFiles[] = "plugins/PrivacyManager/angularjs/report-deletion.model.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/schedule-report-deletion/schedule-report-deletion.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/anonymize-ip/anonymize-ip.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/do-not-track-preference/do-not-track-preference.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/delete-old-logs/delete-old-logs.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/delete-old-reports/delete-old-reports.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.controller.js";
$jsFiles[] = "plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.js";
}
public function getStylesheetFiles(&$stylesheets)
{
$stylesheets[] = "plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.less";
$stylesheets[] = "plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.less";
$stylesheets[] = "plugins/PrivacyManager/stylesheets/gdprOverview.less";
$stylesheets[] = "plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.less";
$stylesheets[] = "plugins/PrivacyManager/stylesheets/footerLinks.less";
}
/**
* Customize the Installation "default settings" form.
*
* @param FormDefaultSettings $form
*/
public function installationFormInit(FormDefaultSettings $form)
{
$form->addElement('checkbox', 'do_not_track', null,
array(
'content' => '<div class="form-help">' . Piwik::translate('PrivacyManager_DoNotTrack_EnabledMoreInfo') . '</div> &nbsp;&nbsp;' . Piwik::translate('PrivacyManager_DoNotTrack_Enable')
));
$form->addElement('checkbox', 'anonymise_ip', null,
array(
'content' => '<div class="form-help">' . Piwik::translate('PrivacyManager_AnonymizeIpExtendedHelp', array('213.34.51.91', '213.34.0.0')) . '</div> &nbsp;&nbsp;' . Piwik::translate('PrivacyManager_AnonymizeIpInlineHelp')
));
// default values
$form->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
'do_not_track' => $this->dntChecker->isActive(),
'anonymise_ip' => IPAnonymizer::isActive(),
)));
}
/**
* Process the submit on the Installation "default settings" form.
*
* @param FormDefaultSettings $form
*/
public function installationFormSubmit(FormDefaultSettings $form)
{
$doNotTrack = (bool) $form->getSubmitValue('do_not_track');
$dntChecker = new DoNotTrackHeaderChecker();
if ($doNotTrack) {
$dntChecker->activate();
} else {
$dntChecker->deactivate();
}
$anonymiseIp = (bool) $form->getSubmitValue('anonymise_ip');
if ($anonymiseIp) {
IPAnonymizer::activate();
} else {
IPAnonymizer::deactivate();
}
}
/**
* Returns the settings for the data purging feature.
*
* @return array
*/
public static function getPurgeDataSettings()
{
$settings = array();
// load settings from ini config
$config = PiwikConfig::getInstance();
foreach (self::$purgeDataOptions as $configKey => $configSection) {
$values = $config->$configSection;
$settings[$configKey] = $values[$configKey];
}
if (!Controller::isDataPurgeSettingsEnabled()) {
return $settings;
}
// load the settings for the data purging settings
foreach (self::$purgeDataOptions as $configName => $configSection) {
$value = Option::get($configName);
if ($value !== false) {
$settings[$configName] = $value;
}
}
return $settings;
}
/**
* Saves the supplied data purging settings.
*
* @param array $settings The settings to save.
*/
public static function savePurgeDataSettings($settings)
{
foreach (self::$purgeDataOptions as $configName => $configSection) {
if (isset($settings[$configName])) {
Option::set($configName, $settings[$configName]);
}
}
}
/**
* Deletes old archived data (reports & metrics).
*
* Archive tables are not optimized after, as that is handled by a separate scheduled task
* in CoreAdminHome. This is a scheduled task and will only execute every N days. The number
* of days is determined by the delete_logs_schedule_lowest_interval config option.
*
* If delete_reports_enable is set to 1, old archive data is deleted. The following
* config options can tweak this behavior:
* - delete_reports_older_than: The number of months after which archive data is considered
* old. The current month is not considered when applying this
* value.
* - delete_reports_keep_basic_metrics: If set to 1, keeps certain metric data. Right now,
* all metric data is kept.
* - delete_reports_keep_day_reports: If set to 1, keeps old daily reports.
* - delete_reports_keep_week_reports: If set to 1, keeps old weekly reports.
* - delete_reports_keep_month_reports: If set to 1, keeps old monthly reports.
* - delete_reports_keep_year_reports: If set to 1, keeps old yearly reports.
*/
public function deleteReportData()
{
$settings = self::getPurgeDataSettings();
// Make sure, data deletion is enabled
if ($settings['delete_reports_enable'] == 0) {
return false;
}
// make sure purging should run at this time (unless this is a forced purge)
if (!$this->shouldPurgeData($settings, self::OPTION_LAST_DELETE_PIWIK_REPORTS, 'delete_logs_schedule_lowest_interval')) {
return false;
}
// set last run time
Option::set(self::OPTION_LAST_DELETE_PIWIK_REPORTS, Date::factory('today')->getTimestamp());
ReportsPurger::make($settings, self::getAllMetricsToKeep())->purgeData();
return true;
}
/**
* Deletes old raw data based on the options set in the Deletelogs config
* section. This is a scheduled task and will only execute every N days. The number
* of days is determined by the delete_logs_schedule_lowest_interval config option.
*
* If delete_logs_enable is set to 1, old data in the log_visit, log_conversion,
* log_conversion_item and log_link_visit_action tables is deleted. The following
* options can tweak this behavior:
* - delete_logs_older_than: The number of days after which raw data is considered old.
*
* @ToDo: return number of Rows deleted in last run; Display age of "oldest" row to help the user setting
* the day offset;
*/
public function deleteLogData()
{
$settings = self::getPurgeDataSettings();
// Make sure, data deletion is enabled
if ($settings['delete_logs_enable'] == 0) {
return false;
}
// make sure purging should run at this time
if (!$this->shouldPurgeData($settings, self::OPTION_LAST_DELETE_PIWIK_LOGS, 'delete_logs_schedule_lowest_interval')) {
return false;
}
/*
* Tell the DB that log deletion has run BEFORE deletion is executed;
* If deletion / table optimization exceeds execution time, other tasks maybe prevented of being executed
* every time, when the schedule is triggered.
*/
$lastDeleteDate = Date::factory("today")->getTimestamp();
Option::set(self::OPTION_LAST_DELETE_PIWIK_LOGS, $lastDeleteDate);
$shouldDeleteUnusedLogActions = $this->shouldPurgeData($settings, self::OPTION_LAST_DELETE_UNUSED_LOG_ACTIONS, 'delete_logs_unused_actions_schedule_lowest_interval');
if ($shouldDeleteUnusedLogActions) {
Option::set(self::OPTION_LAST_DELETE_UNUSED_LOG_ACTIONS, $lastDeleteDate);
}
// execute the purge
/** @var LogDataPurger $logDataPurger */
$logDataPurger = StaticContainer::get('Piwik\Plugins\PrivacyManager\LogDataPurger');
$logDataPurger->purgeData($settings['delete_logs_older_than'], $shouldDeleteUnusedLogActions);
return true;
}
/**
* Returns an array describing what data would be purged if both raw data & report
* purging is invoked.
*
* The returned array maps table names with the number of rows that will be deleted.
* If the table name is mapped with -1, the table will be dropped.
*
* @param array $settings The config options to use in the estimate. If null, the real
* options are used.
* @return array
*/
public static function getPurgeEstimate($settings = null)
{
if (is_null($settings)) {
$settings = self::getPurgeDataSettings();
}
$result = array();
if ($settings['delete_logs_enable']) {
/** @var LogDataPurger $logDataPurger */
$logDataPurger = StaticContainer::get('Piwik\Plugins\PrivacyManager\LogDataPurger');
$result = array_merge($result, $logDataPurger->getPurgeEstimate($settings['delete_logs_older_than']));
}
if ($settings['delete_reports_enable']) {
$reportsPurger = ReportsPurger::make($settings, self::getAllMetricsToKeep());
$result = array_merge($result, $reportsPurger->getPurgeEstimate());
}
return $result;
}
private static function getReportDate($strPeriod, $strDate)
{
// if range, only look at the first date
if ($strPeriod == 'range') {
$idSite = Common::getRequestVar('idSite', '');
if (intval($idSite) != 0) {
$site = new Site($idSite);
$timezone = $site->getTimezone();
} else {
$timezone = 'UTC';
}
$period = new Range('range', $strDate, $timezone);
$reportDate = $period->getDateStart();
} elseif (Period::isMultiplePeriod($strDate, $strPeriod)) {
// if a multiple period, this function is irrelevant
return false;
} else {
// otherwise, use the date as given
$reportDate = Date::factory($strDate);
}
return $reportDate;
}
/**
* Returns true if a report with the given year & month should be purged or not.
*
* If reportsOlderThan is set to null or not supplied, this function will check if
* a report should be purged, based on existing configuration. In this case, if
* delete_reports_enable is set to 0, this function will return false.
*
* @param int $reportDateYear The year of the report in question.
* @param int $reportDateMonth The month of the report in question.
* @param int|Date $reportsOlderThan If an int, the number of months a report must be older than
* in order to be purged. If a date, the date a report must be
* older than in order to be purged.
* @return bool
*/
public static function shouldReportBePurged($reportDateYear, $reportDateMonth, $reportsOlderThan = null)
{
// if no 'older than' value/date was supplied, use existing config
if (is_null($reportsOlderThan)) {
// if report deletion is not enabled, the report shouldn't be purged
$settings = self::getPurgeDataSettings();
if ($settings['delete_reports_enable'] == 0) {
return false;
}
$reportsOlderThan = $settings['delete_reports_older_than'];
}
// if a integer was supplied, assume it is the number of months a report must be older than
if (!($reportsOlderThan instanceof Date)) {
$reportsOlderThan = Date::factory('today')->subMonth(1 + $reportsOlderThan);
}
return ReportsPurger::shouldReportBePurged(
$reportDateYear, $reportDateMonth, $reportsOlderThan);
}
/**
* Returns the general metrics to keep when the 'delete_reports_keep_basic_metrics'
* config is set to 1.
*/
private static function getMetricsToKeep()
{
return array('nb_uniq_visitors', 'nb_visits', 'nb_users', 'nb_actions', 'max_actions',
'sum_visit_length', 'bounce_count', 'nb_visits_converted', 'nb_conversions',
'revenue', 'quantity', 'price', 'orders');
}
/**
* Returns the goal metrics to keep when the 'delete_reports_keep_basic_metrics'
* config is set to 1.
*/
private static function getGoalMetricsToKeep()
{
// keep all goal metrics
return array_values(Metrics::$mappingFromIdToNameGoal);
}
/**
* Returns the names of metrics that should be kept when purging as they appear in
* archive tables.
*/
public static function getAllMetricsToKeep()
{
$metricsToKeep = self::getMetricsToKeep();
// convert goal metric names to correct archive names
if (Common::isGoalPluginEnabled()) {
$goalMetricsToKeep = self::getGoalMetricsToKeep();
$maxGoalId = self::getMaxGoalId();
// for each goal metric, there's a different name for each goal, including the overview,
// the order report & cart report
foreach ($goalMetricsToKeep as $metric) {
for ($i = 1; $i <= $maxGoalId; ++$i) // maxGoalId can be 0
{
$metricsToKeep[] = Archiver::getRecordName($metric, $i);
}
$metricsToKeep[] = Archiver::getRecordName($metric);
$metricsToKeep[] = Archiver::getRecordName($metric, GoalManager::IDGOAL_ORDER);
$metricsToKeep[] = Archiver::getRecordName($metric, GoalManager::IDGOAL_CART);
}
}
return $metricsToKeep;
}
/**
* Returns true if one of the purge data tasks should run now, false if it shouldn't.
*/
private function shouldPurgeData($settings, $lastRanOption, $setting)
{
// Log deletion may not run until it is once rescheduled (initial run). This is the
// only way to guarantee the calculated next scheduled deletion time.
$initialDelete = Option::get(self::OPTION_LAST_DELETE_PIWIK_LOGS_INITIAL);
if (empty($initialDelete)) {
Option::set(self::OPTION_LAST_DELETE_PIWIK_LOGS_INITIAL, 1);
return false;
}
// Make sure, log purging is allowed to run now
$lastDelete = Option::get($lastRanOption);
$deleteIntervalDays = $settings[$setting];
$deleteIntervalSeconds = $this->getDeleteIntervalInSeconds($deleteIntervalDays);
if ($lastDelete === false ||
$lastDelete === '' ||
((int)$lastDelete + $deleteIntervalSeconds) <= time()
) {
return true;
} else // not time to run data purge
{
return false;
}
}
function getDeleteIntervalInSeconds($deleteInterval)
{
return (int)$deleteInterval * 24 * 60 * 60;
}
private static function getMaxGoalId()
{
return Db::fetchOne("SELECT MAX(idgoal) FROM " . Common::prefixTable('goal'));
}
/**
* Returns a unique salt used for pseudonimisation of user id only
*
* @return string
*/
public static function getUserIdSalt()
{
$salt = Option::get(self::OPTION_USERID_SALT);
if (empty($salt)) {
$salt = Common::getRandomString($len = 40, $alphabet = "abcdefghijklmnoprstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ0123456789_-$");
Option::set(self::OPTION_USERID_SALT, $salt, 1);
}
return $salt;
}
public function renderPrivacyPolicyLinks(&$out)
{
$settings = new SystemSettings();
if (!$this->shouldRenderFooterLinks($settings)) {
return;
}
$privacyPolicyUrl = $settings->privacyPolicyUrl->getValue();
$termsAndConditionUrl = $settings->termsAndConditionUrl->getValue();
if (empty($privacyPolicyUrl) && empty($termsAndConditionUrl)) {
return;
}
$view = new View('@PrivacyManager/footerLinks.twig');
$view->privacyPolicyUrl = $privacyPolicyUrl;
$view->termsAndCondition = $termsAndConditionUrl;
$out .= $view->render();
}
private function shouldRenderFooterLinks(SystemSettings $settings)
{
if (Piwik::isUserIsAnonymous()) {
return true;
}
$module = Common::getRequestVar('module', false);
if ($module == 'Widgetize') {
return (bool)$settings->showInEmbeddedWidgets->getValue();
}
return false;
}
}

View File

@ -0,0 +1,390 @@
<?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\PrivacyManager;
use Piwik\Common;
use Piwik\DataAccess\ArchiveTableCreator;
use Piwik\Date;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Piwik;
/**
* Purges archived reports and metrics that are considered old.
*/
class ReportsPurger
{
// constant used in database purging estimate to signify a table should be dropped
const DROP_TABLE = -1;
/**
* The max set of rows each table scan select should query at one time.
*/
public static $selectSegmentSize = 100000;
/**
* The number of months after which report/metric data is considered old.
*/
private $deleteReportsOlderThan;
/**
* Whether to keep basic metrics or not.
*/
private $keepBasicMetrics;
/**
* Array of period types. Reports for these periods will not be purged.
*/
private $reportPeriodsToKeep;
/**
* Whether to keep reports for segments or not.
*/
private $keepSegmentReports;
/**
* The maximum number of rows to delete per DELETE query.
*/
private $maxRowsToDeletePerQuery;
/**
* List of metrics that should be kept when purging. If $keepBasicMetrics is true,
* these metrics will be saved.
*/
private $metricsToKeep;
/**
* Array that maps a year and month ('2012_01') with lists of archive IDs for segmented
* archives. Used to keep segmented reports when purging.
*/
private $segmentArchiveIds = null;
/**
* Constructor.
*
* @param int $deleteReportsOlderThan The number of months after which report/metric data
* is considered old.
* @param bool $keepBasicMetrics Whether to keep basic metrics or not.
* @param array $reportPeriodsToKeep Array of period types. Reports for these periods will not
* be purged.
* @param bool $keepSegmentReports Whether to keep reports for segments or not.
* @param array $metricsToKeep List of metrics that should be kept. if $keepBasicMetrics
* is true, these metrics will be saved.
* @param int $maxRowsToDeletePerQuery The maximum number of rows to delete per DELETE query.
*/
public function __construct($deleteReportsOlderThan, $keepBasicMetrics, $reportPeriodsToKeep,
$keepSegmentReports, $metricsToKeep, $maxRowsToDeletePerQuery)
{
$this->deleteReportsOlderThan = (int) $deleteReportsOlderThan;
$this->keepBasicMetrics = (bool) $keepBasicMetrics;
$this->reportPeriodsToKeep = $reportPeriodsToKeep;
$this->keepSegmentReports = (bool) $keepSegmentReports;
$this->metricsToKeep = $metricsToKeep;
$this->maxRowsToDeletePerQuery = (int) $maxRowsToDeletePerQuery;
}
/**
* Purges old report/metric data.
*
* If $keepBasicMetrics is false, old numeric tables will be dropped, otherwise only
* the metrics not in $metricsToKeep will be deleted.
*
* If $reportPeriodsToKeep is an empty array, old blob tables will be dropped. Otherwise,
* specific reports will be deleted, except reports for periods in $reportPeriodsToKeep.
*
* @param bool $optimize If tables should be optimized after rows are deleted. Normally,
* this is handled by a scheduled task.
*/
public function purgeData($optimize = false)
{
list($oldNumericTables, $oldBlobTables) = $this->getArchiveTablesToPurge();
// process blob tables first, since archive status is stored in the numeric archives
if (!empty($oldBlobTables)) {
foreach ($oldBlobTables as $table) {
$where = $this->getBlobTableWhereExpr($oldNumericTables, $table);
if (!empty($where)) {
$where = "WHERE $where";
}
Db::deleteAllRows($table, $where, "idarchive ASC", $this->maxRowsToDeletePerQuery);
}
if ($optimize) {
Db::optimizeTables($oldBlobTables);
}
}
$this->segmentArchiveIds = null;
if (!empty($oldNumericTables)) {
foreach ($oldNumericTables as $table) {
$conditions = array("name NOT LIKE 'done%'");
$bind = array();
if ($this->keepBasicMetrics && !empty($this->metricsToKeep)) {
$metricFields = Common::getSqlStringFieldsArray($this->metricsToKeep);
$bind = $this->metricsToKeep;
$conditions[] = sprintf("name NOT IN (%s)", $metricFields);
}
$keepWhere = $this->getBlobTableWhereExpr($oldNumericTables, $table);
if (!empty($keepWhere)) {
$conditions[] = $keepWhere;
}
$where = 'WHERE ' . implode(' AND ', $conditions);
Db::deleteAllRows($table, $where, "idarchive ASC", $this->maxRowsToDeletePerQuery, $bind);
}
if ($optimize) {
Db::optimizeTables($oldNumericTables);
}
}
}
/**
* Returns an array describing what data would be purged if purging were invoked.
*
* This function returns an array that maps table names with the number of rows
* that will be deleted. If a table name is mapped with self::DROP_TABLE, the table
* will be dropped.
*
* @return array
*/
public function getPurgeEstimate()
{
$result = array();
// get archive tables that will be purged
list($oldNumericTables, $oldBlobTables) = $this->getArchiveTablesToPurge();
// process blob tables first, since archive status is stored in the numeric archives
if (empty($this->reportPeriodsToKeep) && !$this->keepSegmentReports) {
// not keeping any reports, so drop all tables
foreach ($oldBlobTables as $table) {
$result[$table] = self::DROP_TABLE;
}
} else {
// figure out which rows will be deleted
foreach ($oldBlobTables as $table) {
$rowCount = $this->getBlobTableDeleteCount($oldNumericTables, $table);
if ($rowCount > 0) {
$result[$table] = $rowCount;
}
}
}
// deal w/ numeric tables
if ($this->keepBasicMetrics) {
// figure out which rows will be deleted
foreach ($oldNumericTables as $table) {
$rowCount = $this->getNumericTableDeleteCount($table);
if ($rowCount > 0) {
$result[$table] = $rowCount;
}
}
} else {
// not keeping any metrics, so drop the entire table
foreach ($oldNumericTables as $table) {
$result[$table] = self::DROP_TABLE;
}
}
return $result;
}
/**
* Utility function that finds every archive table whose reports are considered
* old.
*
* @return array An array of two arrays. The first holds the numeric archive table
* names, and the second holds the blob archive table names.
*/
private function getArchiveTablesToPurge()
{
// get month for which reports as old or older than, should be deleted
// reports whose creation date <= this month will be deleted
// (NOTE: we ignore how far we are in the current month)
$toRemoveDate = Date::factory('today')->subMonth(1 + $this->deleteReportsOlderThan);
// find all archive tables that are older than N months
$oldNumericTables = array();
$oldBlobTables = array();
foreach (DbHelper::getTablesInstalled() as $table) {
$type = ArchiveTableCreator::getTypeFromTableName($table);
if ($type === false) {
continue;
}
$date = ArchiveTableCreator::getDateFromTableName($table);
list($year, $month) = explode('_', $date);
if (self::shouldReportBePurged($year, $month, $toRemoveDate)) {
if ($type == ArchiveTableCreator::NUMERIC_TABLE) {
$oldNumericTables[] = $table;
} else {
$oldBlobTables[] = $table;
}
}
}
return array($oldNumericTables, $oldBlobTables);
}
/**
* Returns true if a report with the given year & month should be purged or not.
*
* @param int $reportDateYear The year of the report in question.
* @param int $reportDateMonth The month of the report in question.
* @param Date $toRemoveDate The date a report must be older than in order to be purged.
* @return bool
*/
public static function shouldReportBePurged($reportDateYear, $reportDateMonth, $toRemoveDate)
{
$toRemoveYear = (int)$toRemoveDate->toString('Y');
$toRemoveMonth = (int)$toRemoveDate->toString('m');
return $reportDateYear < $toRemoveYear
|| ($reportDateYear == $toRemoveYear && $reportDateMonth <= $toRemoveMonth);
}
private function getNumericTableDeleteCount($table)
{
$maxIdArchive = Db::fetchOne("SELECT MAX(idarchive) FROM $table");
$sql = "SELECT COUNT(*) FROM $table
WHERE name NOT IN ('" . implode("','", $this->metricsToKeep) . "')
AND name NOT LIKE 'done%'
AND idarchive >= ?
AND idarchive < ?";
$segments = Db::segmentedFetchOne($sql, 0, $maxIdArchive, self::$selectSegmentSize);
return array_sum($segments);
}
private function getBlobTableDeleteCount($oldNumericTables, $table)
{
$maxIdArchive = Db::fetchOne("SELECT MAX(idarchive) FROM $table");
$sql = "SELECT COUNT(*) FROM $table
WHERE " . $this->getBlobTableWhereExpr($oldNumericTables, $table) . "
AND idarchive >= ?
AND idarchive < ?";
$segments = Db::segmentedFetchOne($sql, 0, $maxIdArchive, self::$selectSegmentSize);
return array_sum($segments);
}
/** Returns SQL WHERE expression used to find reports that should be purged. */
private function getBlobTableWhereExpr($oldNumericTables, $table)
{
$where = "";
if (!empty($this->reportPeriodsToKeep)) // if keeping reports
{
$where = "period NOT IN (" . implode(',', $this->reportPeriodsToKeep) . ")";
// if not keeping segments make sure segments w/ kept periods are also deleted
if (!$this->keepSegmentReports) {
$this->findSegmentArchives($oldNumericTables);
$dateFromTable = ArchiveTableCreator::getDateFromTableName($table);
if (!empty($this->segmentArchiveIds[$dateFromTable])) {
$archiveIds = $this->segmentArchiveIds[$dateFromTable];
$where .= " OR idarchive IN (" . implode(',', $archiveIds) . ")";
}
}
$where = "($where)";
}
return $where;
}
/**
* If we're going to keep segmented reports, we need to know which archives are
* for segments. This info is only in the numeric tables, so we must query them.
*/
private function findSegmentArchives($numericTables)
{
if (!is_null($this->segmentArchiveIds) || empty($numericTables)) {
return;
}
foreach ($numericTables as $table) {
$tableDate = ArchiveTableCreator::getDateFromTableName($table);
$maxIdArchive = Db::fetchOne("SELECT MAX(idarchive) FROM $table");
$sql = "SELECT idarchive FROM $table
WHERE name != 'done'
AND name LIKE 'done_%.%'
AND idarchive >= ?
AND idarchive < ?";
if (is_null($this->segmentArchiveIds)) {
$this->segmentArchiveIds = array();
}
$this->segmentArchiveIds[$tableDate] = array();
foreach (Db::segmentedFetchAll($sql, 0, $maxIdArchive, self::$selectSegmentSize) as $row) {
$this->segmentArchiveIds[$tableDate][] = $row['idarchive'];
}
}
}
/**
* Utility function. Creates a new instance of ReportsPurger with the supplied array
* of settings.
*
* $settings must contain the following keys:
* -'delete_reports_older_than': The number of months after which reports/metrics are
* considered old.
* -'delete_reports_keep_basic_metrics': 1 if basic metrics should be kept, 0 if otherwise.
* -'delete_reports_keep_day_reports': 1 if daily reports should be kept, 0 if otherwise.
* -'delete_reports_keep_week_reports': 1 if weekly reports should be kept, 0 if otherwise.
* -'delete_reports_keep_month_reports': 1 if monthly reports should be kept, 0 if otherwise.
* -'delete_reports_keep_year_reports': 1 if yearly reports should be kept, 0 if otherwise.
* -'delete_reports_keep_range_reports': 1 if range reports should be kept, 0 if otherwise.
* -'delete_reports_keep_segment_reports': 1 if reports for segments should be kept, 0 if otherwise.
* -'delete_logs_max_rows_per_query': Maximum number of rows to delete in one DELETE query.
*/
public static function make($settings, $metricsToKeep)
{
return new ReportsPurger(
$settings['delete_reports_older_than'],
$settings['delete_reports_keep_basic_metrics'] == 1,
self::getReportPeriodsToKeep($settings),
$settings['delete_reports_keep_segment_reports'] == 1,
$metricsToKeep,
$settings['delete_logs_max_rows_per_query']
);
}
/**
* Utility function that returns an array period values based on the 'delete_reports_keep_*'
* settings. The period values returned are the integer values stored in the DB.
*
* @param array $settings The settings to use.
* @return array An array of period values that should be kept when purging old data.
*/
private static function getReportPeriodsToKeep($settings)
{
$keepReportPeriods = array();
foreach (Piwik::$idPeriods as $strPeriod => $intPeriod) {
$optionName = "delete_reports_keep_{$strPeriod}_reports";
if ($settings[$optionName] == 1) {
$keepReportPeriods[] = $intPeriod;
}
}
return $keepReportPeriods;
}
}

View File

@ -0,0 +1,64 @@
<?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\PrivacyManager;
use Piwik\Piwik;
use Piwik\Settings\Setting;
use Piwik\Settings\FieldConfig;
/**
* Defines Settings for PrivacyManager.
*/
class SystemSettings extends \Piwik\Settings\Plugin\SystemSettings
{
/** @var Setting */
public $privacyPolicyUrl;
/** @var Setting */
public $termsAndConditionUrl;
/** @var Setting */
public $showInEmbeddedWidgets;
protected function init()
{
$this->privacyPolicyUrl = $this->createPrivacyPolicyUrlSetting();
$this->termsAndConditionUrl = $this->createTermsAndConditionUrlSetting();
$this->showInEmbeddedWidgets = $this->createShowInEmbeddedWidgetsSetting();
}
private function createPrivacyPolicyUrlSetting()
{
return $this->makeSetting('privacyPolicyUrl', $default = '', FieldConfig::TYPE_STRING, function (FieldConfig $field) {
$field->title = Piwik::translate('PrivacyManager_PrivacyPolicyUrl');
$field->uiControl = FieldConfig::UI_CONTROL_TEXT;
$field->description = Piwik::translate('PrivacyManager_PrivacyPolicyUrlDescription') . ' ' .
Piwik::translate('PrivacyManager_PrivacyPolicyUrlDescriptionSuffix', ['anonymous']);
});
}
private function createTermsAndConditionUrlSetting()
{
return $this->makeSetting('termsAndConditionUrl', $default = '', FieldConfig::TYPE_STRING, function (FieldConfig $field) {
$field->title = Piwik::translate('PrivacyManager_TermsAndConditionUrl');
$field->uiControl = FieldConfig::UI_CONTROL_TEXT;
$field->description = Piwik::translate('PrivacyManager_TermsAndConditionUrlDescription') . ' ' .
Piwik::translate('PrivacyManager_PrivacyPolicyUrlDescriptionSuffix', ['anonymous']);
});
}
private function createShowInEmbeddedWidgetsSetting()
{
return $this->makeSetting('showInEmbeddedWidgets', $default = false, FieldConfig::TYPE_BOOL, function (FieldConfig $field) {
$field->title = Piwik::translate('PrivacyManager_ShowInEmbeddedWidgets');
$field->uiControl = FieldConfig::UI_CONTROL_CHECKBOX;
$field->description = Piwik::translate('PrivacyManager_ShowInEmbeddedWidgetsDescription');
});
}
}

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\PrivacyManager;
use Piwik\Plugins\PrivacyManager\Model\DataSubjects;
use Piwik\Plugins\PrivacyManager\Model\LogDataAnonymizations;
use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
class Tasks extends \Piwik\Plugin\Tasks
{
/**
* @var LogDataAnonymizations
*/
private $logDataAnonymizations;
/**
* @var DataSubjects
*/
private $dataSubjects;
/**
* @var SitesManagerAPI
*/
private $sitesManagerAPI;
public function __construct(LogDataAnonymizations $logDataAnonymizations, DataSubjects $dataSubjects, SitesManagerAPI $sitesManagerAPI)
{
$this->logDataAnonymizations = $logDataAnonymizations;
$this->dataSubjects = $dataSubjects;
$this->sitesManagerAPI = $sitesManagerAPI;
}
public function schedule()
{
$this->daily('deleteReportData', null, self::LOW_PRIORITY);
$this->hourly('deleteLogData', null, self::LOW_PRIORITY);
$this->hourly('anonymizePastData', null, self::LOW_PRIORITY);
$this->weekly('deleteLogDataForDeletedSites', null, self::LOW_PRIORITY);
}
public function anonymizePastData()
{
$loop = 0;
do {
$loop++; // safety loop...
$id = $this->logDataAnonymizations->getNextScheduledAnonymizationId();
if (!empty($id)) {
$this->logDataAnonymizations->executeScheduledEntry($id);
}
} while (!empty($id) && $loop < 100);
}
public function deleteReportData()
{
$privacyManager = new PrivacyManager();
$privacyManager->deleteReportData();
}
/**
* To test execute the following command:
* `./console core:run-scheduled-tasks "Piwik\Plugins\PrivacyManager\Tasks.deleteLogData"`
*/
public function deleteLogData()
{
$privacyManager = new PrivacyManager();
$privacyManager->deleteLogData();
}
public function deleteLogDataForDeletedSites()
{
$allSiteIds = $this->sitesManagerAPI->getAllSitesId();
$this->dataSubjects->deleteDataSubjectsForDeletedSites($allSiteIds);
}
}

View File

@ -0,0 +1,64 @@
<?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\PrivacyManager\Tracker;
use Piwik\Common;
use Piwik\Plugins\PrivacyManager\PrivacyManager;
use Piwik\SettingsPiwik;
use Piwik\Tracker\Request;
use Piwik\Tracker;
use Piwik\Plugins\PrivacyManager\Config as PrivacyManagerConfig;
class RequestProcessor extends Tracker\RequestProcessor
{
public function manipulateRequest(Request $request)
{
$privacyConfig = new PrivacyManagerConfig();
if ($privacyConfig->anonymizeUserId) {
$userId = $request->getParam('uid');
if ($this->isValueSet($userId)) {
$userIdAnonymized = self::anonymizeUserId($userId);
$request->setParam('uid', $userIdAnonymized);
}
}
if ($privacyConfig->anonymizeOrderId) {
$orderId = $request->getParam('ec_id');
if ($this->isValueSet($orderId)) {
$orderIdAnonymized = sha1(Common::getRandomInt() . $orderId . time() . SettingsPiwik::getSalt());
$request->setParam('ec_id', $orderIdAnonymized);
}
}
}
/**
* pseudo anonymization as we need to make sure to always generate the same UserId for the same original UserID
*
* @param $userId
* @return string
*/
public static function anonymizeUserId($userId)
{
$trackerCache = Tracker\Cache::getCacheGeneral();
$salt = '';
if (!empty($trackerCache[PrivacyManager::OPTION_USERID_SALT])) {
$salt = $trackerCache[PrivacyManager::OPTION_USERID_SALT];
}
if(empty($salt)) {
return $userId;
}
return sha1($userId . $salt);
}
private function isValueSet($value)
{
return $value !== '' && $value !== false && $value !== null;
}
}

View File

@ -0,0 +1,32 @@
<?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\PrivacyManager\Validators;
use Piwik\Validators\BaseValidator;
use Piwik\Validators\Exception;
class VisitsDataSubject extends BaseValidator
{
public function validate($visits)
{
if (empty($visits) || !is_array($visits)) {
throw new Exception('No list of visits given');
}
foreach ($visits as $index => $visit) {
if (empty($visit['idsite'])) {
throw new Exception('No idsite key set for visit at index ' . $index);
}
if (empty($visit['idvisit'])) {
throw new Exception('No idvisit key set for visit at index ' . $index);
}
}
}
}

View File

@ -0,0 +1,40 @@
/*!
* 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('AnonymizeIpController', AnonymizeIpController);
AnonymizeIpController.$inject = ['piwikApi'];
function AnonymizeIpController(piwikApi) {
// remember to keep controller very simple. Create a service/factory (model) if needed
var self = this;
this.isLoading = false;
this.save = function () {
this.isLoading = true;
piwikApi.post({module: 'API', method: 'PrivacyManager.setAnonymizeIpSettings'}, {
anonymizeIPEnable: this.enabled ? '1' : '0',
anonymizeUserId: this.anonymizeUserId ? '1' : '0',
anonymizeOrderId: this.anonymizeOrderId ? '1' : '0',
maskLength: this.maskLength,
useAnonymizedIpForVisitEnrichment: parseInt(this.useAnonymizedIpForVisitEnrichment, 10) ? '1' : '0'
}).then(function (success) {
self.isLoading = false;
var UI = require('piwik/UI');
var notification = new UI.Notification();
notification.show(_pk_translate('CoreAdminHome_SettingsSaveSuccess'), {context: 'success', id:'privacyManagerSettings'});
notification.scrollToNotification();
}, function () {
self.isLoading = false;
});
};
}
})();

View File

@ -0,0 +1,145 @@
/*!
* 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('AnonymizeLogDataController', AnonymizeLogDataController);
AnonymizeLogDataController.$inject = ["$scope", "piwikApi", "piwik", "$timeout"];
function AnonymizeLogDataController($scope, piwikApi, piwik, $timeout) {
function sub(value)
{
if (value < 10) {
return '0' + value;
}
return value;
}
var self = this;
var now = new Date();
this.isLoading = false;
this.isDeleting = false;
this.anonymizeIp = false;
this.anonymizeLocation = false;
this.anonymizeUserId = false;
this.site = {id: 'all', name: 'All Websites'};
this.availableVisitColumns = [];
this.availableActionColumns = [];
this.selectedVisitColumns = [{column: ''}];
this.selectedActionColumns = [{column: ''}];
this.start_date = now.getFullYear() + '-' + sub(now.getMonth() + 1) + '-' + sub(now.getDay() + 1);
this.end_date = this.start_date;
piwikApi.fetch({method: 'PrivacyManager.getAvailableVisitColumnsToAnonymize'}).then(function (columns) {
self.availableVisitColumns = [];
angular.forEach(columns, function (column) {
self.availableVisitColumns.push({key: column.column_name, value: column.column_name});
});
});
piwikApi.fetch({method: 'PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize'}).then(function (columns) {
self.availableActionColumns = [];
angular.forEach(columns, function (column) {
self.availableActionColumns.push({key: column.column_name, value: column.column_name});
});
});
this.onVisitColumnChange = function () {
var hasAll = true;
angular.forEach(this.selectedVisitColumns, function (visitColumn) {
if (!visitColumn || !visitColumn.column) {
hasAll = false;
}
});
if (hasAll) {
this.addVisitColumn();
}
};
this.addVisitColumn = function () {
this.selectedVisitColumns.push({column: ''});
};
this.removeVisitColumn = function (index) {
if (index > -1) {
var lastIndex = this.selectedVisitColumns.length - 1;
if (lastIndex === index) {
this.selectedVisitColumns[index] = {column: ''};
} else {
this.selectedVisitColumns.splice(index, 1);
}
}
};
this.onActionColumnChange = function () {
var hasAll = true;
angular.forEach(this.selectedActionColumns, function (actionColumn) {
if (!actionColumn || !actionColumn.column) {
hasAll = false;
}
});
if (hasAll) {
this.addActionColumn();
}
};
this.addActionColumn = function () {
this.selectedActionColumns.push({column: ''});
};
this.removeActionColumn = function (index) {
if (index > -1) {
var lastIndex = this.selectedActionColumns.length - 1;
if (lastIndex === index) {
this.selectedActionColumns[index] = {column: ''};
} else {
this.selectedActionColumns.splice(index, 1);
}
}
};
this.scheduleAnonymization = function () {
var date = this.start_date + ',' + this.end_date;
if (this.start_date === this.end_date) {
date = this.start_date;
}
var params = {date: date};
params.idSites = this.site.id;
params.anonymizeIp = this.anonymizeIp ? '1' : '0';
params.anonymizeLocation = this.anonymizeLocation ? '1' : '0';
params.anonymizeUserId = this.anonymizeUserId ? '1' : '0';
params.unsetVisitColumns = [];
params.unsetLinkVisitActionColumns = [];
angular.forEach(this.selectedVisitColumns, function (column) {
if (column.column) {
params.unsetVisitColumns.push(column.column);
}
});
angular.forEach(this.selectedActionColumns, function (column) {
if (column.column) {
params.unsetLinkVisitActionColumns.push(column.column);
}
});
piwik.helper.modalConfirm('#confirmAnonymizeLogData', {yes: function () {
piwikApi.post({method: 'PrivacyManager.anonymizeSomeRawData'}, params).then(function () {
location.reload(true);
});
}});
};
$timeout(function () {
var options1 = piwik.getBaseDatePickerOptions(null);
var options2 = piwik.getBaseDatePickerOptions(null);
$(".anonymizeStartDate").datepicker(options1);
$(".anonymizeEndDate").datepicker(options2);
});
}
})();

View File

@ -0,0 +1,142 @@
<div class="anonymizeLogData">
<div class="form-group row">
<div class="col s12 input-field">
<div>
<label for="anonymizeSite" class="siteSelectorLabel">Anonymize the data of this site(s)</label>
<div piwik-siteselector
class="sites_autocomplete"
ng-model="anonymizeLogData.site"
id="anonymizeSite"
show-all-sites-item="true"
switch-site-on-select="false"
show-selected-site="true"></div>
</div>
</div>
</div>
<div class="form-group row">
<div class="col s6 input-field">
<div>
<label for="anonymizeStartDate" class="active">Anonymize all raw data starting from:</label>
<input type="text" ng-model="anonymizeLogData.start_date"
class="anonymizeStartDate"
name="anonymizeStartDate">
</div>
</div>
<div class="col s6 input-field">
<div>
<label for="anonymizeEndDate" class="active">Anonymize all raw data up to:</label>
<input type="text" ng-model="anonymizeLogData.end_date"
class="anonymizeEndDate"
name="anonymizeEndDate">
</div>
</div>
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeIp"
title="Anonymize IP"
ng-model="anonymizeLogData.anonymizeIp"
introduction="Visit"
inline-help="This action cannot be undone. If enabled, for all visits during this duration the IP will be anonymized by at least 2 bytes, for example '192.168.xxx.xxx'. If you have currently configured to anonymize by 3 bytes, then this setting will be respected and all IPs will be anonymized by 3 bytes.">
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeLocation"
title="Anonymize Location"
ng-model="anonymizeLogData.anonymizeLocation"
inline-help="This action cannot be undone. Re-evaluates the location based on the anonymized IP (at least 2 bytes of the IP will be anonymized).">
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeTheUserId"
title="Replace User ID with a pseudonym"
ng-model="anonymizeLogData.anonymizeUserId"
inline-help="When you enable this option, the User ID will be replaced by a pseudonym to avoid directly storing and displaying personally identifiable information such as an email address. In technical terms: given your User ID, Matomo will process the User ID pseudonym using a salted hash function.<br/><br/><em>Note: replacing with a pseudonym is not the same as anonymisation. In GDPR terms: the User ID pseudonym still counts as personal data. The original User ID could still be identified if certain additional information is available (which only Matomo and your data processor has access to).</em>">
</div>
<div class="form-group row">
<div class="col s12 m6">
<div>
<label for="visit_columns">Unset visit columns</label>
<div ng-repeat="(index, visitColumn) in anonymizeLogData.selectedVisitColumns"
class="selectedVisitColumns selectedVisitColumns{{ index }} multiple valign-wrapper">
<div piwik-field uicontrol="select" name="visit_columns"
class="innerFormField"
full-width="true"
ng-model="anonymizeLogData.selectedVisitColumns[index].column"
ng-change="anonymizeLogData.onVisitColumnChange();"
options="anonymizeLogData.availableVisitColumns">
</div>
<span ng-click="anonymizeLogData.removeVisitColumn(index)"
title="{{ 'General_Remove'|translate }}"
ng-hide="(index + 1) == (anonymizeLogData.selectedVisitColumns|length)"
class="icon-minus valign"></span>
</div>
</div>
</div>
<div class="col s12 m6">
<div class="form-help">
<span class="inline-help">
This action cannot be undone. A list of database columns in scope visit that you want to unset.
Each value for that column will be set to its default value. Please note that if the same
column exists in scope 'conversion', then this column will be deleted as well
</span>
</div>
</div>
</div>
<div class="form-group row">
<div class="col s12"><h3>Action</h3></div>
</div>
<div class="form-group row">
<div class="col s12 m6">
<div>
<label for="action_columns">Unset action columns</label>
<div ng-repeat="(index, actionColumn) in anonymizeLogData.selectedActionColumns"
class="selectedActionColumns selectedActionColumns{{ index }} multiple valign-wrapper">
<div piwik-field uicontrol="select" name="action_columns"
class="innerFormField"
full-width="true"
ng-model="anonymizeLogData.selectedActionColumns[index].column"
ng-change="anonymizeLogData.onActionColumnChange();"
options="anonymizeLogData.availableActionColumns">
</div>
<span ng-click="anonymizeLogData.removeActionColumn(index)"
title="{{ 'General_Remove'|translate }}"
ng-hide="(index + 1) == (anonymizeLogData.selectedActionColumns|length)"
class="icon-minus valign"></span>
</div>
</div>
</div>
<div class="col s12 m6">
<div class="form-help">
<span class="inline-help">
This action cannot be undone. A list of database columns in scope action that you want to unset. Each value for that column will be set to its default value.
</span>
</div>
</div>
</div>
<p><span class="icon-info"></span> This action may take a long time and will therefore not be executed right away. You will be able to follow the current state of the process below. The anonymization should typically start within one hour.</p>
<div piwik-save-button
class="anonymizePastData"
onconfirm="anonymizeLogData.scheduleAnonymization()"
data-disabled="!anonymizeLogData.anonymizeIp && !anonymizeLogData.anonymizeLocation && !anonymizeLogData.selectedVisitColumns && !anonymizeLogData.selectedActionColumns"
value="Anonymize past data for the selected site and time">
</div>
<div class="ui-confirm" id="confirmAnonymizeLogData">
<h2>Are you sure you want to anonymize the data for the selected website(s) and time range? This action cannot be undone, data may be deleted as requested, and this process may take a long time.</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
</div>

View File

@ -0,0 +1,29 @@
/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
/**
* Usage:
* <div matomo-anonymize-log-data>
*/
(function () {
angular.module('piwikApp').directive('matomoAnonymizeLogData', anonymizeLogData);
anonymizeLogData.$inject = ['piwik'];
function anonymizeLogData(piwik){
return {
restrict: 'A',
scope: {},
templateUrl: 'plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html?cb=' + piwik.cacheBuster,
controller: 'AnonymizeLogDataController',
controllerAs: 'anonymizeLogData',
compile: function (element, attrs) {
}
};
}
})();

View File

@ -0,0 +1,17 @@
.anonymizeLogData {
.icon-minus {
cursor: pointer;
}
.innerFormField {
margin-left: -0.75rem;
.form-group.row {
margin-top: 2px;
margin-bottom: 2px;
}
}
.innerFormField {
width: 100%;
}
}

View File

@ -0,0 +1,54 @@
/*!
* 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('DeleteOldLogsController', DeleteOldLogsController);
DeleteOldLogsController.$inject = ['reportDeletionModel', 'piwikApi', '$timeout'];
function DeleteOldLogsController(reportDeletionModel, piwikApi, $timeout) {
var self = this;
this.isLoading = false;
function saveSettings()
{
var method = 'PrivacyManager.setDeleteLogsSettings';
reportDeletionModel.savePurageDataSettings(self, method, self.getSettings());
}
this.getSettings = function () {
return {
enableDeleteLogs: this.enabled ? '1' : '0',
deleteLogsOlderThan: this.deleteOlderThan
};
}
this.reloadDbStats = function () {
reportDeletionModel.updateSettings(this.getSettings());
}
$timeout(function () {
reportDeletionModel.initSettings(self.getSettings());
});
this.save = function () {
if (this.enabled) {
var confirmId = 'deleteLogsConfirm';
if (reportDeletionModel.settings && '1' === reportDeletionModel.settings.enableDeleteReports) {
confirmId = 'deleteBothConfirm';
}
$('#confirmDeleteSettings').find('>h2').hide();
$("#" + confirmId).show();
piwikHelper.modalConfirm('#confirmDeleteSettings', {yes: saveSettings});
} else {
saveSettings();
}
};
}
})();

View File

@ -0,0 +1,66 @@
/*!
* 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('DeleteOldReportsController', DeleteOldReportsController);
DeleteOldReportsController.$inject = ['reportDeletionModel', 'piwikApi', '$timeout'];
function DeleteOldReportsController(reportDeletionModel, piwikApi, $timeout) {
// remember to keep controller very simple. Create a service/factory (model) if needed
var self = this;
this.isLoading = false;
function getInt(value)
{
return value ? '1' : '0';
}
function saveSettings()
{
var method = 'PrivacyManager.setDeleteReportsSettings';
reportDeletionModel.savePurageDataSettings(self, method, self.getSettings());
}
this.getSettings = function () {
return {
enableDeleteReports: this.enabled ? '1' : '0',
deleteReportsOlderThan: this.deleteOlderThan,
keepBasic: getInt(this.keepBasic),
keepDay: getInt(this.keepDataForDay),
keepWeek: getInt(this.keepDataForWeek),
keepMonth: getInt(this.keepDataForMonth),
keepYear: getInt(this.keepDataForYear),
keepRange: getInt(this.keepDataForRange),
keepSegments: getInt(this.keepDataForSegments),
};
}
this.reloadDbStats = function () {
reportDeletionModel.updateSettings(this.getSettings());
}
$timeout(function () {
reportDeletionModel.initSettings(self.getSettings());
});
this.save = function () {
if (this.enabled) {
var confirmId = 'deleteReportsConfirm';
if (reportDeletionModel.settings && '1' === reportDeletionModel.settings.enableDeleteLogs) {
confirmId = 'deleteBothConfirm';
}
$('#confirmDeleteSettings').find('>h2').hide();
$("#" + confirmId).show();
piwikHelper.modalConfirm('#confirmDeleteSettings', {yes: saveSettings});
} else {
saveSettings();
}
};
}
})();

View File

@ -0,0 +1,40 @@
/*!
* 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('DoNotTrackPreferenceController', DoNotTrackPreferenceController);
DoNotTrackPreferenceController.$inject = ['piwikApi'];
function DoNotTrackPreferenceController(piwikApi) {
// remember to keep controller very simple. Create a service/factory (model) if needed
var self = this;
this.isLoading = false;
this.save = function () {
this.isLoading = true;
var action = 'deactivateDoNotTrack';
if (this.enabled === '1') {
action = 'activateDoNotTrack';
}
piwikApi.post({module: 'API', method: 'PrivacyManager.' + action}).then(function (success) {
self.isLoading = false;
var UI = require('piwik/UI');
var notification = new UI.Notification();
notification.show(_pk_translate('CoreAdminHome_SettingsSaveSuccess'), {context: 'success', id:'privacyManagerSettings'});
notification.scrollToNotification();
}, function () {
self.isLoading = false;
});
};
}
})();

View File

@ -0,0 +1,159 @@
/*!
* 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('ManageGdprController', ManageGdprController);
ManageGdprController.$inject = ["$scope", "piwikApi", "piwik", "$timeout"];
function ManageGdprController($scope, piwikApi, piwik, $timeout) {
var self = this;
this.isLoading = false;
this.isDeleting = false;
this.site = {id: 'all', name: 'All Websites'};
this.segment_filter = 'userId==';
this.dataSubjects = [];
this.toggleAll = true;
this.hasSearched = false
var sitesPromise = piwikApi.fetch({method: 'SitesManager.getSitesIdWithAdminAccess', filter_limit: '-1'});
this.linkTo = function (action){
var currentUrl = window.location.pathname + window.location.search;
var newUrl = piwik.broadcast.updateParamValue('module=PrivacyManager', currentUrl);
newUrl = piwik.broadcast.updateParamValue('action=' + action, newUrl);
return newUrl;
}
function showSuccessNotification(message)
{
var UI = require('piwik/UI');
var notification = new UI.Notification();
notification.show(message, {context: 'success', id: 'manageGdpr'});
$timeout(function () {
notification.scrollToNotification();
}, 200);
}
this.toggleActivateAll = function () {
var toggleAll = this.toggleAll;
angular.forEach(this.dataSubjects, function (dataSubject) {
dataSubject.dataSubjectActive = toggleAll;
});
};
this.hasActiveDataSubjects = function()
{
return !!this.getActivatedDataSubjects().length;
};
this.getActivatedDataSubjects = function () {
var visitsToDelete = [];
angular.forEach(this.dataSubjects, function (visit) {
if (visit.dataSubjectActive) {
visitsToDelete.push({idsite: visit.idSite, idvisit: visit.idVisit});
}
});
return visitsToDelete;
}
this.showProfile = function (visitorId, idSite) {
require('piwik/UI').VisitorProfileControl.showPopover(visitorId, idSite);
};
this.exportDataSubject = function () {
var visitsToDelete = this.getActivatedDataSubjects();
piwikApi.post({
module: 'API',
method: 'PrivacyManager.exportDataSubjects',
format: 'json',
filter_limit: -1,
}, {visits: visitsToDelete}).then(function (visits) {
showSuccessNotification('Visits were successfully exported');
piwik.helper.sendContentAsDownload('exported_data_subjects.json', JSON.stringify(visits));
});
};
this.deleteDataSubject = function () {
piwik.helper.modalConfirm('#confirmDeleteDataSubject', {yes: function () {
self.isDeleting = true;
var visitsToDelete = self.getActivatedDataSubjects();
piwikApi.post({
module: 'API',
method: 'PrivacyManager.deleteDataSubjects',
filter_limit: -1,
}, {visits: visitsToDelete}).then(function (visits) {
self.dataSubjects = [];
self.isDeleting = false;
showSuccessNotification('Visits were successfully deleted');
self.findDataSubjects();
}, function () {
self.isDeleting = false;
});
}});
};
this.addFilter = function (segment, value) {
this.segment_filter += ',' + segment + '==' + value;
this.findDataSubjects();
};
this.findDataSubjects = function () {
this.dataSubjects = [];
this.isLoading = true;
this.toggleAll = true;
function addDatePadding(number)
{
if (number < 10) {
return '0' + number;
}
return number;
}
var now = new Date();
var dateString = (now.getFullYear() + 2) + '-' + addDatePadding(now.getMonth() + 1) + '-' + addDatePadding(now.getDay());
// we are adding two years to make sure to also capture some requests in the future as we fetch data across
// different sites and different timezone and want to avoid missing any possible requests
sitesPromise.then(function (idsites) {
var siteIds = self.site.id;
if (siteIds === 'all' && !piwik.hasSuperUserAccess) {
// when superuser, we speed the request up a little and simply use 'all'
siteIds = idsites;
if (angular.isArray(idsites)) {
siteIds = idsites.join(',');
}
}
piwikApi.fetch({
idSite: siteIds,
period: 'range',
date: '1998-01-01,today',
module: 'API',
method: 'Live.getLastVisitsDetails',
segment: self.segment_filter,
filter_limit: 401,
doNotFetchActions: 1
}).then(function (visits) {
self.hasSearched = true;
angular.forEach(visits, function (visit) {
visit.dataSubjectActive = true;
});
self.dataSubjects = visits;
self.isLoading = false;
}, function () {
self.isLoading = false;
});
});
};
}
})();

View File

@ -0,0 +1,139 @@
<div class="manageGdpr">
<div piwik-content-block content-title="GDPR Tools">
<div class="intro">
<p>
This page has been designed in order for you to exercise data subject rights.
<br /><br />
Here you can exercise the rights of your users with our GDPR-friendly procedures:
<br />
</p>
<ol>
<li>the right of access to all of their data (and the right to data portability),</li>
<li>the right to erase some or all of their data (and the right to rectification).</li>
</ol>
<p><br />In case you do not know what GDPR is, please refer to the <a ng-href="{{ manageGdpr.linkTo('gdprOverview') }}">GDPR overview</a>.</p>
</div>
<h3>Search for a data subject</h3>
<div class="form-group row">
<div class="col s12 input-field">
<div>
<label for="gdprsite" class="siteSelectorLabel">Select a website</label>
<div piwik-siteselector
class="sites_autocomplete"
ng-model="manageGdpr.site"
id="gdprsite"
show-all-sites-item="true"
switch-site-on-select="false"
show-selected-site="true"></div>
</div>
</div>
</div>
<div class="form-group row segmentFilterGroup">
<div class="col s12">
<div>
<label style="margin: 8px 0;display: inline-block;">Find data subjects by</label>
<div piwik-segment-generator
visit-segments-only="1"
idsite="manageGdpr.site.id"
ng-model="manageGdpr.segment_filter"></div>
</div>
</div>
</div>
<div piwik-save-button
class="findDataSubjects"
onconfirm="manageGdpr.findDataSubjects()"
data-disabled="!manageGdpr.segment_filter"
value="Find matching data subjects"
saving="manageGdpr.isLoading">
</div>
</div>
<div ng-show="!manageGdpr.dataSubjects.length && manageGdpr.hasSearched">
<h2>No data subjects found</h2>
</div>
<div ng-show="manageGdpr.dataSubjects.length">
<h2>Matching data subjects</h2>
<p>These visits match the selected criteria.
In case you are exporting the data to exercise the right of access, please make sure the selected visits are actually performed by the data subject you want to export the data for.
<br />
<br />
When deleting data to exercise the right of erasure keep in mind that any data that will be deleted for this data subject might still be included in previously generated reports.
As many reports are aggregated this is in most cases not a problem unless you have for example URLs, Page Titles, Custom Variables or Custom Dimensions that include personal data. In this case
you may want to consider to <a href="https://matomo.org/faq/how-to/faq_155/" target="_blank" rel="noreferrer noopener">invalidate reports</a> after deleting these visits.
<br /><br />
Please also note that any data will be only deleted from the Matomo database but not from your webserver logs. Also note that if you re-import any historical data, for example from logs, that any previously deleted data may be imported again.
<br /><br />
The found results include all visits without any time restriction and include today.
</p>
<table piwik-content-table>
<thead>
<tr>
<th class="checkInclude">
<div piwik-field uicontrol="checkbox" name="activateAll"
ng-model="manageGdpr.toggleAll"
ng-change="manageGdpr.toggleActivateAll()"
full-width="true">
</div>
</th><th>Site</th>
<th>Visit ID</th>
<th>Visitor ID</th>
<th>Visitor IP</th>
<th>User ID</th>
<th>Info</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr ng-show="(manageGdpr.dataSubjects|length) > 400">
<td colspan="8">More than 400 results were found and the result was truncated to the first 400 visits.</td>
</tr>
<tr ng-repeat="(index, dataSubject) in manageGdpr.dataSubjects" title="Last action: {{ dataSubject.lastActionDateTime }}">
<td class="checkInclude">
<div piwik-field uicontrol="checkbox" name="subject{{dataSubject.idVisit}}"
ng-model="manageGdpr.dataSubjects[index].dataSubjectActive"
full-width="true">
</div>
</td>
<td class="site" title="(ID {{dataSubject.idSite}})">{{ dataSubject.siteName }}</td>
<td class="visitId">{{ dataSubject.idVisit }}</td>
<td class="visitorId"><a ng-click="manageGdpr.addFilter('visitorId', dataSubject.visitorId)" title="Click to add this visitorID to the search">{{ dataSubject.visitorId }}</a></td>
<td class="visitorIp"><a ng-click="manageGdpr.addFilter('visitIp', dataSubject.visitIp)" title="Click to add this visitorIP to the search">{{ dataSubject.visitIp }}</a></td>
<td class="userId"><a ng-click="manageGdpr.addFilter('userId', dataSubject.userId)" title="Click to add this userID to the search">{{ dataSubject.userId }}</a></td>
<td>
<span title="{{ dataSubject.deviceType }} {{ dataSubject.deviceModel }}"><img height="16" ng-src="{{ dataSubject.deviceTypeIcon }}"></span>
<span title="{{ dataSubject.operatingSystem }}"><img height="16" ng-src="{{ dataSubject.operatingSystemIcon }}"></span>
<span title="{{ dataSubject.browser }} {{ dataSubject.browserFamilyDescription }}"><img height="16" ng-src="{{ dataSubject.browserIcon }}"></span>
<span title="{{ dataSubject.country }} {{ dataSubject.region }}"><img height="16" ng-src="{{ dataSubject.countryFlag }}"></span>
</td>
<td><a class="visitorLogTooltip" title="View visitor profile" ng-click="manageGdpr.showProfile(dataSubject.visitorId, dataSubject.idSite)">
<img src="plugins/Live/images/visitorProfileLaunch.png"> <span>View visitor profile</span>
</a></td>
</tr>
</tbody>
</table>
<div piwik-save-button
class="exportDataSubjects"
onconfirm="manageGdpr.exportDataSubject()"
data-disabled="!manageGdpr.hasActiveDataSubjects()"
value="Export selected visits">
</div>
<div piwik-save-button
class="deleteDataSubjects"
onconfirm="manageGdpr.deleteDataSubject()"
data-disabled="!manageGdpr.hasActiveDataSubjects() || manageGdpr.isDeleting"
value="Delete selected visits">
</div>
</div>
<div class="ui-confirm" id="confirmDeleteDataSubject">
<h2>Are you sure you want to delete the selected visits? This action cannot be undone. </h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
</div>

View File

@ -0,0 +1,29 @@
/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
/**
* Usage:
* <div matomo-manage-gdpr>
*/
(function () {
angular.module('piwikApp').directive('matomoManageGdpr', matomoManageGdpr);
matomoManageGdpr.$inject = ['piwik'];
function matomoManageGdpr(piwik){
return {
restrict: 'A',
scope: {},
templateUrl: 'plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html?cb=' + piwik.cacheBuster,
controller: 'ManageGdprController',
controllerAs: 'manageGdpr',
compile: function (element, attrs) {
}
};
}
})();

View File

@ -0,0 +1,16 @@
.manageGdpr {
td.checkInclude {
width: 80px;
.form-group.row {
margin-top: 0;
}
}
td.site {
width: 180px;
}
}
.deleteDataSubjects .btn {
background-color: @color-red-piwik;
}

View File

@ -0,0 +1,62 @@
/*!
* 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('OptOutCustomizerController', OptOutCustomizerController);
OptOutCustomizerController.$inject = ["$scope"];
function OptOutCustomizerController($scope) {
var vm = this;
vm.piwikurl = $scope.piwikurl;
vm.language = $scope.language;
vm.fontSizeUnit = 'px';
vm.fontSizeWithUnit = '';
vm.backgroundColor = '';
vm.fontColor = '';
vm.fontSize = '';
vm.fontFamily = '';
vm.updateFontSize = function () {
if (vm.fontSize) {
vm.fontSizeWithUnit = vm.fontSize + vm.fontSizeUnit;
} else {
vm.fontSizeWithUnit = "";
}
this.onUpdate();
};
vm.onUpdate = function () {
if (vm.piwikurl) {
if (vm.backgroundColor === '' && vm.fontColor !== '' && vm.nearlyWhite(vm.fontColor.substr(1))) {
$('#previewIframe').addClass('withBg');
} else {
$('#previewIframe').removeClass('withBg');
}
var value = vm.piwikurl + "index.php?module=CoreAdminHome&action=optOut&language=" + vm.language + "&backgroundColor=" + vm.backgroundColor.substr(1) + "&fontColor=" + vm.fontColor.substr(1) + "&fontSize=" + vm.fontSizeWithUnit + "&fontFamily=" + encodeURIComponent(vm.fontFamily);
var isAnimationAlreadyRunning = $('.optOutCustomizer pre').queue('fx').length > 0;
if (value !== vm.iframeUrl && !isAnimationAlreadyRunning) {
$('.optOutCustomizer pre').effect("highlight", {}, 1500);
}
vm.iframeUrl = value;
} else {
vm.iframeUrl = "";
};
}
vm.nearlyWhite = function (hex) {
var bigint = parseInt(hex, 16);
var r = (bigint >> 16) & 255;
var g = (bigint >> 8) & 255;
var b = bigint & 255;
return (r >= 225 && g >= 225 && b >= 225);
}
vm.onUpdate();
$scope.$watch('piwikurl', function (val, oldVal) {
vm.onUpdate();
});
}
})();

View File

@ -0,0 +1,52 @@
<div class="optOutCustomizer">
<p>
{{ 'CoreAdminHome_OptOutExplanation'|translate }}
<span ng-bind-html="'General_ReadThisToLearnMore'|translate:'&lt;a rel=\'noreferrer noopener\' target=\'_blank\' href=\'https://matomo.org/faq/how-to/faq_25918/\'>':'&lt;/a>'"></span>
</p>
<h3>Customize the Opt-out iframe</h3>
<div>
<p>
<span>
Font Color:
<input type="color" ng-model="optOutCustomizer.fontColor" ng-change="optOutCustomizer.onUpdate()">
</span>
<span>
Background Color:
<input type="color" ng-model="optOutCustomizer.backgroundColor" ng-change="optOutCustomizer.onUpdate()">
</span>
<span>
Font Size:
<input id=FontSizeInput type="number" min="1" max="100" ng-model="optOutCustomizer.fontSize" ng-change="optOutCustomizer.updateFontSize()">
</span>
<span>
<select class="browser-default" ng-model="optOutCustomizer.fontSizeUnit" ng-change="optOutCustomizer.updateFontSize()">
<option value="px">px</option>
<option value="pt">pt</option>
<option value="em">em</option>
<option value="rem">rem</option>
<option value="%">%</option>
</select>
</span>
<span>
Font Family:
<input id=FontFamilyInput type="text" ng-model="optOutCustomizer.fontFamily" ng-change="optOutCustomizer.onUpdate()">
</span>
</p>
</div>
</p>
<h3>HTML code to embed on your website</h3>
<pre piwik-select-on-focus>&lt;iframe
style="border: 0; height: 200px; width: 600px;"
src="{{ optOutCustomizer.iframeUrl }}"
&gt;&lt;/iframe&gt;</pre>
<p ng-bind-html="'CoreAdminHome_OptOutExplanationIntro'|translate:'&lt;a href=\'' + optOutCustomizer.iframeUrl + '\' rel=\'noreferrer noopener\' target=\'_blank\'>':'&lt;/a>'">
</p>
<h3>Preview of the Opt-out as it will appear on your website</h3>
<iframe id="previewIframe" ng-src="{{ optOutCustomizer.iframeUrl }}" style="border: 1px solid #333; height: 200px; width: 600px;" />
</div>

View File

@ -0,0 +1,45 @@
/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
/**
* Usage:
* <div piwik-opt-out-customizer>
*/
(function () {
angular.module('piwikApp').directive('piwikOptOutCustomizer', piwikOptOutCustomizer);
piwikOptOutCustomizer.$inject = ['piwik'];
function piwikOptOutCustomizer(piwik){
var defaults = {
// showAllSitesItem: 'true'
};
return {
restrict: 'A',
scope: {
language: '@',
piwikurl: '@'
},
templateUrl: 'plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html?cb=' + piwik.cacheBuster,
controller: 'OptOutCustomizerController',
controllerAs: 'optOutCustomizer',
compile: function (element, attrs) {
for (var index in defaults) {
if (defaults.hasOwnProperty(index) && attrs[index] === undefined) {
attrs[index] = defaults[index];
}
}
return function (scope, element, attrs) {
};
}
};
}
})();

View File

@ -0,0 +1,30 @@
.optOutCustomizer {
#FontSizeInput {
width: 100px;
}
#FontFamilyInput {
width: 180px;
}
input, select{
margin-right: 30px;
}
select{
width:60px;
display: inline-block;
}
p span{
white-space: nowrap;
}
iframe{
width: 100%;
&.withBg{
background-color: #4d4d4d;
}
}
}

View File

@ -0,0 +1,111 @@
/*!
* 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.service').factory('reportDeletionModel', reportDeletionModel);
reportDeletionModel.$inject = ['piwik', 'piwikApi'];
function reportDeletionModel (piwik, piwikApi) {
var currentRequest;
var isFirstLoad = true;
var model = {
settings: {},
showEstimate: false,
loadingEstimation: false,
estimation: '',
isModified: false,
isEitherDeleteSectionEnabled: isEitherDeleteSectionEnabled,
reloadDbStats: reloadDbStats,
savePurageDataSettings: savePurageDataSettings,
updateSettings: updateSettings,
initSettings: initSettings
};
return model;
function updateSettings(settings)
{
initSettings(settings);
model.isModified = true;
}
function initSettings(settings)
{
model.settings = angular.merge({}, model.settings, settings);
model.reloadDbStats();
}
function savePurageDataSettings(controller, apiMethod, settings)
{
controller.isLoading = true;
model.isModified = false;
return piwikApi.post({
module: 'API', method: apiMethod
}, settings).then(function () {
controller.isLoading = false;
var UI = require('piwik/UI');
var notification = new UI.Notification();
notification.show(_pk_translate('CoreAdminHome_SettingsSaveSuccess'), {context: 'success', id:'privacyManagerSettings'});
notification.scrollToNotification();
}, function () {
controller.isLoading = false;
});
}
function isEitherDeleteSectionEnabled() {
return ('1' === model.settings.enableDeleteLogs || '1' === model.settings.enableDeleteReports);
}
function isManualEstimationLinkShowing()
{
return $('#getPurgeEstimateLink').length > 0;
}
/**
* @param {boolean} [forceEstimate] (defaults to false)
*/
function reloadDbStats(forceEstimate) {
if (currentRequest) {
currentRequest.abort();
}
// if the manual estimate link is showing, abort unless forcing
if (forceEstimate !== true
&& (!isEitherDeleteSectionEnabled() || isManualEstimationLinkShowing())) {
return;
}
model.loadingEstimation = true;
model.estimation = '';
model.showEstimate = false;
var formData = model.settings;
if (forceEstimate === true) {
formData['forceEstimate'] = 1;
}
currentRequest = piwikApi.post({
module: 'PrivacyManager',
action: 'getDatabaseSize',
format: 'html'
}, formData).then(function (data) {
currentRequest = undefined;
model.estimation = data;
model.showEstimate = true;
model.loadingEstimation = false;
}, function () {
model.loadingEstimation = true;
});
}
}
})();

View File

@ -0,0 +1,65 @@
/*!
* 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('ScheduleReportDeletionController', ScheduleReportDeletionController);
ScheduleReportDeletionController.$inject = ['reportDeletionModel', 'piwikApi', '$timeout'];
function ScheduleReportDeletionController(reportDeletionModel, piwikApi, $timeout) {
var self = this;
this.isLoading = false;
this.dataWasPurged = false;
this.showPurgeNowLink = true;
this.model = reportDeletionModel;
this.save = function () {
var method = 'PrivacyManager.setScheduleReportDeletionSettings';
self.model.savePurageDataSettings(this, method, {
deleteLowestInterval: this.deleteLowestInterval
});
};
this.executeDataPurgeNow = function () {
if (reportDeletionModel.isModified) {
piwikHelper.modalConfirm('#saveSettingsBeforePurge', {yes: function () {}});
return;
}
// ask user if they really want to delete their old data
piwikHelper.modalConfirm('#confirmPurgeNow', {
yes: function () {
self.loadingDataPurge = true;
self.showPurgeNowLink = false;
// execute a data purge
piwikApi.withTokenInUrl();
var ajaxRequest = piwikApi.fetch({
module: 'PrivacyManager',
action: 'executeDataPurge',
format: 'html'
}).then(function () {
self.loadingDataPurge = false;
// force reload
reportDeletionModel.reloadDbStats();
self.dataWasPurged = true;
$timeout(function () {
self.dataWasPurged = false;
self.showPurgeNowLink = true;
}, 2000);
}, function () {
self.loadingDataPurge = false;
});
}
});
};
}
})();

View File

@ -0,0 +1,5 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "قم بتشفير آخر بايت من عناوين IP للزوار للإلتزام بقوانين\/إرشادات الخصوصية المحلية."
}
}

View File

@ -0,0 +1,17 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Схаваць апошні байт(ы) IP-адрасоў наведвальнікаў, каб выканаць вашы мясцовыя законы кіруючых органаў.",
"AnonymizeIpMaskLengtDescription": "Выбраць, колькі байтаў IP-адрасоў наведвальнікаў павінны быць схаваныя.",
"AnonymizeIpMaskLength": "%1$s байт(ы) - напр., %2$s",
"ClickHereSettings": "Націсніце тут, каб атрымаць доступ да %s наладак.",
"DeleteLogDescription2": "Калі вы ўключыце аўтаматычнае выдаленне запісаў, вы павінны пераканацца, што ўсе папярэднія штодзённыя справаздачы былі апрацаваны, каб пазбегнуць гублення дадзеных.",
"DeleteLogsOlderThan": "Выдаліць запісы старэй чым",
"DeleteMaxRows": "Максімальная колькасць радкоў для выдалення за адзін праход:",
"LastDelete": "Апошняе выдаленне было",
"LeastDaysInput": "Калі ласка, пазначце колькасць дзён больш, чым %s.",
"MenuPrivacySettings": "Прыватнасць",
"NextDelete": "Наступнае запланавана выдаленне",
"TeaserHeadline": "Наладкі прыватнасці",
"UseAnonymizeIp": "Ананімазаваць IP-адрасы наведвальнікаў"
}
}

View File

@ -0,0 +1,42 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Скрива последните цифри на IP адреса на посетителя, за да бъде спазен закона за поверителност.",
"AnonymizeIpMaskLengtDescription": "Изберете колко байта от IP на посетителите да е маскирано.",
"AnonymizeIpMaskLength": "%1$s байта - пример %2$s",
"ClickHereSettings": "Натиснете тук, за да влезете в %s настройките.",
"CurrentDBSize": "Настоящ размер на базата данни",
"DBPurged": "Базата от данни е изтрита.",
"DeleteDataInterval": "Изтрий стара информация на всеки",
"DeleteLogDescription2": "Ако включите автоматичното изтриване на логове, трябва да сте сигурни, че всичките предишни дневни отчети са били преработени, за да не се изгуби информация.",
"DeleteLogsOlderThan": "Изтрий отчети по-стари от",
"DeleteMaxRows": "Максималният брой редове, които да бъдат изтрити на един път:",
"DeleteMaxRowsNoLimit": "без лимит",
"DeleteReportsConfirm": "На път сте да включите изтриване на отчетите. Ако старите отчети са изтрити, вие ще трябвате да ги изготвите наново за да ги видите. Сигурни ли сте, че искате да направите това?",
"DeleteReportsOlderThan": "Изтрива отчети по-стари от",
"DeleteDataSettings": "Изтриване на старите потребителски логове и отчети",
"DoNotTrack_Description": "Не проследявай е технология и предложение, което позволява отказ от проследяване на сайтове, които те не посещават; включително инструменти за анализ, рекламни мрежи и социални платформи.",
"DoNotTrack_Disable": "Изключете \"Не проследявай\" поддръжката.",
"DoNotTrack_DisabledMoreInfo": "Препоръчваме да уважавате поверителността на вашите посетители и да включите \"Не проследявай\" поддръжката.",
"DoNotTrack_Enable": "Включете \"Не проследявай\" поддръжката.",
"DoNotTrack_Enabled": "Понастоящем вие уважавате поверителността на вашите потребители. Браво!",
"DoNotTrack_SupportDNTPreference": "Поддръжка на \"Не проследявай\" настройки.",
"EstimatedDBSizeAfterPurge": "Изчислен размер на базата данни след изтриване",
"EstimatedSpaceSaved": "Изчислено спестено място",
"GetPurgeEstimate": "Изчисляване на времето за изтриване",
"KeepBasicMetrics": "Запазване на основните данни (посещения, посещения на страници, степен на отпадане, цели, конверсия при електронна търговия и др.)",
"KeepReportSegments": "За да запазите горната информация, също запазете сегментите на отчета.",
"LastDelete": "Последното изтриване е било на",
"LeastDaysInput": "Моля укажете номер на дни по голям от %s.",
"LeastMonthsInput": "Моля укажете номер на месеци по-голям от %s.",
"MenuPrivacySettings": "Поверителност",
"NextDelete": "Следващото планирано изтриване е на",
"PurgeNow": "Изтриване на базата данни СЕГА",
"PurgeNowConfirm": "Вие сте на път перманентно да изтриете информацията от вашата база данни. Сигурни ли сте, че искате да продължите?",
"PurgingData": "Изтриване на базата данни...",
"ReportsDataSavedEstimate": "Размер на базата данни",
"SaveSettingsBeforePurge": "Вие променихте настройките за изтриване на информация. Моля запазете ги, преди да започнете изтриване.",
"TeaserHeadline": "Настройки на поверителността",
"UseAnonymizeIp": "Правене на IP-тата на посетителите анонимни",
"UseDeleteReports": "Периодично изтрива старите посетителски отчети от базата данни"
}
}

View File

@ -0,0 +1,43 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Anonimitzar el(s) últim(s) de la IP de les adreces dels visitants per complir amb la vostra política de privacitat\/llei.",
"AnonymizeIpMaskLengtDescription": "Seleccioneu quans bytes de l'adreça IP del visitant voleu enmascarar.",
"AnonymizeIpMaskLength": "%1$s byte(s) - p.e. %2$s",
"ClickHereSettings": "Feu click aquí per entrar a %s la configuració",
"CurrentDBSize": "Tamany actual de la Base de dades",
"DBPurged": "Base de dades purgada",
"DeleteDataInterval": "Esborrar la informació antiga cada",
"DeleteLogDescription2": "Quan activeu l'eliminació automàtica us heu d'asegurar que tots els informes diaris han estat processats, així no perdeu informació.",
"DeleteLogsOlderThan": "Eliminar elsb registres anterior a",
"DeleteMaxRows": "Nombre màxim de files per eliminar en una sola execució:",
"DeleteMaxRowsNoLimit": "sense límit",
"DeleteReportsConfirm": "Esteu a punt d'activar l'eliminació de la informació dels informes. Si els informes antics s'eliminen, haure de tornar-los a procesar per veure'ls. Esteu segur que voleu fer això?",
"DeleteReportsOlderThan": "Elmina els informes anteriors a",
"DeleteDataSettings": "Eliminar el registre de visitants i informes antics",
"DoNotTrack_Description": "La tecnologia de no traquejar permet als usuris donar-se de baixa de les estadístiques pels llocs web que ells no visiten, incloïent els serveis analítiques, les xarxes públicitaries i els xarxes socials.",
"DoNotTrack_Disable": "Desactiveu el suport per a la desactivació del rastreig.",
"DoNotTrack_DisabledMoreInfo": "Recomanem respectar la privacitat dels vostres visitants i activar el suport per la desactivació del rastreig.",
"DoNotTrack_Enable": "Activeu el suport per la desactivació del restreig",
"DoNotTrack_Enabled": "Bravo! Esteu respectant la privacitat dels vostres usuaris.",
"DoNotTrack_SupportDNTPreference": "Suportar la configuració de No Rastreig",
"EstimatedDBSizeAfterPurge": "Tamany de la base de dades desprès de la purga",
"EstimatedSpaceSaved": "Tamany estalviat (estimació)",
"GeolocationAnonymizeIpNote": "Nota: La geocalitazció tindrà els mateixos resultats amb 1 bit anònim. Amb 2 bits o més, la geocalització no serà acurada.",
"GetPurgeEstimate": "Obtenir l'estimació de la purga",
"KeepBasicMetrics": "Conserveu les mètriques bàsiques ( visites, pàgines vistes, raó de rebot, conversió d'objectius, conversións ecommerce, etc.)",
"KeepReportSegments": "Per mantenir aquesta informació també heu de mantenir els informes segmentats.",
"LastDelete": "La última eliminació va ser el",
"LeastDaysInput": "Siusplau especifieu un nombre de díes més gran que %s.",
"LeastMonthsInput": "Siusplau, especifiqueu un nombre de dies més gran que %s.",
"MenuPrivacySettings": "Privacitat",
"NextDelete": "La pròxima eliminació programada el",
"PurgeNow": "Purga la BD ara",
"PurgeNowConfirm": "Esteu a punt d'esborrar tota la informació de la vostra base de ades. Esteu segur que voleu continuar?",
"PurgingData": "Prugant la informació...",
"ReportsDataSavedEstimate": "Mida de la Base de dades",
"SaveSettingsBeforePurge": "Heu canviat la configuració d'esborrament. Sisplau, guardeu les vostres preferències abans de començar la purga.",
"TeaserHeadline": "Preferències de Privacitat",
"UseAnonymizeIp": "Convertir la IP dels vostres visitants en anònima",
"UseDeleteReports": "Esobrreu els informes de la base de dades de forma períodica"
}
}

View File

@ -0,0 +1,51 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Skryje poslední byte IP adresy návštěvníka, aby souhlasila se zákony vaší země.",
"AnonymizeIpExtendedHelp": "Když uživatelé navštíví vaše stránky, Matomo neuloží jejich plnou IP adresu (jako %1$s), ale nejprve bude anonymizována (na %2$s). Anonymizace IP adres je jedním z požadavků práva na ochranu soukromí v některých zemí, jako je třeba Německo.",
"AnonymizeIpMaskLengtDescription": "Zvolte, kolik bitů z návštěvníkovy IP adresy má být maskováno.",
"AnonymizeIpMaskLength": "%1$s bitů - např. %2$s",
"ClickHereSettings": "Pro přístup k nastavení %s klikněte zde.",
"CurrentDBSize": "Aktuální velikost databáze",
"DBPurged": "Databáze vyprázdněna.",
"DeleteDataInterval": "Smazat stará data každých",
"DeleteOldVisitorLogs": "Smazat staré záznamy o návštěvnících",
"DeleteLogDescription2": "Pokud povolíte automatické mazání logů, musíte zajistit, že jsou zpracována všechna denní hlášení, aby nedošlo ke ztrátě dat.",
"DeleteLogsOlderThan": "Vymazat logy starší než",
"DeleteMaxRows": "Maximální počet řádků, které se mají smazat při jednom běhu:",
"DeleteMaxRowsNoLimit": "bez limitu",
"DeleteReportsConfirm": "Chystáte se povolit mazání starých hlášení. Pokud je budete chtít zobrazit, budou muset být znovu vytvořena. Opravdu to chcete provést?",
"DeleteReportsOlderThan": "Smazat hlášení starší než",
"DeleteSchedulingSettings": "Maplánovat výmaz starých dat",
"DeleteDataSettings": "Smazat staré logy návštěvníků a hlášení",
"DoNotTrack_Description": "Do Not Track je návrh technologie a politiky, která umožňuje uživatelům odhlásit se ze sledování stránkami, které navštíví, včetně služeb webových analýz, reklamních sítí a sociálních platforem.",
"DoNotTrack_Disable": "Zakázat podporu Do not track",
"DoNotTrack_DisabledMoreInfo": "Doporučujeme respektovat soukromí vašich návštěvníků a podporu Do not track povolit.",
"DoNotTrack_Enable": "Povolit podporu Do not track",
"DoNotTrack_Enabled": "Aktuálně respektujete soukromí vašich návštěvníků, víborně!",
"DoNotTrack_SupportDNTPreference": "Podporovat předvolbu Do not track",
"EstimatedDBSizeAfterPurge": "Odhadovaná velikost databáze po vyprázdnění",
"EstimatedSpaceSaved": "Odhadované ušetřené místo",
"GeolocationAnonymizeIpNote": "Poznámka: Geolokace bude mít přibližně stejnou přesnost, když je anonymizován 1 bit. Pokud jsou anonymizovány 2 bity a více, geolokace bude nepřesná.",
"GetPurgeEstimate": "Získat odhad po vyprázdnění",
"KeepBasicMetrics": "Uchovat základní měření (návštěvy, zobrazení stránek, odchody, cíle, atd.)",
"KeepDataFor": "Uchovávat všechna data po",
"KeepReportSegments": "Pro výše uchovávaná data také zachovat segmentovaná hlášení",
"LastDelete": "Poslední mazání bylo v",
"LeastDaysInput": "Prosím, uveďte počet dní větší než %s.",
"LeastMonthsInput": "Prosím, uveďte počet měsíců větší než %s.",
"MenuPrivacySettings": "Ochrana soukromí",
"NextDelete": "Následující plánované mazání za",
"PurgeNow": "Vyprázdnit databázi nyní",
"PurgeNowConfirm": "Chystáte se natrvalo odstranit data z vaší databáze. Opravdu chcete pokračovat?",
"PurgingData": "Promazávání dat...",
"RecommendedForPrivacy": "Doporučeno pro soukromí",
"ReportsDataSavedEstimate": "Velikost databáze",
"SaveSettingsBeforePurge": "Nastavení mazání dat byla změněna. Uložte je před promazáním.",
"SeeAlsoOurOfficialGuidePrivacy": "Podívejte se také na náš oficiální návod: %1$ssoukromí webové analýzy%2$s",
"TeaserHeadline": "Nastavení ochrany soukromí",
"UseAnonymizedIpForVisitEnrichment": "Anonymizované IP adresy použít i při obohacování návštěv.",
"UseAnonymizedIpForVisitEnrichmentNote": "Zásuvné moduly jako geolokace podle IP a poskytovatel vylepšují metadata o návštěvnících. Ve výchozím stavu tyto zásuvné moduly používají anonymizované IP adresy. Pokud vyberete \"ne\", pak tyto zásuvné moduly budou používat plné adresy, což způsobí omezení soukromí ale zlepšení výsledků.",
"UseAnonymizeIp": "Anonymizovat IP adresy návštěvníků",
"UseDeleteReports": "Průběžně mazat stará hlášení z databáze"
}
}

View File

@ -0,0 +1,60 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonymiser data",
"AnonymizeIpInlineHelp": "Anonymiser besøgendes IP-adresser for at efterkomme den lokale lovgivning om privatlivets fred\/retningslinjer.",
"AnonymizeIpExtendedHelp": "Når brugerne besøger hjemmesiden, vil Matomo ikke bruge den fulde IP-adresse (f.eks %1$s), men i stedet vil Matomo anonymisere det først (til %2$s). IP-adresse anonymisering er et af de krav, som lovgivningen om privatlivets fred i visse lande som fx. Tyskland.",
"AnonymizeIpMaskLengtDescription": "Vælg hvor mange bytes af de besøgendes IP-adresser der skal maskeres.",
"AnonymizeIpMaskLength": "%1$s bytes - f.eks %2$s",
"AskingForConsent": "Samtykkeanmodning",
"ClickHereSettings": "Klik her for at få adgang til %s indstillinger.",
"CurrentDBSize": "Nuværende databasestørrelse",
"DBPurged": "Databasen er opryddet.",
"DeleteDataInterval": "Slet gamle data hver",
"DeleteOldVisitorLogs": "Slet gamle besøgslogfiler",
"DeleteLogDescription2": "Når automatisk log sletning aktiveres, så sørg for, at alle tidligere daglige rapporter er blevet behandlet, således at ingen data går tabt.",
"DeleteLogsOlderThan": "Slet logfiler ældre end",
"DeleteMaxRows": "Maksimale antal rækker der slettes på én gang:",
"DeleteMaxRowsNoLimit": "ingen begrænsning",
"DeleteReportsConfirm": "Aktiver rapportdata sletning. Hvis gamle rapporter fjernes, skal de forarbejdes igen dem med henblik på se dem. Bekræft sletning.",
"DeleteReportsOlderThan": "Slet rapporter ældre end",
"DeleteDataSettings": "Slet gamle besøgslogfiler og -rapporter",
"DoNotTrack_Description": "Spor ikke er en teknologi og politisk forslag, der giver brugerne mulighed for at fravælge sporing af websteder, de ikke besøger, herunder analyse-tjenester, reklame netværk og sociale platforme.",
"DoNotTrack_Disable": "Deaktiver spor ikke understøttelse",
"DoNotTrack_DisabledMoreInfo": "Vi anbefaler at respektere dine besøgende privatliv og muliggøre spor ikke understøttelse.",
"DoNotTrack_Enable": "Aktiver spor ikke understøttelse",
"DoNotTrack_Enabled": "Du respekterer beskyttelse af dine brugeres personlige oplysninger, bravo!",
"DoNotTrack_EnabledMoreInfo": "Når brugere har indstillet deres browser til “jeg ønsker ikke at blive sporet” (DoNotTrack er aktiveret), vil Matomo ikke spore disse besøg.",
"DoNotTrack_SupportDNTPreference": "Understøt spor ikke præference",
"EstimatedDBSizeAfterPurge": "Anslået database størrelse efter oprydning",
"EstimatedSpaceSaved": "Anslået sparet plads",
"GeolocationAnonymizeIpNote": "Bemærk: geolokalisering vil have omtrent de samme resultater med 1 byte anonymiseret. Med 2 byte eller mere, vil geolokalisering være unøjagtig.",
"GDPR": "GDPR",
"GdprManager": "GDPR-administration",
"GdprOverview": "GDPR-overblik",
"GdprTools": "GDPR-værktøjer",
"GetPurgeEstimate": "Overslag på rensning",
"KeepBasicMetrics": "Behold grundlæggende målinger (besøg, sidevisninger, afvisningsprocent, mål konverteringer, eHandel konverteringer osv.)",
"KeepReportSegments": "For beholdte data ovenfor, beholdes desuden segmenterede rapporter",
"LastDelete": "Sidste sletningen var d.",
"LeastDaysInput": "Angiv et antal dage større end %s.",
"LeastMonthsInput": "Angiv et antal måneder større end %s.",
"MenuPrivacySettings": "Privatliv",
"NextDelete": "Næste planlagt sletning på",
"PurgeNow": "Ryd op i databasen nu",
"PurgeNowConfirm": "Permanent sletning af data fra databasen. Bekræft for at fortsætte?",
"PurgingData": "Rydder op i data...",
"ReportsDataSavedEstimate": "Database størrelse",
"SaveSettingsBeforePurge": "Indstillinger for datasletning er ændret. Gem før oprydning.",
"SeeAlsoOurOfficialGuidePrivacy": "Se også vores officielle vejledning: %1$sWeb Analytics Privacy%2$s",
"TeaserHeadline": "Privatlivsindstillinger",
"UseAnonymizedIpForVisitEnrichment": "Brug også anonymiserede IP-adresser ved berigelse af besøg.",
"UseAnonymizedIpForVisitEnrichmentNote": "Programudvidelser som Geo Location via IP og udbyder forbedrer besøgendes metadata. Som standard bruger disse udvidelsesmoduler anonyme IP-adresser. Hvis du vælger 'Nej', så vil den ikke-anonymiseret fulde IP-adresse blive brugt i stedet for, hvilket resulterer i mindre privatliv, men bedre data nøjagtighed.",
"UseAnonymizeIp": "Anonymisere besøgendes IP-adresser",
"UseAnonymizeTrackingData": "Anonymiser sporingsdata",
"PseudonymizeUserId": "Erstat bruger-ID med et pseudonym",
"UseDeleteReports": "Slet regelmæssigt gamle rapporter fra databasen",
"PrivacyPolicyUrl": "Privatlivspolitik-URL",
"PrivacyPolicyUrlDescription": "Link til din privatlivspolitik.",
"PrivacyPolicy": "Privatlivspolitik"
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Daten anonymisieren",
"AnonymizeIpDescription": "Wählen Sie \"Ja\", wenn Mamoto keine vollständigen IP-Adressen speichern soll.",
"AnonymizeIpInlineHelp": "Um den Datenschutzbestimmungen Ihres Landes gerecht zu werden, können Sie mit diesem Plugin die letzten Bytes der IP-Adresse Ihrer Besucher anonymisieren.",
"AnonymizeIpExtendedHelp": "Wenn Benutzer Ihre Website besuchen, wird Matomo nicht die komplette IP-Adresse (so wie %1$s) benützen, sondern sie stattdessen zuerst anonymisieren (zu %2$s). Die Anonymisierung der IP-Adresse ist in einigen Ländern eine gesetzliche Pflicht, zum Beispiel in Deutschland vorgegeben durch das Datenschutzrecht.",
"AnonymizeIpMaskLengtDescription": "Wählen Sie aus, wieviele Bytes der Besucher-IP maskiert werden sollen.",
"AnonymizeIpMaskLength": "%1$s byte(s) - z.B. %2$s",
"AskingForConsent": "Um Erlaubnis bitten",
"ClickHereSettings": "Hier klicken, um die %s Einstellungen zu bearbeiten.",
"CurrentDBSize": "Aktuelle Größe der Datenbank",
"DBPurged": "Datenbank bereinigt.",
"DeleteBothConfirm": "Sie sind dabei, das Löschen von sowohl Berichts- als auch unbearbeiteten Daten zu aktivieren. Das wird Ihnen dauerhaft die Möglichkeit nehmen, auf alte Analysedaten zuzugreifen. Sind Sie sicher, dass Sie das wollen?",
"DeleteDataDescription": "Sie können Matomo so konfigurieren, dass regelmäßig alte Besucher-Logs und\/oder generierte Berichte gelöscht werden, um die Größe der Datenbank klein zu halten oder Datenschutzregeln wie die DSGVO einzuhalten.",
"DeleteDataInterval": "Lösche alte Daten alle",
"DeleteOldVisitorLogs": "Alte Besucher-Logs löschen",
"DeleteOldRawData": "Lösche regelmäßig alte Daten aus der Datenbank",
"DeleteOldAggregatedReports": "Alte vereinigte Berichtdaten löschen",
"DeleteLogDescription2": "Wenn Sie das automatische Leeren von Logs aktivieren, müssen Sie sicherstellen, dass alle (Tages-)Berichte bereits berechnet wurden, um Datenverlust zu vermeiden.",
"DeleteRawDataInfo": "Die Rohdaten enthalten alle Details über jeden individuellen Besuch und jede vom Besucher getätigte Aktion. Wenn Sie Rohdaten löschen, dann ist die gelöschte Information nicht mehr im Besucher-Log verfügbar. Ausserdem werden segmentierte Berichte für dieses gelöschte Zeitfenster nicht mehr verfügbar sein, wenn Sie später beschliessen, ein Segment zu erstellen, weil alle aggregierten Berichte aus diesen Rohrdaten generiert werden.",
"DeleteLogsConfirm": "Sie sind dabei, das Löschen von unbearbeiteten Daten zu aktivieren. Wenn alte Daten gelöscht werden und die entsprechenden Berichte noch nicht generiert worden sind, können Sie auf die historischen Analysedaten später nicht mehr zugreifen. Sind Sie sicher, dass Sie das wollen?",
"DeleteLogsOlderThan": "Logs löschen, die älter sind als",
"DeleteMaxRows": "Maximale Anzahl der Datensätze, die pro Durchlauf gelöscht werden dürfen:",
"DeleteMaxRowsNoLimit": "Keine Begrenzung",
"DeleteReportsConfirm": "Sie sind dabei, das Löschen von Berichtsdaten zu aktivieren. Wenn alte Berichte entfernt wurden, müssen Sie diese neu generieren, um Sie anzusehen. Sind Sie sicher, dass Sie das wollen?",
"DeleteAggregateReportsDetailedInfo": "Wenn Sie diese Einstellung aktivieren, werden alle aggregierten Berichte gelöscht. Aggregierte Berichte werden aus den Rohdaten generiert und repräsentieren aggregierte Daten aus diversen individuellen Besuchen. Der \"Land\" Bericht zum Beispiel listet aggregierte Zahlen um aufzuzeigen wie viele Besuche Sie von welchem Land erhalten haben.",
"KeepBasicMetricsReportsDetailedInfo": "Wenn Sie diese Einstellung aktivieren, werden einige Schlüsselleistungsindikatoren nicht gelöscht.",
"DeleteReportsInfo2": "Wenn Sie alte Berichte löschen, dann können diese aus den Rohdaten wiederhergestellt werden falls Sie sie benötigen.",
"DeleteReportsInfo3": "Wenn Sie auch \"%s\" aktiviert haben, sind die Berichte dauerhaft gelöscht.",
"DeleteReportsOlderThan": "Lösche Berichte, die älter sind als",
"DeleteSchedulingSettings": "Löschung alter Daten planen",
"DeleteDataSettings": "Alte Besucher-Logs und Berichte löschen",
"DoNotTrack_Description": "Do-not-Track ist eine Technologie und ein Richtlinienvorschlag, der es Benutzern ermöglichen soll, selbständig zu entscheiden, ob ihr Verhalten von Websites, Werbenetzwerken und Sozialen Netzwerken verfolgt wird.",
"DoNotTrack_Disable": "Do-not-Track Unterstützung deaktivieren",
"DoNotTrack_Disabled": "Mamoto verfolgt derzeit das Verhalten aller Besucher, auch derjenigen, die explizit in ihrem Browser \"Ich möchte nicht getrackt werden\" eingestellt haben.",
"DoNotTrack_DisabledMoreInfo": "Wir empfehlen, die Privatsphäre Ihrer Besucher zu respektieren und die Do-not-Track Unterstützung zu aktivieren.",
"DoNotTrack_Enable": "Do-not-Track Unterstützung aktivieren",
"DoNotTrack_Enabled": "Sie respektieren die Privatsphäre Ihrer Besucher, Bravo!",
"DoNotTrack_EnabledMoreInfo": "Wenn Benutzer in ihrem Browser \"Ich möchte nicht getrackt werden\" eingestellt haben (Do-not-Track aktiviert), dann wird Mamoto diese Besuche nicht tracken.",
"DoNotTrack_SupportDNTPreference": "Do-not-Track Einstellungen",
"EstimatedDBSizeAfterPurge": "Erwartete Größe der Datenbank nach dem Löschen",
"EstimatedSpaceSaved": "Geschätzte Speichereinsparung",
"GeolocationAnonymizeIpNote": "Hinweis: Standorterkennung wird ungefähr das gleiche Ergebnis haben, wenn 1 Byte anonymisiert ist. Bei 2 Bytes oder mehr wird Geolokalisierung sehr ungenau werden.",
"GDPR": "DSGVO",
"GdprManager": "DSGVO Verwaltung",
"GdprOverview": "DSGVO Übersicht",
"GdprTools": "DSGVO Hilfsmittel",
"GetPurgeEstimate": "Hochrechnung der Auswirkungen anzeigen",
"KeepBasicMetrics": "Behalte Basismetriken (Besuche, Seitenansichten, Absprungrate, Ziel-Konversionen, Ecommerce-Konversionen, etc.)",
"KeepDataFor": "Behalte alle Daten für",
"KeepReportSegments": "Für die behaltenen Daten oben, auch segmentierte Berichte behalten",
"LastDelete": "Letzter Löschvorgang war am",
"LeastDaysInput": "Bitte geben Sie eine Anzahl an Tagen an, die größer als %s ist.",
"LeastMonthsInput": "Bitte spezifizieren Sie eine Anzahl Monate größer als %s.",
"MenuPrivacySettings": "Privatsphäre",
"NextDelete": "Nächste Löschung geplant in",
"PluginDescription": "Erweitern Sie den Datenschutz für Ihre Benutzer und machen Sie Ihre Matomo Installation gemäss Ihren lokalen Datenschutzbestimmungen datenschutzkonform.",
"PurgeNow": "Datenbank jetzt leeren",
"PurgeNowConfirm": "Sie sind dabei, Daten dauerhaft aus der Datenbank zu entfernen. Sind Sie sicher?",
"PurgingData": "Daten werden bereinigt...",
"RecommendedForPrivacy": "Für den Datenschutz empfohlen",
"ReportsDataSavedEstimate": "Größe der Datenbank",
"SaveSettingsBeforePurge": "Sie haben die Einstellungen für das Löschen von Daten geändert. Bitte erst speichern, bevor Sie einen Löschvorgang starten.",
"SeeAlsoOurOfficialGuidePrivacy": "Siehe auch unser offizielles Handbuch: %1$sWebanalyse Privatsphäre%2$s",
"TeaserHeader": "Auf dieser Seite können Sie Matomo individuell anpassen, um es konform zur bestehenden Gesetzgebung zu halten, durch: %1$s Anonymisierung der Besucher IP%2$s, %3$s automatisches entfernen alter Besucherlogdateien aus der Datenbank%4$s, und %5$s anonymisieren von zuvor registrierten rohen Benutzerdaten%6$s.",
"TeaserHeadline": "Privatsphäreeinstellungen",
"UseAnonymizedIpForVisitEnrichment": "Benutze die anonymisierte IP-Adresse auch für die Aufbereitung der Besuche.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugins wie Geolokalisierung anhand IP und Provider verbessern die Metadaten eines Besuchers. Normalerweise verwenden diese Plugins die anonymisierte IP-Adresse. Wenn sie 'Nein' auswählen wird stattdessen die nicht anonymisierte volle IP-Adresse verwendet. Daraus resultiert eine größere Genauigkeit, jedoch weniger Privatsphäre.",
"PseudonymizeUserIdNote": "Wenn Sie diese Option aktivieren, wird die Benutzer ID durch ein Pseudonym ersetzt, um zu verhindern, dass persönlich identifizierbare Informationen wie die E-Mail-Adresse direkt gespeichert oder angezeigt werden. In technischer Beschreibung: Matomo wird die Benutzer ID mit Hilfe einer salted hash Funktion pseudonymisieren.",
"PseudonymizeUserIdNote2": "Hinweis: Mit einem Pseudonym ersetzen ist nicht dasselbe wie Anonymisierung. Gemäss GDPR Bedinungen: Das Benutzer ID Pseudonym zählt zu den persönlichen Daten. Die Original Benutzer ID kann weiterhin identifiziert werden, wenn bestimmte zusätzlichen Daten vorhanden sind (auf welche nur Matomo und der Datenprozessor Zugriff haben).",
"AnonymizeOrderIdNote": "Da eine Bestellnummer mit einem anderen System referenziert sein kann, typischerweise einem E-Commerce Shop, könnte die Bestellnummer zu den persönlichen Informationen zählen die unter die DSGVO fallen. Wenn diese Einstellung aktiviert wird, wird die Bestellnummer automatisch anonymisiert, um keine persönlichen Informationen zu speichern.",
"UseAnonymizeIp": "Anonymisiere die IP-Adresse von Besuchern",
"UseAnonymizeTrackingData": "Tracking Daten anonymisieren",
"UseAnonymizeUserId": "Benutzer-ID anonymisieren",
"PseudonymizeUserId": "Benutzer ID mit Pseudonym austauschen",
"UseAnonymizeOrderId": "Bestellnummer anonymisieren",
"UseDeleteLog": "Lösche regelmäßig alte Daten aus der Datenbank",
"UseDeleteReports": "Lösche regelmäßig alte Berichte aus der Datenbank",
"UsersOptOut": "Benutzer Opt-Out",
"PrivacyPolicyUrl": "URL für Datenschutzrichtlinie",
"PrivacyPolicyUrlDescription": "Ein Link zu Ihrer Datenschutzrichtlinienseite.",
"TermsAndConditionUrl": "URL für Geschäftsbedingungen",
"TermsAndConditionUrlDescription": "Ein Link zu Ihrer Geschäftsbedingungenseite.",
"PrivacyPolicyUrlDescriptionSuffix": "Wenn Sie etwas angeben, wird es am Ende der Anmeldeseite und auf Seiten angezeigt, auf die der '%1$s' Benutzer Zugriff hat.",
"ShowInEmbeddedWidgets": "In eingebetteten Widgets anzeigen",
"ShowInEmbeddedWidgetsDescription": "Wenn angewählt, wird am Ende der eingebetteten Widgets ein Link zu Ihren Datenschutzrichtlinien und zu Ihren Geschäftsbedingungen angezeigt.",
"PrivacyPolicy": "Datenschutzrichtlinie",
"TermsAndConditions": "Geschäftsbedingungen"
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Ανωνυμοποίηση των δεδομένων",
"AnonymizeIpDescription": "Επιλέξτε \"Ναι\" αν επιθυμείτε το Matomo να μην παρακολουθεί πλήρεις διευθύνσεις IP.",
"AnonymizeIpInlineHelp": "Αποκρύπτει το τελευταίο byte των διευθύνσεων IP των επισκεπτών σας για συμμόρφωση με την τοπική νομοθεσία περί Ιδιωτικού Απορρήτου.",
"AnonymizeIpExtendedHelp": "Όταν οι χρήστες επισκέπτονται τον ιστοτόπο σας, το Matomo δε θα χρησιμοποιήσει την πλήρη διεύθυνση IP (όπως %1$s), αντίθετα θα την κάνει πρώτα ανώνυμη (σε %2$s). Η ανωνυμοποίηση των διευθύνσεων IP είναι μία από τις απαιτήσεις που θέτει η νομοθεσία σε ορισμένες χώρες όπως η Γερμανία.",
"AnonymizeIpMaskLengtDescription": "Επιλέξτε πόσα bytes από τις διευθύνσεις IP των επισκεπτών πρέπει να κρύβονται.",
"AnonymizeIpMaskLength": "%1$s byte - πχ. %2$s",
"AskingForConsent": "Ερώτημα για συναίνεση",
"ClickHereSettings": "Πατήστε εδώ για να έχετε πρόσβαση στις ρυθμίσεις %s.",
"CurrentDBSize": "Τρέχον μέγεθος βάσης δεδομένων",
"DBPurged": "Η βάση δεδομένων διαγράφτηκε.",
"DeleteBothConfirm": "Πρόκειται να ενεργοποιήσετε τη διαγραφή δεδομένων καταγραφής και αναφορών. Αυτό θα αφαιρέσει μόνιμα τη δυνατότητα να βλέπετε παλαιά δεδομένα αναλυτικών. Σίγουρα επιθυμείτε να συνεχίσετε;",
"DeleteDataDescription": "Μπορείτε να παραμετροποιήσετε το Matomo να διαγράφει τακτικά παλιά ανεπεξέργαστα δεδομένα και\/ή συγκεντρωτικές αναφορές για να κρατάει το μέγεθος της βάσης δεδομένων μικρό ή να πληρεί τους κανονισμούς ιδιωτικότητας όπως το GDPR.",
"DeleteDataInterval": "Διαγραφή παλαιών δεδομένων κάθε",
"DeleteOldVisitorLogs": "Διαγραφή παλιών εγγραφών ημερολογίου επισκεπτών",
"DeleteOldRawData": "Τακτική διαγραφή παλιών ανεπεξέργαστων δεδομένων",
"DeleteOldAggregatedReports": "Διαγραφή δεδομένων παλιών αρχειοθετημένων αναφορών",
"DeleteLogDescription2": "Όταν ενεργοποιήσετε την αυτόματη διαγραφή καταγραφών, πρέπει να είστε σίγουροι ότι όλες οι προηγούμενες ημερήσιες αναφορές έχουν καταχωρηθεί για να μην χαθούν δεδομένα.",
"DeleteRawDataInfo": "Τα ανεπεξέργαστα δεδομένα περιέχουν όλες τις λεπτομέρειες όπως η κάθε επίσκεψη και κάθε ενέργεια που έκανε ένας επισκέπτης. Όταν διαγράφετε ανεπεξέργαστα δεδομένα, η διαγραμμένη πληροφορία δε θα είναι πλέον διαθέσιμη στο ημερολόγιο επισκέπτη. Αν αργότερα αποφασίσετε να δημιουργήσετε μια κατάτμηση, οι κατατετμημένες αναφορές δεν θα είναι διαθέσιμες για το χρονικό διάστημα που έχει διαγραφεί, καθώς όλες οι συγκεντρωτικές αναφορές δημιουργούνται από αυτά τα ανεπεξέργαστα δεδομένα.",
"DeleteLogsConfirm": "Πρόκειται να ενεργοποιήσετε τη διαγραφή δεδομένων καταγραφής. Αν διαγραφούν παλιά δεδομένα που δεν έχουν επεξεργαστεί και οι αναφορές δεν έχουν δημιουργηθεί, δε θα είστε σε θέση να δείτε ιστορικές αναφορές αναλυτικών. Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;",
"DeleteLogsOlderThan": "Διαγραφή καταγραφών παλαιοτέρων από",
"DeleteMaxRows": "Μέγιστος αριθμός εγγραφών για διαγραφή κάθε φορά:",
"DeleteMaxRowsNoLimit": "χωρίς περιορισμό",
"DeleteReportsConfirm": "Πρόκειται να ενεργοποιήσετε τη διαγραφή δεδομένων αναφορών. Αν οι παλαιές αναφορές απομακρυνθούν, θα πρέπει να τις ξαναδημιουργήσετε ώστε να τις δείτε. Θέλετε, σίγουρα, να συνεχίσετε;",
"DeleteAggregateReportsDetailedInfo": "Όταν ενεργοποιείτε αυτή τη ρύθμιση, όλες οι συγκεντρωτικές αναφορές θα διαγραφούν. Οι συγκεντρωτικές αναφορές δημιουργούνται από τα ανεπεξέργαστα δεδομένα και αντιπροσωπεύουν τα συγκεντρωτικά δεδομένα για τις διάφορες επισκέψεις. Για παράδειγμα, η αναφορά \"Χώρα\" εμφανίζει συγκεντρωτικούς αριθμούς για να δείτε πόσες επισκέψεις έγιναν από κάθε χώρα.",
"KeepBasicMetricsReportsDetailedInfo": "Όταν ενεργοποιήσετε αυτή τη ρύθμιση, ορισμένοι αριθμητικοί δείκτες απόδοσης δε θα διαγραφούν.",
"DeleteReportsInfo2": "Αν διαγράψετε παλιές αναφορές, ενδέχεται να γίνει επεξεργασία τους και πάλι από τα ανεπεξέργαστα δεδομένα όταν τις ξαναζητήσετε.",
"DeleteReportsInfo3": "Αν έχετε επίσης ενεργοποιήσει το \"%s\", τα δεδομένα των αναφορών που διαγράφετε θα χαθούν για πάντα.",
"DeleteReportsOlderThan": "Διαγραφή αναφορών παλαιότερων από",
"DeleteSchedulingSettings": "Προγραμματισμός διαγραφής παλιών δεδομένων",
"DeleteDataSettings": "Διαγραφή παλαιών καταγραφών επισκεπτών και αναφορών",
"DoNotTrack_Description": "Το Do Not Track είναι μια τεχνολογική και πολιτική πρόταση που δίνει τη δυνατότητα στους χρήστες να απενεργοποιούν την καταγραφή από ιστοσελίδες που δεν επισκέπτονται, όπως υπηρεσίες ανάλυσης, διαφημιστικά δίκτυα και κοινωνικές πλατφόρμες.",
"DoNotTrack_Disable": "Απενεργοποίηση Υποστήριξης Μη Καταγραφής",
"DoNotTrack_Disabled": "Το Matomo καταγράφει όλους τους επισκέπτες, ακόμα και αυτούς που δηλώνουν ότι «Δεν θέλουν να καταγράφονται» στους φυλλομετρητές τους.",
"DoNotTrack_DisabledMoreInfo": "Προτείνουμε να σεβαστείτε την ιδιωτικότητα των επισκεπτών σας και να ενεργοποιήσετε την υποστήριξη του DoNotTrack.",
"DoNotTrack_Enable": "Ενεργοποίηση Υποστήριξης Μη Καταγραφής",
"DoNotTrack_Enabled": "Σέβεστε την Ιδιωτικότητα των χρηστών σας. Μπράβο!",
"DoNotTrack_EnabledMoreInfo": "Όταν οι χρήστες έχουν ορίσει στον φυλλομετρητή τους ότι «Δεν επιθυμώ να καταγράφομαι» (το DoNotTrack είναι ενεργό) τότε το Matomo δεν θα καταγράφει αυτές τις επισκέψεις.",
"DoNotTrack_SupportDNTPreference": "Υποστήριξη επιλογής Μη Καταγραφής",
"EstimatedDBSizeAfterPurge": "Εκτιμώμενο μέγεθος βάσης δεδομένων μετά την εκκαθάριση",
"EstimatedSpaceSaved": "Εκτιμώμενος χώρος που εξοικονομήθηκε",
"GeolocationAnonymizeIpNote": "Σημείωση: Η Γεωτοποθεσία θα έχει περίπου τα ίδια αποτελέσματα με 1 byte ανώνυμο. Με 2 bytes ή περισσότερο, η Γεωτοποθεσία θα είναι ανακριβής.",
"GDPR": "GDPR",
"GdprManager": "Διαχειριστής GDPR",
"GdprOverview": "Σύνοψη GDPR",
"GdprTools": "Εργαλεία GDPR",
"GetPurgeEstimate": "Λάβετε εκτίμηση διαγραφής",
"KeepBasicMetrics": "Διατήρηση βασικών μετρήσεων (επισκέψεις, προβολές σελίδας, βαθμός αναπήδησης, μετατροπή στόχου, μετατροπές ηλεκτρονικού εμπορίου, κλπ.)",
"KeepDataFor": "Να διατηρούνται όλα τα δεδομένα για",
"KeepReportSegments": "Για να διατηρήσετε τα παραπάνω δεδομένα, κρατείστε, επίσης, και τις τεμαχισμένες αναφορές",
"LastDelete": "Η τελευταία διαγραφή ήταν την",
"LeastDaysInput": "Ορίστε ένα αριθμό ημερών μεγαλύτερο από %s.",
"LeastMonthsInput": "Ορίστε έναν αριθμό μηνών μεγαλύτερο από %s.",
"MenuPrivacySettings": "Ιδιωτικό απόρρητο",
"NextDelete": "Η επόμενη προγραμματισμένη διαγραφή σε",
"PluginDescription": "Αυξήστε την Ιδιωτικότητα των χρηστών σας και κάντε συμβατή την εγκατάσταση του Matomo σας με την νομοθεσία της χώρας σας.",
"PurgeNow": "Εκκαθάριση Βάσης Δεδομένων Τώρα",
"PurgeNowConfirm": "Πρόκειται να διαγράψετε μόνιμα δεδομένα από τη βάση δεδομένων σας. Θέλετε, σίγουρα, να συνεχίσετε;",
"PurgingData": "Εκκαθάριση δεδομενων...",
"RecommendedForPrivacy": "Προτείνεται για λόγους ιδιωτικότητας",
"ReportsDataSavedEstimate": "Μέγεθος βάσης δεδομένων",
"SaveSettingsBeforePurge": "Έχετε αλλάξει τις ρυθμίσεις διαγραφής δεδομένων. Αποθηκεύστε τις πριν αρχίσετε την εκκαθάριση.",
"SeeAlsoOurOfficialGuidePrivacy": "Δείτε επίσης τον επίσημο οδηγό μας: %1$sΙδιωτικότητα στα Αναλυτικά Ιστού%2$s",
"TeaserHeader": "Στη σελίδα αυτή, μπορείτε να παραμετροποιήσετε το Matomo για να το κάνετε συμβατό με την υπάρχουσα νομοθεσία, με: %1$sανωνυμοποίηση της διεύθυνσης IP του επισκέπτη%2$s, %3$sαυτόματη αφαίρεση ημερολογίων επισκεπτών από τη βάση δεδομένων%4$s και %5$sανωνυμοποίηση παλιότερων ανεπεξέργαστων δεδομένων χρηστών%6$s.",
"TeaserHeadline": "Ρυθμίσεις ιδιωτικού απορρήτου",
"UseAnonymizedIpForVisitEnrichment": "Χρησιμοποιήστε παράλληλα και τις Ανώνυμες Διευθύνσεις IP κατά τον εμπλουτισμό των επισκέψεων.",
"UseAnonymizedIpForVisitEnrichmentNote": "Πρόσθετα όπως αυτό της Γεωτοποθεσίας και του Παρόχου βελτιώνουν τα μεταδεδομένα για τους επισκέπτες. Εξ' ορισμού τα πρόσθετα αυτά χρησιμοποιούν ανώνυμες διευθύνσεις IP. Αν επιλέξετε 'Όχι', τότε θα χρησιμοποιηθούν οι πλήρεις διευθύνσεις IP, έχοντας ως αποτέλεσμα λιγότερη ιδιωτικότητα, αλλά καλύτερη ακρίβεια δεδομένων.",
"PseudonymizeUserIdNote": "Αν ενεργοποιήστε την επιλογή αυτή, το αναγνωριστικό χρήστη θα αντικατασταθεί από ένα ψευδώνυμο για να αποφευχθεί η αποθήκευση και εμφάνιση πληροφοριών που ενδέχεται να ταυτοποιήσουν το άτομο, όπως μια διεύθυνση ηλεκτρονικού ταχυδρομείου. Σε τεχνικούς όρους, με δεδομένο το αναγνωριστικό χρήστη, το Matomo θα επεξεργαστεί το ψευδώνυμο με χρήση συνάρτησης κατακερματισμού.",
"PseudonymizeUserIdNote2": "Σημείωση: Η αντικατάσταση με ψευδώνυμο δεν είναι το ίδιο με την ανωνυμοποίηση. Σε όρους GDPR: το αναγνωριστικό χρήστη θα συνεχίσει να εκλαμβάνεται ως προσωπικό δεδομένο. Το αρχικό αναγνωριστικό χρήστη μπορεί να ταυτοποιηθεί αν υπάρχει διαθέσιμη επιπρόσθετη πληροφορία (στην οποία μόνο το Matomo και ο επεξεργαστής δεδομένων σας έχει πρόσβαση).",
"AnonymizeOrderIdNote": "Επειδή το αναγνωριστικό παραγγελίας μπορεί να συσχετιστεί με άλλο σύστημα, τυπικά ένα κατάστημα ηλεκτρονικού εμπορίου, το αναγνωριστικό παραγγελίας μπορεί να θεωρηθεί προσωπικό δεδομένο σύμφωνα με το GDPR. Όταν ενεργοποιήστε την επιλογή αυτή, το αναγνωριστικό παραγγελίας θα γίνει αυτόματα ανώνυμο ώστε να μην γίνεται παρακολούθηση προσωπικών πληροφοριών.",
"UseAnonymizeIp": "Κάντε ανώνυμες τις διευθύνσεις IP Επισκεπτών",
"UseAnonymizeTrackingData": "Ανωνυμοποίηση Παρακολούθησης Δεδομένων",
"UseAnonymizeUserId": "Ανωνυμοποίηση αναγνωριστικού χρήστη",
"PseudonymizeUserId": "Αντικατάσταση του αναγνωριστικού χρήστη με ψευδώνυμο",
"UseAnonymizeOrderId": "Ανωνυμοποίηση αναγνωριστικού παραγγελίας",
"UseDeleteLog": "Τακτική διαγραφή παλιών ανεπεξέργαστων δεδομένων από τη βάση δεδομένων",
"UseDeleteReports": "Τακτική διαγραφή παλαιών αναφορών από τη βάση δεδομένων",
"UsersOptOut": "Opt-out χρηστών",
"PrivacyPolicyUrl": "Διεύθυνση URL Πολιτικής Ιδιωτικότητας",
"PrivacyPolicyUrlDescription": "Ένας σύνδεσμος για την σελίδα Πολιτικής Ιδιωτικότητας.",
"TermsAndConditionUrl": "Διεύθυνση URL Όρων Χρήσης",
"TermsAndConditionUrlDescription": "Ένας σύνδεσμος για την σελίδα Όρων Χρήσης.",
"PrivacyPolicyUrlDescriptionSuffix": "Αν το ορίσετε, θα εμφανίζεται στο κάτω μέρος της σελίδας εισόδου χρήστη και στις σελίδες που ο χρήστης '%1$s' έχει πρόσβαση.",
"ShowInEmbeddedWidgets": "Εμφάνιση στα ενσωματωμένα γραφικά συστατικά",
"ShowInEmbeddedWidgetsDescription": "Αν είναι τσεκαρισμένο, θα εμφανίζεται ένας σύνδεσμος για την Πολιτική Ιδιωτικότητας και Όρων Χρήσης στο κάτω μέρος των ενσωματωμένων γραφικών συστατικών.",
"PrivacyPolicy": "Πολιτική Ιδιωτικότητας",
"TermsAndConditions": "Όροι Χρήσης"
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonymize data",
"AnonymizeIpDescription": "Select \"Yes\" if you want Matomo not to track fully qualified IP-Addresses.",
"AnonymizeIpInlineHelp": "Anonymize the last byte(s) of visitors IP addresses to comply with your local privacy laws\/guidelines.",
"AnonymizeIpExtendedHelp": "When users visit your website, Matomo will not use the full IP address (such as %1$s) but instead Matomo will anonymise it first (to %2$s). IP address anonymisation is one of the requirements set by the privacy laws in some countries such as Germany.",
"AnonymizeIpMaskLengtDescription": "Select how many bytes of the visitors' IPs should be masked.",
"AnonymizeIpMaskLength": "%1$s byte(s) - e.g. %2$s",
"AskingForConsent": "Asking for consent",
"ClickHereSettings": "Click here to access the %s settings.",
"CurrentDBSize": "Current database size",
"DBPurged": "DB purged.",
"DeleteBothConfirm": "You are about to enable both raw data deletion & report data deletion. This will permanently remove your ability to view old analytics data. Are you sure you want to do this?",
"DeleteDataDescription": "You can configure Matomo to regularly delete old raw data and\/or aggregated reports to keep your database small or to meet privacy regulations such as GDPR.",
"DeleteDataInterval": "Delete old data every",
"DeleteOldVisitorLogs": "Delete old visitor logs",
"DeleteOldRawData": "Regularly delete old raw data",
"DeleteOldAggregatedReports": "Delete old aggregated report data",
"DeleteLogDescription2": "When you enable automatic log deletion, you must ensure that all previous daily reports have been processed, so that no data is lost.",
"DeleteRawDataInfo": "The raw data contains all details about each individual visit and each action your visitors took. When you delete raw data, the deleted information won't be available anymore in the visitor log. Also if you later decide to create a segment, the segmented reports won't become available for the time frame that has been deleted since all aggregated reports are generated from this raw data.",
"DeleteLogsConfirm": "You are about to enable raw data deletion. If old raw data is removed, and reports haven't already been created, you will not be able to see historical past analytics data. Are you sure you want to do this?",
"DeleteLogsOlderThan": "Delete logs older than",
"DeleteMaxRows": "Maximum number of rows to delete in one run:",
"DeleteMaxRowsNoLimit": "no limit",
"DeleteReportsConfirm": "You are about to enable report data deletion. If old reports are removed, you will have to re-process them in order view them. Are you sure you want to do this?",
"DeleteAggregateReportsDetailedInfo": "When you enable this setting, all aggregated reports will be deleted. Aggregated reports are generated from the raw data and represent aggregated data from several individual visits. For example, the \"Country\" report lists aggregated numbers to see how many visits you have gotten from each country.",
"KeepBasicMetricsReportsDetailedInfo": "When you enable this setting, some numeric key performance indicators won't be deleted.",
"DeleteReportsInfo2": "If you delete old reports, they may be re-processed again from your RAW data when you request them.",
"DeleteReportsInfo3": "If you have also enabled \"%s\", then the reports data you're deleting will be permanently lost.",
"DeleteReportsOlderThan": "Delete reports older than",
"DeleteSchedulingSettings": "Schedule old data deletion",
"DeleteDataSettings": "Delete old visitor logs and reports",
"DoNotTrack_Description": "Do Not Track is a technology and policy proposal that enables users to opt out of tracking by websites they do visit, including analytics services, advertising networks, and social platforms.",
"DoNotTrack_Disable": "Disable Do Not Track support",
"DoNotTrack_Disabled": "Matomo is currently tracking all visitors, even when they specified \"I do not want to be tracked\" in their web browsers.",
"DoNotTrack_DisabledMoreInfo": "We recommend to respect your visitors privacy and enable DoNotTrack support.",
"DoNotTrack_Enable": "Enable Do Not Track support",
"DoNotTrack_Enabled": "You are currently respecting your users Privacy, Bravo!",
"DoNotTrack_EnabledMoreInfo": "When users have set their web browser to \"I do not want to be tracked\" (DoNotTrack is enabled) then Matomo will not track these visits.",
"DoNotTrack_SupportDNTPreference": "Support Do Not Track preference",
"EstimatedDBSizeAfterPurge": "Estimated database size after purge",
"EstimatedSpaceSaved": "Estimated space saved",
"GeolocationAnonymizeIpNote": "Note: Geolocation will have approximately the same results with 1 byte anonymized. With 2 bytes or more, Geolocation will be inaccurate.",
"GDPR": "GDPR",
"GdprManager": "GDPR Manager",
"GdprOverview": "GDPR Overview",
"GdprTools": "GDPR Tools",
"GetPurgeEstimate": "Get purge estimate",
"KeepBasicMetrics": "Keep basic metrics (visits, page views, bounce rate, goal conversions, ecommerce conversions, etc.)",
"KeepDataFor": "Keep all data for",
"KeepReportSegments": "For kept data above, also keep segmented reports",
"LastDelete": "Last deletion was on",
"LeastDaysInput": "Please specify a number of days greater than %s.",
"LeastMonthsInput": "Please specify a number of months greater than %s.",
"MenuPrivacySettings": "Privacy",
"NextDelete": "Next scheduled deletion in",
"PluginDescription": "Increase Privacy for your users and make your Matomo instance privacy compliant with your local legislation. ",
"PurgeNow": "Purge DB Now",
"PurgeNowConfirm": "You are about to permanently delete data from your database. Are you sure you want to continue?",
"PurgingData": "Purging data...",
"RecommendedForPrivacy": "Recommended for privacy",
"ReportsDataSavedEstimate": "Database size",
"SaveSettingsBeforePurge": "You have changed the data deletion settings. Please save them before starting a purge.",
"SeeAlsoOurOfficialGuidePrivacy": "See also our official guide: %1$sWeb Analytics Privacy%2$s",
"TeaserHeader": "On this page, you can customize Matomo to make it privacy compliant with existing legislations, by: %1$s anonymizing the visitor IP%2$s, %3$s automatically remove old visitor logs from the database%4$s, and %5$s anonymise previously tracked raw users' data%6$s.",
"TeaserHeadline": "Privacy Settings",
"UseAnonymizedIpForVisitEnrichment": "Also use the Anonymized IP addresses when enriching visits.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugins such as Geo Location via IP and Provider improve visitor's metadata. By default these plugins use the anonymized IP addresses. If you select 'No', then the non-anonymized full IP address will be used instead, resulting in less privacy but better data accuracy.",
"PseudonymizeUserIdNote": "When you enable this option, the User ID will be replaced by a pseudonym to avoid directly storing and displaying personally identifiable information such as an email address. In technical terms: given your User ID, Matomo will process the User ID pseudonym using a salted hash function.",
"PseudonymizeUserIdNote2": "Note: replacing with a pseudonym is not the same as anonymisation. In GDPR terms: the User ID pseudonym still counts as personal data. The original User ID could still be identified if certain additional information is available (which only Matomo and your data processor has access to).",
"AnonymizeOrderIdNote": "Because an Order ID can be cross referenced with another system, typically an ecommerce shop, the Order ID may count as personal information under the GDPR. When you enable this option, an Order ID will be automatically anonymized so no personal information will be tracked.",
"UseAnonymizeIp": "Anonymize Visitors' IP addresses",
"UseAnonymizeTrackingData": "Anonymize Tracking Data",
"UseAnonymizeUserId": "Anonymize User ID",
"PseudonymizeUserId": "Replace User ID with a pseudonym",
"UseAnonymizeOrderId": "Anonymize Order ID",
"UseDeleteLog": "Regularly delete old raw data from the database",
"UseDeleteReports": "Regularly delete old reports from the database",
"UsersOptOut": "Users opt-out",
"PrivacyPolicyUrl": "Privacy Policy URL",
"PrivacyPolicyUrlDescription": "A link to your Privacy Policy page.",
"TermsAndConditionUrl": "Terms & Conditions URL",
"TermsAndConditionUrlDescription": "A link to your Terms & Conditions page.",
"PrivacyPolicyUrlDescriptionSuffix": "If you set this, it will be displayed at the bottom of the login page and on pages that the '%1$s' user can access.",
"ShowInEmbeddedWidgets": "Show in embedded widgets",
"ShowInEmbeddedWidgetsDescription": "If checked, a link to your Privacy Policy and your Terms & Conditions will be displayed at the bottom of embedded widgets.",
"PrivacyPolicy": "Privacy Policy",
"TermsAndConditions": "Terms & Conditions"
}
}

View File

@ -0,0 +1,46 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Ocultar la dirección IP del visitante para cumplir las leyes\/directrices de privacidad de su localidad.",
"AnonymizeIpMaskLengtDescription": "Seleccione cuantos bytes de las direcciones IP de los visitantes deben ser ocultados.",
"AnonymizeIpMaskLength": "%1$s byte(s) - ej. %2$s",
"ClickHereSettings": "Haga clic aquí para acceder a la configuración de %s",
"CurrentDBSize": "Tamaño actual de la base de datso",
"DBPurged": "DB purgado.",
"DeleteDataInterval": "Borrar antigua información cada",
"DeleteLogDescription2": "Cuando habilite la eliminación automática de registros, debe comprobar que todos los reportes diarios previos han sido procesados, de modo que ningún dato es perdido.",
"DeleteLogsOlderThan": "Eliminar registros más antiguos que",
"DeleteMaxRows": "Número máximo de filas que serán eliminadas por cada ejecución",
"DeleteMaxRowsNoLimit": "sin límites",
"DeleteReportsConfirm": "Está disponiendo el borrado de datos de informes. Si un informe antiguo es borrado, tendrá que reprocesarlos nuevamente para visualizarlos. Está seguro que quiere hacer esto?",
"DeleteReportsOlderThan": "Borrar informes mayores que",
"DeleteDataSettings": "Borrar los registros y reportes de los visitantes antiguos",
"DoNotTrack_Description": "Do Not Track es una tecnología y una propuesta política que permite a los usuarios decidir no ser rastreados por sitios de internet que no visitan, tales como servicios analíticos, redes de publicidad y plataformas sociales.",
"DoNotTrack_Disable": "Deshabilitado, no da soporte al seguimiento",
"DoNotTrack_DisabledMoreInfo": "Recomendamos respetar la privacidad de sus visitantes y habilitar la opción DoNotTrack.",
"DoNotTrack_Enable": "Habilitar soporte a Do Not Track",
"DoNotTrack_Enabled": "Actualmente está respetando la privacidad de sus visitantes, ¡Bravo!",
"DoNotTrack_SupportDNTPreference": "Soporte a la preferencia Do Not Track",
"EstimatedDBSizeAfterPurge": "Tamaño aproximado de la base de datos después de la purga",
"EstimatedSpaceSaved": "Espacio estimado guardado",
"GeolocationAnonymizeIpNote": "Nota: Geolocalización tendrá aproximadamente los mismos resultados con 1 byte anónimo. Con 2 bytes o más, Geolocalización será imprecisa.",
"GetPurgeEstimate": "Obtener estimación de purga",
"KeepBasicMetrics": "Mantener métricas básicas (visitantes, vistas de páginas, tasa de rebote, conversiones de meta, conversiones de comercio electrónico, etc.)",
"KeepReportSegments": "Para mantener la información superior, también mantenga informes segmentados",
"LastDelete": "La última eliminación fue en",
"LeastDaysInput": "Por favor, especifique un número de días más grande que %s.",
"LeastMonthsInput": "Por favor, especifique un número de meses mayor que %s.",
"MenuPrivacySettings": "Privacidad",
"NextDelete": "La próxima eliminación programada es en",
"PurgeNow": "Purgar DB ahora",
"PurgeNowConfirm": "Está a punto de borrar información permanentemente de su base de datos. Está seguro que quiere continuar?",
"PurgingData": "Purgando información...",
"ReportsDataSavedEstimate": "Tamaño de la base de datos",
"SaveSettingsBeforePurge": "Ha cambiado la configuración de borrado de información. Por favor, guárdelas antes de iniciar la purga.",
"SeeAlsoOurOfficialGuidePrivacy": "See also our official guide: %1$sWeb Analytics Privacy%2$s",
"TeaserHeadline": "Configuración de Privacidad",
"UseAnonymizedIpForVisitEnrichment": "Also use the Anonymized IP addresses when enriching visits.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugins such as Geo Location via IP and Provider improve visitor's metadata. By default these plugins use the anonymized IP addresses. If you select 'No', then the non-anonymized full IP address will be used instead, resulting in less privacy but better data accuracy.",
"UseAnonymizeIp": "Hacer anónimas las direcciones IP de los visitantes",
"UseDeleteReports": "Regularmente borre los reportes antiguos de la base de datos"
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonimizar datos",
"AnonymizeIpDescription": "Seleccione \"Si\" si desea que Matomo no registre direcciones IP completas.",
"AnonymizeIpInlineHelp": "Ocultar los últimos bit(s) de la dirección IP del visitante para cumplir con las leyes\/directrices de privacidad de su jurisdicción.",
"AnonymizeIpExtendedHelp": "Cuando los usuarios visiten su sitio web, Matomo no usará la dirección IP completa (como en %1$s) sino que Matomo la mantendrá anónima (como en %2$s). El anonimato de una dirección IP es uno de los requisitos dispuestos por leyes de privacidad en algunos países como Alemania.",
"AnonymizeIpMaskLengtDescription": "Seleccione cuantos bytes de las direcciones IP de los visitantes deben ser enmascaradas.",
"AnonymizeIpMaskLength": "%1$s byte(s) - ej. %2$s",
"AskingForConsent": "Pidiendo consentimiento",
"ClickHereSettings": "Haga clic aquí para acceder a la configuración de %s",
"CurrentDBSize": "Tamaño de la actual base de datos",
"DBPurged": "Base de datos purgada.",
"DeleteBothConfirm": "Está a punto de habilitar la eliminación de datos de informes y registros. Esta acción permanentemente quitará la posibilidad de disponer de información analítica añeja. ¿Está seguro que desea llevarlo a cabo?",
"DeleteDataDescription": "Puede configurar Matomo para que elimine regularmente datos sin procesar añejos y\/o informes agregados para mantener su base de datos pequeña o para cumplir con las regulaciones de privacidad tal como la GDPR.",
"DeleteDataInterval": "Eliminar información antigua cada",
"DeleteOldVisitorLogs": "Borrar los antiguos registros de visitantes",
"DeleteOldRawData": "Regularmente eliminar los antiguos datos sin procesar",
"DeleteOldAggregatedReports": "Eliminar datos de informes agregados antiguos",
"DeleteLogDescription2": "Cuando habilite la eliminación automática de registros, debe comprobar que todos los informes diarios previos han sido procesados, de modo que ningún dato sea perdido.",
"DeleteRawDataInfo": "Los datos sin procesar contienen todos los detalles sobre cada visita individual y cada acción que realizaron sus visitantes. Cuando elimine datos sin procesar, la información eliminada ya no estará disponible en el registro de visitantes. Además, si luego decide crear un segmento, los informes segmentados no estarán disponibles para el período de tiempo que se eliminó, ya que todos los informes agregados se generan a partir de estos datos sin procesar.",
"DeleteLogsConfirm": "Está a punto de habilitar la eliminación de datos en bruto. Si se eliminan los datos sin procesar antiguos y no se han creado los informes, no podrá ver los datos de análisis históricos anteriores. ¿Seguro que desea hacer esto?",
"DeleteLogsOlderThan": "Eliminar registros más antiguos que",
"DeleteMaxRows": "Número máximo de filas que serán eliminadas en cada ejecución:",
"DeleteMaxRowsNoLimit": "sin límites",
"DeleteReportsConfirm": "Está disponiendo la eliminación de datos de informes. Si un antiguo informe es borrado, tendrá que reprocesarlos nuevamente para visualizarlos. ¿Está seguro que desea hacer esto?",
"DeleteAggregateReportsDetailedInfo": "Cuando habilite esta configuración, todos los informes agregados se eliminarán. Los informes agregados se generan a partir de los datos sin procesar y representan datos agregados de varias visitas individuales. Por ejemplo, el informe \"País\" enumera números agregados para ver cuántas visitas ha recibido de cada país.",
"KeepBasicMetricsReportsDetailedInfo": "Cuando habilita esta configuración, algunos indicadores de rendimiento de clave numérica no se eliminarán.",
"DeleteReportsInfo2": "Si elimina informes antiguos, es posible que se vuelvan a procesar de nuevo a partir de sus datos SIN PROCESAR cuando los solicite.",
"DeleteReportsInfo3": "Si también ha habilitado \"%s\", entonces los datos de los informes que está eliminando se perderán permanentemente.",
"DeleteReportsOlderThan": "Borrar informes anteriores a",
"DeleteSchedulingSettings": "Programar el borrado de datos añejos",
"DeleteDataSettings": "Borrar los registros y reportes de los antiguos visitantes",
"DoNotTrack_Description": "Do Not Track es una tecnología y una propuesta política que permite a los usuarios decidir no ser rastreados por sitios de internet que no visitan, incluyendo servicios analíticos, redes de publicidad y plataformas sociales.",
"DoNotTrack_Disable": "Deshabilitar respaldo a Do Not Track",
"DoNotTrack_Disabled": "Matomo actualmente está rastreando a todos los visitantes, incluso aquellos que han especificado \"No deseo ser rastreado\" en sus respectivos navegadores de internet.",
"DoNotTrack_DisabledMoreInfo": "Recomendamos respetar la privacidad de sus visitantes y habilitar la opción DoNotTrack.",
"DoNotTrack_Enable": "Habilitar soporte a Do Not Track",
"DoNotTrack_Enabled": "Actualmente está respetando la privacidad de sus visitantes, ¡Bravo!",
"DoNotTrack_EnabledMoreInfo": "Cuando los usuarios configuran su navegador de internet en \"No quiero ser rastreado\" (DoNotTrack está habilitado), entonces Matomo no rastreará estas visitas.",
"DoNotTrack_SupportDNTPreference": "Soporte a la preferencia Do Not Track",
"EstimatedDBSizeAfterPurge": "Tamaño aproximado de la base de datos después de la purga",
"EstimatedSpaceSaved": "Espacio estimado guardado",
"GeolocationAnonymizeIpNote": "Nota: Geolocalización tendrá aproximadamente los mismos resultados con 1 byte anónimo. Con 2 bytes o más, la Geolocalización será imprecisa.",
"GDPR": "GDPR",
"GdprManager": "Administrador GDPR",
"GdprOverview": "Visión general GDPR",
"GdprTools": "Herramientas GDPR",
"GetPurgeEstimate": "Obtener estimación de purga",
"KeepBasicMetrics": "Mantener métricas básicas (visitantes, vistas de páginas, tasa de rebote, conversiones de meta, conversiones de comercio electrónico, etc.)",
"KeepDataFor": "Mantener toda la información para",
"KeepReportSegments": "Para mantener la información superior, también mantenga informes segmentados",
"LastDelete": "La última eliminación fue en",
"LeastDaysInput": "Por favor, especifique un número de días superior a %s.",
"LeastMonthsInput": "Por favor, especifique un número de meses mayor que %s.",
"MenuPrivacySettings": "Privacidad",
"NextDelete": "La próxima eliminación programada es en",
"PluginDescription": "Aumente la privacidad para sus usuarios y haga que su instalación Matomo sea compatible con la legislación local.",
"PurgeNow": "Purgar base de datos ahora",
"PurgeNowConfirm": "Está a punto de borrar información permanentemente de su base de datos. ¿Está seguro que desea continuar?",
"PurgingData": "Purgando información...",
"RecommendedForPrivacy": "Recomendado por privacidad",
"ReportsDataSavedEstimate": "Tamaño de la base de datos",
"SaveSettingsBeforePurge": "Ha cambiado la configuración de borrado de información. Por favor, guárdelas antes de iniciar la purga.",
"SeeAlsoOurOfficialGuidePrivacy": "Lee también nuestra guía oficial: %1$sPrivacidad en las análíticas web%2$s",
"TeaserHeader": "En esta página, puede personalizar cómo Matomo cumple con la privacidad respecto de las legislaciones existentes: %1$s haciendo anónima la IP del visitante%2$s, %3$s eliminando automáticamente los antiguos registros de los visitantes en la base de datos%4$s y %5$s suministrando un mecanismo de renuncia en su sitio web (para que los visitantes no sean rastreados)%6$s",
"TeaserHeadline": "Configuración de privacidad",
"UseAnonymizedIpForVisitEnrichment": "Usa también direcciones IP anónimas para enriquecer las visitas.",
"UseAnonymizedIpForVisitEnrichmentNote": "Los complementos Geo Location a través de IP y Provider mejoran los metadatos de los visitantes. Por defecto estos complementos utilizan las direcciones IP anónimas. Si elige 'No' será utilizada una dirección completa de forma no anónima lo que resulta en una menor privacidad pero una mayor precisión de datos.",
"PseudonymizeUserIdNote": "Cuando habilite esta opción, la ID de usuario será reemplazada por un seudónimo para evitar el almacenamiento y la visualización de información de identificación personal, como una dirección de correo electrónico. En términos técnicos: dado su ID de usuario, Matomo procesará el seudónimo de ID de usuario utilizando una función hash.",
"PseudonymizeUserIdNote2": "Nota: reemplazar con un seudónimo no es lo mismo que anonimizar. En términos de GDPR: el seudónimo de ID de usuario todavía cuenta como datos personales. La ID de usuario original aún podría identificarse si cierta información adicional está disponible (a la que solo Matomo y su procesador de datos tienen acceso).",
"AnonymizeOrderIdNote": "Debido a que un ID de pedido puede ser referenciado con otro sistema, generalmente una tienda de comercio electrónico, el ID de pedido puede contar como información personal bajo el GDPR. Cuando habilite esta opción, la identificación del pedido se anonimizará automáticamente, por lo que no se rastreará la información personal.",
"UseAnonymizeIp": "Hacer anónimas las direcciones IP de los visitantes",
"UseAnonymizeTrackingData": "Anonimizar datos de seguimiento de datos",
"UseAnonymizeUserId": "Anonimizar Usuario ID",
"PseudonymizeUserId": "Reemplazar ID de usuario con un seudónimo",
"UseAnonymizeOrderId": "Anonimizar ID pedido",
"UseDeleteLog": "Regularmente elimine datos añejos de la base de datos",
"UseDeleteReports": "Regularmente borrar los antiguos informes de la base de datos",
"UsersOptOut": "Los usuarios optan por excluirse",
"PrivacyPolicyUrl": "URL de Política de privacidad",
"PrivacyPolicyUrlDescription": "Un enlace a su página Política de privacidad.",
"TermsAndConditionUrl": "URL de Términos & Condiciones",
"TermsAndConditionUrlDescription": "Un enlace a su página de Términos & Condiciones.",
"PrivacyPolicyUrlDescriptionSuffix": "Si configura esto, se mostrará en la parte inferior de la página de inicio de sesión y en las páginas a las que el usuario '%1$s' puede acceder.",
"ShowInEmbeddedWidgets": "Mostrar en widgets embebidos",
"ShowInEmbeddedWidgetsDescription": "Si está marcado, se mostrará un enlace a su Política de privacidad y sus Términos y condiciones en la parte inferior de los widgets incrustados.",
"PrivacyPolicy": "Política de privacidad",
"TermsAndConditions": "Términos & Condiciones"
}
}

View File

@ -0,0 +1,16 @@
{
"PrivacyManager": {
"AnonymizeIpMaskLength": "%1$s bait(i) - nt. %2$s",
"ClickHereSettings": "Vajuta siia, et minna %s seadete lehele.",
"CurrentDBSize": "Praegune andmebaasi suurus",
"DBPurged": "Andmebaas tühjendatud.",
"DeleteDataInterval": "Kustuta vanad andmed iga",
"DeleteDataSettings": "Kustuta vanad külastajate logid ja raportid",
"EstimatedSpaceSaved": "Ennustatud kettaruumi sääst",
"MenuPrivacySettings": "Privaatsus",
"PurgeNow": "Tühjenda andmebaas kohe",
"ReportsDataSavedEstimate": "Andmebaasi suurus",
"TeaserHeadline": "Privaatsusseaded",
"UseDeleteReports": "Kustuta regulaarselt vanad raportid andmebaasist"
}
}

View File

@ -0,0 +1,38 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "گمنام آخرین بایت از آدرس های IP بازدید کنندگان مطابق با قوانین حفظ حریم خصوصی خود را محلی \/ دستورالعمل.",
"AnonymizeIpMaskLengtDescription": "انتخاب کنید چه تعداد از IP های بازدید کنندهگان باید مخفی باشند.",
"AnonymizeIpMaskLength": "%1$s بایت (ها) - e.g. %2$s",
"ClickHereSettings": "اینجا کلیلک کنید تا به تنظیمات %s دسترسی پیدا کنید.",
"CurrentDBSize": "اندازه بانک اطلاعاتی کنونی",
"DBPurged": "پایگاه داده پالایش شد.",
"DeleteDataInterval": "داده های قدیمی را حذف کن هر",
"DeleteLogDescription2": "هنگامی که شما را قادر می سازد به صورت خودکار حذف ورود به سیستم، شما باید اطمینان حاصل شود که همه گزارش های قبلی روزانه پردازش شده اند، به طوری که هیچ داده ای از دست داده است.",
"DeleteLogsOlderThan": "پاک کردن لاگ های مسن تر از",
"DeleteMaxRows": "بیشترین تعداد ردیف را حذف کنید در 1 اجرا:",
"DeleteMaxRowsNoLimit": "هیچ محدودیتی",
"DeleteReportsConfirm": "شما را قادر می سازد گزارش حذف داده ها هستند. اگر گزارش های قدیمی حذف می شوند، شما باید دوباره پردازش آنها را در جهت آنها را مشاهده کنید. آیا شما مطمئن هستید که می خواهید برای انجام این کار؟",
"DeleteReportsOlderThan": "حذف گزارش های مسن تر از",
"DeleteDataSettings": "حذف سیاهههای مربوط به بازدید کننده ها و گزارش از پایگاه داده",
"DoNotTrack_Disable": "پشتیبانی غیر فعال کردن پیگیری نشده",
"DoNotTrack_Enable": "فعال کردن گزینه پشتیبانی را پیگیری نکن",
"DoNotTrack_Enabled": "شما به حریم شخصی کاربران تان احترام می گذارید , آفرین!",
"EstimatedDBSizeAfterPurge": "اندازه پایگاه داده های تخمینی پس از پاکسازی",
"EstimatedSpaceSaved": "فضای تخمینی ذخیره",
"GetPurgeEstimate": "برآورد پاکسازی",
"KeepBasicMetrics": "حفظ معیارهای اساسی (بازدیدکننده داشته است، صفحه نمایش، نرخ جهش، هدف تبدیل، تبدیل تجارت الکترونیک، و غیره)",
"LastDelete": "حذف آخرین بود",
"LeastDaysInput": "لطفا تعداد روزهایی بیشتر از %s را مشخص کنید.",
"LeastMonthsInput": "لطفا تعداد ماه هایی بیشتر از %s را مشخص کنید.",
"MenuPrivacySettings": "حریم خصوصی",
"NextDelete": "حذف زمان بندی شده ی بعدی در",
"PurgeNow": "پایگاه داده را هم اکنون پالایش کن",
"PurgeNowConfirm": "شما به طور دائم حذف داده ها از پایگاه داده خود هستند. آیا مطمئن هستید که میخواهید ادامه دهید؟",
"PurgingData": "در حال پاکسازی داده ها ...",
"ReportsDataSavedEstimate": "اندازه بانک اطلاعاتی",
"SaveSettingsBeforePurge": "شما تغییر تنظیمات حذف داده ها. لطفا آنها را قبل از شروع پاکسازی را نجات دهد.",
"TeaserHeadline": "تنظیمات حریم خصوصی",
"UseAnonymizeIp": "آدرس آی پی بازدیدکنندگان گمنام",
"UseDeleteReports": "به طور منظم گزارش های قدیمی را از بانک اطلاعاتی حذف کنید"
}
}

View File

@ -0,0 +1,51 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Poistaa viimeisen tavun vierailijoiden IP-osoitteista. Tämä voi olla tarpeen paikallisien tietosuojalakien tai -ohjeistuksien noudattamiseksi.",
"AnonymizeIpExtendedHelp": "Kun käyttäjät vierailevat sivullasi, Matomo ei tallenna täyttä IP-osoitetta (esim. %1$s), vaan sen sijaan osoite anonymisoidaan (esim. %2$s). IP-osoitteen anonymisointi on osa yksityisyydensuojasta määrääviä lakeja esimerkiksi Saksassa.",
"AnonymizeIpMaskLengtDescription": "Valitse, montako tavua käyttäjien IP-osoitteista piilotetaan.",
"AnonymizeIpMaskLength": "%1$s tavua - esim. %2$s",
"ClickHereSettings": "Muokkaa %s:n asetuksia.",
"CurrentDBSize": "Nykyinen tietokannan koko",
"DBPurged": "Tietokannasta poistettiin vanhat tiedot.",
"DeleteDataInterval": "Poista vanhat tiedot joka",
"DeleteOldVisitorLogs": "Poista vanhat kävijälokit",
"DeleteLogDescription2": "Kun lokeja poistetaan automaattisesti, sinun täytyy tarkistaa, että kaikki aikaisemmat päivittäiset raportit on prosessoitu, jotta tietoja ei häviä.",
"DeleteLogsOlderThan": "Poista lokit, jotka ovat vanhempia kuin",
"DeleteMaxRows": "Yhdellä kertaa poistettavien rivien maksimimäärä:",
"DeleteMaxRowsNoLimit": "ei rajaa",
"DeleteReportsConfirm": "Olet ottamassa käyttöön raporttien poistamisen. Jos vanhat raportit poistetaan, sinun täytyy luoda ne uudelleen ennen katsomista. Haluatko varmasti tehdä tämän?",
"DeleteReportsOlderThan": "Poista raportit, jotka ovat vanhempia kuin",
"DeleteSchedulingSettings": "Ajoita vanhojen tietojen poisto",
"DeleteDataSettings": "Poista vanhat lokit ja raportit",
"DoNotTrack_Description": "\"Do not Track\" (älä seuraa) on teknologia, jolla käyttäjät voivat ilmoittaa etteivät halua tulla seuratuiksi.",
"DoNotTrack_Disable": "Poista \"Älä seuraa minua\" (\"do not track\") -tuki käytöstä",
"DoNotTrack_DisabledMoreInfo": "Suosittelemme, että kunnioitat kävijöiden yksityisyyttä ja otat käyttöön \"DoNotTrack\"-tuen.",
"DoNotTrack_Enable": "Ota \"Älä seuraa minua\" (\"do not track\") -tuki käyttöön",
"DoNotTrack_Enabled": "Onneksi olkoon, kunnioitat kävijöidesi yksityisyyttä!",
"DoNotTrack_SupportDNTPreference": "Ota käyttöön \"Do Not Track\"-tuki",
"EstimatedDBSizeAfterPurge": "Arvioitu koko siivoamisen jäkleen",
"EstimatedSpaceSaved": "Arvioitu tilansäästö",
"GeolocationAnonymizeIpNote": "Huom: Geopaikannuksella on suurin piirtein samat tulokset, kun 1 tavu on salattu. Jos 2 tavua tai enemmän on salattu, Geopaikannus on epätarkka.",
"GetPurgeEstimate": "Kokoarviot tietojen poistamisesta",
"KeepBasicMetrics": "Kerää yksinkertaiset metriikat (käynnit, sivujen katselut, kauppatiedot jne.)",
"KeepDataFor": "Säilytä kaikki tiedot",
"KeepReportSegments": "Säilytä alla listattujen tietojen lisäksi segmentoidut raportit",
"LastDelete": "Edellinen poistaminen oli",
"LeastDaysInput": "Päiviä täytyy olla enemmän kuin %s.",
"LeastMonthsInput": "Kuukausien lukumäärän täytyy olla suurempi kuin %s.",
"MenuPrivacySettings": "Yksityisyys",
"NextDelete": "Seuraava poistaminen on",
"PurgeNow": "Siivoa tietokanta nyt",
"PurgeNowConfirm": "Olet poistamassa tietoja lopullisesti. Haluatko varmasti jatkaa?",
"PurgingData": "Siivotaan tietoja...",
"RecommendedForPrivacy": "Suositellaan yksityisyydensuojaan",
"ReportsDataSavedEstimate": "Tietokannan koko",
"SaveSettingsBeforePurge": "Olet muuttanut tietojen poistamisen asetuksia. Tallenna muutokset ennen jatkamista.",
"SeeAlsoOurOfficialGuidePrivacy": "Lue myös virallinen oppaamme: %1$sVerkkoanalyysi ja yksityisyys%2$s",
"TeaserHeadline": "Yksityisyysasetukset",
"UseAnonymizedIpForVisitEnrichment": "Käytä piilotettuja IP-osoitteita myös käyntejä rikastettaessa.",
"UseAnonymizedIpForVisitEnrichmentNote": "Geopaikannusliitännäiset parantavat käyttäjien metadataa. Nämä liitännäiset käyttävät oletuksena piilotettuja IP-osoitteita. Jos valitset \"Ei\", käytetään täysiä, ei-piilotettuja IP-osoitteita. Tämä vähentää yksityisyyttä, mutta parantaa datan tarkkuutta.",
"UseAnonymizeIp": "Anonymisoi kävijöiden IP-osoitteet",
"UseDeleteReports": "Poista vanhat raportit säännöllisesti."
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonymiser les données",
"AnonymizeIpDescription": "Sélectionnez \"Oui\" si vous souhaitez que Matomo n'enregistre pas des adresses IP complètes.",
"AnonymizeIpInlineHelp": "Masque les adresses IP des visiteurs pour remplir les conditions légales et politiques locales.",
"AnonymizeIpExtendedHelp": "Quand les utilisateurs visitent votre site, Matomo n'utilisera pas l'adresse IP complète (par exemple %1$s) mais l'anonymisera (par exemple %2$s). L'anonymisation des adresses IP est requise par certaines lois adressant la protection de la vie privée dans certains pays comme l'Allemagne.",
"AnonymizeIpMaskLengtDescription": "Sélectionnez combien de bytes de l'adresse IP du visiteur doivent être masqués.",
"AnonymizeIpMaskLength": "%1$s byte(s) - ex %2$s",
"AskingForConsent": "Demande de permission",
"ClickHereSettings": "Cliquez ici pour accéder aux paramètres %s.",
"CurrentDBSize": "Taille actuelle de la base de données",
"DBPurged": "BDD purgée.",
"DeleteBothConfirm": "Vous êtes sur le point d'activer la suppression des données primaires et des données de rapports. Ceci vous empêchera définitivement de visualiser d'anciennes données de statistique. Êtes vous sûr(e) de vouloir effectuer cela?",
"DeleteDataDescription": "Vous pouvez configurer Matomo pour qu'il supprime de manière régulière les anciennes données brutes et\/ou les rapports agrégés afin de garder votre base de données petite ou bien afin de respecter des régulations telles que GDPR.",
"DeleteDataInterval": "Supprimer les anciennes données toutes les",
"DeleteOldVisitorLogs": "Supprimer les journaux des anciens visiteurs",
"DeleteOldRawData": "Supprimer régulièrement les anciennes données brutes",
"DeleteOldAggregatedReports": "Supprimer les données des anciens rapports aggrégés",
"DeleteLogDescription2": "Quand vous activez la suppression automatique des logs, vous devez vous assurer que tous les rapports précédents ont bien été compilés, de cette manière aucune donnée n'est perdue.",
"DeleteRawDataInfo": "Les données brutes contiennent tous les détails à propos de chaque visite individuelle et chaque action qu'ont accompli vos visiteurs. Lorsque vous supprimez les données brutes, les données supprimées ne seront plus disponibles dans le journal des visiteurs. Aussi si vous décidez plus tard de créer un segment, les rapports segmentés ne seront pas disponibles pour la période de temps qui a été supprimée puisque que tous les rapports aggrégrés sont générées depuis ces données brutes.",
"DeleteLogsConfirm": "Vous êtes sur le point d'activer suppression des données primaires Si d'anciennes données sont supprimées et que les rapports n'ont pas encore été créés, vous ne serez pas en mesure de consulter l'historique des données de statistiques. Êtes vous sûr(e) de vouloir effectuer cela?",
"DeleteLogsOlderThan": "Supprimer les logs plus anciens que",
"DeleteMaxRows": "Nombre maximal de lignes à supprimer à la fois:",
"DeleteMaxRowsNoLimit": "aucune limite",
"DeleteReportsConfirm": "Vous êtes sur le point d'activer la suppression des donées de rapports. Si d'anciens rapports sont supprimés, vous devrez les recalculer afin de les visualiser. Êtes vous sûr(e) de vouloir effectuer cela?",
"DeleteAggregateReportsDetailedInfo": "Lorsque vous activez ce paramètre, tous les rapports aggrégés seront supprimés. Les rapports aggrégés sont générés depuis les données brutes et représentent les données aggrégrées depuis des visites individuelles. Par exemple le rapport \"Pays\" contient des nombres aggrégés afin de voir combien de visites vous avez obtenues de chaque pays.",
"KeepBasicMetricsReportsDetailedInfo": "Lorsque vous activez ce paramètre, certains indicateurs clefs de performance ne seront pas supprimés.",
"DeleteReportsInfo2": "Si vous supprimez d'anciens rapports, ils pourront êtres analysés à nouveau à partir de vos données brutes lorsque vous le demandez.",
"DeleteReportsInfo3": "Si vous avez aussi activé \"%s\", alors les données des rapports que vous supprimez seront supprimées de manière permanente.",
"DeleteReportsOlderThan": "Supprimer les rapports plus anciens que",
"DeleteSchedulingSettings": "Planifier la suppression des anciennes données",
"DeleteDataSettings": "Supprimer les journaux et rapports des anciens visiteurs",
"DoNotTrack_Description": "\"Ne pas Suivre\" (Do Not Track) est une technologie et une proposition de politique qui permet aux utilisateurs de désactiver leur suivi par les sites web qu'ils ne visitent pas, incluant les services d'analyse, les réseaux publicitaires et les réseaux sociaux.",
"DoNotTrack_Disable": "Désactiver la prise en charge de \"Ne pas Suivre\"",
"DoNotTrack_Disabled": "Matomo suit actuellement tous les visiteurs, même si ils ont précisé \"Je ne veux pas être suivi\" dans leurs navigateurs.",
"DoNotTrack_DisabledMoreInfo": "Nous vous recommandons de respecter la vie privée de vos visiteurs et d'activer la prise en charge de \"Ne pas Suivre\"",
"DoNotTrack_Enable": "Activer la prise en charge de \"Ne pas Suivre\"",
"DoNotTrack_Enabled": "Vous respectez actuellement actuellement la vie privée de vos utilisateurs, Bravo!",
"DoNotTrack_EnabledMoreInfo": "Quand les utilisateurs ont activé dans leurs navigateurs \"Je ne veux pas être suivi\" (Do No Track en anglais) Matamo ne suit plus leurs visites.",
"DoNotTrack_SupportDNTPreference": "Prendre en charge la préférence \"Ne Pas Suivre\"",
"EstimatedDBSizeAfterPurge": "Taille estimée de la base de données après la purge",
"EstimatedSpaceSaved": "Espace libéré estimé",
"GeolocationAnonymizeIpNote": "Note : La géolocalisation aura à peu près les mêmes résultats avec 1 octet rendu anonyme. Avec 2 octets ou plus, elle sera inexacte.",
"GDPR": "RGPD",
"GdprManager": "Gestionnaire RGPD",
"GdprOverview": "Vue d'ensemble RGPD",
"GdprTools": "Outils RGPD",
"GetPurgeEstimate": "Obtenir l'estimation de la purge",
"KeepBasicMetrics": "Conserver les métriques de base (visites, pages vues, taux de rebond, objectif, conversions, conversions ecommerce, etc.)",
"KeepDataFor": "Conserver toutes les données pour",
"KeepReportSegments": "Pour les données conservées précédemment, conserver aussi les rapports",
"LastDelete": "La dernière suppression était le",
"LeastDaysInput": "Veuillez spécifier un nombre de jours plus grand que %s.",
"LeastMonthsInput": "Veuillez spécifier un nombre de mois supérieur à %s",
"MenuPrivacySettings": "Vie privée",
"NextDelete": "Prochaine suppression programmée dans",
"PluginDescription": "Augmente le respect de la vie privée de vos utilisateurs et rend votre installation de Matomo conforme avec la législation locale.",
"PurgeNow": "Purger la base de données maintenant",
"PurgeNowConfirm": "Vous êtes sur le point de supprimer définitivement les données de votre base de données. Êtes vous sûr(e) de vouloir continuer?",
"PurgingData": "Purge des données...",
"RecommendedForPrivacy": "Recommandé pour le respect de la vie privée",
"ReportsDataSavedEstimate": "Taille de la base de données",
"SaveSettingsBeforePurge": "Vous avez modifié les paramètres de suppression des données. Veuillez les sauvegarder avant de démmarrer une purge.",
"SeeAlsoOurOfficialGuidePrivacy": "Consultez aussi notre guide officiel : %1$sConfidentialité de l'analyse web%2$s",
"TeaserHeader": "Depuis cette page, vous pouvez personnaliser Matomo afin de rendre sa politique de vie privée conforme aux législations, en %1$sanonymisant l'adresse IP des visiteurs %2$s, %3$ssupprimant automatiquement les anciens journaux de visites de la base de données %4$s, et en %5$sanonymisant les données brutes de visites déjà enregistrées %6$s.",
"TeaserHeadline": "Paramètres de vie privée",
"UseAnonymizedIpForVisitEnrichment": "Utiliser les adresses IP anonymisées pour enrichir les visites",
"UseAnonymizedIpForVisitEnrichmentNote": "Les composants tels que Geo Location (localisation) par IP et Fournisseur améliorent les métadonnées des visiteurs. Par défaut ces composants utilisent des adresses IP anonymisées. Si vous sélectionnez \"Non\", l'adresse IP réelle et complète sera utilisée à la place. Ceci améliorera la précision des données mais diminuera le respect de la vie privée.",
"PseudonymizeUserIdNote": "Lorsque vous activez cette option, l'identifiant utilisateur va être remplacé par un pseudonyme afin d'éviter de stocker et d'afficher des information directement identifiables telles qu'une adresse courriel. En termes techniques: étant donné un identifiant utilisateur, Matomo va générer l'identifiant avec une fonction de hash utilisant un \"grain de sel\".",
"PseudonymizeUserIdNote2": "Note: remplacer par un pseudonyme n'est pas identique à une anonymisation des données. Dans les termes énoncés par RGPD: un pseudonyme identifiant l'utilisateur compte toujours comme une données personnelle. L'identifiant utilisateur originel pourrait toujours être identifié si certaines informations complémentaires étaient disponibles (auxquelles uniquement Matomo et votre traitement de données ont accès).",
"AnonymizeOrderIdNote": "Parce qu'un identifiant de commande peut être référencé au travers de plusieurs systèmes, typiquement un magasin e-commerce, l'identifiant de commande compte comme donnée personnelle pour RGPD. En sélectionnant cette option, un identifiant de commande va être automatiquement anonymisé de sorte qu'aucune information personnelle ne sera enregistrée.",
"UseAnonymizeIp": "Rendre anonymes les adresses IP des visiteurs",
"UseAnonymizeTrackingData": "Anonymiser les données de suivit",
"UseAnonymizeUserId": "Anonymiser l'identifiant utilisateur",
"PseudonymizeUserId": "Remplacer l'identifiant utilisateur par un pseudonyme",
"UseAnonymizeOrderId": "Anonymiser l'identifiant de la commande",
"UseDeleteLog": "Supprimer les anciennes données brutes de la base de données régulièrement",
"UseDeleteReports": "Supprimer régulièrement les anciens rapports de la base de données",
"UsersOptOut": "Désinscription des utilisateurs",
"PrivacyPolicyUrl": "URL de politique de vie privée",
"PrivacyPolicyUrlDescription": "Un lien vers votre page de Politique de la vie privée",
"TermsAndConditionUrl": "URL de termes et conditions",
"TermsAndConditionUrlDescription": "Un lien vers votre page de termes et conditions.",
"PrivacyPolicyUrlDescriptionSuffix": "Si vous définissez ceci, ce sera affiché au bas de votre page d'identification et sur les pages auxquelles l'utilisateur \"%1$s\" a accès.",
"ShowInEmbeddedWidgets": "Afficher dans les gadgets embarqués",
"ShowInEmbeddedWidgetsDescription": "Si coché, un lien vers votre Politique de vie privée et vos Termes et conditions sera affiché en bas des gadgets embarqués.",
"PrivacyPolicy": "Politique de la vie privée",
"TermsAndConditions": "Termes et conditions"
}
}

View File

@ -0,0 +1,5 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "הסתרת הספרות האחרונות של כתובת הIP של המבקרים בכדי להתיישר עם החוקים \/ תקנות המקומיים."
}
}

View File

@ -0,0 +1,44 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "अपने स्थानीय गोपनीयता कानून \/ दिशा निर्देशों का अनुपालन करने के लिए आगंतुकों आईपी पतों की अज्ञात आखिरी बाइट",
"AnonymizeIpMaskLengtDescription": "आवृत किया जाना चाहिए कि कितने बाइट्स 'दर्शकों के आईपी का चयन करें.",
"AnonymizeIpMaskLength": "%1$s बाइट - e.g. %2$s",
"ClickHereSettings": "%s की सेटिंग्स का उपयोग करने के लिए यहां क्लिक करें.",
"CurrentDBSize": "वर्तमान डेटाबेस का आकार",
"DBPurged": "डीबी शुद्ध किए गए.",
"DeleteDataInterval": "हर पुराने डेटा हटाएं",
"DeleteOldVisitorLogs": "पुराने आगंतुक लॉग्स हटाएं",
"DeleteLogDescription2": "जब आप स्वत: लॉग हटाना सक्षम करते हैं, जिससे कि कोई डेटा खो जाती है आप सभी पिछले दैनिक रिपोर्ट संसाधित किया गया है कि यह सुनिश्चित करना होगा.",
"DeleteLogsOlderThan": "की तुलना में पुराने लॉग हटाएँ",
"DeleteMaxRows": "एक समय में नष्ट करने के लिए पंक्तियों की अधिकतम संख्या:",
"DeleteMaxRowsNoLimit": "कोई सीमा नहीं",
"DeleteReportsConfirm": "आप रिपोर्ट डेटा मिटाना सक्षम करने के बारे में हैं. पुराने रिपोर्टों को हटा रहे हैं, तो आप उन्हें देखने के क्रम में फिर से प्रक्रिया उनमें करनी होगी. आप सुनिश्चित करें कि आप यह करना चाहते हैं?",
"DeleteReportsOlderThan": "की तुलना में पुराने रिपोर्टों को हटाएँ",
"DeleteDataSettings": "पुराने आगंतुक लॉग और रिपोर्ट हटाएं",
"DoNotTrack_Description": "'नहीं ट्रैक करते हैं' एक प्रौद्योगिकी और नीति प्रस्ताव है जो कि उपयोगकर्ताओं को यात्रा नहीं की सहित विश्लेषिकी सेवाओं, विज्ञापन नेटवर्क, और सामाजिक प्लेटफार्मों वेबसाइटों की ट्रैकिंग से बाहर निकलना करने में सक्षम बनाता है",
"DoNotTrack_Disable": "निष्क्रिय करें समर्थन ट्रैक नहीं",
"DoNotTrack_DisabledMoreInfo": "हम अपने आगंतुकों की गोपनीयता का सम्मान करते हैं और 'DoNotTrack' समर्थन को सक्रिय करने की सलाह देते हैं.",
"DoNotTrack_Enable": "सक्षम करें समर्थन 'ट्रैक नहीं'",
"DoNotTrack_Enabled": "आप वर्तमान में अपने उपयोगकर्ताओं की गोपनीयता का सम्मान कर रहे हैं शाबाश!",
"DoNotTrack_SupportDNTPreference": "समर्थन प्राथमिकता ट्रैक नहीं",
"EstimatedDBSizeAfterPurge": "शुद्ध करने के बाद अनुमानित डेटाबेस का विस्तार",
"EstimatedSpaceSaved": "अनुमानित स्थान को बचाया",
"GeolocationAnonymizeIpNote": "नोट: जियोलोकेशन लगभग 1 बाइट अनाम के साथ ही परिणाम होगा. 2 बाइट या अधिक के साथ, जियोलोकेशन गलत हो जाएगा.",
"GetPurgeEstimate": "शुद्ध अनुमान करें",
"KeepBasicMetrics": "बुनियादी मैट्रिक्स (दौरा, पृष्ठ विचारों, उछाल दर, लक्ष्य रूपांतरण, ईकॉमर्स रूपांतरण, आदि) रखें",
"KeepReportSegments": "उपरोक्त डेटा के लिए भी खंडों की रिपोर्ट रखना",
"LastDelete": "अंतिम हटाए जाने पर था",
"LeastDaysInput": "%s की तुलना में अधिक से अधिक दिनों की संख्या का उल्लेख करें.",
"LeastMonthsInput": "%s की तुलना में अधिक से अधिक महीनों की संख्या का उल्लेख करें.",
"MenuPrivacySettings": "गोपनीयता",
"NextDelete": "में अगले अनुसूचित को हटाएँ",
"PurgeNow": "शुद्ध DB अब है",
"PurgeNowConfirm": "आप स्थायी रूप से अपने डेटाबेस से डेटा को नष्ट करने के बारे में हैं. क्या आप जारी रखना चाहते हैं?",
"PurgingData": "डेटा शुद्धीकरण ...",
"ReportsDataSavedEstimate": "डेटाबेस विस्तार",
"SaveSettingsBeforePurge": "अपने डेटा विलोपन सेटिंग्स को बदल दिया है. शुद्धीकरण शुरू करने से पहले उन्हें बचाइए.",
"TeaserHeadline": "गोपनीयता की सेटिंग्स",
"UseAnonymizeIp": "आगंतुक आईपी पते को गुमनाम करे",
"UseDeleteReports": "नियमित रूप से डेटाबेस से पुरानी रिपोर्टें हटाना"
}
}

View File

@ -0,0 +1,5 @@
{
"PrivacyManager": {
"ClickHereSettings": "Klikni za pristup %s postavkama."
}
}

View File

@ -0,0 +1,5 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "A látogatók IP címeinek utolsó bájtját törölve megakadályozza a látogatók beazonosítását, hogy megfelelhess a helyi adatvédelmi törvényeknek és ajánlásoknak."
}
}

View File

@ -0,0 +1,43 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Anonimasi bita terakhir dari alamat IP pengunjung sesuai dengan peraturan privasi\/panduan setempat Anda.",
"AnonymizeIpMaskLengtDescription": "Pilih berapa banyak bita dari IP pengunjung harus ditutupi.",
"AnonymizeIpMaskLength": "%1$s bita - misalnya %2$s",
"ClickHereSettings": "Klik di sini untuk mengakses pengaturan %s.",
"CurrentDBSize": "Ukuran basisdata saat ini",
"DBPurged": "BD terbersihkan.",
"DeleteDataInterval": "Hapus data lama setiap",
"DeleteLogDescription2": "Ketika Anda mengaktifkan catatan penghapusan otomatis, Anda harus memastikan bahwa semua laporan harian sebelumnya telah diproses, sehingga tidak ada data yang hilang.",
"DeleteLogsOlderThan": "Hapus catatan yang lebih lama dari",
"DeleteMaxRows": "Jumlah maksimum baris yang dihapus dalam sekali tindakan:",
"DeleteMaxRowsNoLimit": "tak terbatas",
"DeleteReportsConfirm": "Anda berkeinginan mengaktifkan penghapusan data laporan. Bila laporan lama dihapus, Anda harus memroses ulang laporan tersebut sebelum dapat ditampilkan. Apakah Anda yakin melakukan ini?",
"DeleteReportsOlderThan": "Hapus laporan yang berumur lebih dari",
"DeleteDataSettings": "Hapus laporan dan catatan kunjungan lama",
"DoNotTrack_Description": "Jangan-Lacak adalah teknologi dan usulan kebijakan yang memungkinkan pengguna untuk memilih tidak dilacak oleh situs yang tidak dikunjungi, termasuk situs layanan analisis, jaringan iklan, dan platform sosial.",
"DoNotTrack_Disable": "Matikan dukungan Jangan-Lacak",
"DoNotTrack_DisabledMoreInfo": "Kami sarankan menghargai pengunjung dan mengaktifkan dukungan Jangan-Lacak.",
"DoNotTrack_Enable": "Aktifkan dukungan Jangan-Lacak",
"DoNotTrack_Enabled": "Anda sekarang menghargai Privasi pengguna, Selamat!",
"DoNotTrack_SupportDNTPreference": "Dukungan pengaturan Jangan-Lacak",
"EstimatedDBSizeAfterPurge": "Perkiraan ukuran database setelah pembersihan",
"EstimatedSpaceSaved": "Perkiraan penghematan kapasitas",
"GeolocationAnonymizeIpNote": "Catatan: Lokasi-geo akan memperkirakan hasil sama dengan 1 bita anonimasi. Dengan 2 bita atau lebih, Lokasi-geo akan tidak teliti.",
"GetPurgeEstimate": "Dapatkan perkiraan perbersihan",
"KeepBasicMetrics": "Biarkan metrik dasar (kunjungan, tampilan halaman, tinkat pentalan, konversi tujuan, konversi niaga-e, dll.)",
"KeepReportSegments": "Untuk membiarkan data di atas, juga biarkan laporan terpecah",
"LastDelete": "Penghapusan terakhir di",
"LeastDaysInput": "Silakan tentukan jumlah hari lebih besar dari %s.",
"LeastMonthsInput": "Harap memasukkan jumlah bulan lebih besar dari %s.",
"MenuPrivacySettings": "Privasi",
"NextDelete": "Jadwal penghapusan selanjutnya di",
"PurgeNow": "Membersihkan Basisdata Sekarang",
"PurgeNowConfirm": "Anda berkeinginan menghapus permanen data dari basisdata Anda. Apakah Anda yakin melanjutkannya?",
"PurgingData": "Membersihkan data...",
"ReportsDataSavedEstimate": "Ukuran basisdata",
"SaveSettingsBeforePurge": "Anda melakukan perubahan pengaturan penghapusan. Harap menyimpan perubahan tersebut sebelum melakukan pembersihan.",
"TeaserHeadline": "Pengaturan Privasi",
"UseAnonymizeIp": "Anonimasi alamat IP Pengunjung",
"UseDeleteReports": "Hapus laporan lama dari basisdata"
}
}

View File

@ -0,0 +1,5 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Hylja síðusta bæti gesta IP-tölu til samræðis við persónuverndarlaga þíns lands."
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Rendi anonimi i dati",
"AnonymizeIpDescription": "Seleziona \"Sì\" se vuoi che Matomo non tenga traccia degli Indirizzi IP completi.",
"AnonymizeIpInlineHelp": "Rende anonimi gli ip dei tuoi visitatori per conformarsi alle leggi o ai regolamenti locali.",
"AnonymizeIpExtendedHelp": "Quando gli utenti visitano il tuo sito web, Matomo non userà l'indirizzo IP completo (come %1$s) ma lo renderà prima anonimo (così: %2$s). Questo è uno dei requisiti definiti dalle leggi sulla privacy in alcuni paesi come la Germania.",
"AnonymizeIpMaskLengtDescription": "Seleziona quanti byte degli indirizzi IP dei visitatori devono essere nascosti.",
"AnonymizeIpMaskLength": "%1$s byte(s) - es. %2$s",
"AskingForConsent": "Richiesta consenso",
"ClickHereSettings": "Accedi alle impostazioni %s.",
"CurrentDBSize": "Dimensione corrente del database",
"DBPurged": "DB ripulito.",
"DeleteBothConfirm": "Stai per abilitare sia l'eliminazione dei dati grezzi che la cancellazione dei dati dei report. Questo rimuoverà permanentemente la possibilità di visualizzare i vecchi dati di analisi. Sei sicuro di volerlo fare?",
"DeleteDataDescription": "È possibile configurare Matomo per eliminare con regolarità i vecchi dati grezzi e\/o i report aggregati per mantenere piccolo il database o per rispettare le normative sulla privacy come il GDPR.",
"DeleteDataInterval": "Cancella i vecchi dati ogni",
"DeleteOldVisitorLogs": "Cancella i vecchi log dei visitatori",
"DeleteOldRawData": "Elimina con regolarità i vecchi dati grezzi",
"DeleteOldAggregatedReports": "Elimina i dati dei vecchi report aggregati",
"DeleteLogDescription2": "Quando l'eliminazione automatica è abilitata, è necessario assicurarsi che tutti i report giornalieri precedenti siano stati elaborati, in modo che nessun dato venga perso. Ottieni più informazioni.",
"DeleteRawDataInfo": "I dati grezzi contengono tutti i dettagli di ogni singola visita e di ogni azione intrapresa dai visitatori. Quando elimini i dati grezzi, le informazioni cancellate non saranno più disponibili nel registro visitatori. Inoltre, se in seguito si decide di creare un segmento, i report segmentati non saranno disponibili per l'intervallo di tempo che è stato eliminato poiché tutti i report aggregati sono generati da questi dati non elaborati.",
"DeleteLogsConfirm": "Stai per abilitare la cancellazione dei dati grezzi. Se vengono rimossi i vecchi dati grezzi e i report non sono già stati creati, non sarà possibile visualizzare lo storico dei dati analitici passati. Sei sicuro di volerlo fare?",
"DeleteLogsOlderThan": "Cancella log più vecchi di",
"DeleteMaxRows": "Numero massimo di righe da cancellare in un passaggio:",
"DeleteMaxRowsNoLimit": "nessun limite",
"DeleteReportsConfirm": "Stai per consentire la cancellazione dei dati dei report. Se i vecchi report vengono rimossi, si dovranno rielaborare per visualizzarli. Sei sicuro di volerlo fare?",
"DeleteAggregateReportsDetailedInfo": "Quando si attiva questa impostazione, tutti i report aggregati verranno eliminati. I report aggregati sono generati dai dati grezzi e rappresentano i dati aggregati delle diverse visite individuali. Ad esempio, il rapporto \"Paese\" elenca i numeri aggregati per vedere quante visite hai ottenuto da ciascun paese.",
"KeepBasicMetricsReportsDetailedInfo": "Quando si attiva questa impostazione, alcuni indicatori delle prestazioni delle chiavi numeriche non verranno eliminati.",
"DeleteReportsInfo2": "Se elimini i vecchi report, questi potrebbero essere nuovamente elaborati a partire dai tuoi dati RAW quando lo richiedi.",
"DeleteReportsInfo3": "Se hai anche abilitato \"%s\", allora i dati dei report che stai eliminando verranno persi definitivamente.",
"DeleteReportsOlderThan": "Elimina i report più vecchi di",
"DeleteSchedulingSettings": "Pianifica la cancellazione dei vecchi dati",
"DeleteDataSettings": "Cancella i vecchi log dei visitatori e i report",
"DoNotTrack_Description": "Do Not Track è una tecnologia e una proposta di indirizzo che consente agli utenti di escludersi dal tracciamento dei siti che visitano, includendo i servizi statistici, le reti pubblicitarie e le piattaforme sociali.",
"DoNotTrack_Disable": "Disabilita il supporto per Do Not Track",
"DoNotTrack_Disabled": "Matomo sta attualmente tracciando tutti i visitatori, anche quando hanno specificato \"Non voglio essere tracciato\" nei loro browser.",
"DoNotTrack_DisabledMoreInfo": "Si raccomanda di rispettare la privacy dei tuoi visitatori abilitando il supporto DoNotTrack.",
"DoNotTrack_Enable": "Abilita il supporto per Do Not Track",
"DoNotTrack_Enabled": "Al momento stai rispettando la Privacy dei tuoi utenti. Bravo!",
"DoNotTrack_EnabledMoreInfo": "Quando gli utenti hanno impostato il proprio browser su \"Non voglio essere tracciato\" (DoNotTrack è abilitato), Matomo non terrà traccia di queste visite.",
"DoNotTrack_SupportDNTPreference": "Supporto preferenza Do Not Track",
"EstimatedDBSizeAfterPurge": "Dimensione stimata del database dopo la pulizia",
"EstimatedSpaceSaved": "Stima dello spazio risparmiato",
"GeolocationAnonymizeIpNote": "Nota: La Geolocalizzazione avrà circa gli stessi risultati con 1 byte anonimo. Con 2 byte o più, la Geolocalizzazione sarà imprecisa.",
"GDPR": "GDPR",
"GdprManager": "Gestione GDPR",
"GdprOverview": "Panoramica GDPR",
"GdprTools": "Strumenti GDPR",
"GetPurgeEstimate": "Ottieni stima pulizia",
"KeepBasicMetrics": "Mantieni le metriche di base (visite, pagine viste, percentuali dei rimbalzi, conversioni obiettivi, conversioni ecommerce, ecc.)",
"KeepDataFor": "Conserva tutti i dati per",
"KeepReportSegments": "Per i dati qui sopra che sono stati mantenuti, tieni anche i report segmentati",
"LastDelete": "L'ultima cancellazione è stata il",
"LeastDaysInput": "Specifica un numero di giorni maggiore di %s.",
"LeastMonthsInput": "Specifica un numero di mesi superiore a %s",
"MenuPrivacySettings": "Privacy",
"NextDelete": "Prossima cancellazione programmata per il",
"PluginDescription": "Aumenta la privacy per i tuoi utenti e rendi la gestione della privacy di Matomo conforme alla legislazione del tuo paese.",
"PurgeNow": "Pulisci il DB Ora",
"PurgeNowConfirm": "Stai per cancellare definitivamente dei dati dal tuo database. Sei sicuro di voler continuare?",
"PurgingData": "Eliminazione dei dati...",
"RecommendedForPrivacy": "Raccomandato per la privacy",
"ReportsDataSavedEstimate": "Dimensioni database",
"SaveSettingsBeforePurge": "Hai cambiato le impostazioni per la cancellazione dei dati. Si consiglia di salvarli prima di cominciare una pulizia.",
"SeeAlsoOurOfficialGuidePrivacy": "Leggi anche la nostra guida ufficiale: %1$sWeb Analytics Privacy%2$s",
"TeaserHeader": "In questa pagina, è possibile personalizzare Matomo per renderlo conforme alla normativa sulla privacy vigente, in questo modo: %1$srendendo anonimo l'IP del visitatore%2$s, %3$srimuovendo automaticamente i vecchi log dei visitatori dal database%4$s e %5$srendendo anonimi i dati grezzi degli utenti monitorati in precedenza%6$s.",
"TeaserHeadline": "Impostazioni privacy",
"UseAnonymizedIpForVisitEnrichment": "Usa anche gli indirizzi IP Anonimi quando si arricchiscono le visite",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugin come Geo Location tramite IP e Provider incrementano i metadati dei visitatori. Di default questi plugin utiizzano gli indirizzi IP resi anonimi. Se selezioni 'No', verrà utilizzato l'indirizzo IP completo non reso anonimo, con la conseguenza di una minore privacy ma con un'accuratezza dei dati migliore.",
"PseudonymizeUserIdNote": "Quando abiliti questa opzione, l'ID Utente verrà sostituito da uno pseudonimo per evitare di archiviare e visualizzare direttamente informazioni personali identificabili, come un indirizzo email. In termini tecnici: dato il tuo ID Utente, Matomo elaborerà lo pseudonimo di ID Utente utilizzando una funzione di hash criptata.",
"PseudonymizeUserIdNote2": "Nota: la sostituzione con uno pseudonimo non è la stessa cosa dell'anonimato. In termini GDPR: lo pseudonimo di ID Utente conta ancora come un dato personale. L'ID Utente originale potrebbe ancora essere identificato se sono disponibili alcune informazioni aggiuntive (a cui solo Matomo e il tuo elaboratore di dati possono accedere).",
"AnonymizeOrderIdNote": "Poiché un ID Ordine può essere referenziato con un altro sistema, in genere un negozio e-commerce, l'ID Ordine può essere considerato come un'informazione personale, secondo il GDPR. Quando abiliti questa opzione, un ID Ordine verrà automaticamente reso anonimo, quindi non verranno tracciate le informazioni personali.",
"UseAnonymizeIp": "Rendi anonimi gli IP dei visitatori",
"UseAnonymizeTrackingData": "Rendi anonimi i Dati di Tracciamnto",
"UseAnonymizeUserId": "Rendi anonimo l'ID Utente",
"PseudonymizeUserId": "Sostituisci l'ID Utente con uno pseudonimo",
"UseAnonymizeOrderId": "Rendi anonimo l'ID dell'Ordine",
"UseDeleteLog": "Elimina con regolarità dal database i vecchi dati grezzi",
"UseDeleteReports": "Cancella regolarmente i vecchi report dal database",
"UsersOptOut": "Opt-out Utenti",
"PrivacyPolicyUrl": "URL Politiche sulla Privacy",
"PrivacyPolicyUrlDescription": "Link alla pagina con le tue Politiche sulla Privacy.",
"TermsAndConditionUrl": "URL Termini e Condizioni",
"TermsAndConditionUrlDescription": "Link alla pagina con i tuoi Termini e Condizioni.",
"PrivacyPolicyUrlDescriptionSuffix": "Se imposti questo, esso verrà mostrato in fondo alla pagina di login e sulle pagine alle quali può accedere l'utente '%1$s'.",
"ShowInEmbeddedWidgets": "Mostra in widget incorporati",
"ShowInEmbeddedWidgetsDescription": "Se spuntato, verrà mostrato un link alle tue Politiche sulla Privacy e ai Termini e Condizioni in fondo ai widget incorporati.",
"PrivacyPolicy": "Politiche sulla Privacy",
"TermsAndConditions": "Termini e Condizioni"
}
}

View File

@ -0,0 +1,81 @@
{
"PrivacyManager": {
"AnonymizeData": "データの匿名化",
"AnonymizeIpDescription": "Matomo が完全な IP アドレスを追跡しないようにする場合、有効にしてください。",
"AnonymizeIpInlineHelp": "ローカルプライバシー規則やガイドラインに応じて、ビジターの IP アドレスの最終バイトを匿名化します。",
"AnonymizeIpExtendedHelp": "ユーザーがウェブサイトを訪れるとき、Matomo は ( %1$s のような ) 完全な IP アドレスを使用しませんが、代わりに最初に匿名化します ( %2$s まで ) 。IP アドレスの匿名化はドイツを含むいくつかの国においてプライバシー法によって設定されている条件の中の1つです。",
"AnonymizeIpMaskLengtDescription": "ビジターの IP アドレスから何バイトマスクするか選択してください。",
"AnonymizeIpMaskLength": "%1$s バイト- 例. %2$s",
"AskingForConsent": "同意を求める",
"ClickHereSettings": "%s 設定はこちらをクリック",
"CurrentDBSize": "現在のデータベースサイズ",
"DBPurged": "データベースがパージされました。",
"DeleteBothConfirm": "生データ削除とレポートデータ削除の両方を有効にしようとしています。 これにより、古いアナリティクスデータを表示する機能が完全に削除されます。 これを実行しますか?",
"DeleteDataInterval": "古いデータを削除:毎",
"DeleteOldVisitorLogs": "古いビジターログを削除",
"DeleteLogDescription2": "自動ログ削除を有効にする時は、データが失われないように、以前のすべての日次レポートが処理されていることを確認する必要があります。",
"DeleteLogsConfirm": "生データの削除を有効にしようとしています。 古い生データが削除され、レポートが作成されていない場合、過去の過去の分析データは表示されません。 これを実行しますか?",
"DeleteLogsOlderThan": "この日数より古いログを削除",
"DeleteMaxRows": "一回の実行で削除する最大の行数:",
"DeleteMaxRowsNoLimit": "制限なし",
"DeleteReportsConfirm": "リポートデータの削除を可能にしようとしています。古いリポートが削除された場合は、再度生成する必要があります。続けますか?",
"DeleteReportsOlderThan": "この月数より古いリポートを削除",
"DeleteSchedulingSettings": "古いデータの削除をスケジュールします。",
"DeleteDataSettings": "古いビジターログとリポートを削除",
"DoNotTrack_Description": "「トラック(追跡)しない」機能は、ユーザーが訪問しないウェブサイト(分析サービス、広告ネットワーク、ソーシャルプラットフォームを含む)によるトラッキングのオプトアウトを可能にするためのテクノロジーとポリシーの提言です。",
"DoNotTrack_Disable": "「トラック(追跡)しない」機能のサポートを無効にする",
"DoNotTrack_Disabled": "Matomo は現在、ウェブブラウザで「追跡しない」と指定した場合でも、すべてのビジターを追跡しています。",
"DoNotTrack_DisabledMoreInfo": "ビジターのプライバシーを尊重し、「トラック( 追跡 )しない」機能のサポートを有効にすることをお勧めします。",
"DoNotTrack_Enable": "「トラック( 追跡 )しない」機能のサポートを有効にする",
"DoNotTrack_Enabled": "あなたは現在ユーザーのプライバシーを尊重しています。ブラボー!",
"DoNotTrack_EnabledMoreInfo": "ユーザーがウェブブラウザで「追跡しない」( DoNotTrack が有効に設定している場合、Matomo はこれらのビジットを追跡しません。",
"DoNotTrack_SupportDNTPreference": "「Do Not Track」機能のサポート",
"EstimatedDBSizeAfterPurge": "削除後の推定データベースサイズ",
"EstimatedSpaceSaved": "確保される推定容量",
"GeolocationAnonymizeIpNote": "注)位置情報探索機能は、匿名化された 1 byte の場合とほぼ同じ結果になります。2 byte 以上を使用すると、位置情報探索機能が不正確になります。",
"GDPR": "GDPR",
"GdprManager": "GDPR マネージャー",
"GdprOverview": "GDPR の概要",
"GdprTools": "GDPR ツール",
"GetPurgeEstimate": "パージ推定値を取得",
"KeepBasicMetrics": "基本のメトリックスを保持 ( ビジット、ページビュー、直帰率、目標コンバージョン、e コマースコンバージョン等 )",
"KeepDataFor": "すべてのデータを保持",
"KeepReportSegments": "上記の保持されるデータについては、レポートのセグメントも保持する",
"LastDelete": "最後に削除したのは",
"LeastDaysInput": "日数は %s より大きい数を指定してください。",
"LeastMonthsInput": "月数は %s より大きい数を指定してください。",
"MenuPrivacySettings": "プライバシー",
"NextDelete": "次回の削除まで",
"PluginDescription": "ユーザーのプライバシーを向上させ、Matomo インスタンスのプライバシーを地域の法律に準拠させるようにします。",
"PurgeNow": "今すぐ DB を削除する",
"PurgeNowConfirm": "データベースから永久にデータを削除しようとしています。続けますか?",
"PurgingData": "データを削除しています...",
"RecommendedForPrivacy": "プライバシー推奨",
"ReportsDataSavedEstimate": "データベースサイズ",
"SaveSettingsBeforePurge": "データ削除設定を変更しました。削除が開始される前に保存してください。",
"SeeAlsoOurOfficialGuidePrivacy": "私達のオフィシャルガイドもご確認ください。%1$sWeb Analytics Privacy%2$s",
"TeaserHeader": "このページでは、%1$s ビジター IP の匿名化%2$s、%3$s ビジターログのデータベースからの自動削除%4$s、 %5$s 以前に追跡された生データの匿名化%6$sによって、既存の法律に準拠したプライバシーを実現するよう Matomo をカスタマイズできます。",
"TeaserHeadline": "プライバシー設定",
"UseAnonymizedIpForVisitEnrichment": "ビジット数を増やす場合は、匿名化された IP アドレスもご利用ください。",
"UseAnonymizedIpForVisitEnrichmentNote": "IP およびプロバイダー経由の位置情報探索機能のようなプラグインは、ビジターのメタデータを修正します。デフォルトでは、このようなプラグインは匿名 IP アドレスを使用します。'No' を選ぶと、非匿名の完全な IP アドレスが代わりに使用されます。この場合、データの正確性は向上しますがプライバシーは多少劣ります。",
"PseudonymizeUserIdNote": "このオプションを有効にすると、E メールアドレスなどの個人識別可能な情報を直接格納して表示しないようにするために、ユーザー ID は仮名に置き換えられます。技術的には、ユーザー ID が与えられたとき、、Matomo はソルト化ハッシュ関数を使用してユーザー ID を仮名に処理します。",
"PseudonymizeUserIdNote2": "注:仮名に置き換えることは、匿名化と同じではありません。 GDPR では、仮名化されたユーザー ID は依然として個人データとみなされます。 特定の追加情報が利用可能な場合、元のユーザー ID を特定することができます。(必要な追加情報には Matomo とあなたのデータプロセッサのみがアクセス可能です)",
"AnonymizeOrderIdNote": "注文IDは、通常、e コマースショップの他のシステムと相互参照することがでるため、注文 ID は GDPR 下などの個人情報をカウントすることができます。 このオプションを有効にすると、注文ID は自動的に匿名化され、個人情報は追跡されません。",
"UseAnonymizeIp": "ビジター IP アドレスの匿名化",
"UseAnonymizeTrackingData": "トラッキングデータを匿名化",
"UseAnonymizeUserId": "ユーザーIDを匿名化",
"PseudonymizeUserId": "ユーザー IDを仮名に置き換える",
"UseAnonymizeOrderId": "オーダー ID を匿名化",
"UseDeleteReports": "定期的にデータベースから古いリポートを削除",
"UsersOptOut": "ユーザーオプトアウト",
"PrivacyPolicyUrl": "プライバシーポリシー URL",
"PrivacyPolicyUrlDescription": "プライバシーポリシーページへのリンク。",
"TermsAndConditionUrl": "利用規約 URL",
"TermsAndConditionUrlDescription": "利用規約ページへのリンク。",
"PrivacyPolicyUrlDescriptionSuffix": "これを設定すると、ログインページの下部と '%1$s' ユーザーがアクセスできるページに表示されます。",
"ShowInEmbeddedWidgets": "埋め込みウィジェットで表示する",
"ShowInEmbeddedWidgetsDescription": "オンにすると、プライバシーポリシーへのリンクと利用規約が埋め込みウィジェットの下部に表示されます。",
"PrivacyPolicy": "プライバシーポリシー",
"TermsAndConditions": "利用規約"
}
}

View File

@ -0,0 +1,5 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "გახადეთ ანონიმური ვიზიტორების IP მისამრთის ბოლო ბაიტი, რათა დააკმაყოფილოთ კონფიდენციალურობის ადგილობრივი კანონი\/განაწესი."
}
}

View File

@ -0,0 +1,51 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "개인이 설정한 내부 규칙 및 지침에 따라 방문자의 IP주소의 마지막 바이트를 숨깁니다.",
"AnonymizeIpExtendedHelp": "유저들이 웹사이트에 접속할 때, Matomo는 모든 IP 주소(예: %1$s)를 사용하지 않고 일부를 숨깁니다(예: %2$s). IP 주소 익명 처리는 독일과 같이 특정 국가에서 프라이버시 법률에 따라 요구되는 것 중 하나입니다.",
"AnonymizeIpMaskLengtDescription": "방문자의 IP 주소에서 몇 바이트를 숨기려면 선택하세요.",
"AnonymizeIpMaskLength": "%1$s 바이트 - 예) %2$s",
"ClickHereSettings": "%s 설정은 여기를 클릭하세요.",
"CurrentDBSize": "현재 데이터베이스 크기",
"DBPurged": "DB가 제거되었습니다.",
"DeleteDataInterval": "오래된 데이터 삭제",
"DeleteOldVisitorLogs": "오래된 방문자 로그 삭제",
"DeleteLogDescription2": "자동으로 로그 삭제를 활성화할 때 데이터가 손실되지 않도록 모든 이전의 일일 보고서가 처리되고 있는지 확인해야합니다.",
"DeleteLogsOlderThan": "오래된 로그 삭제",
"DeleteMaxRows": "한번의 실행으로 최대 제거 행 수:",
"DeleteMaxRowsNoLimit": "제한 없음",
"DeleteReportsConfirm": "보고서 데이터의 삭제를 가능하게하려고합니다. 이전 보고서가 삭제 된 경우 다시 생성해야합니다. 계속 하시겠습니까?",
"DeleteReportsOlderThan": "오래된 보고서 삭제",
"DeleteSchedulingSettings": "오래된 데이터 삭제 계획하기",
"DeleteDataSettings": "오래된 방문자 기록 및 보고서 삭제",
"DoNotTrack_Description": "\"추적 않함\"기능은 사용자가 방문한 웹사이트 (분석 서비스, 광고 네트워크, 소셜 플랫폼 등)에 의한 추적 차단을 가능하게하는 기술과 정책 제언입니다.",
"DoNotTrack_Disable": "\"추적하지 않음\"기능 지원 비활성화",
"DoNotTrack_DisabledMoreInfo": "방문자의 프라이버시를 존중하고 \"추적하지 않기\"기능 지원을 활성화하는 것이 좋습니다.",
"DoNotTrack_Enable": "\"추적하지 않음\"기능 활성화",
"DoNotTrack_Enabled": "당신은 현재 사용자의 프라이버시를 존중합니다. 브라보!",
"DoNotTrack_SupportDNTPreference": "\"추적하지 않음\" 지원 기능 설정",
"EstimatedDBSizeAfterPurge": "삭제후 추정되는 데이터베이스 크기",
"EstimatedSpaceSaved": "확보되는 추정 용량",
"GeolocationAnonymizeIpNote": "참고: 위치 정보는 대략 1바이트로 익명으로 처리되는 것과 같은 결과를 얻습니다. 2바이트 또는 이상이면 위치 정보가 정확하지 않을 수 있습니다.",
"GetPurgeEstimate": "비운 추정치 받기",
"KeepBasicMetrics": "기본 지표 유지 (방문, 페이지뷰, 반송률, 목표전환, 전자상거래 전환 등)",
"KeepDataFor": "모든 데이터를 유지합니다:",
"KeepReportSegments": "위 유지되는 데이터는 보고서의 세그먼트에도 유지",
"LastDelete": "마지막으로 삭제한 것은",
"LeastDaysInput": "일 수는 %s보다 커야합니다.",
"LeastMonthsInput": "개월은 %s보다 커야합니다.",
"MenuPrivacySettings": "개인 정보 보호",
"NextDelete": "다음 제거까지",
"PurgeNow": "지금 DB 삭제",
"PurgeNowConfirm": "영구적으로 데이터베이스의 데이터를 삭제하려고합니다. 계속 하시겠습니까?",
"PurgingData": "데이터를 삭제합니다...",
"RecommendedForPrivacy": "프라이버시를 위해 권장함",
"ReportsDataSavedEstimate": "데이터베이스 크기",
"SaveSettingsBeforePurge": "데이터 삭제 설정을 변경했습니다. 삭제가 시작되기 전에 저장하세요.",
"SeeAlsoOurOfficialGuidePrivacy": "공식 가이드인 %1$sWeb Analytics Privacy%2$s을 참고해주세요.",
"TeaserHeadline": "개인 정보 보호 설정",
"UseAnonymizedIpForVisitEnrichment": "또한, 방문이 많을 때 익명화된 IP 주소를 사용합니다.",
"UseAnonymizedIpForVisitEnrichmentNote": "IP 주소와 공급자를 통하여 방문자의 지역 정보를 알아내는 것 같은 플러그인은 방문자의 메타데이터를 향상시킵니다. 기본적으로 이런 플러그인은 익명화된 IP 주소를 사용합니다. 만약 '아니오'를 선택할 경우, 익명처리되지 않은 전체 IP 주소를 대신 사용하게 되어 프라이버시는 낮추지만 대신 데이터 정확도를 높일 것입니다.",
"UseAnonymizeIp": "익명 방문자의 IP 주소",
"UseDeleteReports": "정기적으로 데이터베이스에서 오래된 보고서를 삭제"
}
}

View File

@ -0,0 +1,13 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Paslėpkite savo lankytojų IP adresus, jei to reikalauja Jūsų vidaus taisyklės ar įstatymai.",
"CurrentDBSize": "Esamas duomenų bazės dydis",
"DeleteLogsOlderThan": "Ištrinti įrašus senesnius nei",
"DeleteMaxRows": "Maksimalus vienu metu trinamų eilučių kiekis:",
"LastDelete": "Paskutinis išvalymas atliktas",
"MenuPrivacySettings": "Privatumas",
"NextDelete": "Kitas suplanuotas išvalymas",
"TeaserHeadline": "Privatumo nustatymai",
"UseAnonymizeIp": "Paslėpti lankytojų IP adresus"
}
}

View File

@ -0,0 +1,14 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Anonimizē apmeklētāju IP adrešu pēdējo baitu(s). Nepieciešamību nosaka Jūsu vietējie privātuma likumi\/pavadlīnijas.",
"ClickHereSettings": "Klikšķiniet šeit lai piekļūtu %s iestatījumiem.",
"DeleteLogsOlderThan": "Dzēst vecākus žurnālus par",
"DeleteMaxRows": "Maksimālais rindu skaits ko dzēst vienā reizē:",
"LastDelete": "Pēdējā dzēšana notika",
"LeastDaysInput": "Lūdzu izvēlieties dienu skaitu lielāku par %s.",
"MenuPrivacySettings": "Privātums",
"NextDelete": "Nākošā dzēšana paredzēta",
"TeaserHeadline": "Privātuma iestatījumi",
"UseAnonymizeIp": "Anonimizēt apmeklētāju IP adreses"
}
}

View File

@ -0,0 +1,24 @@
{
"PrivacyManager": {
"AnonymizeIpMaskLength": "%1$s byte(s) f.eks. %2$s",
"ClickHereSettings": "Klikk her for å få tilgang til %s-innstillingene.",
"CurrentDBSize": "Nåværende databasestørrelse",
"DeleteDataInterval": "Slett gammel data hver",
"DeleteOldVisitorLogs": "Slett gamle besøkslogger",
"DeleteLogsOlderThan": "Slett logger eldre enn",
"DeleteMaxRowsNoLimit": "ingen grense",
"DeleteReportsOlderThan": "Slett rapporter eldre enn",
"DeleteDataSettings": "Slett gamle besøkslogger og -rapporter",
"DoNotTrack_Disable": "Deaktiver Do Not Track-støtte",
"DoNotTrack_Enable": "Aktiver Do Not Track-støtte",
"EstimatedSpaceSaved": "Estimert plassbesparelse",
"GeolocationAnonymizeIpNote": "Merk: Geoposisjonering vil ha omtrent de samme resultatene med en byte anonymisert. Med to byte eller mer, vil geoposisjonering være unøyaktig.",
"KeepDataFor": "Behold all data for",
"LastDelete": "Siste sletting var på",
"MenuPrivacySettings": "Personvern",
"PurgeNow": "Rydd database nå",
"RecommendedForPrivacy": "Anbefalt for personvern",
"ReportsDataSavedEstimate": "Databasestørrelse",
"TeaserHeadline": "Personverninnstillinger"
}
}

View File

@ -0,0 +1,72 @@
{
"PrivacyManager": {
"AnonymizeData": "Data anonimiseren",
"AnonymizeIpDescription": "Selecteer \"Ja\" als je wilt dat Matomo niet de volledige IP-adressen bijhoudt.",
"AnonymizeIpInlineHelp": "Anonimiseer de laatste byte(s) van IP-adressen van bezoekers om te voldoen aan uw lokale privacywetten\/-richtlijnen.",
"AnonymizeIpExtendedHelp": "Als gebruikers uw website bezoeken zal Matomo niet het volledige IP-adres (zoals %1$s) gebruiken maar dit eerst anonimiseren (tot %2$s). IP-adres anonimisatie is in sommige landen zoals Duitsland een van de eisen gesteld in privacywetgeving.",
"AnonymizeIpMaskLengtDescription": "Selecteer hoeveel bytes van IP's van de bezoekers moet worden gemaskeerd.",
"AnonymizeIpMaskLength": "%1$s byte(s) - bijv. %2$s",
"AskingForConsent": "Vragen om toestemming",
"ClickHereSettings": "Klik hier om naar de %s-instellingen te gaan.",
"CurrentDBSize": "Huidige databasegrootte",
"DBPurged": "Database geleegd.",
"DeleteDataInterval": "Verwijder oude gegevens elke",
"DeleteOldVisitorLogs": "Verwijder oude bezoekerslogboeken",
"DeleteLogDescription2": "Wanneer u automatische logboekverwijdering inschakelt, moet u ervoor zorgen dat alle vorige dagelijkse rapporten zijn verwerkt, zodat er geen gegevens verloren gaan.",
"DeleteLogsOlderThan": "Verwijder logboeken ouder dan",
"DeleteMaxRows": "Maximum aantal rijen te verwijderen in een keer:",
"DeleteMaxRowsNoLimit": "geen limiet",
"DeleteReportsConfirm": "U staat op het punt om het verwijderen van rapporten te activeren. Als de oude rapporten zijn verwijderd, dan zullen ze opnieuw aangemaakt moeten worden als u ze later wilt bekijken. Bent u er zzker van dat u de oude rapporten wilt verwijderen?",
"DeleteReportsOlderThan": "Verwijder rapporten ouder dan",
"DeleteSchedulingSettings": "Plan het verwijderen van oude data",
"DeleteDataSettings": "Verwijder oude bezoekerslogboeken en rapporten",
"DoNotTrack_Description": "Volg-me-niet is een technologie en een privacybeleid dat gebruikers de mogelijkheid van een opt-out biedt, voor websites die ze niet zelf bezoeken, inclusief analytics services, advertising networks en social platforms.",
"DoNotTrack_Disable": "Volg-me-niet-ondersteuning uitschakelen",
"DoNotTrack_Disabled": "Matomo registreert momenteel alle bezoekers, zelfs als ze in hun browser \"Volg-me-niet\" hebben ingeschakeld.",
"DoNotTrack_DisabledMoreInfo": "We adviseren om de privacy van bezoekers te respecteren en de \"volg-me-niet\" ondersteuning in Matomo te activeren.",
"DoNotTrack_Enable": "Volg-me-niet-ondersteuning inschakelen",
"DoNotTrack_Enabled": "Momenteel respecteer u de privacy van uw gebruikers, bravo!",
"DoNotTrack_EnabledMoreInfo": "Als gebruikers in hun browser \"Volg-me-niet\" hebben ingeschakeld, zal Matomo deze bezoeken niet registreren.",
"DoNotTrack_SupportDNTPreference": "Ondersteun volg-me-niet-voorkeur",
"EstimatedDBSizeAfterPurge": "Geschatte databasegrootte na legen",
"EstimatedSpaceSaved": "Geschatte ruimte bespaard",
"GeolocationAnonymizeIpNote": "Opmerking: geolocatie heeft ongeveer dezelfde resultaten met 1 byte geanonimiseerd. Met 2 bytes of meer zal geolocatie onnauwkeurig zijn.",
"GDPR": "AVG",
"GdprManager": "AVG Manager",
"GdprOverview": "AVG Overzicht",
"GdprTools": "AVG Hulpmiddelen",
"GetPurgeEstimate": "Schat het aantal teruggewonnen ruimte",
"KeepBasicMetrics": "Behoud de basisgegevens (visits, page views, bounce rate, goal conversions, ecommerce conversions, etc.)",
"KeepDataFor": "Bewaar alle gegevens voor",
"KeepReportSegments": "Voor de hierboven bewaarde gegevens, bewaar ook de gesegmenteerde rapporten",
"LastDelete": "Laatste verwijdering was op",
"LeastDaysInput": "Geef het aantal dagen groter dan %s.",
"LeastMonthsInput": "Geef het aantal maanden op, groter dan %s.",
"MenuPrivacySettings": "Privacy",
"NextDelete": "Volgende geprogrammeerde verwijdering in",
"PluginDescription": "Verhoog de privacy van je gebruikers en maak je Matomo omgeving conform lokale wetgeving.",
"PurgeNow": "Database nu legen",
"PurgeNowConfirm": "Je staat op het punt om data permanent van je database te verwijderen. Weet je zeker dat je wilt doorgaan?",
"PurgingData": "Data opschonen...",
"RecommendedForPrivacy": "Aanbevolen voor privacy",
"ReportsDataSavedEstimate": "Database omvang",
"SaveSettingsBeforePurge": "De data verwijder instellingen zijn aangepast. Sla deze eerst op voor het starten van het verwijderen.",
"SeeAlsoOurOfficialGuidePrivacy": "Zie ook onze officiele gids: %1$sWeb Analytics Privacy%2$s",
"TeaserHeadline": "Privacy-instellingen",
"UseAnonymizedIpForVisitEnrichment": "Gebruik de geanonimiseerde IP-adressen ook bij het verrijken van bezoeken.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugins zoals Geolocatie via IP en Provider verbeteren bezoekers metadata. Standaard maken deze plugins gebruik van de geanonimiseerde IP adressen. Als je 'Nee' selecteert, dan zal het volledige, niet geanonimiseerde IP adres gebruikt worden. Dat resulteert in minder privacy, maar een grotere nauwkeurigheid van data.",
"UseAnonymizeIp": "Anonimiseer IP-adressen van bezoekers",
"UseAnonymizeTrackingData": "Tracking gegevens anonimiseren",
"UseAnonymizeUserId": "Gebruikers-ID anonimiseren",
"PseudonymizeUserId": "Gebruikers-ID vervangen door een pseudoniem",
"UseAnonymizeOrderId": "Ordernummer anonimiseren",
"UseDeleteReports": "Verwijder regelmatig oude rapporten uit de database",
"PrivacyPolicyUrl": "Privacybeleid-URL",
"PrivacyPolicyUrlDescription": "Een link naar de pagina met je privacybeleid.",
"TermsAndConditionUrl": "Algemene voorwaarden URL",
"TermsAndConditionUrlDescription": "Een link naar de pagina met je algemene voorwaarden.",
"ShowInEmbeddedWidgetsDescription": "Als je deze optie inschakelt zal er een link naar je privacybeleid en algemene voorwaarden weergegeven worden onder ingesloten widgets.",
"PrivacyPolicy": "Privacybeleid",
"TermsAndConditions": "Algemene voorwaarden"
}
}

View File

@ -0,0 +1,6 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Anonymiser siste del av IPen til vitjarane for å overhalda lokale lovar og retningsliner for personvern.",
"KeepBasicMetrics": "Behald standardverdiar (vitjingar, sidevisningar, hoppfrekvens, målkonverteringar, netthandelkonverteringar, osb)"
}
}

View File

@ -0,0 +1,76 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonimizuj dane",
"AnonymizeIpDescription": "Zaznacz \"Tak\" jeśli Matomo ma nie śledzić pełnych adresów IP.",
"AnonymizeIpInlineHelp": "Anonimizacja ostatniego bajtu w adresie IP odwiedzających, by dostosować się do być może lokalnego prawa do prywatności\/wytycznych o prywatności.",
"AnonymizeIpExtendedHelp": "Kiedy użytkownik odwiedzi twoją stronę. Matomo nie użyje całego adresu IP danej osoby (np %1$s), a zamiast tego wykona anonimizację adresu (do %2$s). Anonimizacja adresu IP jest wymogiem prawnym w niektórych krajach - na przykład w Niemczech.",
"AnonymizeIpMaskLengtDescription": "Wybierz ile bajtów z odwiedzających' adresów IP powinny być zamaskowane.",
"AnonymizeIpMaskLength": "%1$s bajt(ów) - np. %2$s",
"AskingForConsent": "Zapytanie o zgodę",
"ClickHereSettings": "Kliknij tutaj, aby uzyskać dostęp do %s ustawień.",
"CurrentDBSize": "Obecny rozmiar bazy danych",
"DBPurged": "Baza danych wyczyszczona.",
"DeleteBothConfirm": "Zamierzasz włączyć kasowanie nieobrobionych danych i raportów. To na zawsze pozbawi Cię możliwości przeglądania archiwalnych danych. Czy na pewno chcesz to zrobić?",
"DeleteDataDescription": "Matomo pozwala Ci skonfigurować regularne kasowanie starych surowych wpisów i\/lub wygenerowanych raportów, co pozwoli Ci zachować mały rozmiar bazy danych lub spełnić wymogi regulacji dotyczących prywatności takich jak RODO.",
"DeleteDataInterval": "Usuń archiwalne dane co",
"DeleteOldVisitorLogs": "Usuń archiwalne logi odwiedzin",
"DeleteLogDescription2": "Po włączeniu automatycznego usuwania logów należy się upewnić, że wszystkie poprzednie raporty dzienne zostały przetworzone, tak że żadne dane nie zostaną utracone.",
"DeleteLogsConfirm": "Włączasz usuwanie nieprzetworzonych danych. Następstwem usunięcia tych danych, w sytuacji gdy nie powstały na ich podstawie raporty, będzie brak możliwości analizowania statystyk z przeszłości. Czy na pewno chcesz kontynuować?",
"DeleteLogsOlderThan": "Usuń logi starsze niż",
"DeleteMaxRows": "Maksymalna liczba wierszy, aby usunąć w jednym przebiegu:",
"DeleteMaxRowsNoLimit": "bez limitu",
"DeleteReportsConfirm": "Zamierzasz aktywować usuwanie raportów. Po usunięciu archiwalnych raportów, konieczne będzie ponowne przetworzenie logów, w celu uzyskania ponownego wglądu w raporty. Kontynuować?",
"DeleteReportsInfo2": "Skasowane stare raporty mogą na żądanie zostać odtworzone z surowych wpisów.",
"DeleteReportsInfo3": "Jeśli dodatkowo włączysz \"%s\", usunięcie danych raportów całkowicie usunie dane dotyczące odwiedzin.",
"DeleteReportsOlderThan": "Usuń raporty starsze niż",
"DeleteSchedulingSettings": "Zaplanuj usuwanie starych danych",
"DeleteDataSettings": "Usuń stare logi odwiedzin i raporty",
"DoNotTrack_Description": "\"Nie Śledź Mnie\" jest technologią i propozycją polityki, która umożliwia użytkownikom wypisanie się ze śledzenia na odwiedzanych stronach, włączając w to serwisy analityczne, sieci reklamowe i platformy społecznościowe.",
"DoNotTrack_Disable": "Wyłącz wsparcie Do Not Track",
"DoNotTrack_Disabled": "Obecnie Matomo śledzi wszystkich użytkowników, nawet tych, którzy ustawili w przeglądarce opcję \"Nie chcę być śledzony\".",
"DoNotTrack_DisabledMoreInfo": "Dla uszanowania prywatności odwiedzających zalecamy włączenie wsparcia DoNotTrack.",
"DoNotTrack_Enable": "Włącz wspracie dla \"Nie chcę być śledzony\"",
"DoNotTrack_Enabled": "Obecnie szanujesz prywatności swojch użytkowników, Brawo!",
"DoNotTrack_EnabledMoreInfo": "Jeśli użytkownicy ustawili w przeglądarce \"Nie chcę być śledzony\" (DoNotTrack włączony), Matomo nie będzie rejestrowało tych wizyt,",
"DoNotTrack_SupportDNTPreference": "Wsparcie dla ustawienia \"Do Not Track \/ Nie Śledź\"",
"EstimatedDBSizeAfterPurge": "Szacowana wielkość bazy danych po oczyszczaniu",
"EstimatedSpaceSaved": "Szacowana oszczędność miejsca",
"GeolocationAnonymizeIpNote": "NOTKA: Geolokalizacja zwróci zbliżone wyniki przy anonimizacji 1 bajtu. 2 bajty lub więcej znacząco obniżą dokładność.",
"GDPR": "RODO",
"GdprManager": "Zarządzaj RODO",
"GdprOverview": "Przegląd RODO",
"GdprTools": "Narzędzia RODO",
"GetPurgeEstimate": "Oszacuj wzrost wolnego miejsca",
"KeepBasicMetrics": "Zachowaj podstawowe wskaźniki ()wizyty, odsłony stron, wskaźnik porzuceń, konwersje celów, konwersje e-commerce, itd.)",
"KeepDataFor": "Zachowaj wszystkie dane przez",
"KeepReportSegments": "Zachowaj raporty grup dla zachowanych powyżej danych",
"LastDelete": "Ostatnio usunięte",
"LeastDaysInput": "Proszę podać liczbę dni większą niż %s.",
"LeastMonthsInput": "Proszę określić liczbę miesięcy większą niż %s.",
"MenuPrivacySettings": "Prywatność",
"NextDelete": "Następne oczyszczanie zaplanowano za",
"PluginDescription": "Zwiększ prywatność swoich użytkowników i dostosuj Matomo do zapisów lokalnego prawa w zakresie ochrony prywatności.",
"PurgeNow": "Oczyść bazę danych teraz",
"PurgeNowConfirm": "Zamierzasz ostatecznie skasować dane z Twojej bazy danych. Czy na pewno chcesz kontynuować?",
"PurgingData": "Czyszczenie danych...",
"RecommendedForPrivacy": "Zalecenia Prywatności",
"ReportsDataSavedEstimate": "Rozmiar bazy danych",
"SaveSettingsBeforePurge": "Zmodyfikowałeś ustawienia kasowania danych. Proszę zapisz je przed przystąpieniem do kasowania.",
"SeeAlsoOurOfficialGuidePrivacy": "Zobacz również nasz oficjalny przewodnik: : %1$sWeb Analytics Privacy%2$s",
"TeaserHeader": "Ta strona pozwala dostosować Matomo do wymaganej prawem prywatności odwiedzających poprzez: %1$sanonimizację adresu IP odwiedzającego%2$s, %3$sautomatyczne usuwanie starych logów odwiedzin z bazy danych%4$s i %5$sanonimizowanie już zebranych nieprzetworzonych danych użytkowników%6$s.",
"TeaserHeadline": "Ustawienia prywatności",
"UseAnonymizedIpForVisitEnrichment": "Korzystaj z Anonimizowanych adresów IP przy analizowaniu wizyt.",
"UseAnonymizedIpForVisitEnrichmentNote": "Wtyczki takie jak Geolokalizacja (bazując na IP i dostawcy) wzbogacają metadane odwiedzających. Domyślnie te wtyczki wykorzystują anonimizowane adresy IP. Wybierając 'Nie', wybierasz wykorzystanie pełnego, nie anonimizowanego adresu IP, co zwiększa dokładność danych kosztem prywatności.",
"PseudonymizeUserIdNote": "Po włączeniu tej opcji, ID Użytkownika zostanie zastąpione pseudonimem, dzięki czemu w statystykach nie bedą przechowywane i wyświetlane dane osobowe takie jak adres e-mail. Technicznie rzecz ujmując: po przekazaniu ID Użytkownika, Matomo wygeneruje na jego podstawie pseudonim korzystając z funkcji skrótu (z solą).",
"PseudonymizeUserIdNote2": "UWAGA: zamiana ID Użytkownika pseudonimem w myśl RODO nie jest tym samym co anonimizacja. Pseudonim w dalszym ciągu jest zaliczany do danych osobowych. W tym przypadku ID Użytkownika może zostać powiązane z pseudonimem na podstawie dodatkowych danych (dostępnych dla Matomo i przetwarzającego Twoje dane).",
"AnonymizeOrderIdNote": "Ze względu na możliwość powiązania ID zamówienia z innym systemem, na przykład w sklepie internetowym, ID zamówienia może zostać zaliczone jako dane osobowe w myśl RODO. Po włączeniu tej opcji ID zamówienia zostanie automatycznie zanonimizowane, co wykluczy śledzenie danych osobowych.",
"UseAnonymizeIp": "Anonimizacja adresów IP odwiedzających",
"UseAnonymizeTrackingData": "Anonimizuj dane śledzenia",
"UseAnonymizeUserId": "Anonimizuj ID użytkownika",
"PseudonymizeUserId": "Zamień ID użytkownika na pseudonim",
"UseAnonymizeOrderId": "Anonimizuj ID zamówienia",
"UseDeleteLog": "Regularnie kasuj stare nieprzetworzone dane z bazy",
"UseDeleteReports": "Regularnie usuwaj stare raporty z bazy danych",
"UsersOptOut": "Rezygnacja ze śledzenia"
}
}

View File

@ -0,0 +1,54 @@
{
"PrivacyManager": {
"AnonymizeIpDescription": "Selecione \"Sim\" se você quer que o Matomo não rastreie os endereços de IP totalmente qualificados.",
"AnonymizeIpInlineHelp": "Anonimize o último byte do endereço IP dos visitantes para obedecer suas leis\/guias locais de privacidade.",
"AnonymizeIpExtendedHelp": "Quando usuários visitarem o seu site, Matomo não vai usar o endereço de IP completo (como %1$s), pelo contrário, Matomo vai anonimizá-los primeiro (para %2$s). Anonimização de endereço de IP é um dos requisitos estabelecidos pelas leis de privacidade em alguns países como a Alemanha.",
"AnonymizeIpMaskLengtDescription": "Selecione quantos bytes de IPs dos visitantes deve ser mascarado.",
"AnonymizeIpMaskLength": "%1$s byte(s) - e.g. %2$s",
"ClickHereSettings": "Clique aqui para acessar as configurações do %s.",
"CurrentDBSize": "Tamanho atual do banco de dados",
"DBPurged": "DB purgado.",
"DeleteDataInterval": "Excluir dados antigoa a cada",
"DeleteOldVisitorLogs": "Apagar logs de antigos visitantes",
"DeleteLogDescription2": "Quando você habilitar a exclusão automática de log, você deve garantir que todos os relatórios anteriores diários tenham sido processados, de modo que nenhum dado seja perdido.",
"DeleteLogsOlderThan": "Excluir logs mais velhos que",
"DeleteMaxRows": "O número máximo de linhas a serem excluídos em uma execução:",
"DeleteMaxRowsNoLimit": "nenhum limite",
"DeleteReportsConfirm": "Você está prestes a permitir a exclusão dos dados do relatório. Se os relatórios antigos são removidos, você vai ter que re-processar-los em ordem de visualização. Tem certeza de que quer fazer isto?",
"DeleteReportsOlderThan": "Apagar relatórios com mais de",
"DeleteSchedulingSettings": "Agendar eliminação de dados antigos",
"DeleteDataSettings": "Excluir logs de visitantes e relatórios antigos",
"DoNotTrack_Description": "Do Not Track é uma tecnologia e proposta de política que permite aos usuários optar por não ser rastreado por sites que não visitam, incluindo serviços de análise, redes de publicidade e plataformas sociais.",
"DoNotTrack_Disable": "Desabilitar o suporte Do Not Track",
"DoNotTrack_DisabledMoreInfo": "Recomendamos respeitar a privacidade dos seus visitantes e ativar o suporte DoNotTrack.",
"DoNotTrack_Enable": "Ativar suporte para 'Não rastrear'",
"DoNotTrack_Enabled": "Você está respeitando a sua privacidade usuários, Bravo!",
"DoNotTrack_SupportDNTPreference": "Preferencias do suporte Do Not Track",
"EstimatedDBSizeAfterPurge": "Tamanho do banco estimado após purge",
"EstimatedSpaceSaved": "Espaço estimado salvo",
"GeolocationAnonymizeIpNote": "Nota: Geolocation terá aproximadamente os mesmos resultados com um byte anónimos. Com dois bytes ou mais, Geolocation será impreciso.",
"GDPR": "GDPR",
"GdprManager": "Gerenciar GDPR",
"GetPurgeEstimate": "Obter estimativa de purge",
"KeepBasicMetrics": "Mantenha métricas básicas (visitas, exibições de página, taxa de rejeição, conversões de meta, conversões de comércio eletrônico, etc)",
"KeepDataFor": "Manter todos os dados para",
"KeepReportSegments": "Para dados mantidos acima, também manter relatórios segmentados",
"LastDelete": "Última deleção foi em",
"LeastDaysInput": "Por favor, especifique um número de dias maior do que %s.",
"LeastMonthsInput": "Por favor, especifique um número de meses maior que %s.",
"MenuPrivacySettings": "Privacidade",
"NextDelete": "Próxima exclusão agendada em",
"PurgeNow": "Purge DB Agora",
"PurgeNowConfirm": "Você está prestes a excluir permanentemente os dados de seu banco de dados. Tem certeza de que quer continuar?",
"PurgingData": "Purgando dados...",
"RecommendedForPrivacy": "Recomendado para privacidade",
"ReportsDataSavedEstimate": "Tamanho do banco de dados",
"SaveSettingsBeforePurge": "Você mudou as configurações de exclusão de dados. Guarde-os antes de iniciar um expurgo.",
"SeeAlsoOurOfficialGuidePrivacy": "Veja também nosso guia oficial: %1$sWeb Analytics Privacy%2$s",
"TeaserHeadline": "Configurações de privacidade",
"UseAnonymizedIpForVisitEnrichment": "Utilize também o endereço de IP Anonimizado ao enriquecer visitas.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugins como o de Geo Localização via IP e o Provedor melhoraram os metadados do visitante. Por padrão, esses plugins usam endereços IP anónimos. Se você selecionar \"Não\", então o endereço IP não-anónimos completo será usado, resultando em menos privacidade, mas melhor precisão dos dados.",
"UseAnonymizeIp": "Anonimizar endereços IP dos visitantes",
"UseDeleteReports": "Exclua regularmente relatórios antigos do banco de dados"
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonimizar dados",
"AnonymizeIpDescription": "Selecione \"Sim\" se pretende que o Matomo não acompanhe os endereços de IP totalmente qualificados.",
"AnonymizeIpInlineHelp": "Torna o(s) último(s) byte(s) dos endereços IP dos visitantes anónimo(s) para obedecer às suas leis\/regulamentos de privacidade locais.",
"AnonymizeIpExtendedHelp": "Quando os utilizadores visitam o seu site, o Matomo não irá utilizar o endereço de IP completo (como por exemplo, %1$s) mas em vez disso o Matomo irá anonimizar o mesmo primeiro (para %2$s). A anonimização do endereço de IP é um dos requisitos definidos por leis de privacidade em alguns países, como a Alemanha.",
"AnonymizeIpMaskLengtDescription": "Selecione quantos bytes dos IPs dos visitantes devem ser mascarados.",
"AnonymizeIpMaskLength": "%1$s byte(s) - por exemplo %2$s",
"AskingForConsent": "Solicitando consentimento",
"ClickHereSettings": "Clique aqui para aceder às definições %s.",
"CurrentDBSize": "Tamanho atual da base de dados",
"DBPurged": "Base de dados limpa.",
"DeleteBothConfirm": "Está prestes a ativar a eliminação tanto dos dados em bruto como os dados dos relatórios. Isto vai remover permanentemente a sua capacidade de ver dados analíticos antigos. Tem a certeza que pretende fazer isto?",
"DeleteDataDescription": "Pode configurar o Matomo para eliminar regularmente dados em bruto e\/ou relatórios agregados, de forma a manter o tamanho da sua base de dados pequeno ou de forma a cumprir normas de privacidade, tais como o RGPD.",
"DeleteDataInterval": "Eliminar dados antigos todos\/todas",
"DeleteOldVisitorLogs": "Eliminar registos antigos de visitantes",
"DeleteOldRawData": "Eliminar regularmente dados em bruto antigos",
"DeleteOldAggregatedReports": "Eliminar os dados agregados antigos de relatórios",
"DeleteLogDescription2": "Quando ativa a eliminação automática de registos, deve garantir que todos os relatórios diários anteriores foram processados, de modo a que nenhuma informação seja perdida.",
"DeleteRawDataInfo": "Os dados em bruto contém todos os detalhes sobre cada visita individual e cada ação que os seus visitantes executaram. Quando elimina dados em bruto, a informação eliminada não estará mais disponível no registo de visitas. Também, se decidir criar um segmento mais tarde, os relatórios segmentados não ficaram disponíveis para o intervalo de tempo que foi eliminado dado que todos os relatórios agregados são gerados a partir destes dados em bruto.",
"DeleteLogsConfirm": "Está prestes a ativar a eliminação de dados em bruto. Se os dados em bruto forem removidos e se os relatórios ainda não tiverem sido criados, não poderá ver os dados analíticos mais antigos. Tem a certeza que pretende fazer isto?",
"DeleteLogsOlderThan": "Eliminar registos mais antigos que",
"DeleteMaxRows": "Número máximo de linhas para eliminar de cada vez:",
"DeleteMaxRowsNoLimit": "sem limite",
"DeleteReportsConfirm": "Está prestes a ativar a eliminação de dados em bruto. Se os relatórios antigos forem removidos, terá de reprocessar os mesmos para os poder consultar. Tem a certeza que pretende fazer isto?",
"DeleteAggregateReportsDetailedInfo": "Se ativar esta definição, todos os relatórios agregados serão eliminados. Os relatórios agregados são gerados a partir dos dados em bruto e representam os dados agregados de várias visitas individuais. Por exemplo, o relatório \"País\" lista os números agregados para ver quantas visitas teve de cada país.",
"KeepBasicMetricsReportsDetailedInfo": "Quando ativa esta definição, alguns indicadores numéricos chave de desempenho não serão eliminados.",
"DeleteReportsInfo2": "Se eliminar relatórios antigos, estes poderão ser reprocessados novamente a partir dos seus dados em bruto, se os solicitar.",
"DeleteReportsInfo3": "Se também ativou \"%s\", então os dados dos relatórios que está a eliminar serão perdidos de forma irreversível.",
"DeleteReportsOlderThan": "Eliminar relatórios mais antigos que",
"DeleteSchedulingSettings": "Agendar a eliminação de dados antigos",
"DeleteDataSettings": "Eliminar registos e relatórios de visitantes antigos",
"DoNotTrack_Description": "Do Not Track é uma proposta de tecnologia e de política que permite que os utilizadores optem por não serem acompanhados pelos sites que visitam, incluindo serviços de analytics, redes de publicidade e plataformas sociais.",
"DoNotTrack_Disable": "Desativar o suporte ao Do Not Track",
"DoNotTrack_Disabled": "O Matomo está atualmente a acompanhar todos os visitantes, mesmo quando estes especificaram \"Eu não pretendo ser acompanhado\" nos seus navegadores.",
"DoNotTrack_DisabledMoreInfo": "Nós recomendamos que respeite a privacidade dos seus visitantes e ative o suporte ao DoNotTrack.",
"DoNotTrack_Enable": "Ativar o suporte ao Do Not Track",
"DoNotTrack_Enabled": "Atualmente está a respeitar a privacidade dos seus utilizadores. Excelente!",
"DoNotTrack_EnabledMoreInfo": "Quando os utilizadores têm o seu navegador configurado para \"Eu não quero ser acompanhado\" (o DoNotTrack está ativo), então o Matomo não irá acompanhar estas visitas.",
"DoNotTrack_SupportDNTPreference": "Preferência para a funcionalidade Do Not Track",
"EstimatedDBSizeAfterPurge": "Tamanho da base de dados estimado depois da limpeza",
"EstimatedSpaceSaved": "Espaço estimado recuperado",
"GeolocationAnonymizeIpNote": "Nota: A geolocalização terá aproximadamente os mesmos resultados com 1 byte anonimizado. Com 2 bytes ou mais, a geolocalização será imprecisa.",
"GDPR": "RGPD",
"GdprManager": "Gestor do RGPD",
"GdprOverview": "Visão geral do RGPD",
"GdprTools": "Ferramentas do RGPD",
"GetPurgeEstimate": "Obter uma estimativa da limpeza",
"KeepBasicMetrics": "Manter as métricas básicas (visitas, visualizações de páginas, taxa de ressalto, conversões de objetivos, conversões de comércio eletrónico, etc.)",
"KeepDataFor": "Manter todos os dados para",
"KeepReportSegments": "Para os dados mantidos acima, manter também os relatórios segmentados",
"LastDelete": "A última eliminação foi a",
"LeastDaysInput": "Por favor, especifique um número de dias maior que %s.",
"LeastMonthsInput": "Por favor, especifique um número de meses maior que %s.",
"MenuPrivacySettings": "Privacidade",
"NextDelete": "Próxima eliminação agendada em",
"PluginDescription": "Aumente a privacidade para os seus utilizadores e faça com que a sua instância do Matomo esteja em conformidade com a sua legislação local.",
"PurgeNow": "Limpar a base de dados agora",
"PurgeNowConfirm": "Está prestes a eliminar dados da sua base de dados de forma permanente. Tem a certeza de que pretende continuar?",
"PurgingData": "A limpar dados...",
"RecommendedForPrivacy": "Recomendado para a privacidade",
"ReportsDataSavedEstimate": "Tamanho da base de dados",
"SaveSettingsBeforePurge": "Alterou as definições de eliminação de dados. Por favor, guarde estas definições antes de iniciar uma limpeza.",
"SeeAlsoOurOfficialGuidePrivacy": "Consulte também o nosso guia oficial: %1$sPrivacidade em Web Analytics%2$s",
"TeaserHeader": "Nesta página, pode configurar o Matomo para o tornar conforme com a legislação vigente, fazendo: %1$s a anonimização do IP do visitante%2$s, %3$s a remoção automática de registos antigos dos visitantes da base de dados%4$s e %5$s a anonimização dos dados de acompanhamento em bruto dos utilizadores%6$s.",
"TeaserHeadline": "Definições de privacidade",
"UseAnonymizedIpForVisitEnrichment": "Também utilizamos os endereços de IP anonimizados ao enriquecer as visitas.",
"UseAnonymizedIpForVisitEnrichmentNote": "As extensões como a Geolocalização via IP e fornecer, enriquecem os meta-dados dos visitantes. Por omissão, estas extensões utilizam os endereços de IP anonimizados. Se selecionar 'Não', então será utilizado o endereço de IP completo não anonimizado , resultando em menos privacidade mas melhor fiabilidade dos dados.",
"PseudonymizeUserIdNote": "Quando ativa esta opção, o ID de utilizador será substituído por um pseudónimo para evitar o armazenamento e a apresentação direta de informação pessoal identificável, tal como o endereço de e-mail. Em termos técnicos: com base no seu ID de utilizador, o Matomo irá processar o pseudónimo do ID de utilizador utilizando uma função hash com salt.",
"PseudonymizeUserIdNote2": "Nota: a substituição com um pseudónimo não é o mesmo que anonimização. Nos termos do RGPD: o pseudónimo do ID de utilizador ainda é considerado dado pessoal. O ID de utilizador ainda pode ser identificado se determinadas informações adicionais estiverem disponíveis (a que apenas o Matomo e o seu processador de dados têm acesso).",
"AnonymizeOrderIdNote": "Dado que um ID de um pedido pode ser cruzado com outro sistema, tipicamente uma loja de comércio eletrónico, o ID do pedido pode ser considerado como uma informação pessoal sob o RGPD. Quando ativa esta opção, um ID de um pedido será automaticamente anonimizado pelo nenhuma informação pessoal será registada.",
"UseAnonymizeIp": "Anonimizar os endereços IP dos visitantes",
"UseAnonymizeTrackingData": "Anonimizar as informações de acompanhamento",
"UseAnonymizeUserId": "Anonimizar ID de utilizador",
"PseudonymizeUserId": "Substituir o ID de utilizador por um pseudónimo",
"UseAnonymizeOrderId": "Anonimizar o ID de um pedido",
"UseDeleteLog": "Eliminar com regularidade dados em bruto antigos da base de dados",
"UseDeleteReports": "Apagar com regularidade os relatórios antigos da base de dados",
"UsersOptOut": "Participação dos utilizadores",
"PrivacyPolicyUrl": "Endereço da política de privacidade",
"PrivacyPolicyUrlDescription": "Uma ligação para a página com a sua política de privacidade.",
"TermsAndConditionUrl": "Endereços dos termos e condições",
"TermsAndConditionUrlDescription": "Uma ligação para a página com os seus termos e condições.",
"PrivacyPolicyUrlDescriptionSuffix": "Se definir isto, isto será mostrado no rodapé da página de autenticação e em páginas a que o utilizador '%1$s' possa aceder.",
"ShowInEmbeddedWidgets": "Mostrar em widgets incorporados",
"ShowInEmbeddedWidgetsDescription": "Se marcado, será apresentada uma ligação para a sua política de privacidade e para os seus termos e condições no final das widgets incorporadas.",
"PrivacyPolicy": "Política de privacidade",
"TermsAndConditions": "Termos e condições"
}
}

View File

@ -0,0 +1,46 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Ascunde ultimele cifre ale IP-ului vizitatorilor pentru a fi în conformitate cu legile privind protecţia datelor personale.",
"AnonymizeIpMaskLengtDescription": "Selectați cât de multe bytes al IP-urilor de visitatori ar trebui să fie mascate.",
"AnonymizeIpMaskLength": "%1$s octet(ii)- ex. %2$s",
"ClickHereSettings": "Dă click aici pentru a accesa setările %s.",
"CurrentDBSize": "Dimensiunea bazei de date curenta",
"DBPurged": "DB curățat.",
"DeleteDataInterval": "Şterge datele vechi fiecare",
"DeleteLogDescription2": "Când activați ștergerea automată a jurnalului, trebuie să vă asigurați că toate rapoartele zilnice anterioare au fost prelucrate, astfel încât sa nu se piarda date .",
"DeleteLogsOlderThan": "Șterge înregistrări mai vechi decât",
"DeleteMaxRows": "Numărul maxim de rânduri pentru a șterge într-o cursă:",
"DeleteMaxRowsNoLimit": "nelimitat",
"DeleteReportsConfirm": "Sunteți pe cale de a permite ștergerea raportului de date. Dacă rapoartele vechi sunt eliminate, va trebui să re-prelucrare a acestora, în scopul de a le vizualiza. Ești sigur că vrei să faci asta?",
"DeleteReportsOlderThan": "Șterge rapoarte mai vechi de",
"DeleteDataSettings": "Şterge înregistrări şi raportare vechi",
"DoNotTrack_Description": "Nu urmari este o tehnologie și propunere de politici, care permite utilizatorilor să renunțațe la urmărirea de către site-urile care le viziteaza, inclusiv servicii de analiză, retele de publicitate, și platforme sociale.",
"DoNotTrack_Disable": "Dezactivați nu urmăresc suport",
"DoNotTrack_DisabledMoreInfo": "Recomandăm să respecţi confidenţialitatea vizitatorilor şi să activezi funcţia DoNotTrack.",
"DoNotTrack_Enable": "Nu se permite urmărire suport",
"DoNotTrack_Enabled": "Bravo, respecţi confidenţialitatea utilizatorilor tăi!",
"DoNotTrack_SupportDNTPreference": "Nu urmăresc preferință suport",
"EstimatedDBSizeAfterPurge": "Dimensiunea estimativa a bazei de date după epurare",
"EstimatedSpaceSaved": "Estimare spatiu salvat",
"GeolocationAnonymizeIpNote": "Notă: Geolocation va avea aproximativ aceleași rezultate cu un octet anonime. Cu 2 bytes sau mai multe, Geolocation vor fi inexacte.",
"GetPurgeEstimate": "Estimare curatenie",
"KeepBasicMetrics": "Păstrați metrici de bază (vizite, vizualizări de pagină, bounce rate, conversiile de obiectiv, conversii de comert electronic, etc.)",
"KeepReportSegments": "Pentru datele păstrate de mai sus, se păstreaza, de asemenea, rapoarte segmentate",
"LastDelete": "Ultima ștergere a fost pe",
"LeastDaysInput": "Vă rugăm să specificați un număr de zile mai mare decât %s.",
"LeastMonthsInput": "Vă rugăm să specificați un număr de luni mai mare decât %s.",
"MenuPrivacySettings": "Confidenţialitate",
"NextDelete": "Următoarea programare de ștergere",
"PurgeNow": "Curăța DB acum",
"PurgeNowConfirm": "Ești pe cale de a șterge definitiv baza de date. Sigur doriți să continuați?",
"PurgingData": "Purjare de date ...",
"ReportsDataSavedEstimate": "Mărimea bazei de date",
"SaveSettingsBeforePurge": "Ați schimbat setările de ștergere a datelor. Vă rugăm să le salvați înainte de a începe o curatare.",
"SeeAlsoOurOfficialGuidePrivacy": "A se vedea, de asemenea, ghidul nostru oficial: %1$sWeb Analytics confidențialitate%2$s",
"TeaserHeadline": "Setări confidenţialitate",
"UseAnonymizedIpForVisitEnrichment": "De asemenea, utilizeaza adresele IP anonimime, atunci când se cresc vizitele.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugin-uri, cum ar fi Locația geografică prin intermediul IP și furnizor îmbunătățire metadate vizitator. În mod implicit aceste plugin-uri folosesc adresele IP anonimizate. Dacă selectați \"Nu\", atunci adresa IP complet non-anonime va fi folosit în loc, careare mai puțina intimitate, dar are o mai mare acuratețe a datelor.",
"UseAnonymizeIp": "Adresele IP ale vizitatorilor anonimi",
"UseDeleteReports": "Șterge periodic rapoartele vechi din baza de date"
}
}

View File

@ -0,0 +1,45 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Скрыть последний байт IP-адресов ваших посетителей согласно вашим принципам конфиденциальности или законодательству.",
"AnonymizeIpExtendedHelp": "Когда пользователи посещают ваш сайт, Matomo не будет использовать полный IP-адрес (например, %1$s), а анонимизирует его (например, в %2$s). Анонимизация IP-адреса является одним из требований, установленных законами о конфиденциальности в некоторых странах, таких как Германия.",
"AnonymizeIpMaskLengtDescription": "Выберите, как много байтов IP-адреса посетителей должно быть скрыто.",
"AnonymizeIpMaskLength": "%1$s байт(ов), например, %2$s",
"ClickHereSettings": "Нажмите здесь, чтобы перейти к настройкам: %s.",
"CurrentDBSize": "Текущий размер базы данных",
"DBPurged": "База данных очищена.",
"DeleteDataInterval": "Удалять старые данные каждые",
"DeleteLogDescription2": "Если вы используете автоматическое удаление логов, убедитесь, что все предыдущие отчеты за день были обработаны, чтобы не потерять ни каких данных.",
"DeleteLogsOlderThan": "Удалить логи, старше чем",
"DeleteMaxRows": "Максимальное число строк для удаления за один раз:",
"DeleteMaxRowsNoLimit": "нет ограничений",
"DeleteReportsConfirm": "Вы собираетесь включить удаление данных по отчетам. Когда старые отчеты будут удалены, вы должны снова обработать их, если хотите просмотреть их. Вы увереныЮ что хотите сделать это?",
"DeleteReportsOlderThan": "Удалить отчеты, старше чем",
"DeleteDataSettings": "Удаление старых логов посещений и отчетов",
"DoNotTrack_Description": "Отказ от Отслеживания технология и предложение политики безопасности, которая позволяет пользователям отказываться от того, чтобы их посещения отслеживали. Используется в аналитических сервисах, рекламных сетях и социальных платформах.",
"DoNotTrack_Disable": "Отключить возможность отказа от отслеживания",
"DoNotTrack_DisabledMoreInfo": "Мы рекомендуем уважать конфиденциальность ваших посетителей и включить возможность отказа от отслеживания.",
"DoNotTrack_Enable": "Включить возможность отказа от отслеживания",
"DoNotTrack_Enabled": "На данный момент вы уважается конфиденциальность ваших посетителей. Браво!",
"DoNotTrack_SupportDNTPreference": "Настройки Отказа от Отслеживания",
"EstimatedDBSizeAfterPurge": "Ожидаемый размер базы данных после чистки",
"EstimatedSpaceSaved": "Ожидаемый сохраненный размер space saved",
"GeolocationAnonymizeIpNote": "Подсказка: Геолоакция будет иметь практически те же результаты с 1 скрытым байтом IP адреса. Если скрыто два или более байтов, геолокация будет определять местонахождене пользователя неточно.",
"GetPurgeEstimate": "Оценить очистку базы по времени",
"KeepBasicMetrics": "Сохранить основные показатели (посещения, просмотры страниц, процент отскоков, конверсию целей, конверсию эл. заказов и др.)",
"KeepReportSegments": "Для сохранения данных выше также настройте сегментацию отчетов",
"LastDelete": "Последнее удаление было",
"LeastDaysInput": "Пожалуйста, определите количество дней, большее чем %s.",
"LeastMonthsInput": "Пожалуйста, определите количество месяцев, большее чем %s.",
"MenuPrivacySettings": "Конфиденциальность",
"NextDelete": "Следующее удаление по расписанию через",
"PurgeNow": "Очистить базу данных сейчас",
"PurgeNowConfirm": "Вы собираетесь навсегда удалить данные из вашей базы данных. Вы уверены, что хотите продолжить?",
"PurgingData": "Чистка данных...",
"ReportsDataSavedEstimate": "Размер базы данных",
"SaveSettingsBeforePurge": "Вы изменили настройки удаления данных. Пожалуйста, сохраните их, перед тем как начать чистку.",
"SeeAlsoOurOfficialGuidePrivacy": "Смотрите также официальное руководство: %1$sКонфидециальность данных в Matomo%2$s",
"TeaserHeadline": "Настройки конфиденциальности",
"UseAnonymizeIp": "Скрыть IP-адреса посетителей",
"UseDeleteReports": "Всегда удалять старые отчеты из баз данных"
}
}

View File

@ -0,0 +1,10 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Anonymnosť posledný bajt IP adresy návštevníkov v súlade s miestnymi zákonmi na ochranu súkromia.",
"AnonymizeIpMaskLengtDescription": "Vyberte koľko bajtov IP adresy návštevníkov by malo byť maskovaných.",
"AnonymizeIpMaskLength": "%1$s bajt(y) - napr. %2$s",
"ClickHereSettings": "Kliknite sem pre prístup k %s nastaveniam.",
"CurrentDBSize": "Aktuálna veľkosť databázy",
"DBPurged": "Databáza vyčistená."
}
}

View File

@ -0,0 +1,13 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Anonimiziraj zadnji bajt IP naslova obiskovalca, da se s tem izpolnijo zahteve lokalnih zakonov\/smernic o zasebnosti.",
"ClickHereSettings": "Kliknite tu za dostop do %s nastavitev.",
"DeleteLogsOlderThan": "Izbriši dnevnike, starejše od",
"DeleteMaxRowsNoLimit": "brez omejitve",
"LastDelete": "Zadnji izbris je bil",
"LeastDaysInput": "Prosimo, navedite število dni, večje od %s.",
"MenuPrivacySettings": "Zasebnost",
"NextDelete": "Naslednji izbris je predviden",
"TeaserHeadline": "Nastavitve zasebnosti"
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonimizo të dhënat",
"AnonymizeIpDescription": "Përzgjidhni \"Po\" nëse doni që Matomo të mos ndjekë adresa IP të përcaktuara qartë.",
"AnonymizeIpInlineHelp": "Anonimizoje bajtin(et) e fundit të adresave IP të vizitorëve, në pajtim me ligjet\/udhëzimet vendore mbi privatësinë.",
"AnonymizeIpExtendedHelp": "Kur përdoruesit vizitojnë sajtin tuaj, Matomo sdo të përdorë adresën e plotë IP (të tillë si %1$s), por në vend të kësaj Matomo së pari do ta anonimizojë (si %2$s). Anonimizimi i adresave IP është një nga domosdoshmëritë e vendosura nga ligjet mbi privatësinë në disa vende, si Gjermania, fjala vjen.",
"AnonymizeIpMaskLengtDescription": "Përzgjidhni sa bajte të maskohen te IP-ja e vizitorit.",
"AnonymizeIpMaskLength": "%1$s bajt(e) - p.sh. %2$s",
"AskingForConsent": "Kërkim pranimi",
"ClickHereSettings": "Klikoni këtu që të shkoni te rregullimet mbi %s.",
"CurrentDBSize": "Madhësia e tanishme e bazës së të dhënave",
"DBPurged": "DB-ja u pastrua.",
"DeleteBothConfirm": "Ju ndan një hap nga aktivizimi i fshirjes si për të dhënat e papërpunuara, ashtu edhe për të dhëna raportesh. Kjo do tju heqë përgjithmonë aftësinë të shihni të dhëna analitike të vjetra. Jeni i sigurt se doni të bëhet kjo?",
"DeleteDataDescription": "Mund ta formësoni Matomo-n të fshjë rregullisht të dhëna të vjetra të papërpunuara dhe\/ose raporte të krijuar, për ta mbajtur bazën tuaj të të dhënave të vogël ose për të qenë në përputhje me rregulla privatësie të tilla si GDPR-ja.",
"DeleteDataInterval": "Fshiji të dhënat e vjetra çdo",
"DeleteOldVisitorLogs": "Fshi regjistra të vjetër vizitorësh",
"DeleteOldRawData": "Fshi rregullisht të dhëna të vjetra të papërpunuara",
"DeleteOldAggregatedReports": "Fshi raporte të vjetër të krijuar",
"DeleteLogDescription2": "Kur aktivizoni fshirjen e vetvetishme të regjistrimeve, duhet të siguroheni që janë përpunuar krejt raportet e ditës së mëparshme, që të mos humbni të dhëna.",
"DeleteRawDataInfo": "Të dhënat e papërpunuara përfshijnë krejt hollësitë mbi secilën vizitë individuale dhe mbi çdo veprim që bënë vizitorët tuaj. Kur fshini të dhëna të papërpunuara, informacioni i fshirë sdo të mund të gjendet apo përdoret më te regjistri mbi atë vizitorë. Gjithashtu, nëse vendosni më vonë të krijoni një segment, sdo të prodhohen dot raporte segmentesh për atë interval kohor që është fshirë, ngaqë krejt raportet e krijuar prodhohen nga këto të dhëna të papërpunuara.",
"DeleteLogsConfirm": "Ju ndan një hap nga fshirja e të dhënave të papërpunuara. Nëse hiqen të dhënat e vjetra të papërpunuara, dhe raportet sjanë krijuar ende, sdo të jeni në gjendje të shihni të dhëna analitike të dikurshme historike. Jeni i sigurt se doni të bëhet kjo?",
"DeleteLogsOlderThan": "Fshi regjistrime më të vjetër se",
"DeleteMaxRows": "Numër maksimum rreshtash për tu fshirë njëherazi:",
"DeleteMaxRowsNoLimit": "pa kufi",
"DeleteReportsConfirm": "Ju ndan një hap nga aktivizimi i fshirjes së të dhënave të raporteve. Nëse hiqen raportet e vjetër, do tju duhet ti ripërpunoni ata, pa të mund ti shihni. Jeni i sigurt se doni të bëhet kjo?",
"DeleteAggregateReportsDetailedInfo": "Kur e aktivizoni këtë rregullim, do të fshihen krejt raportet e krijuar. Raportet e krijuar prodhohen nga të dhëna të papërpunuara prej shumë vizitash individuale. Për shembull, raporti \"Vend\" radhit numra përmbledhës për të parë se sa vizita keni pasur prej secilit vend.",
"KeepBasicMetricsReportsDetailedInfo": "Kur e aktivizoni këtë rregullim, disa tregues kyç numerikë mbi funksionimin e sajtit nuk do të fshihen.",
"DeleteReportsInfo2": "Nëse fshini raporte të vjetër, ata mund të rikrijohen përmes të dhënave të PAPËRPUNUARA, kur ta kërkoni këtë.",
"DeleteReportsInfo3": "Nëse keni aktivizuar edhe \"%s\", atëherë të dhënat e raporteve që po fshini, do të humbin përgjithnjë.",
"DeleteReportsOlderThan": "Fshi raporte më të vjetër se",
"DeleteSchedulingSettings": "Planifikoni fshirje të dhënash të vjetra",
"DeleteDataSettings": "Fshi regjistra dhe raporte të vjetër përdoruesish",
"DoNotTrack_Description": "Mos Më Gjurmo është një propozim teknik dhe rregulli që u lejon përdoruesve të zgjedhin lënien jashtë ndjekjes nga sajtet që vizitojnë, përfshi shërbime analizash, rrjete reklamash, dhe platforma shoqërore.",
"DoNotTrack_Disable": "Çaktivizoni mbulimin e Mos Më Gjurmo-së",
"DoNotTrack_Disabled": "Matomo i ndjek krejt vizitorët, edhe kur ata kanë zgjedhur \"Nuk dua të gjurmohem\" në shfletuesin e tyre.",
"DoNotTrack_DisabledMoreInfo": "Këshillojmë të respektoni privatësinë e vizitorëve tuaj dhe të aktivizoni mbulimin e Mos Më Gjurmo-së.",
"DoNotTrack_Enable": "Aktivizoni mbulimin e Mos Më Gjurmo-së",
"DoNotTrack_Enabled": "Po e respektoni Privatësinë e përdoruesve tuaj. Bravo!",
"DoNotTrack_EnabledMoreInfo": "Kur përdoruesit kanë zgjedhur në shfletuesin e tyre \"Nuk dua të gjurmohem\" (DoNotTrack është i aktivizuar) atëherë Matomo nuk do ti ndjekë këto vizita.",
"DoNotTrack_SupportDNTPreference": "Përkrahni parapëlqimin Mos Më Gjurmo",
"EstimatedDBSizeAfterPurge": "Madhësi e pritshme për bazën e të dhënave pas pastrimit",
"EstimatedSpaceSaved": "Hapësirë që pritet të kursehet",
"GeolocationAnonymizeIpNote": "Shënim: Gjeovendëzimi do të ketë përafërsisht të njëjtat përfundime me 1 bajt të anonimizuar. Me 2 ose më shumë bajte, Gjeovendëzimi do të jetë i pasaktë.",
"GDPR": "GDPR",
"GdprManager": "Përgjegjës GDPR",
"GdprOverview": "Përmbledhje e GDPR-së",
"GdprTools": "Mjete GDPR",
"GetPurgeEstimate": "Merrni parashikim pastrimi",
"KeepBasicMetrics": "Mba vlerat bazë (vizita, parje faqesh, mesatare kthimesh, shndërrime objektivash, shndërrime e-tregti, etj.)",
"KeepDataFor": "Mba krejt të dhënat për",
"KeepReportSegments": "Për të dhëna të mbajtura më sipër, mbaj edhe raporte të segmentuar",
"LastDelete": "Fshirja e fundit u krye më",
"LeastDaysInput": "Ju lutemi, jepni një numër ditësh më të madh se %s.",
"LeastMonthsInput": "Ju lutemi, tregoni një numër muajsh më të madh se %s.",
"MenuPrivacySettings": "Privatësi",
"NextDelete": "Fshirja pasuese është planifikuar më",
"PluginDescription": "Shtoni Privatësinë për përdoruesit tuaj dhe bëjeni instalimin tuaj të Matomo-s të përputhshëm me ligjshmërinë vendore mbi privatësinë.",
"PurgeNow": "Pastroje DB-në Tani",
"PurgeNowConfirm": "Ju ndan një hap nga fshirja përgjithmonë e të dhënave nga baza juaj e të dhënave. Jeni i sigurt se doni të vazhdohet?",
"PurgingData": "Po pastrohen të dhënat…",
"RecommendedForPrivacy": "E këshilluar për privatësi",
"ReportsDataSavedEstimate": "Madhësi baze të dhënash",
"SaveSettingsBeforePurge": "Keni ndryshuar rregullimet për fshirje të dhënash. Ju lutemi, ruajini ato përpara se të nisni një pastrim.",
"SeeAlsoOurOfficialGuidePrivacy": "Shihni edhe udhërrëfyesin tonë zyrtar: %1$sPrivatësi Analizash Web%2$s",
"TeaserHeader": "Në këtë faqe, mund ta përshtatni Matomo-n për ta bërë të përputhshëm me rregulla privatësie legjislacionesh ekzistuese, duke: %1$s anonimizuar IP-në e vizitorit%2$s, %3$s duke hequr vetvetiu nga baza e të dhënave regjistra të vjetër vizitorësh%4$s, dhe %5$s anonimizuar të dhëna të papërpunuara vizitorësh të ndjekur më parë%6$s.",
"TeaserHeadline": "Rregullime Privatësie",
"UseAnonymizedIpForVisitEnrichment": "Përdor edhe adresa IP të Anonimizuara kur pasurohen vizita.",
"UseAnonymizedIpForVisitEnrichmentNote": "Shtojca të tilla si Gjeovendëzim përmes IP-sh dhe Furnizuesish përmirësojnë tejtëdhënat e përdoruesve. Si parazgjedhje, këto shtojca përdorin adresa IP të anonimizuara. Nëse përzgjidhni 'Jo', atëherë do të përdoren adresa IP të plota, të paanonimizuara, që do të thotë më pak privatësi, por më tepër saktësi të dhënash.",
"PseudonymizeUserIdNote": "Kur aktivizoni këtë mundësi, ID-ja e Përdoruesit do të zëvendësohet me një pseudonim, për të shmangur depozitim dhe shfaqje të drejtpërdrejtë në ekran të dhënash personale të identifikueshme, f.v. një adresë email. Me terma teknike: kur i jepet ID-ja juaj e Përdoruesit, Matomo do të përgatisë pseudonimin e ID-së së Përdoruesit duke përdorur një funksion <em>salted hash<\/em>.",
"PseudonymizeUserIdNote2": "Shënim: zëvendësimi me një pseudonim sështë e njëjta gjë me anonimizimin. Me termat e GDPR-së: Pseudonimi i ID-së së Përdoruesit merret si e dhënë personale. ID-ja origjinale e Përdoruesit prapë mund të identifikohet, nëse kihen disa të dhëna të caktuara (te të cilat mund të hyjë vetëm Matomo dhe përpunuesi i të dhënave tuaja).",
"AnonymizeOrderIdNote": "Ngaqë një ID Porosie mund të mund të përshoqërohet me një sistem tjetër, zakonisht një dyqan etregtie, ID-ja e Porosisë mund të shihet si e dhënë personale, nën GDPR-në. Kur e aktivizoni këtë mundësi, një ID Porosie do të anonimizohet vetvetiu, dhe kështu sdo të ketë ndjekje të dhënash personale.",
"UseAnonymizeIp": "Anonimizoni adresat IP të Vizitorëve",
"UseAnonymizeTrackingData": "Anonimizo Të dhëna Ndjekjeje",
"UseAnonymizeUserId": "Anonimizo ID Përdoruesi",
"PseudonymizeUserId": "Zëvendëso ID Përdoruesi me një pseudonim",
"UseAnonymizeOrderId": "Anonimizo ID Porosie",
"UseDeleteLog": "Fshi rregullisht të dhëna të vjetra të papërpunuara prej bazës së të dhënave",
"UseDeleteReports": "Fshi rregullisht raporte të vjetër prej bazës së të dhënave",
"UsersOptOut": "Zgjedhje lënieje jashtë nga përdoruesit",
"PrivacyPolicyUrl": "URL Rregullash Privatësie",
"PrivacyPolicyUrlDescription": "Një lidhje për te faqja juaj e Rregullave të Privatësisë",
"TermsAndConditionUrl": "URL Termash & Kushtesh",
"TermsAndConditionUrlDescription": "Një lidhje për te faqja e Termave & Kushteve tuaja.",
"PrivacyPolicyUrlDescriptionSuffix": "Nëse e caktoni këtë, do të shfaqet në fund të faqes së hyrjeve dhe te faqe te të cilat mund të hyjë përdoruesi '%1$s'.",
"ShowInEmbeddedWidgets": "Shfaqe në widget-e të trupëzuar",
"ShowInEmbeddedWidgetsDescription": "Nëse i vihet shenjë, në fund të widget-eve të trupëzuar do të shfaqet një lidhje për te Rregullat tuaja të Privatësisë dhe Termat & Kushtet tuaja.",
"PrivacyPolicy": "Rregulla Privatësie",
"TermsAndConditions": "Terma & Kushte"
}
}

View File

@ -0,0 +1,51 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Maskiranje poslednjeg bajta IP adresa posetioca kako bi sve bilo u skladu sa vašim lokalnim zakonima i preporukama o zaštiti privatnosti.",
"AnonymizeIpExtendedHelp": "Kada korisnik poseti vaš sajt, Matomo neće koristiti punu IP adresu (poput %1$s) već će je anonimizirati (u %2$s). Anonimizacija IP adresa je jedan od zahteva koje su postavili zakoni o zaštit privatnosti u zemljama poput Nemačke.",
"AnonymizeIpMaskLengtDescription": "Izaberite koliko bajtova IP adrese treba da bude maskirano",
"AnonymizeIpMaskLength": "%1$s bajt(ova) - npr. %2$s",
"ClickHereSettings": "Kliknite ovde kako biste pristupili %s podešavanjima.",
"CurrentDBSize": "Trenutna veličina baze",
"DBPurged": "Baza je očišćena",
"DeleteDataInterval": "Obriši stare posatke svakih",
"DeleteOldVisitorLogs": "Obriši stare zapise",
"DeleteLogDescription2": "Kada omogućite automatsko brisanje zapisa, morate biti sigurni da su svi prethodni dnevni izveštaji obrađeni kako ne bi došlo do gubitka podataka.",
"DeleteLogsOlderThan": "Obriši zapise starije od",
"DeleteMaxRows": "Maksimalan broj redova za brisanje odjednom:",
"DeleteMaxRowsNoLimit": "bez ograničenja",
"DeleteReportsConfirm": "Na putu ste da uključite brisanje izveštaja. Ukoliko obrišete stare izveštaje, moraćete ponovo da ih kreirate ako budete želeli opet da ih vidite. Da li ste sigurni da želite to da uradite?",
"DeleteReportsOlderThan": "Briši izveštaje starije od",
"DeleteSchedulingSettings": "Zakaži brisanje starih podataka",
"DeleteDataSettings": "Obriši stare zapise i izveštaje",
"DoNotTrack_Description": "Do Not Track je predlog tehnologije i polise koji omogućuje korisnicima da se izuzmu iz praćenja od strane sajtova koje oni nisu posetili uključujući analitičke servise, reklamne mreže i društvene platforme.",
"DoNotTrack_Disable": "Isključi podršku za Do Not Track",
"DoNotTrack_DisabledMoreInfo": "Predlažemo vam da poštujete privatnost vaših korisnika i uključite podršku za Do Not Track.",
"DoNotTrack_Enable": "Uključi podršku za Do Not Track",
"DoNotTrack_Enabled": "Vi poštujete privatnost vaših korisnika. Bravo!",
"DoNotTrack_SupportDNTPreference": "Do Not Track podešavanja",
"EstimatedDBSizeAfterPurge": "Procenjena veličina baze nakon čišćenja",
"EstimatedSpaceSaved": "Procenjena ušteda u prostoru",
"GeolocationAnonymizeIpNote": "Pažnja: Geolokacija će imati približno iste rezultate sa jednim bajtom anonimizacije. Sa dva bajta ili više, Geolokacija neće biti tačna.",
"GetPurgeEstimate": "Daj procenu",
"KeepBasicMetrics": "Zadrži osnovne metrike (posete, broj prikaza stranica, stopu odbijanja, ispunjenje ciljeva, elektronske porudžbine itd.)",
"KeepDataFor": "Zadrži sve podatke za",
"KeepReportSegments": "Za gore sačuvane podatke sačuvaj i segmentirane izveštaje",
"LastDelete": "Poslednje brisanje je bilo",
"LeastDaysInput": "Molimo vas da navedete broj dana veći od %s.",
"LeastMonthsInput": "Molimo vas da navedete broj meseci veći od %s.",
"MenuPrivacySettings": "Privatnost",
"NextDelete": "Sledeće zakazano brisanje za",
"PurgeNow": "Očisti bazu",
"PurgeNowConfirm": "Na putu ste da trajno obrišete podatke iz baze. Da li želite da nastavite?",
"PurgingData": "Čišćenje baze",
"RecommendedForPrivacy": "Preporučljivo zbog privatnosti",
"ReportsDataSavedEstimate": "Veličina baze",
"SaveSettingsBeforePurge": "Izmenili ste pravila oko brisanja podataka. Molimo vas da ih sačuvate pre nego što počnete sa čišćenjem podataka.",
"SeeAlsoOurOfficialGuidePrivacy": "Pogledajte i naš zvanični vodič: %1$sPrivatnost u analitikama%2$s",
"TeaserHeadline": "Podešavanja privatnosti",
"UseAnonymizedIpForVisitEnrichment": "Takođe koristi anonimne IP adrese kada obogaćuješ podete.",
"UseAnonymizedIpForVisitEnrichmentNote": "Dodaci poput Geolokacije putem IP adrese i provajdera unapređuju podatke o posetiocima. Podrazumevano, ovi dodaci anonimiziraju IP adrese. Ukoliko izaberete 'Ne', onda će u upotrebi biti pune IP adrese što će rezultovati slabijom privatnošću ali i većom tačnošću podataka.",
"UseAnonymizeIp": "Anonimizacija IP adrese posetilaca",
"UseDeleteReports": "Periodično briši stare izveštaje iz baze"
}
}

View File

@ -0,0 +1,81 @@
{
"PrivacyManager": {
"AnonymizeData": "Anonymisera data",
"AnonymizeIpDescription": "Välj \"Ja\" om du vill att Matomo inte ska spåra fullständiga IP-adresser.",
"AnonymizeIpInlineHelp": "Anonymisera den sista byten av besökarnas IP-adress för att följa lokala lagar om personlig integritet\/riktlinjer.",
"AnonymizeIpExtendedHelp": "När användare besöker din webbplats kommer inte Matomo använda deras fullständiga IP-adress (exempelvis %1$s). Istället kommer Matomo anonymisera den först (till %2$s). Anonymisering av IP-adresser är ett krav enligt personuppgiftslagen i några länder såsom Tyskland.",
"AnonymizeIpMaskLengtDescription": "Välj hur många bytes av besökares IP-adresser som ska döljas.",
"AnonymizeIpMaskLength": "%1$s byte(s) - t.ex. %2$s",
"AskingForConsent": "Begär samtycke",
"ClickHereSettings": "Klicka här för att komma åt inställningar för %s.",
"CurrentDBSize": "Aktuell databasstorlek",
"DBPurged": "DB rensad.",
"DeleteBothConfirm": "Du är på väg att aktivera radering av både loggar och rapportdata. Det innebär att du permanent kommer att förlora möjligheterna att visa gammal analysdata. Är du säker på att du vill göra detta?",
"DeleteDataInterval": "Ta bort gamla data varje",
"DeleteOldVisitorLogs": "Radera gamla besöksloggar",
"DeleteLogDescription2": "När du aktiverar automatisk radering av loggar, så måste du se till att alla tidigare dagliga rapporter har behandlats så att inga data går förlorade.",
"DeleteLogsConfirm": "Du är på väg att aktivera radering av loggdata. Om gamla loggdata tas bort, och rapporter inte redan har skapats, kommer du inte kunna se historiska förflutna analysdata. Är du säker på att du vill göra detta?",
"DeleteLogsOlderThan": "Ta bort loggfiler äldre än",
"DeleteMaxRows": "Maximalt antal rader som ska tas bort under en körning:",
"DeleteMaxRowsNoLimit": "ingen begränsning",
"DeleteReportsConfirm": "Du är på väg att aktivera radering av loggdata. Om gamla rapporter tas bort, måste du på nytt behandla dem för att visa dem. Är du säker på att du vill göra detta?",
"DeleteReportsOlderThan": "Ta bort rapporter äldre än",
"DeleteSchedulingSettings": "Schemalägg radering av gammalt data",
"DeleteDataSettings": "Radera gamla besöksloggar och rapporter från databasen",
"DoNotTrack_Description": "\"Do Not Track\" är en teknologi och policy som tillåter användare att avstå från spårning av webbplatser dom besöker, det inkluderar analystjänster, reklamnätverk och sociala plattformer.",
"DoNotTrack_Disable": "Inaktivera Do Not Track",
"DoNotTrack_Disabled": "Matomo spårar för närvarande alla besök, även om användare specificerat \"Begär att webbplaster inte spårar mig\" i sina webbläsare.",
"DoNotTrack_DisabledMoreInfo": "Vi rekommenderar att du respekterar dina besökares integritet och aktiverar DoNotTrack",
"DoNotTrack_Enable": "Aktivera DoNotTrack",
"DoNotTrack_Enabled": "Du respekterar dina användares integritetBravo!",
"DoNotTrack_EnabledMoreInfo": "När användare som besöker sidan har ställt in sin webbläsare till \"Begär att webbplatser inte spårar mig\" (DoNotTrack aktiverat), så kommer Matomo inte att spåra dessa besök.",
"DoNotTrack_SupportDNTPreference": "Stöd \"Do Not Track\"-val",
"EstimatedDBSizeAfterPurge": "Beräknad databasstorlek efter rensning",
"EstimatedSpaceSaved": "Beräknat sparat utrymme",
"GeolocationAnonymizeIpNote": "Notera: Geolocation kommer att ha ungefär samma resultat med 1 byte anonymiserad. Med 2 byte eller mer blir Geolocation vara felaktig.",
"GDPR": "GDPR",
"GdprManager": "GDPR Hantering",
"GdprOverview": "GDPR Översikt",
"GdprTools": "GDPR Verktyg",
"GetPurgeEstimate": "Hämta uppskattning för rensning",
"KeepBasicMetrics": "Behåll grundläggande variabler (besök, sidvisningar, studsfrekvens, målomvandlingar, e-handelskonverteringar, etc.)",
"KeepDataFor": "Behåll all data för",
"KeepReportSegments": "För behållen data, spara även segmenterade rapporter",
"LastDelete": "Senast borttaget",
"LeastDaysInput": "Vänligen ange ett antal dagar som är större än %s.",
"LeastMonthsInput": "Ange ett antal månader mer än %s.",
"MenuPrivacySettings": "Integritet",
"NextDelete": "Nästa schemalagda borttagning",
"PluginDescription": "Förbättra sekretessen för dina användare och gör så att din Matomo miljös sekretess uppfyller kraven som ställs enligt lokal lagstiftning.",
"PurgeNow": "Rensa databasen nu",
"PurgeNowConfirm": "Du är på väg att permanent radera data från din databas. Är du säker på att du vill fortsätta?",
"PurgingData": "Rensar data...",
"RecommendedForPrivacy": "Rekommenderas för sekretess",
"ReportsDataSavedEstimate": "Databasstorlek",
"SaveSettingsBeforePurge": "Du har ändrat inställningarna för radering av loggdata. Spara dem innan du startar en utrensning.",
"SeeAlsoOurOfficialGuidePrivacy": "Se också vår allmänna guide: %1$sWeb Analytics Privacy%2$s",
"TeaserHeader": "På denna sidan kan du anpassa Matomo så att den personliga integriteten uppfyller existerande lagstiftning, genom att: %1$s anonymisera besökarens IP%2$s, %3$s automatiskt ta bort gamla besöksloggar från databasen %4$s, och %5$s erbjuda exkludering av spårning för din webbplats%6$s.",
"TeaserHeadline": "Integritetinställningar",
"UseAnonymizedIpForVisitEnrichment": "Använd också de anonyma IP-adresserna för att berika besök.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugin som Geo Location via IP adress och leverantör förbättrar dina användares metadat. För att standardisera dessa plugins använder du en anonyma IP adresser. Om du väljer \"Nej\", kommer den icke-anonyma fullständiga IP adressen att användas istället. Det kommer göra att du är mindre privat, men du kommer få en mer exakt data",
"PseudonymizeUserIdNote": "När du aktiverar det här alternativet kommer användarnamnet att ersättas av en pseudonym för att undvika direkt lagring och visning av personligt identifierbar information såsom en e-postadress. Tekniskt sett: Med ditt användar-ID, kommer Matomo att bearbeta användar-ID-pseudonym med hjälp av en saltad hashfunktion.",
"PseudonymizeUserIdNote2": "OBS! Att byta ut med en pseudonym är inte detsamma som anonymisering. I GDPR-termer: Användarens ID-pseudonym räknas fortfarande som personuppgifter. Det ursprungliga användar-ID kan fortfarande identifieras om vissa ytterligare uppgifter är tillgängliga (som endast Matomo och din dataprocessor har tillgång till).",
"AnonymizeOrderIdNote": "Eftersom ett Order-ID kan hänvisas till ett annat system, vanligtvis en e-handelsbutik, kan Order-ID räknas som personlig information under GDPR. När du aktiverar det här alternativet kommer ett Order-ID automatiskt att anonymiseras så att ingen personlig information kommer att spåras.",
"UseAnonymizeIp": "Anonymisera besökarnas IP-adresser",
"UseAnonymizeTrackingData": "Anonymisera spårningsdata",
"UseAnonymizeUserId": "Anonymisera användar-Id",
"PseudonymizeUserId": "Byt ut användar-Id mot ett pseudonym",
"UseAnonymizeOrderId": "Anonymisera order-Id",
"UseDeleteReports": "Ta regelbundet bort gamla rapporter från databasen",
"UsersOptOut": "Användare väljer att inte vara med (opt-out)",
"PrivacyPolicyUrl": "Adress till integritetspolicyn",
"PrivacyPolicyUrlDescription": "En länk till sidan för din integritetspolicy.",
"TermsAndConditionUrl": "Adress till villkoren",
"TermsAndConditionUrlDescription": "En länk till sidan för dina villkor.",
"PrivacyPolicyUrlDescriptionSuffix": "Om du anger detta, visas den längst ner på inloggningssidan och på sidor som '%1$s' användaren kan komma åt.",
"ShowInEmbeddedWidgets": "Visa i inbäddade widgets",
"ShowInEmbeddedWidgetsDescription": "Om denna är markerad visas en länk till din sekretesspolicy och dina användarvillkor längst ner i inbäddade widgets.",
"PrivacyPolicy": "Integritetspolicy",
"TermsAndConditions": "Villkor"
}
}

View File

@ -0,0 +1,7 @@
{
"PrivacyManager": {
"DeleteMaxRowsNoLimit": "పరిమితి లేదు",
"MenuPrivacySettings": "గోప్యత",
"TeaserHeadline": "గోప్యతా అమరికలు"
}
}

View File

@ -0,0 +1,20 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Anonymize มีขนาดเป็นไบต์ล่าสุดของที่อยู่ IP ของผู้เข้าชมเพื่อให้สอดคล้องกับนโยบายข้อมูลส่วนบุคคลภายในเครื่องของคุณ",
"ClickHereSettings": "คลิกที่นี่เพื่อเข้าถึงการตั้งค่า %s",
"CurrentDBSize": "ขนาดฐานข้อมูลปัจจุบัน",
"DBPurged": "ล้าง DB",
"DeleteDataInterval": "ลบข้อมูลเก่าทุกๆ",
"DeleteLogsOlderThan": "ลบบันทึก logs ที่มีอายุเก่ากว่า",
"DeleteMaxRowsNoLimit": "ไม่จำกัด",
"DeleteReportsOlderThan": "ลบรายงานที่มีอายุเก่ากว่า",
"DeleteDataSettings": "ลบบันทึกการเข้าชมและรายงานที่เก่าแล้ว",
"LastDelete": "ลบครั้งสุดท้ายเมื่อ",
"MenuPrivacySettings": "ความเป็นส่วนตัว",
"PurgeNow": "ล้างข้อมูลในฐานข้อมูลตอนนี้เลย",
"PurgingData": "กำลังล้างข้อมูล...",
"ReportsDataSavedEstimate": "ขนาดฐานข้อมูล",
"TeaserHeadline": "การตั้งค่าความเป็นส่วนตัว",
"UseAnonymizeIp": "ผู้เข้าชมแบบไม่ระบุที่อยู่ IP"
}
}

View File

@ -0,0 +1,45 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "E-Anonymize ang huling byte ng IP address ng iyong mga bisita upang sumunod sa iyong mga alituntuning local at privacy.",
"AnonymizeIpMaskLengtDescription": "Piliin kung gaano karaming byte ng IP ng bisita ang dapat na ikubli.",
"AnonymizeIpMaskLength": "%1$s (na) byte - hal %2$s",
"ClickHereSettings": "Mag-click dito upang i-access ang mga setting sa %s.",
"CurrentDBSize": "Kasalukuyang laki ng database",
"DBPurged": "DB purged",
"DeleteDataInterval": "Tanggalin ang mga lumang data sa bawat",
"DeleteLogDescription2": "Kapag iyong pinagana ang automatic log deletion dapat mong tiyakin na ang lahat ng karaang mga ulat ay na proseso na upang sa ganun ay wala ng data na mawawala.",
"DeleteLogsOlderThan": "Tanggalin ang mga log na mas luma sa",
"DeleteMaxRows": "Pinakamataas na bilang ng mga hilera na tatanggalin sa isang pagtakbo:",
"DeleteMaxRowsNoLimit": "walang limitasyon",
"DeleteReportsConfirm": "Iyong papaganahin ang pag tanggal sa datus ng ulat. Kung ang matatagal ng ulat ay natanggal Kailangan mong ulitin ang mga ito upang makita. Gustomo mo bang gawin ito?",
"DeleteReportsOlderThan": "Tanggalin ang mga lumang ulat na hihigit sa",
"DeleteDataSettings": "Tanggaling lumang log ng mga bisita at mga ulat.",
"DoNotTrack_Description": "Do Not Track ay isang teknolohiya at patakaran na nagbibigay daan sa mga gumagamit upang makapili kung nais nitong hindi masubay-bayan ang bawat website na kanilang binibista kabilang na dito ang analytics services mga network sa advertising at social platform.",
"DoNotTrack_Disable": "Huwag paganahin ang Do Not Track support",
"DoNotTrack_Enable": "Paganahin ang Do Not Track support",
"DoNotTrack_Enabled": "Kasalukuyan mong inirerespeto ang Privacy ng iyong mga user Bravo!",
"DoNotTrack_SupportDNTPreference": "Suporta para sa Do Not Track preference.",
"EstimatedDBSizeAfterPurge": "Tantsang laki ng database pagkatapos ma purge.",
"EstimatedSpaceSaved": "Tinatatyang na save na space",
"GeolocationAnonymizeIpNote": "Tandaan: Geolocation ay magkakaroon ng tinatayang may parehas na resulta na may 1 byte na hindi pa nakikilala. May 2 bytes o higit pa Geolocation na hindi pa tiyak sa pag gana",
"GetPurgeEstimate": "Kunin ang mga na estimate na pag purge",
"KeepBasicMetrics": "Panatilihin ang mga pangunahing panukat (mga pagbisita page view rate ng biglaang pag-alis goal conversions ecommerce conversions atbp.",
"KeepReportSegments": "Para sa pinanatiling data sa taas panatilihin din ang mga binahaging ulat.",
"LastDelete": "Huling pagtanggal ay sa",
"LeastDaysInput": "Mangyaring tukuyin ang bilang ng araw na mas mataas kaysa sa %s.",
"LeastMonthsInput": "Mangyaring tukuyin ang bilang ng buwan na na mas mataas kaysa %s.",
"MenuPrivacySettings": "Privacy",
"NextDelete": "Susunod na iskedyul sa pagtaggal sa",
"PurgeNow": "I-purge ang DB Ngayon",
"PurgeNowConfirm": "Iyo ng permanenteng tanggalin ang data mula sa iyong database. Sigurado ka bang gusto mo itong ituloy?",
"PurgingData": "Purging data...",
"ReportsDataSavedEstimate": "Laki ng database",
"SaveSettingsBeforePurge": "Iyong binago ang mga setting ng pagtanggal ng data. Mangyaring i-save ang mga ito bago simulan ang isang pag purge.",
"SeeAlsoOurOfficialGuidePrivacy": "Tingnan din ang aming opisyal na gabay: %1$s Privacy Web Analytics %2$s",
"TeaserHeadline": "Mga setting ng privacy",
"UseAnonymizedIpForVisitEnrichment": "Gamitin rin ang hindi kilalang IP address kapag bumibisita.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugis tulad ng Geo Location sa pamamagitang ng IP at Provider ay pinagbuti ang metadata ng mga bumibisita. Sa una ang plugins na ito ay gumagamit ng anonymized IP addresses. Kapag iyong pinili ang 'No' pagkatapos ay ang non-anonymized na IP address ay syang magagamit na mag-reresulta ng may mababang privacy ngunit mas mahusay at tiyak na data.",
"UseAnonymizeIp": "I-anonymize ang IP addresses ng mga bisita.",
"UseDeleteReports": "Palaging tanggalin ang mga lumang report sa database"
}
}

View File

@ -0,0 +1,90 @@
{
"PrivacyManager": {
"AnonymizeData": "Verileri Anonim Kılma",
"AnonymizeIpDescription": "Bu seçenek etkinleştirildiğinde, Matomo tarafından tam sınıflandırılmış IP adresleri izlenmez.",
"AnonymizeIpInlineHelp": "Kişisel Verilerin Korunması Düzenlemelerine Uygun Olarak Ziyaretçi IP Adreslerinin Son Baytları Anonim Kılınsın",
"AnonymizeIpExtendedHelp": "Bu seçenek etkinleştirildiğinde, Matomo web sitenize gelen ziyaretçilerin IP adresini (%1$s gibi) kullanmaz ve IP adresini anonim kılar (%2$s gibi). IP adresinin anonim kılınması Almanya gibi bazı ülkelerde kişisel verilerin korunması yasalarına göre zorunludur.",
"AnonymizeIpMaskLengtDescription": "Ziyaretçi IP adreslerinin kaç baytının maskeleneceğini seçin.",
"AnonymizeIpMaskLength": "%1$s bayt - Örnek: %2$s",
"AskingForConsent": "Onay Sorma",
"ClickHereSettings": "%s ayarlarına erişmek için buraya tıklayın.",
"CurrentDBSize": "Geçerli veritabanı boyutu",
"DBPurged": "Veritabanı temizlendi.",
"DeleteBothConfirm": "Hem ham verileri hem de rapor verilerini silmeyi seçtiniz. Bu işlemin sonunda eski istatistik verileriniz kalıcı olarak silinecek ve raporları da yeniden oluşturamayacaksınız. Bu işlemi yapmak istediğinize emin misiniz?",
"DeleteDataDescription": "Matomo veritabanının boyutunu küçük tutmak ve Kişisel Verilerin Korunması Kanunu koşullarını sağlamak için eski ham verilerin ve işlenmiş raporların düzenli olarak silinmesini sağlayabilirsiniz.",
"DeleteDataInterval": "Eski verileri silme sıklığı",
"DeleteOldVisitorLogs": "Eski ziyaretçi günlüğü kayıtları silinsin",
"DeleteOldRawData": "Eski ham veriler düzenli olarak silinsin",
"DeleteOldAggregatedReports": "Eski işlenmiş rapor verileri silinsin",
"DeleteLogDescription2": "Günlük kayıtlarını otomatik silme özelliğini etkinleştirdiğinizde tüm önceki günlük raporların işlenmiş olduğundan ve herhangi bir verinin kaybolmayacağından emin olun.",
"DeleteRawDataInfo": "Ham verilerde, konuklarınızın yaptığı her ziyaretin ve her işlemin ayrıntıları bulunur. Ham veriler silindiğinde, silinen bilgiler konuk günlüğünde görüntülenmez. Ayrıca daha sonra bir parça oluşturmak isterseniz, silinen verinin bulunduğu zaman aralığında bu ham veriyi kullanarak üretilmiş olan işlenmiş raporların tümü silinmiş olacağından parçalı raporlar üretilemez.",
"DeleteLogsConfirm": "Ham veri silinmesini etkinleştirmek üzeresiniz. Eski ham veriler silindiğinde, henüz bu eski dönemlere ait oluşturulmamış raporlar varsa bu istatistik verilerini göremeyeceksiniz. Bu işlemi yapmak istediğinize emin misiniz?",
"DeleteLogsOlderThan": "Şundan eski günlük kayıtları silinsin",
"DeleteMaxRows": "Bir kerede silinecek en fazla satır sayısı:",
"DeleteMaxRowsNoLimit": "sınırlama yok",
"DeleteReportsConfirm": "Rapor verilerini silmeyi seçmek üzeresiniz. Eski raporlar silindiğinde eski istatistik bilgilerini görebilmek için raporların yeniden işlenmesi gerekir. Devam etmek ister misiniz?",
"DeleteAggregateReportsDetailedInfo": "Bu seçenek etkinleştirildiğinde, tüm işlenmiş raporlar silinir. İşlenmiş raporlar ham verilerden çeşitli ziyaretlerin ham verilerinin işlenmesi ile üretilir. Örneğin \"Ülke\" raporunda her bir ülkeden yapılmış ziyaretlerin sayısının işlenmesi ile oluşturulur.",
"KeepBasicMetricsReportsDetailedInfo": "Bu seçenek etkinleştirildiğinde, bazı sayısal Anahtar Performans Göstergeleri silinmez.",
"DeleteReportsInfo2": "Silinen eski raporlar, gerekli olduğunda ham verilerden yeniden üretilebilir.",
"DeleteReportsInfo3": "Ancak \"%s\" seçeneği de etkinleştirilmiş ise, silinen rapor verileri tamamen kaybolur.",
"DeleteReportsOlderThan": "Şundan eski raporlar silinsin",
"DeleteSchedulingSettings": "Eski verileri silmeyi zamanlayın",
"DeleteDataSettings": "Eski ziyaretçi günlüğü kayıtlarını ve raporları sil",
"DoNotTrack_Description": "İzlenmek İstemiyorum özelliği, kullanıcılara ziyaret ettikleri istatistik hizmetleri, reklam ağları ve sosyal ağlar gibi web siteleri tarafından izlenip izlenmemelerini seçme olanağı sunar.",
"DoNotTrack_Disable": "İzlenmek İstemiyorum Özelliği Kullanılmasın",
"DoNotTrack_Disabled": "Matomo şu anda web tarayıcılarından \"İzlenmek İstemiyorum\" seçeneğini seçmiş olsalar da tüm ziyaretçileri izliyor.",
"DoNotTrack_DisabledMoreInfo": "Ziyaretçilerinizin kişisel gizliliğine ve isteklerine saygı duymanız ve İzlenmek İstemiyorum özelliğini etkinleştirmeniz önerilir.",
"DoNotTrack_Enable": "İzlenmek İstemiyorum Özelliği Kullanılsın",
"DoNotTrack_Enabled": "Şu anda ziyaretçilerinizin kişisel gizliliğine önem veriyorsunuz. Tebrikler!",
"DoNotTrack_EnabledMoreInfo": "Bu seçenek etkinleştirildiğinde, ziyaretçiler web sitelerinden \"İzlenmek İstemiyorum\" seçeneğini seçebilir ve Matomo bu kullanıcıların ziyaretlerini izlemez.",
"DoNotTrack_SupportDNTPreference": "İzlenmek İstemiyorum Özelliği Ayarı",
"EstimatedDBSizeAfterPurge": "Temizklik sonrası öngörülen veritabanı boyutu",
"EstimatedSpaceSaved": "Öngörülen kazanılacak boyut",
"GeolocationAnonymizeIpNote": "Not: Coğrafi konum yaklaşık olarak 1 bayt anonim kılma ile aynı sonucu verir. 2 ya da daha fazla bayt ile yapılan anonim kılmalarda coğrafi konum doğruluğu kalmaz.",
"GDPR": "GVKY (GDPR)",
"GdprManager": "GVKY Yönetimi",
"GdprOverview": "Kişisel Veri Güvenliği Yönergesi Özeti",
"GdprTools": "Kişisel Veri Güvenliği Yönergesi Araçları",
"GetPurgeEstimate": "Temizlik öngörüsünü görüntüle",
"KeepBasicMetrics": "Temel ölçütler korunur (ziyaretler, sayfa görüntülemeleri, hemen çıkma oranı, hedef tutturma, e-ticarete dönüşme gibi)",
"KeepDataFor": "Şunun için tüm veriler korunsun",
"KeepReportSegments": "Yukarıdaki verileri korumak için dilimlenmiş raporlar da korunmalı",
"LastDelete": "Son silinme zamanı",
"LeastDaysInput": "Lütfen %s değerinden büyük bir gün sayısı belirtin.",
"LeastMonthsInput": "Lütfen %s değerinden büyük bir ay sayısı belirtin.",
"MenuPrivacySettings": "Kişisel Gizlilik",
"NextDelete": "Sonraki zamanlanmış silme",
"PluginDescription": "Ziyaretçilerinizin kişisel gizliliğini arttırın ve Matomo kopyanızın bulunduğunuz ülkenin kişisel verileri koruma yasalarına uygun çalıştığından emin olun.",
"PurgeNow": "Veritabanını Temizle",
"PurgeNowConfirm": "Veritabanınızdaki verileri kalıcı olarak silmek üzeresiniz. Devam etmek istiyor musunuz?",
"PurgingData": "Veriler boşaltılıyor...",
"RecommendedForPrivacy": "Kişisel gizlilik için önerilir",
"ReportsDataSavedEstimate": "Veritabanı boyutu",
"SaveSettingsBeforePurge": "Veri silme ayarlarınızı değiştirdiniz. Lütfen temizliği başlatmadan önce ayarları kaydedin.",
"SeeAlsoOurOfficialGuidePrivacy": "Resmi belgelere de bakabilirsiniz: %1$sWeb İstatistiklerinde Kişisel Gizlilik%2$s",
"TeaserHeader": "Kişisel gizliliğin korunması yasalarına uygun Matomo ayarları bu bölümden şu seçenekler kullanılarak yapılabilir: %1$s Ziyaretçi IP adreslerinin anonim kılınması%2$s, %3$s Eski ziyaretçi günlük kayıtlarının veritabanından otomatik olarak kaldırılması%4$s ve %5$s önceden izlenmiş ham kullanıcı verilerinin anonim kılınması%6$s.",
"TeaserHeadline": "Kişisel Gizlilik Ayarları",
"UseAnonymizedIpForVisitEnrichment": "Ziyaret verilerini zenginleştirirken Anonoimleştirilmiş IP adresleri kullanılsın.",
"UseAnonymizedIpForVisitEnrichmentNote": "Zİyaretçilerin üst verilerini geliştiren IP adresi ve hizmet sağlayıcıya göre coğrafi konum bulma uygulama ekleri. Varsayılan olarak bu uygulama eklerinde anonim kılınmış IP adresleri kullanılır. Bu seçenek devre dışı bırakıldığında anonim kılınmamış tam IP adresi kullanılır. Bu durum da kişisel gizliliğin korunmasını azaltırken daha doğru konum bilgisi sağlar.",
"PseudonymizeUserIdNote": "Bu seçenek etkinleştirildiğinde, Kullanıcı Kodu yerine bir sahte bir kod görüntülenerek, e-posta adresi gibi kişisel gizliliğin korunmasını engelleyebilecek bilgilerin görüntülenmesi ve kaydedilmesi engellenir. Teknik olarak Kullanıcı Kodu belirtildiğinde, Matomo karılmış bir işlev ile oluşturulmuş sahte kullanıcı kodunu kullanır.",
"PseudonymizeUserIdNote2": "Not: Sahte kod kullanılması anonim kılma ile aynı şey değildir. Kişisel Verilerin Korunması hükümlerine göre Sahte Kullanıcı Kodu da kişisel veri sayılır. Belirli verilere sahip olunması durumunda (yalnız Matomo ve veri işleyiciniz tarafından erişilebilen) Sahte Kullanıcı Kodu kullanılarak Gerçek Kullanıcı Kodu bulunabilir.",
"AnonymizeOrderIdNote": "Sipariş Kodu bir e-ticaret mağazası gibi başka bir sistemde referans olarak bulunacağından, Genel Veri Koruma Yönergesi kapsamındaki kişisel bilgilerin elde edilmesinde kullanılabilir. Bu seçenek etkinleştirildiğinde, Sipariş Kodu otomatik olarak anonim kılınır böylece kişisel bilgiler izlenemez.",
"UseAnonymizeIp": "Ziyaretçinin IP adresi anonim kılınsın",
"UseAnonymizeTrackingData": "İzleme Verileri Anonim Kılınsın",
"UseAnonymizeUserId": "Kullanıcı Kodu Anonim Kılınsın",
"PseudonymizeUserId": "Kullanıcı Kodu Sahte Kullanıcı Koduna Dönüştürülsün",
"UseAnonymizeOrderId": "Sipariş Kodu Anonim Kılınsın",
"UseDeleteLog": "Eski ham veriler veritabanından düzenli olarak silinsin",
"UseDeleteReports": "Veritabanından eski raporlar düzenli olarak silinsin",
"UsersOptOut": "İzlemeyi Engelleme",
"PrivacyPolicyUrl": "Gizlilik İlkesi Adresi",
"PrivacyPolicyUrlDescription": "Gizlilik İlkesi sayfanızın bağlantısı.",
"TermsAndConditionUrl": "Hüküm ve Koşullar Adresi",
"TermsAndConditionUrlDescription": "Hüküm ve Koşullar sayfanızın bağlantısı.",
"PrivacyPolicyUrlDescriptionSuffix": "Buraya yazılan adres, oturum açma sayfası ve '%1$s' kullanıcısının erişebileceği sayfaların altında görüntülenir.",
"ShowInEmbeddedWidgets": "Gömülü gereçler içinde görüntülensin",
"ShowInEmbeddedWidgetsDescription": "Bu seçenek etkinleştirildiğinde, gömülü gereçlerin altında Gizlilik İlkesi ve Hüküm ve Koşullar sayfalarınıza bağlantılar görüntülenir.",
"PrivacyPolicy": "Gizlilik İlkesi",
"TermsAndConditions": "Hüküm ve Koşullar"
}
}

View File

@ -0,0 +1,51 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Приховати останній байт IP-адрес ваших відвідувачів згідно вашим принципам конфіденційності або законодавству.",
"AnonymizeIpExtendedHelp": "Коли користувачі відвідують ваш сайт, Matomo не використовуватиме повний IP-адрес (наприклад, %1$s), а анонимизирует его (например, в %2$s). Анонимизация IP-адреса является одним из требований, установленных законами о конфиденциальности в некоторых странах, таких как Германия.",
"AnonymizeIpMaskLengtDescription": "Виберіть, як багато байтів IP-адреси відвідувачів повинно бути приховано.",
"AnonymizeIpMaskLength": "%1$s байт(ів), наприклад, %2$s",
"ClickHereSettings": "Натисніть тут, щоб перейти до налаштувань: %s.",
"CurrentDBSize": "Поточний розмір бази даних",
"DBPurged": "База даних очищена.",
"DeleteDataInterval": "Видаляти старі дані кожні",
"DeleteOldVisitorLogs": "Видалення старих журналів відвідувача",
"DeleteLogDescription2": "Якщо ви використовуєте автоматичне видалення логів, переконайтеся, що всі попередні звіти за день були оброблені, щоб не втратити ні яких даних.",
"DeleteLogsOlderThan": "Видалити логи, старше ніж",
"DeleteMaxRows": "Максимальне число рядків для видалення за один раз:",
"DeleteMaxRowsNoLimit": "немає обмежень",
"DeleteReportsConfirm": "Ви збираєтеся включити видалення даних за звітами. Коли старі звіти будуть видалені, ви повинні знову обробити їх, якщо хочете переглянути їх. Ви впевнені що хочете зробити це?",
"DeleteReportsOlderThan": "Видалити звіти, старше ніж",
"DeleteSchedulingSettings": "Розклад видалення старих даних",
"DeleteDataSettings": "Видалення старих логів відвідувань і звітів",
"DoNotTrack_Description": "Відмова від відстеження технологія і пропозиція політики безпеки, яка дозволяє користувачам відмовлятися від того, щоб їх відвідування відстежувалися. Використовується в аналітичних сервісах, рекламних мережах і соціальних платформах.",
"DoNotTrack_Disable": "Відключити можливість відмови від відстеження",
"DoNotTrack_DisabledMoreInfo": "Ми рекомендуємо поважати конфіденційність ваших відвідувачів і включити можливість відмови від відстеження.",
"DoNotTrack_Enable": "Включити можливість відмови від відстеження",
"DoNotTrack_Enabled": "На даний момент ви поважаєте конфіденційність ваших відвідувачів. Браво!",
"DoNotTrack_SupportDNTPreference": "Налаштування Відмови від Відстеження",
"EstimatedDBSizeAfterPurge": "Очікуваний розмір бази даних після чистки",
"EstimatedSpaceSaved": "Очікуваний розмір збереженого простору",
"GeolocationAnonymizeIpNote": "Підказка: Геолоакція матиме практично ті ж результати з 1 прихованим байтом IP адреси. Якщо приховано два або більше байтів, геолокація буде визначати місцезнаходження користувача неточно.",
"GetPurgeEstimate": "Оцінити очищення бази за часом",
"KeepBasicMetrics": "Зберегти основні показники (відвідування, перегляди сторінок, відсоток відскоків, конверсію цілей, конверсію ел. замовлень і ін.)",
"KeepDataFor": "Зберегти всі дані для",
"KeepReportSegments": "Для збереження даних вище також налаштуйте сегментацію звітів",
"LastDelete": "Останнє видалення було",
"LeastDaysInput": "Будь ласка, визначте кількість днів, більше ніж %s.",
"LeastMonthsInput": "Будь ласка, визначте кількість місяців, більше ніж %s.",
"MenuPrivacySettings": "Конфіденційність",
"NextDelete": "Наступне видалення за розкладом через",
"PurgeNow": "Очистити базу даних зараз",
"PurgeNowConfirm": "Ви збираєтеся назавжди видалити дані з вашої бази даних. Ви впевнені, що хочете продовжити?",
"PurgingData": "Видалення даних...",
"RecommendedForPrivacy": "Рекомендується для забезпечення конфіденційності",
"ReportsDataSavedEstimate": "Розмір бази даних",
"SaveSettingsBeforePurge": "Ви змінили налаштування видалення даних. Будь ласка, збережіть їх, перед тим як почати чистку.",
"SeeAlsoOurOfficialGuidePrivacy": "Дивіться також офіційне керівництво: %1$sПриватність даних в Matomo%2$s",
"TeaserHeadline": "Налаштування конфіденційності",
"UseAnonymizedIpForVisitEnrichment": "Також використовуйте анонімні IP-адреси при логуванні відвідувань.",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugins such as Geo Location via IP and Provider improve visitor's metadata. By default these plugins use the anonymized IP addresses. If you select 'No', then the non-anonymized full IP address will be used instead, resulting in less privacy but better data accuracy.",
"UseAnonymizeIp": "Приховати IP-адреси відвідувачів",
"UseDeleteReports": "Завжди видаляти старі звіти з баз даних"
}
}

View File

@ -0,0 +1,45 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "Làm ẩn danh những byte(s) cuối trên địa chỉ IP của khách để tuân thủ quy định\/luật nội bộ về quyền riêng tư.",
"AnonymizeIpMaskLengtDescription": "Chọn bao nhiêu byte IPs của khách truy cập nên giấu.",
"AnonymizeIpMaskLength": "%1$s byte(s) - ví dụ %2$s.",
"ClickHereSettings": "Click chuột tại đây để truy cập các cài đặt %s.",
"CurrentDBSize": "Kích thước cơ sở dữ liệu hiện tại",
"DBPurged": "Loại bỏ DB.",
"DeleteDataInterval": "Xóa mọi dữ liệu cũ",
"DeleteLogDescription2": "Khi bạn kích hoạt xóa bản ghi tự động, bạn phải đảm bảo rằng tất cả các báo cáo hàng ngày trước đây đã được xử lý, do đó không có dữ liệu bị mất.",
"DeleteLogsOlderThan": "Xóa các bản ghi cũ hơn",
"DeleteMaxRows": "Số hàng lớn nhất phải xóa trong mỗi lần chạy:",
"DeleteMaxRowsNoLimit": "không giới hạn",
"DeleteReportsConfirm": "Bạn muốn cho phép xóa dữ liệu báo cáo. Nếu báo cáo cũ được loại bỏ, bạn sẽ phải xử lý lại chúng theo thứ tự xem. Bạn có chắc bạn muốn làm điều này?",
"DeleteReportsOlderThan": "Xóa báo cáo cũ hơn",
"DeleteDataSettings": "Xóa các bản ghi và báo cáo cũ của khách truy cập",
"DoNotTrack_Description": "Do Not Track là một công nghệ và đề xuất chính sách cho phép người dùng chọn không bị theo dõi bởi các trang web họ truy cập, bao gồm cả dịch vụ phân tích, mạng lưới quảng cáo, và các nền tảng xã hội.",
"DoNotTrack_Disable": "Vô hiệu hóa Do Not Track hỗ trợ",
"DoNotTrack_DisabledMoreInfo": "Chúng tôi khuyên bạn nên tôn trọng sự riêng tư của khách truy cập của bạn và kích hoạt sự hỗ trợ DoNotTrack .",
"DoNotTrack_Enable": "Kích hoạt sự hỗ trợ Do Not Track",
"DoNotTrack_Enabled": "Bạn đang tôn trọng sự riêng tư của người dùng của bạn, Bravo!",
"DoNotTrack_SupportDNTPreference": "Hỗ trợ Do Not Track ưu tiên",
"EstimatedDBSizeAfterPurge": "Kích thước cơ sở dữ liệu ước tính sau khi thanh lọc",
"EstimatedSpaceSaved": "Không gian ước tính đã lưu",
"GeolocationAnonymizeIpNote": "Lưu ý: Định vị sẽ có khoảng kết quả tương tự với 1 byte ẩn danh. Với 2 byte hoặc nhiều hơn, Định vị sẽ không chính xác.",
"GetPurgeEstimate": "Thiết lập ước lượng thanh lọc",
"KeepBasicMetrics": "Giữ các số liệu cơ bản (thăm, xem trang, tỷ lệ thoát, chuyển đổi mục tiêu, chuyển đổi thương mại điện tử, vv)",
"KeepReportSegments": "Đã dữ liệu trên, cũng giữ các báo cáo phân đoạn",
"LastDelete": "Việc xóa lần cuối trên",
"LeastDaysInput": "Hãy xác định số ngày lớn hơn %s.",
"LeastMonthsInput": "Hãy xác định số tháng lớn hơn %s.",
"MenuPrivacySettings": "Riêng tư",
"NextDelete": "Xóa lịch trình tiếp theo trong",
"PurgeNow": "Loại bỏ DB ngay",
"PurgeNowConfirm": "Bạn muốn xóa vĩnh viễn dữ liệu từ cơ sở dữ liệu của bạn. Bạn có chắc muốn tiếp tục?",
"PurgingData": "Đang loại bỏ dữ liệu...",
"ReportsDataSavedEstimate": "Kích cỡ cơ sở dữ liệu",
"SaveSettingsBeforePurge": "Bạn đã thay đổi thiết lập việc xóa dữ liệu. Vui lòng lưu chúng trước khi bắt đầu loại bỏ.",
"TeaserHeadline": "Thiết lập riêng tư",
"UseAnonymizedIpForVisitEnrichment": "Cũng sử dụng các địa chỉ IP ẩn danh khi làm phong phú thêm các lượt truy cập.",
"UseAnonymizedIpForVisitEnrichmentNote": "Các plugin như là Vị trí Địa lý thông qua IP và nhà cung cấp cải tiến siêu dữ liệu của khách truy cập. Theo mặc định các plugin này sử dụng các địa chỉ IP được ẩn danh. Nếu bạn chọn 'No', sau đó địa chỉ IP đầy đủ không ẩn danh sẽ được sử dụng thay vào đó, kết quả là quyền riêng tư ít hơn nhưng dữ liệu chính xác hơn.",
"UseAnonymizeIp": "Các địa chỉ IP của khách truy cập ẩn danh",
"UseDeleteReports": "Thường xuyên xóa báo cáo cũ từ cơ sở dữ liệu"
}
}

View File

@ -0,0 +1,45 @@
{
"PrivacyManager": {
"AnonymizeIpInlineHelp": "隐藏访客IP位址最后一个字符以符合您当地的隐私条例\/政策。",
"AnonymizeIpMaskLengtDescription": "隐藏的访客IP的字节数",
"AnonymizeIpMaskLength": "%1$s 字节 - 例如 %2$s",
"ClickHereSettings": "点这里查看 %s 设置。",
"CurrentDBSize": "当前数据库大小",
"DBPurged": "数据库清理完成。",
"DeleteDataInterval": "删除旧的数据时间间隔",
"DeleteLogDescription2": "如果启用自动日志删除,您必须确认所有旧的日报表已经处理,这样就不会丢失数据。",
"DeleteLogsOlderThan": "删除旧的日志",
"DeleteMaxRows": "每次运行最多删除的行数:",
"DeleteMaxRowsNoLimit": "没有限制",
"DeleteReportsConfirm": "您正要启用报表数据删除。如果删除了旧的报表,下次查看前需要重新生成,您确认要这么做吗?",
"DeleteReportsOlderThan": "删除报表超过",
"DeleteDataSettings": "删除旧的访问日志和报表",
"DoNotTrack_Description": "Do Not Track 指一种技术和政策建议,让用户能主动退出包括分析服务、广告网络以及社交平台在内的网站统计分析。",
"DoNotTrack_Disable": "禁用 Do Not Track 支持",
"DoNotTrack_DisabledMoreInfo": "建议您考虑访客隐私并启用 DoNotTrack 支持。",
"DoNotTrack_Enable": "启用 Do Not Track 支持",
"DoNotTrack_Enabled": "您重视用户隐私, 很好!",
"DoNotTrack_SupportDNTPreference": "支持 Do Not Track 参数",
"EstimatedDBSizeAfterPurge": "清除后数据库估计的大小",
"EstimatedSpaceSaved": "估计节省的空间",
"GeolocationAnonymizeIpNote": "提示: 屏蔽1个字节地理位置基本一样。屏蔽2个或更多字节地理位置将不准确。",
"GetPurgeEstimate": "获得清除预计",
"KeepBasicMetrics": "保留基本的指标 (访客数, 访问次数, 跳出率, 目标转化, 订单转化等。)",
"KeepReportSegments": "上面保留的数据, 也保留分部报表。",
"LastDelete": "上次删除的时间是",
"LeastDaysInput": "请设置天数大于 %s。",
"LeastMonthsInput": "请设置月份大于 %s。",
"MenuPrivacySettings": "隐私设置",
"NextDelete": "下次删除的时间是",
"PurgeNow": "立刻清理数据库",
"PurgeNowConfirm": "准备从数据库里永久删除数据,您确定要继续吗?",
"PurgingData": "清理数据...",
"ReportsDataSavedEstimate": "数据库大小",
"SaveSettingsBeforePurge": "您修改了数据删除选项,请保存后再开始删除。",
"TeaserHeadline": "隐私设置",
"UseAnonymizedIpForVisitEnrichment": "当使访问更加丰富时也使用匿名IP地址。",
"UseAnonymizedIpForVisitEnrichmentNote": "例如通过IP和提供商的Geo定位等插件提供了关于访问者的更多数据。在默认情况下这些插件都使用匿名IP地址。如果你选择“NO”那么将使用非匿名的整个IP地址从而可以得到更准确的数据但是透露了更多的私有信息。",
"UseAnonymizeIp": "隐藏访客的 IP 地址",
"UseDeleteReports": "定时删除数据库中旧的报表"
}
}

View File

@ -0,0 +1,72 @@
{
"PrivacyManager": {
"AnonymizeData": "資料匿名化",
"AnonymizeIpDescription": "如果你希望 Matomo 不要追蹤完整的訪客 IP 位址請勾選。",
"AnonymizeIpInlineHelp": "隱藏訪客 IP 地址最後的字節以符合你本地隱私權法規\/政策。",
"AnonymizeIpExtendedHelp": "當使用者訪問你的網站時Matomo 將不會用完整的 IP 位址(例如 %1$s會先將其匿名化成為 %2$s。在部分國家中IP 位址匿名化是隱私法中的其中一項要求,例如德國。",
"AnonymizeIpMaskLengtDescription": "選擇要隱藏多少字節的 IP 位址。",
"AnonymizeIpMaskLength": "%1$s 字節,例如 %2$s",
"AskingForConsent": "要求同意",
"ClickHereSettings": "點擊這裡查看 %s 設定。",
"CurrentDBSize": "目前資料庫大小",
"DBPurged": "資料庫已清理。",
"DeleteBothConfirm": "你將啟用原始資料刪除和報表刪除功能。這將永久刪除舊資料,你將無法再查看舊有分析資料。確定要繼續嗎?",
"DeleteDataInterval": "刪除舊資料每隔",
"DeleteOldVisitorLogs": "刪除舊的訪客記錄",
"DeleteLogDescription2": "當你啟用自動刪除紀錄,你必須確定之前所有的日報表已經被處理過,資料才不會遺失。",
"DeleteLogsConfirm": "你將啟用原始資料刪除功能。如果舊的原始資料被刪除時,報表還沒被建立,你將無法查看歷史分析資料。確定要繼續嗎?",
"DeleteLogsOlderThan": "刪除紀錄當超過",
"DeleteMaxRows": "每次同時執行的最大列數:",
"DeleteMaxRowsNoLimit": "無限制",
"DeleteReportsConfirm": "你將啟用報表刪除功能。如果舊的報表被刪除,你將需要重新處理它們才能查看。確定要繼續嗎?",
"DeleteReportsOlderThan": "刪除報表當超過",
"DeleteSchedulingSettings": "舊資料刪除排程",
"DeleteDataSettings": "刪除舊的訪客紀錄和報表",
"DoNotTrack_Description": "不追蹤Do Not Track是技術和政策上的提議來讓使用者選擇退出不被所訪問的網站追蹤包含分析服務、廣告聯播網和社群平台。",
"DoNotTrack_Disable": "停用不追蹤Do Not Track支援",
"DoNotTrack_Disabled": "Matomo 目前追蹤所有訪客,包含那些在瀏覽器中設定了「我不想被追蹤」的人。",
"DoNotTrack_DisabledMoreInfo": "我們推薦你尊重訪客的隱私權以及啟用不追蹤Do Not Track支援。",
"DoNotTrack_Enable": "啟用不追蹤Do Not Track支援",
"DoNotTrack_Enabled": "你目前正尊重你的使用者,太棒了!",
"DoNotTrack_EnabledMoreInfo": "當使用者在瀏覽器中設定了「我不想被追蹤」(啟用不追蹤 Do Not TrackMatomo 將不會追蹤這些訪問。",
"DoNotTrack_SupportDNTPreference": "支援不追蹤Do Not Track設定",
"EstimatedDBSizeAfterPurge": "清理後資料庫預估大小",
"EstimatedSpaceSaved": "預估節省空間",
"GeolocationAnonymizeIpNote": "注意:選擇 1 字節時地理位置將會顯示與實際位置大略相同的結果。選擇 2 字節或以上,地理位置可能會不準確。",
"GDPR": "GDPR",
"GdprManager": "GDPR 管理",
"GdprOverview": "GDPR 總覽",
"GdprTools": "GDPR 工具",
"GetPurgeEstimate": "取得清理估計",
"KeepBasicMetrics": "保留基本數據(訪問數、網頁瀏覽數、跳出率、目標轉換數、電子商務轉換數等等)",
"KeepDataFor": "保留以下類型的全數資料",
"KeepReportSegments": "以上保留的資料中,也一並保留區隔報表。",
"LastDelete": "上次清理時間",
"LeastDaysInput": "請指定大於 %s 的天數。",
"LeastMonthsInput": "請指定大於 %s 的月數。",
"MenuPrivacySettings": "隱私",
"NextDelete": "下次排程的刪除時間",
"PluginDescription": "為你的使用者增加隱私,也讓你的 Matomo 隱私權和當地的法規相容。",
"PurgeNow": "立即清理資料庫",
"PurgeNowConfirm": "你將要永久刪除資料庫內的數據。確定要繼續嗎?",
"PurgingData": "清除資料中...",
"RecommendedForPrivacy": "保護隱私時推薦",
"ReportsDataSavedEstimate": "資料庫大小",
"SaveSettingsBeforePurge": "你已變更了資料刪除的設定。請在開始清理前先保存設定。",
"SeeAlsoOurOfficialGuidePrivacy": "也看看我們的官方指南:%1$s網頁分析隱私%2$s",
"TeaserHeader": "在此頁面中你可以透過自訂 Matomo 使其隱私與現有法規相容,如%1$s訪客 IP 匿名化%2$s、%3$s自動從資料庫中移除舊的訪客記錄%4$s和%5$s將之前追蹤的使用者資料匿名化%6$s。",
"TeaserHeadline": "隱私設定",
"UseAnonymizedIpForVisitEnrichment": "彙整訪問紀錄時也將 IP 匿名化。",
"UseAnonymizedIpForVisitEnrichmentNote": "像是 Geo Location via IP and Provider 之類的外掛改善訪客的中繼資料。這些外掛預設使用匿名化的 IP 位址。如果你選擇「否」將會以原始的完整 IP 位址取代,結果呈現較無隱私但數據準確度更高。",
"PseudonymizeUserIdNote": "當你啟用此選項,使用者 ID 將會被一組假名所取代來避免直接儲存或顯示個人可辨識的資訊像是 Email。在技術方面給予你的使用者 IDMatomo 將會使用加鹽的雜湊函數來處理使用者 ID 假名。",
"PseudonymizeUserIdNote2": "注意:以假名取代不等於匿名化。在 GDPR 的條款中:使用者 ID 假名依舊認定為個人資料。如果某些附加資訊可用,原始的使用者 ID 依舊可以被辨識(只有 Matomo 和你的資料處理器可存取)。",
"AnonymizeOrderIdNote": "因為訂單 ID 可以與其他系統交叉使用,一般是電子商務網站,訂單 ID 可能在 GDPR 中會被認定為個人資料。當你啟用這個選項,訂單 ID 將會自動被匿名化,所以不會記錄任何個人資訊。",
"UseAnonymizeIp": "訪客 IP 匿名化",
"UseAnonymizeTrackingData": "追蹤資料匿名化",
"UseAnonymizeUserId": "使用者 ID 匿名化",
"PseudonymizeUserId": "以假名取代使用者 ID",
"UseAnonymizeOrderId": "訂單 ID 匿名化",
"UseDeleteReports": "定時從資料庫中移除舊的報表",
"UsersOptOut": "使用者選擇退出"
}
}

View File

@ -0,0 +1,13 @@
#footerLinks {
text-align: center;
font-size: .7rem;
color: @color-silver;
a {
color: @color-silver;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}

View File

@ -0,0 +1,12 @@
.manageGdpr .intro, .privacyAskingForConsent, .gdprOverview {
ol,ul {
margin-left: 20px;
li {
list-style-type: decimal !important;
}
}
ul li {
list-style-type: disc !important;
}
}

View File

@ -0,0 +1,105 @@
{% extends 'admin.twig' %}
{% set title %}{{ 'PrivacyManager_GDPR'|translate }}{% endset %}
{% block content %}
<div piwik-content-intro>
<h2>Asking for consent</h2>
<p>Consent means offering individuals choice and control about how their personal data is processed.</p>
</div>
<div piwik-content-block content-title="When do I need to ask for user consent?" class="privacyAskingForConsent">
<p>
In the context of the GDPR privacy regulations, when you are processing personal data, in some cases you will need to ask for your users' consent. To identify whether you need to ask for consent, you need to determine whether your lawful basis for processing personal data is "Consent" or "Legitimate interest", or whether you can avoid collecting personal data altogether. We recommend to learn more about the lawful basis under the GDPR for Matomo.
<br /><br />
Note that when you require to have your users' consents and if you cannot prove that you got the "Consent" of your users in the past, then we recommend to <a href="{{ linkTo({module: 'PrivacyManager', action: 'privacySettings'}) }}">anonymise your previously tracked users' raw data</a>.
</p>
</div>
<div piwik-content-block content-title="How do I ask users for consent?" class="privacyAskingForConsent">
<p>
Follow the steps below to ask your user for their consents before their data is processed within Matomo.
</p>
<h3>Step 1: require consent</h3>
<p>
To require consent, insert the following line at top of your existing Matomo Tracking code on all your pages:
</p>
<pre piwik-select-on-focus><code>// require user consent before processing data
_paq.push(['requireConsent']);
_paq.push([trackPageview']);
[...]</code></pre>
<p>
Once this function requireConsent' is executed then no tracking request will be sent to Matomo. Note that some <a href="https://matomo.org/faq/general/faq_146/" target="_blank" rel="noreferrer noopener">tracking cookies</a> will be set during this page view but will be deleted as soon as the user navigates to a different page or closes the browser.
</p>
<h3>Step 2: asking for consent through your privacy notice</h3>
<p>Now you can ask the user for consent for example by displaying a clear privacy notice on your pages. Learn more about privacy notices and asking for user consent. Note that Matomo does not yet offer the feature to display a privacy notice, but may implement such a feature in the future to easily let you display the notice and gather user consent.
</p>
<h3>Step 3: user gives consent</h3>
<p>
Once a user gives consent, you can either A) let Matomo remember the consent, or B) use your own consent tool to remember the consent. We present the two solutions below:
<br /><br />
<strong>A) if you want to let Matomo remember the consent</strong>
<br />
Once a user gives their consent, you can let Matomo remember that the user has given consent by simply calling the following method once the user has given her or his consent:
</p>
<pre piwik-select-on-focus><code>_paq.push(['rememberConsentGiven'])</code></pre>
<p>
Matomo will then remember on subsequent requests that the user has given her or his consent by setting a cookie named "consent". As long as this cookie exists, Matomo will know that consent has been given and will automatically process the data. This means that you only need to call <code piwik-select-on-focus>_paq.push(['rememberConsentGiven'])</code> once, and it is not needed to call <code piwik-select-on-focus>_paq.push(['setConsentGiven'])</code> on any page view.
<br /><br />
Notes:
</p>
<ol>
<li>By default, the cookie and consent will be remembered forever. It is possible to define an optional expiry period for your user consent by calling:
<br /><code piwik-select-on-focus>_paq.push(['rememberConsentGiven', optionallyExpireConsentInHours])</code>.</li>
<li>When you're tracking multiple sub-domains into the same website in Matomo, you want to ensure that when you ask for Consent, the user gives consent for all the sub-domains on which you are collecting data. If the user only gives consent for a particular domain or sub-domain(s), you may need to restrict or widen the scope of the consent cookie domain and path by using 'setCookieDomain' and setCookiePath' (learn more in the JavaScript tracking guide). </li>
<li>It is required that you do not disable cookies.</li>
</ol>
<p>
<br />
<br />
<strong>B) if you use your own consent tool to remember the consent</strong>
<br />
In some cases, you record the information that the user has given consent to be tracked directly in your own system or CMS (for example when you use your own a cookie to remember user consent). Once you have the consent by the user to process their data, you need to call the 'setConsentGiven' method:
</p>
<pre piwik-select-on-focus><code>// require user consent before processing data
_paq.push(['requireConsent']);
_paq.push([trackPageview']);
[...]
// user has given consent to process their data
_paq.push(['setConsentGiven']);</code></pre>
<p>
This lets the JavaScript tracker know that the user has given consent and ensures the tracking is working as expected. This function needs to be called anytime after <code piwik-select-on-focus>_paq.push(['requireConsent'])</code>.
<br />
<br />
Notes:
</p>
<ol>
<li>when you call <code piwik-select-on-focus>_paq.push(['setConsentGiven'])</code>, Matomo will not remember on subsequent requests that this user has given consent: it is important that you call setConsentGiven on every page.</li>
<li>when the user has given consent, you could also avoid calling <code piwik-select-on-focus>_paq.push(['requireConsent'])</code> in the first place. </li>
</ol>
<h3>Step 4: user removes consent</h3>
<p>
In order to remove his consent the user needs to perform a specific action, for example: clicking on a button "I do not want to be tracked anymore".
<br /><br />
<strong>A) if you want to let Matomo remember the consent</strong>
<br />
When the user has expressed she or he no longer gives consent, you need to call the following method once:
</p>
<pre piwik-select-on-focus><code> _paq.push(['forgetConsentGiven']);</code></pre>
<p>This makes sure the cookie that remembered the given consent is deleted.
<br />
<br />
<strong>B) if you use your own consent tool to remember the consent</strong><br />
When the user has expressed she or he no longer gives consent, you shall not call the following method anymore:
<br />
</p>
<pre piwik-select-on-focus><code>// do not call this once user has removed their consent
_paq.push(['setConsentGiven']);</code></pre>
</div>
{% endblock %}

View File

@ -0,0 +1,5 @@
<div id="footerLinks">
{% if privacyPolicyUrl|default('') is not empty %}<a target="_blank" rel="noreferrer noopener" href="{{ privacyPolicyUrl|safelink|e('html_attr') }}">{{ 'PrivacyManager_PrivacyPolicy'|translate }}</a>{% endif %}
{% if privacyPolicyUrl|default('') is not empty and termsAndCondition|default('') is not empty %}|{% endif %}
{% if termsAndCondition|default('') is not empty %}<a target="_blank" rel="noreferrer noopener" href="{{ termsAndCondition|safelink|e('html_attr') }}">{{ 'PrivacyManager_TermsAndConditions'|translate }}</a>{% endif %}
</div>

View File

@ -0,0 +1,80 @@
{% extends 'admin.twig' %}
{% set title %}{{ 'PrivacyManager_GDPR'|translate }}{% endset %}
{% block content %}
<div class="gdprOverview">
<div piwik-content-intro>
<h2>GDPR overview</h2>
<p>
The General Data Protection Regulation (GDPR) is a regulation which strengthens and unifies data protection for all individuals within the European Union (EU).
<br /><br />
If you take steps to ensure no personal data is collected in Matomo, then you may not be concerned by the GDPR for Matomo (if you track no IP addresses, no user IDs, no geolocation data, etc.).
</p>
</div>
{{ postEvent('Template.afterGDPROverviewIntro') }}
<div piwik-content-block content-title="GDPR checklists">
<p>If you are processing personal data of European citizens through Matomo, even if your company is located outside Europe, you need to fulfill GDPR obligations and this guide will help you.
<br /><br />
Find below our tools that let you exercise your users rights easily, and the list of actions to take in order to make your use of Matomo compliant with the GDPR and safeguard your data. Visit our <a rel="noreferrer noopener" target="_blank" href="https://matomo.org/docs/gdpr">GDPR User guide</a> to learn even more.</p>
</div>
<div piwik-content-block content-title="Individuals' rights">
<p>Exercise the rights of your users with our GDPR-friendly procedures:
</p>
<ol>
<li>The right to be informed: inform your users with a clear privacy notice.</li>
<li>The right of access: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and export all of their data.</li>
<li>The right to erasure: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and delete some or all of their data.</li>
<li>The right to rectification: you can <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and delete some or all of their data.</li>
<li>The right to data portability: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and export all of their data.</li>
<li>The right to object: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'usersOptOut'}) }}">let your users easily opt-out</a> on your privacy policy page.</li>
<li>If you offer online services to children and rely on consent to collect information about them, then you may need a parent or guardians consent in order to process the childrens personal data lawfully.</li>
</ol>
</div>
<div piwik-content-block content-title="Awareness & documentation">
<p>Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:</p>
<ol>
<li>Inform your visitors through a clear privacy notice whenever youre collecting personal data.</li>
<li>Inform your users in your privacy policy about what data you collect and how the data is used.</li>
<li>Make your team aware that you are using Matomo Analytics and <a target="_blank" rel="noreferrer noopener" href="https://matomo.org/faq/general/faq_18254/">what data is being collected by your analytics platform</a>.</li>
<li>Document your use of Matomo within your <a href="https://matomo.org/blog/2018/04/gdpr-how-to-fill-in-the-information-asset-register-when-using-matomo/" target="_blank" rel="noreferrer noopener">information asset register</a>.</li>
</ol>
</div>
<div piwik-content-block content-title="Security procedures">
<p>Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:</p>
<ol>
<li>Apply our <a href="https://matomo.org/docs/security/" target="_blank" rel="noreferrer noopener">security recommendations</a> in order to keep your Matomo data safe.</li>
<li>Check that you have a written contract with the company providing you the Matomo server or hosting which ensures <a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/international-transfers/" target="_blank" rel="noreferrer noopener">appropriate safeguards are provided</a>.</li>
<li>Include Matomo in your <a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/personal-data-breaches/" target="_blank" rel="noreferrer noopener">data breach procedure</a>.</li>
<li>Include Matomo in your <a href="https://www.cnil.fr/en/guidelines-dpia" target="_blank" rel="noreferrer noopener">data privacy impact assessment (DPIA)</a>, if applicable.</li>
</ol>
</div>
<div piwik-content-block content-title="Data retention">
<p>
Data retention for data stored in Matomo:
</p>
<ul>
{% if deleteLogsEnable %}
<li>all visits and actions raw data are deleted after <strong>{{ rawDataRetention }}</strong>.</li>
{% else %}
<li>visits and actions raw data are <strong>never</strong> deleted.</li>
{% endif %}
{% if deleteReportsEnable %}
<li>all aggregated reports are deleted after <strong>{{ reportRetention }}</strong>.</li>
{% else %}
<li>aggregated reports are <strong>never</strong> deleted.</li>
{% endif %}
</ul>
<p>
<br />
The overall data retention rate for your privacy policy is the raw data retention rate. Please note that aggregated reports may contain personal data as well. If you are using features like User ID, Custom Variables, Custom Dimension, or track personal data in other ways such as events, page URLs or page titles, etc, then the overall data retention rate for your privacy policy is the higher of the two.
</p>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,7 @@
{% extends 'admin.twig' %}
{% set title %}{{ 'PrivacyManager_GDPR'|translate }}{% endset %}
{% block content %}
<div matomo-manage-gdpr></div>
{% endblock %}

View File

@ -0,0 +1,7 @@
<p>{{ 'PrivacyManager_CurrentDBSize'|translate }}: {{ dbStats.currentSize }}</p>
{% if dbStats.sizeAfterPurge is defined %}
<p>{{ 'PrivacyManager_EstimatedDBSizeAfterPurge'|translate }}: <strong>{{ dbStats.sizeAfterPurge }}</strong></p>
{% endif %}
{% if dbStats.spaceSaved is defined %}
<p>{{ 'PrivacyManager_EstimatedSpaceSaved'|translate }}: {{ dbStats.spaceSaved }}</p>
{% endif %}

View File

@ -0,0 +1,341 @@
{% extends 'admin.twig' %}
{% set title %}{{ 'PrivacyManager_AnonymizeData'|translate }}{% endset %}
{% block content %}
{% import 'macros.twig' as piwik %}
<div piwik-content-intro>
<h2 piwik-enriched-headline help-url="https://matomo.org/docs/privacy/">{{ title }}</h2>
<p>{{ 'PrivacyManager_TeaserHeader'|translate('<a href="#anonymizeIPAnchor">',"</a>",'<a href="#deleteLogsAnchor">',"</a>",'<a href="#anonymizeHistoricalData">',"</a>")|raw }}
{{'PrivacyManager_SeeAlsoOurOfficialGuidePrivacy'|translate('<a href="https://matomo.org/privacy/" rel="noreferrer noopener" target="_blank">','</a>')|raw }}</p>
</div>
<div piwik-content-block
id="anonymizeIPAnchor"
content-title="{{ 'PrivacyManager_UseAnonymizeTrackingData'|translate|e('html_attr') }}">
<div piwik-form ng-controller="AnonymizeIpController as anonymizeIp">
<div piwik-field uicontrol="checkbox" name="anonymizeIpSettings"
ng-model="anonymizeIp.enabled"
title="{{ 'PrivacyManager_UseAnonymizeIp'|translate|e('html_attr') }}"
value="{{ anonymizeIP.enabled }}"
inline-help="{{ 'PrivacyManager_AnonymizeIpInlineHelp'|translate|e('html_attr') }} {{ 'PrivacyManager_AnonymizeIpDescription'|translate|e('html_attr') }}">
</div>
<div ng-show="anonymizeIp.enabled">
<div piwik-field uicontrol="radio" name="maskLength"
ng-model="anonymizeIp.maskLength"
title="{{ 'PrivacyManager_AnonymizeIpMaskLengtDescription'|translate|e('html_attr') }}"
value="{{ anonymizeIP.maskLength }}"
options="{{ maskLengthOptions|json_encode }}"
inline-help="{{ 'PrivacyManager_GeolocationAnonymizeIpNote'|translate|e('html_attr') }}">
</div>
<div piwik-field uicontrol="radio" name="useAnonymizedIpForVisitEnrichment"
ng-model="anonymizeIp.useAnonymizedIpForVisitEnrichment"
title="{{ 'PrivacyManager_UseAnonymizedIpForVisitEnrichment'|translate|e('html_attr') }}"
value="{% if anonymizeIP.useAnonymizedIpForVisitEnrichment %}1{% else %}0{% endif %}"
options="{{ useAnonymizedIpForVisitEnrichmentOptions|json_encode }}"
inline-help="{{ 'PrivacyManager_UseAnonymizedIpForVisitEnrichmentNote'|translate|e('html_attr') }}">
</div>
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeUserId"
ng-model="anonymizeIp.anonymizeUserId"
title="{{ 'PrivacyManager_PseudonymizeUserId'|translate|e('html_attr') }}"
value="{{ anonymizeIP.anonymizeUserId }}"
inline-help="{{ 'PrivacyManager_PseudonymizeUserIdNote'|translate|e('html_attr') }}<br/><br/><em>{{ 'PrivacyManager_PseudonymizeUserIdNote2'|translate|e('html_attr') }}</em>">
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeOrderId"
ng-model="anonymizeIp.anonymizeOrderId"
title="{{ 'PrivacyManager_UseAnonymizeOrderId'|translate|e('html_attr') }}"
value="{{ anonymizeIP.anonymizeOrderId }}"
inline-help="{{ 'PrivacyManager_AnonymizeOrderIdNote'|translate|e('html_attr') }}">
</div>
<div piwik-save-button onconfirm="anonymizeIp.save()" saving="anonymizeIp.isLoading"></div>
</div>
</div>
{% if isDataPurgeSettingsEnabled %}
<div piwik-content-block id="deleteLogsAnchor"
content-title="{{ 'PrivacyManager_DeleteOldRawData'|translate|e('html_attr') }}">
<div class="ui-confirm" id="confirmDeleteSettings">
<h2 id="deleteLogsConfirm">{{ 'PrivacyManager_DeleteLogsConfirm'|translate }}</h2>
<h2 id="deleteReportsConfirm">{{ 'PrivacyManager_DeleteReportsConfirm'|translate }}</h2>
<h2 id="deleteBothConfirm">{{ 'PrivacyManager_DeleteBothConfirm'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
<div class="ui-confirm" id="saveSettingsBeforePurge">
<h2>{{ 'PrivacyManager_SaveSettingsBeforePurge'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/>
</div>
<div class="ui-confirm" id="confirmPurgeNow">
<h2>{{ 'PrivacyManager_PurgeNowConfirm'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
<p>{{ 'PrivacyManager_DeleteDataDescription'|translate }}</p>
<div piwik-form
ng-controller="DeleteOldLogsController as deleteOldLogs"
id="formDeleteSettings">
<div id="deleteLogSettingEnabled">
<div piwik-field uicontrol="checkbox" name="deleteEnable"
ng-model="deleteOldLogs.enabled"
ng-change="deleteOldLogs.reloadDbStats()"
title="{{ 'PrivacyManager_UseDeleteLog'|translate|e('html_attr') }}"
value="{{ deleteData.config.delete_logs_enable }}"
inline-help="{{ 'PrivacyManager_DeleteRawDataInfo'|translate|e('html_attr') }}">
</div>
<div class="alert alert-warning deleteOldLogsWarning" style="width: 50%;" ng-show="deleteOldLogs.enabled">
<a href="https://matomo.org/faq/general/#faq_125" rel="noreferrer noopener" target="_blank">
{{ 'General_ClickHere'|translate }}
</a>
</div>
</div>
<div id="deleteLogSettings" ng-show="deleteOldLogs.enabled">
<div piwik-field uicontrol="text" name="deleteOlderThan"
ng-model="deleteOldLogs.deleteOlderThan"
ng-change="deleteOldLogs.reloadDbStats()"
title="{{ 'PrivacyManager_DeleteLogsOlderThan'|translate|e('html_attr') }} ({{ 'Intl_PeriodDays'|translate }})"
value="{{ deleteData.config.delete_logs_older_than }}"
inline-help="{{ 'PrivacyManager_LeastDaysInput'|translate("1")|e('html_attr') }}">
</div>
</div>
<div piwik-save-button onconfirm="deleteOldLogs.save()" saving="deleteOldLogs.isLoading"></div>
</div>
</div>
<div piwik-content-block id="deleteReportsAnchor"
content-title="{{ 'PrivacyManager_DeleteOldAggregatedReports'|translate|e('html_attr') }}">
<div piwik-form
ng-controller="DeleteOldReportsController as deleteReports"
id="formDeleteSettings">
<div id="deleteReportsSettingEnabled">
<div piwik-field uicontrol="checkbox" name="deleteReportsEnable"
ng-model="deleteReports.enabled"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'PrivacyManager_UseDeleteReports'|translate|e('html_attr') }}"
value="{{ deleteData.config.delete_reports_enable }}"
inline-help="{{ 'PrivacyManager_DeleteAggregateReportsDetailedInfo'|translate|e('html_attr') }}">
</div>
<div class="alert alert-warning" style="width: 50%;" ng-show="deleteReports.enabled">
{% set deleteOldLogs %}{{ 'PrivacyManager_UseDeleteLog'|translate }}{% endset %}
<span>
{{ 'PrivacyManager_DeleteReportsInfo2'|translate(deleteOldLogs) }}<br/><br/>
{{ 'PrivacyManager_DeleteReportsInfo3'|translate(deleteOldLogs) }}
</span>
</div>
</div>
<div id="deleteReportsSettings" ng-show="deleteReports.enabled">
<div piwik-field uicontrol="text" name="deleteReportsOlderThan"
ng-model="deleteReports.deleteOlderThan"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'PrivacyManager_DeleteReportsOlderThan'|translate|e('html_attr') }} ({{ 'Intl_PeriodMonths'|translate }})"
value="{{ deleteData.config.delete_reports_older_than }}"
inline-help="{{ 'PrivacyManager_LeastMonthsInput'|translate("1")|e('html_attr') }}">
</div>
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepBasic"
ng-model="deleteReports.keepBasic"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'PrivacyManager_KeepBasicMetrics'|translate|e('html_attr') }} ({{ 'General_Recommended'|translate|e('html_attr') }})"
value="{{ deleteData.config.delete_reports_keep_basic_metrics }}"
inline-help="{{ 'PrivacyManager_KeepBasicMetricsReportsDetailedInfo'|translate|e('html_attr') }}">
</div>
<h3>
{{ 'PrivacyManager_KeepDataFor'|translate }}
</h3>
<div>
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepDay"
ng-model="deleteReports.keepDataForDay"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'General_DailyReports'|translate|e('html_attr') }}"
value="{{ deleteData.config.delete_reports_keep_day_reports }}">
</div>
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepWeek"
ng-model="deleteReports.keepDataForWeek"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'General_WeeklyReports'|translate|e('html_attr') }}"
value="{{ deleteData.config.delete_reports_keep_week_reports }}">
</div>
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepMonth"
ng-model="deleteReports.keepDataForMonth"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'General_MonthlyReports'|translate|e('html_attr') }} ({{ 'General_Recommended'|translate|e('html_attr') }})"
value="{{ deleteData.config.delete_reports_keep_month_reports }}">
</div>
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepYear"
ng-model="deleteReports.keepDataForYear"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'General_YearlyReports'|translate|e('html_attr') }} ({{ 'General_Recommended'|translate|e('html_attr') }})"
value="{{ deleteData.config.delete_reports_keep_year_reports }}">
</div>
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepRange"
ng-model="deleteReports.keepDataForRange"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'General_RangeReports'|translate|e('html_attr') }}"
value="{{ deleteData.config.delete_reports_keep_range_reports }}">
</div>
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepSegments"
ng-model="deleteReports.keepDataForSegments"
ng-change="deleteReports.reloadDbStats()"
title="{{ 'PrivacyManager_KeepReportSegments'|translate|e('html_attr') }}"
value="{{ deleteData.config.delete_reports_keep_segment_reports }}">
</div>
</div>
</div>
<div piwik-save-button onconfirm="deleteReports.save()" saving="deleteReports.isLoading"></div>
</div>
</div>
<div piwik-form
ng-controller="ScheduleReportDeletionController as reportDeletionSchedule"
id="formDeleteSettings">
<div piwik-content-block id="scheduleSettingsHeadline"
ng-show="reportDeletionSchedule.model.isEitherDeleteSectionEnabled()"
content-title="{{ 'PrivacyManager_DeleteSchedulingSettings'|translate|e('html_attr') }}">
<div id="deleteSchedulingSettings">
<div id="deleteSchedulingSettingsInlineHelp" class="inline-help-node">
{% if deleteData.lastRun %}<strong>{{ 'PrivacyManager_LastDelete'|translate }}:</strong>
{{ deleteData.lastRunPretty }}
<br/>
<br/>
{% endif %}
<strong>{{ 'PrivacyManager_NextDelete'|translate }}:</strong>
{{ deleteData.nextRunPretty|rawSafeDecoded }}
<br/>
<br/>
<a id="purgeDataNowLink" href="#"
ng-show="reportDeletionSchedule.showPurgeNowLink"
ng-click="reportDeletionSchedule.executeDataPurgeNow()">{{ 'PrivacyManager_PurgeNow'|translate }}</a>
<div piwik-activity-indicator
loading-message="'{{ 'PrivacyManager_PurgingData'|translate|e('html_attr') }}'"
loading="reportDeletionSchedule.loadingDataPurge"></div>
<span id="db-purged-message"
ng-show="reportDeletionSchedule.dataWasPurged"
>{{ 'PrivacyManager_DBPurged'|translate }}</span>
</div>
<div piwik-field uicontrol="select" name="deleteLowestInterval"
ng-model="reportDeletionSchedule.deleteLowestInterval"
options="{{ scheduleDeletionOptions|json_encode }}"
title="{{ 'PrivacyManager_DeleteDataInterval'|translate|e('html_attr') }}"
value="{{ deleteData.config.delete_logs_schedule_lowest_interval }}"
inline-help="#deleteSchedulingSettingsInlineHelp">
</div>
</div>
{% if deleteData.config.enable_database_size_estimate == '1' %}
<div id="deleteDataEstimateSect" class="form-group row">
<h3 class="col s12" id="databaseSizeHeadline">
{{ 'PrivacyManager_ReportsDataSavedEstimate'|translate }}
</h3>
<div class="col s12 m6">
<div id="deleteDataEstimate" ng-show="reportDeletionSchedule.model.showEstimate"
ng-bind-html="reportDeletionSchedule.model.estimation"></div>
&nbsp;
<div piwik-activity-indicator loading="reportDeletionSchedule.model.loadingEstimation"></div>
</div>
<div class="col s12 m6">
{% if deleteData.config.enable_auto_database_size_estimate == '0' %}
<div class="form-help">
<a id="getPurgeEstimateLink"
ng-click="reportDeletionSchedule.model.reloadDbStats(true)"
href="#">{{ 'PrivacyManager_GetPurgeEstimate'|translate }}</a>
</div>
{% endif %}
</div>
</div>
{% endif %}
<div piwik-save-button onconfirm="reportDeletionSchedule.save()" saving="reportDeletionSchedule.isLoading"></div>
</div>
{% endif %}
</div>
<a name="anonymizeHistoricalData" id="anonymizeHistoricalData"></a>
<div piwik-content-block content-title="Anonymize previously tracked raw data" class="logDataAnonymizer">
<p>If you have tracked personal data such as the full visitor IP, you may
want to anonymize this data now in case you do not have consent for this data or no longer a legitimate
interest.
</p>
{% if isSuperUser %}
<div matomo-anonymize-log-data></div>
{% else %}
<p>Only a user with Super User access can anonymize previously tracked raw data.</p>
{% endif %}
<br />
<h3>Previous raw data anonymizations</h3>
<table piwik-content-table>
<thead>
<tr>
<th>Requester</th>
<th>Affected ID Sites</th>
<th>Affected date</th>
<th>Anonymize</th>
<th>Visit Columns</th>
<th>Link Visit Action Columns</th>
<th>Status</th>
</tr></thead>
<tbody>
{% for entry in anonymizations %}
{% set isStarted = entry.job_start_date or not entry.job_start_date is empty %}
{% set isFinished = entry.job_finish_date or not entry.job_finish_date is empty %}
<tr>
<td>{{ entry.requester }}</td>
<td>{{ entry.sites|join(', ') }}</td>
<td>{{ entry.date_start }} - {{ entry.date_end }}</td>
<td>{% if entry.anonymize_ip %}<span>IP address<br /></span>{% endif %}
{% if entry.anonymize_location %}<span>Location<br /></span>{% endif %}
{% if entry.anonymize_userid %}<span>User ID</span>{% endif %}
{% if not entry.anonymize_ip and not entry.anonymize_location and not entry.anonymize_userid %}-{% endif %}
</td>
<td>{{ entry.unset_visit_columns|join(', ') }}</td>
<td>{{ entry.unset_link_visit_action_columns|join(', ') }}</td>
<td>
{% if not isStarted %}
<span class="icon-info" style="cursor: help;" title="Scheduled date: {{ entry.scheduled_date|default('') }}."></span> Scheduled
{% elseif isStarted and not isFinished %}
<span class="icon-info" style="cursor: help;" title="Scheduled date: {{ entry.scheduled_date|default('') }}. Job Start Date: {{ entry.job_start_date }}. Current Output: {{ entry.output }}"></span> In progress
{% else %}
<span class="icon-info" style="cursor: help;" title="Scheduled date: {{ entry.scheduled_date|default('') }}. Job Start Date: {{ entry.job_start_date }}. Job Finish Date: {{ entry.job_finish_date }}. Output: {{ entry.output }}"></span> Done
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

View File

@ -0,0 +1,42 @@
{% extends 'admin.twig' %}
{% set title %}{{ 'PrivacyManager_GDPR'|translate }}{% endset %}
{% block content %}
<div piwik-content-block content-title="Let users opt-out of tracking">
<div piwik-opt-out-customizer piwikurl="{{ piwikUrl }}" language="{{ language }}">
</div>
</div>
{% if isSuperUser %}
<div piwik-content-block
id="DNT"
content-title="{{ 'PrivacyManager_DoNotTrack_SupportDNTPreference'|translate|e('html_attr') }}">
<p>
{% if dntSupport %}
<strong>{{ 'PrivacyManager_DoNotTrack_Enabled'|translate }}</strong>
<br/>
{{ 'PrivacyManager_DoNotTrack_EnabledMoreInfo'|translate }}
{% else %}
{{ 'PrivacyManager_DoNotTrack_Disabled'|translate }} {{ 'PrivacyManager_DoNotTrack_DisabledMoreInfo'|translate }}
{% endif %}
</p>
<div piwik-form ng-controller="DoNotTrackPreferenceController as doNotTrack">
{# {{ {'module':'PrivacyManager','nonce':nonce,'action':action} | urlRewriteWithParameters }}#DNT #}
<div piwik-field uicontrol="radio" name="doNotTrack"
ng-model="doNotTrack.enabled"
options="{{ doNotTrackOptions|json_encode }}"
value="{% if dntSupport %}1{% else %}0{% endif %}"
inline-help="{{ 'PrivacyManager_DoNotTrack_Description'|translate|e('html_attr') }}">
</div>
<div piwik-save-button onconfirm="doNotTrack.save()" saving="doNotTrack.isLoading"></div>
</div>
</div>
{% endif %}
{% endblock %}