Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Giehl <stefan@matomo.org>2020-02-26 01:06:13 +0300
committerGitHub <noreply@github.com>2020-02-26 01:06:13 +0300
commit63ec85e4676d8aebadee4275bcb52ef1153fe2a6 (patch)
tree574b6a06bd05989722ca3cd7e379bb4c36a87208 /plugins
parentbaa4c285d80073365d5a12569df238fba5b9a1ab (diff)
Makes remaining GDPR pages fully translatable (#15582)
* Makes GDPRoverview translatable * Makes optout configuration page fully translatable * Makes anonymize log data directive translatable * Makes gdpr tools directive translatable * fixes & test updates
Diffstat (limited to 'plugins')
-rw-r--r--plugins/PrivacyManager/PrivacyManager.php54
-rw-r--r--plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html42
-rw-r--r--plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html65
-rw-r--r--plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html14
-rw-r--r--plugins/PrivacyManager/lang/en.json80
-rw-r--r--plugins/PrivacyManager/templates/gdprOverview.twig70
-rw-r--r--plugins/PrivacyManager/templates/usersOptOut.twig2
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png4
15 files changed, 241 insertions, 118 deletions
diff --git a/plugins/PrivacyManager/PrivacyManager.php b/plugins/PrivacyManager/PrivacyManager.php
index c77023c5c3..2d57805a1b 100644
--- a/plugins/PrivacyManager/PrivacyManager.php
+++ b/plugins/PrivacyManager/PrivacyManager.php
@@ -194,9 +194,63 @@ class PrivacyManager extends Plugin
public function getClientSideTranslationKeys(&$translationKeys)
{
+ $translationKeys[] = 'General_Visit';
+ $translationKeys[] = 'General_Action';
+ $translationKeys[] = 'General_Details';
+ $translationKeys[] = 'General_VisitId';
+ $translationKeys[] = 'General_VisitorID';
+ $translationKeys[] = 'General_VisitorIP';
+ $translationKeys[] = 'General_UserId';
+ $translationKeys[] = 'General_Website';
+ $translationKeys[] = 'Live_ViewVisitorProfile';
$translationKeys[] = 'CoreAdminHome_SettingsSaveSuccess';
$translationKeys[] = 'CoreAdminHome_OptOutExplanation';
$translationKeys[] = 'CoreAdminHome_OptOutExplanationIntro';
+ $translationKeys[] = 'PrivacyManager_OptOutCustomize';
+ $translationKeys[] = 'PrivacyManager_FontColor';
+ $translationKeys[] = 'PrivacyManager_BackgroundColor';
+ $translationKeys[] = 'PrivacyManager_FontSize';
+ $translationKeys[] = 'PrivacyManager_FontFamily';
+ $translationKeys[] = 'PrivacyManager_OptOutHtmlCode';
+ $translationKeys[] = 'PrivacyManager_OptOutPreview';
+ $translationKeys[] = 'PrivacyManager_AnonymizeSites';
+ $translationKeys[] = 'PrivacyManager_AnonymizeRowDataFrom';
+ $translationKeys[] = 'PrivacyManager_AnonymizeRowDataTo';
+ $translationKeys[] = 'PrivacyManager_AnonymizeIp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeIpHelp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeLocation';
+ $translationKeys[] = 'PrivacyManager_AnonymizeLocationHelp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeUserId';
+ $translationKeys[] = 'PrivacyManager_AnonymizeUserIdHelp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeProcessInfo';
+ $translationKeys[] = 'PrivacyManager_AnonymizeDataNow';
+ $translationKeys[] = 'PrivacyManager_AnonymizeDataConfirm';
+ $translationKeys[] = 'PrivacyManager_UnsetVisitColumns';
+ $translationKeys[] = 'PrivacyManager_UnsetVisitColumnsHelp';
+ $translationKeys[] = 'PrivacyManager_UnsetActionColumns';
+ $translationKeys[] = 'PrivacyManager_UnsetActionColumnsHelp';
+ $translationKeys[] = 'PrivacyManager_SearchForDataSubject';
+ $translationKeys[] = 'PrivacyManager_FindDataSubjectsBy';
+ $translationKeys[] = 'PrivacyManager_NoDataSubjectsFound';
+ $translationKeys[] = 'PrivacyManager_DeleteVisitsConfirm';
+ $translationKeys[] = 'PrivacyManager_ResultTruncated';
+ $translationKeys[] = 'PrivacyManager_AddVisitorIdToSearch';
+ $translationKeys[] = 'PrivacyManager_AddVisitorIPToSearch';
+ $translationKeys[] = 'PrivacyManager_AddUserIdToSearch';
+ $translationKeys[] = 'PrivacyManager_ExportSelectedVisits';
+ $translationKeys[] = 'PrivacyManager_DeleteSelectedVisits';
+ $translationKeys[] = 'PrivacyManager_SelectWebsite';
+ $translationKeys[] = 'PrivacyManager_MatchingDataSubjects';
+ $translationKeys[] = 'PrivacyManager_VisitsMatchedCriteria';
+ $translationKeys[] = 'PrivacyManager_ExportingNote';
+ $translationKeys[] = 'PrivacyManager_DeletionFromMatomoOnly';
+ $translationKeys[] = 'PrivacyManager_ResultIncludesAllVisits';
+ $translationKeys[] = 'PrivacyManager_GdprTools';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntro1';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntro2';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntroAccessRight';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntroEraseRight';
+ $translationKeys[] = 'PrivacyManager_GdprToolsOverviewHint';
}
public function setTrackerCacheGeneral(&$cacheContent)
diff --git a/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html b/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html
index 37062f5d23..00b699fd85 100644
--- a/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html
+++ b/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html
@@ -3,7 +3,7 @@
<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>
+ <label for="anonymizeSite" class="siteSelectorLabel">{{ 'PrivacyManager_AnonymizeSites'|translate }}</label>
<div piwik-siteselector
class="sites_autocomplete"
ng-model="anonymizeLogData.site"
@@ -18,7 +18,7 @@
<div class="form-group row">
<div class="col s6 input-field">
<div>
- <label for="anonymizeStartDate" class="active">Anonymize all raw data starting from:</label>
+ <label for="anonymizeStartDate" class="active">{{ 'PrivacyManager_AnonymizeRowDataFrom'|translate }}</label>
<input type="text" ng-model="anonymizeLogData.start_date"
class="anonymizeStartDate"
name="anonymizeStartDate">
@@ -26,7 +26,7 @@
</div>
<div class="col s6 input-field">
<div>
- <label for="anonymizeEndDate" class="active">Anonymize all raw data up to:</label>
+ <label for="anonymizeEndDate" class="active">{{ 'PrivacyManager_AnonymizeRowDataTo'|translate }}</label>
<input type="text" ng-model="anonymizeLogData.end_date"
class="anonymizeEndDate"
name="anonymizeEndDate">
@@ -35,28 +35,28 @@
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeIp"
- data-title="Anonymize IP"
+ data-title="{{ 'PrivacyManager_AnonymizeIp'|translate }}"
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.">
+ introduction="{{ 'General_Visit'|translate }}"
+ inline-help="{{ 'PrivacyManager_AnonymizeIpHelp'|translate }}">
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeLocation"
- data-title="Anonymize Location"
+ data-title="{{ 'PrivacyManager_AnonymizeLocation'|translate }}"
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).">
+ inline-help="{{ 'PrivacyManager_AnonymizeLocationHelp'|translate }}">
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeTheUserId"
- data-title="Replace User ID with a pseudonym"
+ data-title="{{ 'PrivacyManager_AnonymizeUserId'|translate }}"
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>">
+ inline-help="{{ 'PrivacyManager_AnonymizeUserIdHelp'|translate }}">
</div>
<div class="form-group row">
<div class="col s12 m6">
<div>
- <label for="visit_columns">Unset visit columns</label>
+ <label for="visit_columns">{{ 'PrivacyManager_UnsetVisitColumns'|translate }}</label>
<div ng-repeat="(index, visitColumn) in anonymizeLogData.selectedVisitColumns"
class="selectedVisitColumns selectedVisitColumns{{ index }} multiple valign-wrapper">
@@ -79,23 +79,19 @@
<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>
+ <span class="inline-help">{{ 'PrivacyManager_UnsetVisitColumnsHelp'|translate }}</span>
</div>
</div>
</div>
<div class="form-group row">
- <div class="col s12"><h3>Action</h3></div>
+ <div class="col s12"><h3>{{ 'General_Action'|translate }}</h3></div>
</div>
<div class="form-group row">
<div class="col s12 m6">
<div>
- <label for="action_columns">Unset action columns</label>
+ <label for="action_columns">{{ 'PrivacyManager_UnsetActionColumns'|translate }}</label>
<div ng-repeat="(index, actionColumn) in anonymizeLogData.selectedActionColumns"
class="selectedActionColumns selectedActionColumns{{ index }} multiple valign-wrapper">
@@ -118,24 +114,22 @@
<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>
+ <span class="inline-help">{{ 'PrivacyManager_UnsetActionColumnsHelp'|translate }}</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>
+ <p><span class="icon-info"></span> {{ 'PrivacyManager_AnonymizeProcessInfo'|translate }}</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">
+ value="{{ 'PrivacyManager_AnonymizeDataNow'|translate }}">
</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>
+ <h2>{{ 'PrivacyManager_AnonymizeDataConfirm'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
diff --git a/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html b/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html
index e9fa7ea347..9d901734cd 100644
--- a/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html
+++ b/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html
@@ -1,24 +1,24 @@
<div class="manageGdpr">
- <div piwik-content-block content-title="GDPR Tools">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_GdprTools'|translate }}">
<div class="intro">
<p>
- This page has been designed in order for you to exercise data subject rights.
+ {{ 'PrivacyManager_GdprToolsPageIntro1'|translate }}
<br /><br />
- Here you can exercise the rights of your users with our GDPR-friendly procedures:
+ {{ 'PrivacyManager_GdprToolsPageIntro2'|translate }}
<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>
+ <li>{{ 'PrivacyManager_GdprToolsPageIntroAccessRight'|translate }}</li>
+ <li>{{ 'PrivacyManager_GdprToolsPageIntroEraseRight'|translate }}</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>
+ <p><br /><span ng-bind-html="'PrivacyManager_GdprToolsOverviewHint'|translate:('<a href=\'' + manageGdpr.linkTo('gdprOverview') + '\'>'):('</a>')"></span></p>
</div>
- <h3>Search for a data subject</h3>
+ <h3>{{ 'PrivacyManager_SearchForDataSubject'|translate }}</h3>
<div class="form-group row">
<div class="col s12 input-field">
<div>
- <label for="gdprsite" class="siteSelectorLabel">Select a website</label>
+ <label for="gdprsite" class="siteSelectorLabel">{{ 'PrivacyManager_SelectWebsite'|translate }}</label>
<div piwik-siteselector
class="sites_autocomplete"
ng-model="manageGdpr.site"
@@ -33,7 +33,7 @@
<div class="form-group row segmentFilterGroup">
<div class="col s12">
<div>
- <label style="margin: 8px 0;display: inline-block;">Find data subjects by</label>
+ <label style="margin: 8px 0;display: inline-block;">{{ 'PrivacyManager_FindDataSubjectsBy'|translate }}</label>
<div piwik-segment-generator
visit-segments-only="1"
idsite="manageGdpr.site.id"
@@ -52,19 +52,17 @@
</div>
<div ng-show="!manageGdpr.dataSubjects.length && manageGdpr.hasSearched">
- <h2>No data subjects found</h2>
+ <h2>{{ 'PrivacyManager_NoDataSubjectsFound'|translate }}</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 />
- 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.
-
+ <h2>{{ 'PrivacyManager_MatchingDataSubjects'|translate }}</h2>
+ <p>{{ 'PrivacyManager_VisitsMatchedCriteria'|translate }}
+ {{ 'PrivacyManager_ExportingNote'|translate }}
+ <br /> <br />
+ {{ 'PrivacyManager_DeletionFromMatomoOnly'|translate }}
<br /><br />
- The found results include all visits without any time restriction and include today.
+ {{ 'PrivacyManager_ResultIncludesAllVisits'|translate }}
</p>
<table piwik-content-table>
<thead>
@@ -75,18 +73,19 @@
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>
+ </th>
+ <th>{{ 'General_Website'|translate }}</th>
+ <th>{{ 'General_VisitId'|translate }}</th>
+ <th>{{ 'General_VisitorID'|translate }}</th>
+ <th>{{ 'General_VisitorIP'|translate }}</th>
+ <th>{{ 'General_UserId'|translate }}</th>
+ <th>{{ 'General_Details'|translate }}</th>
+ <th>{{ 'General_Action'|translate }}</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>
+ <td colspan="8">{{ 'PrivacyManager_ResultTruncated'|translate:('400') }}</td>
</tr>
<tr ng-repeat="(index, dataSubject) in manageGdpr.dataSubjects" title="Last action: {{ dataSubject.lastActionDateTime }}">
<td class="checkInclude">
@@ -97,9 +96,9 @@
</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 class="visitorId"><a ng-click="manageGdpr.addFilter('visitorId', dataSubject.visitorId)" title="{{ 'PrivacyManager_AddVisitorIdToSearch'|translate }}">{{ dataSubject.visitorId }}</a></td>
+ <td class="visitorIp"><a ng-click="manageGdpr.addFilter('visitIp', dataSubject.visitIp)" title="{{ 'PrivacyManager_AddVisitorIPToSearch'|translate }}">{{ dataSubject.visitIp }}</a></td>
+ <td class="userId"><a ng-click="manageGdpr.addFilter('userId', dataSubject.userId)" title="{{ 'PrivacyManager_AddUserIdToSearch'|translate }}">{{ 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>
@@ -107,7 +106,7 @@
<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>
+ <img src="plugins/Live/images/visitorProfileLaunch.png"> <span>{{ 'Live_ViewVisitorProfile'|translate }}</span>
</a></td>
</tr>
</tbody>
@@ -117,18 +116,18 @@
class="exportDataSubjects"
onconfirm="manageGdpr.exportDataSubject()"
data-disabled="!manageGdpr.hasActiveDataSubjects()"
- value="Export selected visits">
+ value="{{ 'PrivacyManager_ExportSelectedVisits'|translate }}">
</div>
<div piwik-save-button
class="deleteDataSubjects"
onconfirm="manageGdpr.deleteDataSubject()"
data-disabled="!manageGdpr.hasActiveDataSubjects() || manageGdpr.isDeleting"
- value="Delete selected visits">
+ value="{{ 'PrivacyManager_DeleteSelectedVisits'|translate }}">
</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>
+ <h2>{{ 'PrivacyManager_DeleteVisitsConfirm'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
diff --git a/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html b/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html
index cc1363d084..1afa765676 100644
--- a/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html
+++ b/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html
@@ -4,21 +4,21 @@
<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>
+ <h3>{{ 'PrivacyManager_OptOutCustomize'|translate }}</h3>
<div>
<p>
<span>
- Font Color:
+ {{ 'PrivacyManager_FontColor'|translate }}:
<input type="color" ng-model="optOutCustomizer.fontColor" ng-change="optOutCustomizer.onUpdate()">
</span>
<span>
- Background Color:
+ {{ 'PrivacyManager_BackgroundColor'|translate }}:
<input type="color" ng-model="optOutCustomizer.backgroundColor" ng-change="optOutCustomizer.onUpdate()">
</span>
<span>
- Font Size:
+ {{ 'PrivacyManager_FontSize'|translate }}:
<input id=FontSizeInput type="number" min="1" max="100" ng-model="optOutCustomizer.fontSize" ng-change="optOutCustomizer.updateFontSize()">
</span>
@@ -33,20 +33,20 @@
</span>
<span>
- Font Family:
+ {{ 'PrivacyManager_FontFamily'|translate }}:
<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>
+ <h3>{{ 'PrivacyManager_OptOutHtmlCode'|translate }}</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>
+ <h3>{{ 'PrivacyManager_OptOutPreview'|translate }}</h3>
<iframe id="previewIframe" ng-src="{{ optOutCustomizer.iframeUrl }}" style="border: 1px solid #333; height: 200px; width: 600px;" />
</div>
diff --git a/plugins/PrivacyManager/lang/en.json b/plugins/PrivacyManager/lang/en.json
index 60e487c625..e5d54baf83 100644
--- a/plugins/PrivacyManager/lang/en.json
+++ b/plugins/PrivacyManager/lang/en.json
@@ -40,7 +40,36 @@
"AskForConsentStep4DescB": "B) if you use your own consent tool to remember the consent",
"AskForConsentStep4DescBDesc": "When the user has expressed she or he no longer gives consent, you shall not call the following method anymore:",
"AskForConsentStepNotes": "Notes:",
+ "AnonymizeSites": "Anonymize the data of this site(s)",
+ "AnonymizeRowDataFrom": "Anonymize all raw data starting from:",
+ "AnonymizeRowDataTo": "Anonymize all raw data up to:",
+ "AnonymizeIp": "Anonymize IP",
+ "AnonymizeIpHelp": "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.",
+ "AnonymizeLocation": "Anonymize Location",
+ "AnonymizeLocationHelp": "This action cannot be undone. Re-evaluates the location based on the anonymized IP (at least 2 bytes of the IP will be anonymized).",
+ "AnonymizeUserId": "Replace User ID with a pseudonym",
+ "AnonymizeUserIdHelp": "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>",
+ "AnonymizeProcessInfo": "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.",
+ "AnonymizeDataNow": "Anonymize past data for the selected site and time",
+ "AnonymizeDataConfirm": "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.",
+ "UnsetVisitColumns": "Unset visit columns",
+ "UnsetVisitColumnsHelp": "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",
+ "UnsetActionColumns": "Unset action columns",
+ "UnsetActionColumnsHelp": "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.",
+ "AwarenessDocumentation": "Awareness & documentation",
+ "AwarenessDocumentationIntro": "Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:",
+ "AwarenessDocumentationDesc1": "Inform your visitors through a clear privacy notice whenever you’re collecting personal data.",
+ "AwarenessDocumentationDesc2": "Inform your users in your privacy policy about what data you collect and how the data is used.",
+ "AwarenessDocumentationDesc3": "Make your team aware that you are using Matomo Analytics and %1$swhat data is being collected by your analytics platform%2$s.",
+ "AwarenessDocumentationDesc4": "Document your use of Matomo within your %1$sinformation asset register%2$s.",
"CurrentDBSize": "Current database size",
+ "DataRetention": "Data retention",
+ "DataRetentionInMatomo": "Data retention for data stored in Matomo:",
+ "DataRetentionOverall": "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.",
+ "RawDataRemovedAfter": "all visits and actions raw data are deleted after %1$s.",
+ "RawDataNeverRemoved": "visits and actions raw data are <strong>never</strong> deleted.",
+ "ReportsRemovedAfter": "all aggregated reports are deleted after %1$s.",
+ "ReportsNeverRemoved": "aggregated reports are <strong>never</strong> deleted.",
"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.",
@@ -75,9 +104,23 @@
"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",
+ "GdprChecklists": "GDPR checklists",
+ "GdprChecklistDesc1": "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.",
+ "GdprChecklistDesc2": "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 %1$sGDPR User guide%2$s to learn even more.",
"GdprOverview": "GDPR Overview",
+ "GdprOverviewIntro1": "The General Data Protection Regulation (GDPR) is a regulation which strengthens and unifies data protection for all individuals within the European Union (EU).",
+ "GdprOverviewIntro2": "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.).",
"GdprTools": "GDPR Tools",
"GetPurgeEstimate": "Get purge estimate",
+ "IndividualsRights": "Individuals' rights",
+ "IndividualsRightsIntro": "Exercise the rights of your users with our GDPR-friendly procedures:",
+ "IndividualsRightsInform": "The right to be informed: inform your users with a clear privacy notice.",
+ "IndividualsRightsAccess": "The right of access: %1$ssearch for a data subject%2$s and export all of their data.",
+ "IndividualsRightsErasure": "The right to erasure: %1$ssearch for a data subject%2$s and delete some or all of their data.",
+ "IndividualsRightsRectification": "The right to rectification: you can %1$ssearch for a data subject%2$s and delete some or all of their data.",
+ "IndividualsRightsPortability": "The right to data portability: %1$ssearch for a data subject%2$s and export all of their data.",
+ "IndividualsRightsObject": "The right to object: %1$slet your users easily opt-out%2$s on your privacy policy page.",
+ "IndividualsRightsChildren": "If you offer online services to children and rely on consent to collect information about them, then you may need a parent or guardian’s consent in order to process the children’s personal data lawfully.",
"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",
@@ -86,14 +129,41 @@
"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. ",
+ "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",
+ "SearchForDataSubject": "Search for a data subject",
+ "FindDataSubjectsBy": "Find data subjects by",
+ "NoDataSubjectsFound": "No data subjects found",
+ "DeleteVisitsConfirm": "Are you sure you want to delete the selected visits? This action cannot be undone.",
+ "ResultTruncated": "More than %1$s results were found and the result was truncated to the first %1$s visits.",
+ "AddVisitorIdToSearch": "Click to add this visitorID to the search",
+ "AddVisitorIPToSearch": "Click to add this visitorIP to the search",
+ "AddUserIdToSearch": "Click to add this userID to the search",
+ "ExportSelectedVisits": "Export selected visits",
+ "DeleteSelectedVisits": "Delete selected visits",
+ "SelectWebsite": "Select a website",
+ "MatchingDataSubjects": "Matching data subjects",
+ "VisitsMatchedCriteria": "These visits match the selected criteria.",
+ "ExportingNote": "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.",
+ "DeletionFromMatomoOnly": "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.",
+ "ResultIncludesAllVisits": "The found results include all visits without any time restriction and include today.",
+ "GdprToolsPageIntro1": "This page has been designed in order for you to exercise data subject rights.",
+ "GdprToolsPageIntro2": "Here you can exercise the rights of your users with our GDPR-friendly procedures:",
+ "GdprToolsPageIntroAccessRight": "the right of access to all of their data (and the right to data portability),",
+ "GdprToolsPageIntroEraseRight": "the right to erase some or all of their data (and the right to rectification).",
+ "GdprToolsOverviewHint": "In case you do not know what GDPR is, please refer to the %1$sGDPR overview%2$s.",
"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",
+ "SecurityProcedures": "Security procedures",
+ "SecurityProceduresIntro": "Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:",
+ "SecurityProceduresDesc1": "Apply our %1$ssecurity recommendations%2$s in order to keep your Matomo data safe.",
+ "SecurityProceduresDesc2": "Check that you have a written contract with the company providing you the Matomo server or hosting which ensures %1$sappropriate safeguards are provided%2$s.",
+ "SecurityProceduresDesc3": "Include Matomo in your %1$sdata breach procedure%2$s.",
+ "SecurityProceduresDesc4": "Include Matomo in your %1$sdata privacy impact assessment (DPIA)%2$s, if applicable.",
"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 anonymize previously tracked raw users' data%6$s.",
"TeaserHeadline": "Privacy Settings",
"UseAnonymizedIpForVisitEnrichment": "Also use the Anonymized IP addresses when enriching visits.",
@@ -105,6 +175,14 @@
"UseAnonymizeTrackingData": "Anonymize Tracking Data",
"UseAnonymizeUserId": "Anonymize User ID",
"PseudonymizeUserId": "Replace User ID with a pseudonym",
+ "OptOutCustomize": "Customize the Opt-out iframe",
+ "OptOutHtmlCode": "HTML code to embed on your website",
+ "OptOutPreview": "Preview of the Opt-out as it will appear on your website",
+ "FontColor": "Font Color",
+ "FontSize": "Font Size",
+ "FontFamily": "Font Family",
+ "BackgroundColor": "Background Color",
+ "TrackingOptOut": "Let users opt-out of tracking",
"UseAnonymizeOrderId": "Anonymize Order ID",
"UseDeleteLog": "Regularly delete old raw data from the database",
"UseDeleteReports": "Regularly delete old reports from the database",
diff --git a/plugins/PrivacyManager/templates/gdprOverview.twig b/plugins/PrivacyManager/templates/gdprOverview.twig
index f461cad7a9..9dfed7aa6d 100644
--- a/plugins/PrivacyManager/templates/gdprOverview.twig
+++ b/plugins/PrivacyManager/templates/gdprOverview.twig
@@ -5,74 +5,72 @@
{% block content %}
<div class="gdprOverview">
<div piwik-content-intro>
- <h2>GDPR overview</h2>
+ <h2>{{ 'PrivacyManager_GdprOverview'|translate }}</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).
+ {{ 'PrivacyManager_GdprOverviewIntro1'|translate }}
<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.).
-
+ {{ 'PrivacyManager_GdprOverviewIntro2'|translate }}
</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.
+ <div piwik-content-block content-title="{{ 'PrivacyManager_GdprChecklists'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_GdprChecklistDesc1'|translate }}
<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>
+ {{ 'PrivacyManager_GdprChecklistDesc2'|translate('<a rel="noreferrer noopener" target="_blank" href="https://matomo.org/docs/gdpr">', '</a>')|raw }}</p>
</div>
- <div piwik-content-block content-title="Individuals' rights">
- <p>Exercise the rights of your users with our GDPR-friendly procedures:
- </p>
+ <div piwik-content-block content-title="{{ 'PrivacyManager_IndividualsRights'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_IndividualsRightsIntro'|translate }}</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 guardian’s consent in order to process the children’s personal data lawfully.</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsInform'|translate }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsAccess'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsErasure'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsRectification'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsPortability'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsObject'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'usersOptOut'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsChildren'|translate }}</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>
+ <div piwik-content-block content-title="{{ 'PrivacyManager_AwarenessDocumentation'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_AwarenessDocumentationIntro'|translate }}</p>
<ol>
- <li>Inform your visitors through a clear privacy notice whenever you’re 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>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc1'|translate }}</li>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc2'|translate }}</li>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc3'|translate('<a target="_blank" rel="noreferrer noopener" href="https://matomo.org/faq/general/faq_18254/">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc4'|translate('<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">', '</a>')|raw }}</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>
+ <div piwik-content-block content-title="{{ 'PrivacyManager_SecurityProcedures'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_SecurityProceduresIntro'|translate }}</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>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc1'|translate('<a href="https://matomo.org/docs/security/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc2'|translate('<a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/international-transfers/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc3'|translate('<a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/personal-data-breaches/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc4'|translate('<a href="https://www.cnil.fr/en/guidelines-dpia" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
</ol>
</div>
- <div piwik-content-block content-title="Data retention">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_DataRetention'|translate|e('html_attr') }}">
<p>
- Data retention for data stored in Matomo:
+ {{ 'PrivacyManager_DataRetentionInMatomo'|translate }}
</p>
<ul>
{% if deleteLogsEnable %}
- <li>all visits and actions raw data are deleted after <strong>{{ rawDataRetention }}</strong>.</li>
+ <li>{{ 'PrivacyManager_RawDataRemovedAfter'|translate('<strong>' ~ rawDataRetention ~ '</strong>')|raw }}</li>
{% else %}
- <li>visits and actions raw data are <strong>never</strong> deleted.</li>
+ <li>{{ 'PrivacyManager_RawDataNeverRemoved'|translate|raw }}</li>
{% endif %}
{% if deleteReportsEnable %}
- <li>all aggregated reports are deleted after <strong>{{ reportRetention }}</strong>.</li>
+ <li>{{ 'PrivacyManager_ReportsRemovedAfter'|translate('<strong>' ~ reportRetention ~ '</strong>')|raw }}</li>
{% else %}
- <li>aggregated reports are <strong>never</strong> deleted.</li>
+ <li>{{ 'PrivacyManager_ReportsNeverRemoved'|translate|raw }}</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.
+ {{ 'PrivacyManager_DataRetentionOverall'|translate }}
</p>
</div>
diff --git a/plugins/PrivacyManager/templates/usersOptOut.twig b/plugins/PrivacyManager/templates/usersOptOut.twig
index f0615d87c1..51fc9050a1 100644
--- a/plugins/PrivacyManager/templates/usersOptOut.twig
+++ b/plugins/PrivacyManager/templates/usersOptOut.twig
@@ -3,7 +3,7 @@
{% set title %}{{ 'PrivacyManager_GDPR'|translate }}{% endset %}
{% block content %}
- <div piwik-content-block content-title="Let users opt-out of tracking">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_TrackingOptOut'|translate|e('html_attr') }}">
<div piwik-opt-out-customizer piwikurl="{{ piwikUrl }}" language="{{ language }}">
</div>
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png
index 415d2ce10a..e7ca8b21f1 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2fb4c62c3680b09b50cc846b0f39073f71b7002084ef52bd2f1023df73abaadb
-size 245111
+oid sha256:418badecf2d2dae40299140d7ffdda25695e752f5480247fca2fa3c6dbab932b
+size 245277
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png
index e6e6575483..85942b1c6d 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1312c2a758603bee46da2415a0ab148fa3d06af4d453c7bc86079b588cd805f1
-size 242153
+oid sha256:992cc4534cadcb7764af8060090157ca7dc2545a1a5fac8abdf41e813b054804
+size 242300
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png
index d47260c242..65a83dd1fe 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d84b46c2698d65715ea9030081117abc91fbbe8e82ebf8ae6fddf59812861574
-size 578891
+oid sha256:b00314e0cba0c69a98f343279feff75ae4f107b13ba7ec6d7b5c5f6844df1b27
+size 579805
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png
index 095649e649..98775ad05e 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9f4d53010eef0f766c887b90fe54b65db0e802aa236c92950367db910f682a6d
-size 573065
+oid sha256:7476c7d52efb3846c1efdc9cbd7d1206e628cdee4f7127787fd89db1137ddd4d
+size 574188
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png
index 958e5069ca..23fc01a02f 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aa6bb1f494a881cebf2066e29993e0422e5e3f66e0d2f8a77204ccd0f0b671cb
-size 128504
+oid sha256:bba5c60c6b8fa7395acc123f5e1e3775d7b04e7beae395c5ac4d12ab5e778397
+size 129590
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png
index d226aeba91..f44f438eca 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:339c7870fa7f06734f81ecffd150be3d6f65ddfe9f9e81121c5ebecb24102c62
-size 579155
+oid sha256:21b050201b2fdf455349522a66524758434c3db06fa4da11905e32db7dedc682
+size 580214
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png
index d47260c242..65a83dd1fe 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d84b46c2698d65715ea9030081117abc91fbbe8e82ebf8ae6fddf59812861574
-size 578891
+oid sha256:b00314e0cba0c69a98f343279feff75ae4f107b13ba7ec6d7b5c5f6844df1b27
+size 579805
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png
index 284c8c0e28..3f3aebfe4e 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f40e1455411670f82f7ccfca272fef800849aa6b09490bc70630921186178750
-size 573449
+oid sha256:30d755e33da141fd68564e2118f20ff1e36a0646fa3dbe6cd63393ab4ddd6ae7
+size 574557