Showing preview only (331K chars total). Download the full file or copy to clipboard to get everything.
Repository: delight-im/PHP-PrivacyPolicy
Branch: master
Commit: 4fb4bfc70522
Files: 49
Total size: 313.1 KB
Directory structure:
gitextract_ui_n7_0g/
├── .editorconfig
├── .gitignore
├── LICENSE
├── Migration.md
├── README.md
├── Sorting.md
├── composer.json
├── src/
│ ├── Data/
│ │ ├── DataBasis.php
│ │ ├── DataElement.php
│ │ ├── DataGroup.php
│ │ ├── DataPurpose.php
│ │ ├── DataRequirement.php
│ │ ├── DataSpecialCondition.php
│ │ └── DataType.php
│ ├── HumanPrivacyPolicy.php
│ ├── Language/
│ │ ├── EnglishPrivacyPolicy.php
│ │ ├── GermanFormalPrivacyPolicy.php
│ │ ├── GermanInformalPrivacyPolicy.php
│ │ ├── GermanPrivacyPolicy.php
│ │ └── JsonPrivacyPolicy.php
│ ├── MachinePrivacyPolicy.php
│ ├── Markup/
│ │ ├── AbbreviationMarkup.php
│ │ ├── ConcatenationMarkup.php
│ │ ├── DefinitionList/
│ │ │ ├── DefinitionGroup.php
│ │ │ └── DefinitionList.php
│ │ ├── ImageMarkup.php
│ │ ├── LinkMarkup.php
│ │ ├── Markup.php
│ │ ├── SimpleMarkup.php
│ │ └── TextMarkup.php
│ ├── PrivacyPolicy.php
│ ├── Scope/
│ │ ├── AndroidAppScope.php
│ │ ├── AppStoreIosAppScope.php
│ │ ├── IosAppScope.php
│ │ ├── MobileAppScope.php
│ │ ├── PlayStoreAndroidAppScope.php
│ │ ├── Scope.php
│ │ └── WebsiteScope.php
│ └── Throwable/
│ ├── Error.php
│ ├── Exception.php
│ ├── InvalidFormatArgumentsError.php
│ ├── TranslationNotFoundError.php
│ ├── UnexpectedDataBasisError.php
│ ├── UnexpectedDataPurposeError.php
│ ├── UnexpectedDataRequirementError.php
│ ├── UnexpectedDataSpecialConditionError.php
│ ├── UnexpectedDataTypeError.php
│ └── UnexpectedScopeError.php
└── tests/
└── index.php
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# editorconfig.org
root = true
[*]
charset = utf-8
indent_style = tab
trim_trailing_whitespace = true
end_of_line = lf
insert_final_newline = true
[*.md]
indent_style = space
indent_size = 4
================================================
FILE: .gitignore
================================================
# IntelliJ
.idea/
# Composer
vendor/
composer.phar
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) delight.im (https://www.delight.im/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Migration.md
================================================
# Migration
* [General](#general)
* [From `v1.x.x` to `v2.x.x`](#from-v1xx-to-v2xx)
## General
Update your version of this library using Composer and its `composer update` or `composer require` commands [[?]](https://github.com/delight-im/Knowledge/blob/master/Composer%20(PHP).md#how-do-i-update-libraries-or-modules-within-my-application).
## From `v1.x.x` to `v2.x.x`
* The Internationalization extension (`intl`) for PHP is now required.
* The method `setLastUpdated` from class `PrivacyPolicy` has been renamed to `setPublishedAt`.
* The method `hasLastUpdated` from class `PrivacyPolicy` has been removed.
* The method `setExpiration` from class `PrivacyPolicy` has been renamed to `setExpiresAt`.
* The method `hasExpiration` from class `PrivacyPolicy` has been removed.
* For method `addDataGroup` from class `PrivacyPolicy`, between the second parameter (named “description”) and the former third parameter (named “purposes”), two new parameters (named “bases” and “specialConditions”) have been added.
* For the constructor of class `DataGroup`, between the second parameter (named “description”) and the former third parameter (named “purposes”), two new parameters (named “bases” and “specialConditions”) have been added.
* For method `addElement` from class `DataGroup`, the fourth parameter (named “viewable”) and the fifth parameter (named “deletable”) have been removed.
* For the constructor of class `DataElement`, the fourth parameter (named “viewable”) and the fifth parameter (named “deletable”) have been removed.
* The methods `isViewable` and `isDeletable` from class `DataElement` have been removed.
* The method `setRightToInformation` from class `PrivacyPolicy` has been replaced by the five separate methods `setRightOfAccess`, `setRightToRectification`, `setRightToErasure`, `setRightToRestrictProcessing` and `setRightToObject`.
* The method `hasRightToInformation` from class `PrivacyPolicy` has been removed.
* The key `meta.updated` in the JSON output has been renamed to `meta.published`.
* The attributes `viewable` and `deletable` in `data[*].elements[*]` in the JSON output have been removed.
* For `data[*].requirement` and `data[*].elements[*].requirement` in the JSON output, all occurrences of the value `opt_in` have been replaced with `optIn`, and all occurrences of `opt_out` have been replaced with `optOut`.
* The key `choices.information.request` in the JSON output has been renamed to `choices.data.access`.
* The key `choices.information.update` in the JSON output has been renamed to `choices.data.rectification`.
* The key `choices.information.delete` in the JSON output has been renamed to `choices.data.erasure`.
================================================
FILE: README.md
================================================
# PHP-PrivacyPolicy
Programmatically composable privacy policies for [humans](../../tree/examples/Humans) and [machines](../../tree/examples/Machines)
## Requirements
* PHP 5.6.0+
* Internationalization extension (`intl`)
## Installation
1. Include the library via Composer [[?]](https://github.com/delight-im/Knowledge/blob/master/Composer%20(PHP).md):
```
$ composer require delight-im/privacy-policy
```
1. Include the Composer autoloader:
```php
require __DIR__ . '/vendor/autoload.php';
```
## Upgrading
Migrating from an earlier version of this project? See our [upgrade guide](Migration.md) for help.
## Usage
* [Creating an instance](#creating-an-instance)
* [Privacy policies for humans in natural language](#privacy-policies-for-humans-in-natural-language)
* [Privacy policies for machines in formal language](#privacy-policies-for-machines-in-formal-language)
* [Displaying or printing an instance](#displaying-or-printing-an-instance)
* [Privacy policies for humans in natural language](#privacy-policies-for-humans-in-natural-language-1)
* [Privacy policies for machines in formal language](#privacy-policies-for-machines-in-formal-language-1)
* [Defining metadata](#defining-metadata)
* [Describing your privacy practices](#describing-your-privacy-practices)
* [Explaining the amount, type and purpose of the data you collect](#explaining-the-amount-type-and-purpose-of-the-data-you-collect)
* [Lawful bases](#lawful-bases)
* [Special conditions](#special-conditions)
* [Data purposes](#data-purposes)
* [Data requirements](#data-requirements)
* [Data types](#data-types)
* [Primary](#primary)
* [Secondary](#secondary)
* [Tertiary](#tertiary)
* [Specifying the scope of your policy](#specifying-the-scope-of-your-policy)
* [Configuring an instance](#configuring-an-instance)
* [Privacy policies for machines in formal language](#privacy-policies-for-machines-in-formal-language-2)
### Creating an instance
#### Privacy policies for humans in natural language
```php
$policy = new \Delight\PrivacyPolicy\Language\EnglishPrivacyPolicy();
// or
$policy = new \Delight\PrivacyPolicy\Language\GermanFormalPrivacyPolicy();
// or
$policy = new \Delight\PrivacyPolicy\Language\GermanInformalPrivacyPolicy();
```
#### Privacy policies for machines in formal language
```php
$policy = new \Delight\PrivacyPolicy\Language\JsonPrivacyPolicy();
```
### Displaying or printing an instance
#### Privacy policies for humans in natural language
```php
$policy->toHtml();
// or
$policy->toPlainText();
// or
$policy->toMarkdown();
```
#### Privacy policies for machines in formal language
```php
$policy->toJson();
```
### Defining metadata
```php
$policy->setPublishedAt(1393372800);
$policy->setTakesEffectAt(1394582400);
$policy->setExpiresAt(1395792000);
$policy->setVersionName('v3.1.4');
$policy->setCanonicalUrl('https://www.example.com/privacy.html');
$policy->setContactEmail('privacy@example.com');
$policy->setContactUrl('https://www.example.com/contact.html');
// $policy->setContactImage('https://www.example.com/images/contact.png', 'Jane Doe, 123 Main Street, Anytown, USA', 420, 360);
```
### Describing your privacy practices
```php
$policy->setUserDataTraded(false);
$policy->setDataMinimizationGoal(true);
$policy->setChildrenMinimumAge(16);
$policy->setPromotionalEmailOptOut(true);
$policy->setFirstPartyCookies(true);
$policy->setThirdPartyCookies(true);
$policy->setAccountDeletable(true);
$policy->setPreservationInBackups(true);
$policy->setThirdPartyServiceProviders(true);
$policy->setInternationalTransfers(true);
$policy->setTransferUponMergerOrAcquisition(true);
$policy->setTlsEverywhere(true);
$policy->setCompetentSupervisoryAuthority('Estonian Data Protection Inspectorate', 'http://www.aki.ee/en');
$policy->setNotificationPeriod(30);
$policy->setRightOfAccess(true);
$policy->setRightToRectification(true);
$policy->setRightToErasure(true);
$policy->setRightToRestrictProcessing(true);
$policy->setRightToDataPortability(true);
$policy->setRightToObject(true);
$policy->setRightsRelatedToAutomatedDecisions(true);
```
### Explaining the amount, type and purpose of the data you collect
```php
$policy->addDataGroup(
'Server logs',
'Whenever you access our services, ...',
[ \Delight\PrivacyPolicy\Data\DataBasis::LEGITIMATE_INTERESTS ],
null, // [ \Delight\PrivacyPolicy\Data\DataSpecialCondition::EXPLICIT_CONSENT ]
[ \Delight\PrivacyPolicy\Data\DataPurpose::ADMINISTRATION ],
\Delight\PrivacyPolicy\Data\DataRequirement::ALWAYS,
function (\Delight\PrivacyPolicy\Data\DataGroup $group) {
$group->addElement(
\Delight\PrivacyPolicy\Data\DataType::ACCESS_IP_ADDRESS,
\Delight\PrivacyPolicy\Data\DataRequirement::ALWAYS,
24 * 7
);
}
);
```
#### Lawful bases
```php
\Delight\PrivacyPolicy\Data\DataBasis::CONSENT;
\Delight\PrivacyPolicy\Data\DataBasis::CONTRACT;
\Delight\PrivacyPolicy\Data\DataBasis::LEGAL_OBLIGATION;
\Delight\PrivacyPolicy\Data\DataBasis::LEGITIMATE_INTERESTS;
\Delight\PrivacyPolicy\Data\DataBasis::PUBLIC_INTEREST;
\Delight\PrivacyPolicy\Data\DataBasis::VITAL_INTERESTS;
```
#### Special conditions
```php
\Delight\PrivacyPolicy\Data\DataSpecialCondition::ARCHIVING_OR_RESEARCH;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::EMPLOYMENT_AND_SOCIAL_SECURITY;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::EXPLICIT_CONSENT;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::FOUNDATION_ASSOCIATION_OR_NON_PROFIT;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::HEALTH_AND_SOCIAL_CARE;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::LEGAL_CLAIMS_OR_JUDICIAL_CAPACITY;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::PUBLIC_DATA;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::PUBLIC_HEALTH;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::SUBSTANTIAL_PUBLIC_INTEREST;
\Delight\PrivacyPolicy\Data\DataSpecialCondition::VITAL_INTERESTS;
```
#### Data purposes
```php
\Delight\PrivacyPolicy\Data\DataPurpose::ADMINISTRATION;
\Delight\PrivacyPolicy\Data\DataPurpose::ADVERTISING;
\Delight\PrivacyPolicy\Data\DataPurpose::CUSTOMER_SUPPORT;
\Delight\PrivacyPolicy\Data\DataPurpose::FULFILLMENT;
\Delight\PrivacyPolicy\Data\DataPurpose::MARKETING;
\Delight\PrivacyPolicy\Data\DataPurpose::PERSONALIZATION;
\Delight\PrivacyPolicy\Data\DataPurpose::RESEARCH;
```
#### Data requirements
```php
\Delight\PrivacyPolicy\Data\DataRequirement::ALWAYS;
\Delight\PrivacyPolicy\Data\DataRequirement::OPT_IN;
\Delight\PrivacyPolicy\Data\DataRequirement::OPT_OUT;
```
#### Data types
##### Primary
```php
\Delight\PrivacyPolicy\Data\DataType::ACCESS_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_DATETIME_DATE;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_DATETIME_TIME;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_HTTP_METHOD;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_HTTP_STATUS;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_IP_ADDRESS;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_IP_ADDRESS_25_PERCENT;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_IP_ADDRESS_50_PERCENT;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_IP_ADDRESS_75_PERCENT;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_REFERER;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_SIZE;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_URL;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_USERAGENT_STRING;
\Delight\PrivacyPolicy\Data\DataType::BILLING_CANCELLATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::BILLING_END_TIME;
\Delight\PrivacyPolicy\Data\DataType::BILLING_FREE_TRIAL;
\Delight\PrivacyPolicy\Data\DataType::BILLING_MODIFICATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::BILLING_NEXT_PAYMENT_TIME;
\Delight\PrivacyPolicy\Data\DataType::BILLING_PAST_DUE;
\Delight\PrivacyPolicy\Data\DataType::BILLING_PLAN;
\Delight\PrivacyPolicy\Data\DataType::BILLING_START_TIME;
\Delight\PrivacyPolicy\Data\DataType::CUSTOMER_NUMBER;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_BROWSER;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_BROWSER_BRAND;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_BROWSER_VERSION;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_DATETIME_TIME_ZONE;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_ID;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_ID_IMEI;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_ID_MAC_ADDRESS;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_ID_PERMANENT;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_ID_RESETTABLE;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_LANGUAGE;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_LOCATION_APPROXIMATE;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_LOCATION_PRECISE;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_MANUFACTURER;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_MODEL;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_OS;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_OS_BRAND;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_OS_VERSION;
\Delight\PrivacyPolicy\Data\DataType::USER_ACCESS_PRIVILEGES;
\Delight\PrivacyPolicy\Data\DataType::USER_ADDRESS;
\Delight\PrivacyPolicy\Data\DataType::USER_ADDRESS_COUNTRY;
\Delight\PrivacyPolicy\Data\DataType::USER_ADDRESS_LOCALITY;
\Delight\PrivacyPolicy\Data\DataType::USER_ADDRESS_PLACE;
\Delight\PrivacyPolicy\Data\DataType::USER_ADDRESS_POSTAL_CODE;
\Delight\PrivacyPolicy\Data\DataType::USER_ADDRESS_REGION;
\Delight\PrivacyPolicy\Data\DataType::USER_BIRTH_DATE;
\Delight\PrivacyPolicy\Data\DataType::USER_BIRTH_DATE_MONTH_DAY;
\Delight\PrivacyPolicy\Data\DataType::USER_BIRTH_DATE_YEAR;
\Delight\PrivacyPolicy\Data\DataType::USER_BIRTH_DATE_YEAR_MONTH;
\Delight\PrivacyPolicy\Data\DataType::USER_BIRTH_PLACE;
\Delight\PrivacyPolicy\Data\DataType::USER_BLOOD_GROUP;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_DEPARTMENT;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_LOGO;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_NAME;
\Delight\PrivacyPolicy\Data\DataType::USER_COUNTRY;
\Delight\PrivacyPolicy\Data\DataType::USER_EMAIL;
\Delight\PrivacyPolicy\Data\DataType::USER_EMAIL_VERIFIED;
\Delight\PrivacyPolicy\Data\DataType::USER_FAX;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_BANK_ACCOUNT_ID;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_BANK_ID;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_BANK_NAME;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_CREDIT_CARD_BRAND;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_CREDIT_CARD_CVC;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_CREDIT_CARD_EXPIRATION;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_CREDIT_CARD_NUMBER;
\Delight\PrivacyPolicy\Data\DataType::USER_GENDER;
\Delight\PrivacyPolicy\Data\DataType::USER_GEO_COORDINATES;
\Delight\PrivacyPolicy\Data\DataType::USER_HEIGHT;
\Delight\PrivacyPolicy\Data\DataType::USER_IDENTIFIERS_DEU_ST_IDNR;
\Delight\PrivacyPolicy\Data\DataType::USER_IDENTIFIERS_DEU_ST_NR;
\Delight\PrivacyPolicy\Data\DataType::USER_IDENTIFIERS_EU_VAT_IN;
\Delight\PrivacyPolicy\Data\DataType::USER_IDENTIFIERS_USA_SSN;
\Delight\PrivacyPolicy\Data\DataType::USER_IP_ADDRESS;
\Delight\PrivacyPolicy\Data\DataType::USER_IP_ADDRESS_25_PERCENT;
\Delight\PrivacyPolicy\Data\DataType::USER_IP_ADDRESS_50_PERCENT;
\Delight\PrivacyPolicy\Data\DataType::USER_IP_ADDRESS_75_PERCENT;
\Delight\PrivacyPolicy\Data\DataType::USER_LOGIN_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::USER_LOGIN_DATETIME_DATE;
\Delight\PrivacyPolicy\Data\DataType::USER_LOGIN_DATETIME_TIME;
\Delight\PrivacyPolicy\Data\DataType::USER_NAME;
\Delight\PrivacyPolicy\Data\DataType::USER_NAME_ALIAS;
\Delight\PrivacyPolicy\Data\DataType::USER_NAME_FAMILY;
\Delight\PrivacyPolicy\Data\DataType::USER_NAME_GIVEN;
\Delight\PrivacyPolicy\Data\DataType::USER_NOTES;
\Delight\PrivacyPolicy\Data\DataType::USER_OCCUPATION;
\Delight\PrivacyPolicy\Data\DataType::USER_OCCUPATION_CURRENT;
\Delight\PrivacyPolicy\Data\DataType::USER_OCCUPATION_PREFERRED;
\Delight\PrivacyPolicy\Data\DataType::USER_PASSWORD_CLEARTEXT;
\Delight\PrivacyPolicy\Data\DataType::USER_PASSWORD_HASHED;
\Delight\PrivacyPolicy\Data\DataType::USER_PASSWORD_HASHED_STRONG;
\Delight\PrivacyPolicy\Data\DataType::USER_PASSWORD_RESETTABLE;
\Delight\PrivacyPolicy\Data\DataType::USER_PHONE;
\Delight\PrivacyPolicy\Data\DataType::USER_PHONE_HOME;
\Delight\PrivacyPolicy\Data\DataType::USER_PHONE_MOBILE;
\Delight\PrivacyPolicy\Data\DataType::USER_PICTURE;
\Delight\PrivacyPolicy\Data\DataType::USER_REGISTRATION_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::USER_REGISTRATION_DATETIME_DATE;
\Delight\PrivacyPolicy\Data\DataType::USER_REGISTRATION_DATETIME_TIME;
\Delight\PrivacyPolicy\Data\DataType::USER_SIGNATURE;
\Delight\PrivacyPolicy\Data\DataType::USER_SIGNATURE_DRAWN;
\Delight\PrivacyPolicy\Data\DataType::USER_SIGNATURE_HANDWRITTEN;
\Delight\PrivacyPolicy\Data\DataType::USER_WEBSITE_URL;
\Delight\PrivacyPolicy\Data\DataType::USER_WEIGHT;
```
##### Secondary
```php
\Delight\PrivacyPolicy\Data\DataType::ACCESS_APP_VERSION;
\Delight\PrivacyPolicy\Data\DataType::ACCESS_FIRST_TIME;
\Delight\PrivacyPolicy\Data\DataType::BILLING_ID_PAYMENT_SERVICE_PROVIDER;
\Delight\PrivacyPolicy\Data\DataType::CALENDAR_EVENT_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::CALENDAR_EVENT_DATETIME_DATE;
\Delight\PrivacyPolicy\Data\DataType::CALENDAR_EVENT_DATETIME_TIME;
\Delight\PrivacyPolicy\Data\DataType::CALENDAR_EVENT_TITLE;
\Delight\PrivacyPolicy\Data\DataType::CALENDAR_EVENT_TYPE;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_DIAGNOSTICS;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_DIAGNOSTICS_ENERGY_USAGE;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_DIAGNOSTICS_ERRORS;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_DIAGNOSTICS_ERRORS_LOGS;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_DIAGNOSTICS_ERRORS_RATE;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_DIAGNOSTICS_FRAME_RATE;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_DIAGNOSTICS_TIMING;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_INTERACTIONS;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_INTERACTIONS_CLICKS_OR_TAPS;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_INTERACTIONS_SESSIONS;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_INTERACTIONS_VIEWS;
\Delight\PrivacyPolicy\Data\DataType::CLIENT_INTERACTIONS_VISITS;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_ADDRESS;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_ADDRESS_COUNTRY;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_ADDRESS_LOCALITY;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_ADDRESS_PLACE;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_ADDRESS_POSTAL_CODE;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_ADDRESS_REGION;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_BIRTH_DATE;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_BIRTH_DATE_MONTH_DAY;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_BIRTH_DATE_YEAR;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_BIRTH_DATE_YEAR_MONTH;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_COMPANY_DEPARTMENT;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_COMPANY_NAME;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_CREATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_EMAIL;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_FAX;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_FINANCIAL_BANK_ACCOUNT_ID;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_FINANCIAL_BANK_ID;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_FINANCIAL_BANK_NAME;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_GENDER;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_IDENTIFIERS_EU_VAT_IN;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_MODIFICATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_NAME;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_NAME_ALIAS;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_NAME_FAMILY;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_NAME_GIVEN;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_ORIGINAL_MESSAGE_TIME;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_PHONE;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_PHONE_HOME;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_PHONE_MOBILE;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_REFERENCE;
\Delight\PrivacyPolicy\Data\DataType::CONTACT_WEBSITE_URL;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_BCC;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_BODY;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_CC;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_DATETIME_DATE;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_DATETIME_TIME;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_FROM;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_REPLY_TO;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_RETURN_PATH;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_SUBJECT;
\Delight\PrivacyPolicy\Data\DataType::EMAIL_TO;
\Delight\PrivacyPolicy\Data\DataType::FILE_CONTENTS;
\Delight\PrivacyPolicy\Data\DataType::FILE_NAME;
\Delight\PrivacyPolicy\Data\DataType::FILE_SIZE;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_AMOUNT_GROSS;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_AMOUNT_NET;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_CUSTOMER_NUMBER;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_DATETIME_DATE;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_FULFILLMENT_PERIOD;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_NUMBER;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_RECIPIENT;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_TAXES;
\Delight\PrivacyPolicy\Data\DataType::USER_REFERENCE;
```
##### Tertiary
```php
\Delight\PrivacyPolicy\Data\DataType::ACCESS_DEVICE_FEATURES_FILE_UPLOAD;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_BILLING_AMOUNT;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_BILLING_CYCLE;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_CANCELLATION_PERIOD;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_CANCELLATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_CREATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_MODIFICATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_NOTES;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_PARTNER;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_PERIOD_END;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_PERIOD_EXTENSION;
\Delight\PrivacyPolicy\Data\DataType::CONTRACT_PERIOD_START;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_DIAGNOSTICS;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_DIAGNOSTICS_ENERGY;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_DIAGNOSTICS_ENERGY_LEVEL;
\Delight\PrivacyPolicy\Data\DataType::DEVICE_DIAGNOSTICS_ENERGY_SOURCE;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_CREATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_DISCOUNT;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_ITEM_DESCRIPTION;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_ITEM_DISCOUNT;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_ITEM_PRICE_GROSS;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_ITEM_PRICE_NET;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_ITEM_QUANTITY;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_ITEM_TAXES;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_MESSAGE;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_MODIFICATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_NOTES;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_PAYMENT_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_PAYMENT_TERMS;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_REFUND_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::INVOICE_REMINDER_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::LETTER_BODY;
\Delight\PrivacyPolicy\Data\DataType::LETTER_CC;
\Delight\PrivacyPolicy\Data\DataType::LETTER_CREATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::LETTER_DATETIME;
\Delight\PrivacyPolicy\Data\DataType::LETTER_DATETIME_DATE;
\Delight\PrivacyPolicy\Data\DataType::LETTER_DATETIME_TIME;
\Delight\PrivacyPolicy\Data\DataType::LETTER_ENCLOSURES;
\Delight\PrivacyPolicy\Data\DataType::LETTER_HEADLINE;
\Delight\PrivacyPolicy\Data\DataType::LETTER_IS_FIRST;
\Delight\PrivacyPolicy\Data\DataType::LETTER_MATTER_PERSONAL_OR_BUSINESS;
\Delight\PrivacyPolicy\Data\DataType::LETTER_MODIFICATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::LETTER_PS;
\Delight\PrivacyPolicy\Data\DataType::LETTER_SALUTATION;
\Delight\PrivacyPolicy\Data\DataType::LETTER_SUBJECT;
\Delight\PrivacyPolicy\Data\DataType::LETTER_VALEDICTION;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_COMMERCIAL_REGISTER_ENTRY;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_EXECUTIVE_BOARD_MEMBERS;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_LOGO_CREATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_LOGO_LABEL;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_LOGO_MODIFICATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_MANAGEMENT_MEMBERS;
\Delight\PrivacyPolicy\Data\DataType::USER_COMPANY_SUPERVISORY_BOARD_MEMBERS;
\Delight\PrivacyPolicy\Data\DataType::USER_FINANCIAL_PURCHASE_HISTORY;
\Delight\PrivacyPolicy\Data\DataType::USER_IDENTIFIERS_ACCOUNT_ID;
\Delight\PrivacyPolicy\Data\DataType::USER_IDENTIFIERS_ACCOUNT_NAME;
\Delight\PrivacyPolicy\Data\DataType::USER_IDENTIFIERS_ACCOUNT_TYPE;
\Delight\PrivacyPolicy\Data\DataType::USER_SIGNATURE_CREATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::USER_SIGNATURE_LABEL;
\Delight\PrivacyPolicy\Data\DataType::USER_SIGNATURE_MODIFICATION_TIME;
\Delight\PrivacyPolicy\Data\DataType::VEHICLE_COLOR;
\Delight\PrivacyPolicy\Data\DataType::VEHICLE_CONSTRUCTION_PLACE;
\Delight\PrivacyPolicy\Data\DataType::VEHICLE_CONSTRUCTION_YEAR;
\Delight\PrivacyPolicy\Data\DataType::VEHICLE_MAKE;
\Delight\PrivacyPolicy\Data\DataType::VEHICLE_MODEL;
\Delight\PrivacyPolicy\Data\DataType::VEHICLE_NOTES;
\Delight\PrivacyPolicy\Data\DataType::VEHICLE_REGISTRATION_PLATE_NUMBER;
```
### Specifying the scope of your policy
```php
$policy->addScope(
new \Delight\PrivacyPolicy\Scope\WebsiteScope('https://www.example.com/', 'example.com')
);
// and/or
$policy->addScope(
new \Delight\PrivacyPolicy\Scope\PlayStoreAndroidAppScope('com.example.app', 'Example for Android')
);
// and/or
$policy->addScope(
new \Delight\PrivacyPolicy\Scope\AppStoreIosAppScope('54614917093', 'Example for iOS')
);
```
### Configuring an instance
#### Privacy policies for machines in formal language
```php
$policy->setMinified(true);
```
## Frequently asked questions
### How can I help translate the policy to my language?
If there's a class for your language in the [`src/Language/`](src/Language/) directory already, you can just start working on that file.
If there's no such class yet, simply create a new file for your language:
1. Copy the [template](../../blob/templates/src/Language/MyLanguagePrivacyPolicy.php) class that extends `HumanPrivacyPolicy`
1. Rename the class and file to specify the name of your language (following the common naming scheme)
1. Update the documentation comment for the class
1. Replace all occurrences of
```php
throw new TranslationNotFoundError();
```
(except for that in the `default` case of the `switch` block) with a `return` statement specifying the translated string
### Why is the HTML output not displayed correctly when using the “Bootstrap” framework?
The “Bootstrap” front-end framework overwrites some of the default CSS properties for definition/description lists. In order to fix how the policy is displayed, you have to reset those properties to their default values or improve them further. Usually, you may want to restrict these resets to the container element of your policy.
#### Bootstrap 3
```css
dl {
margin-top: 0;
margin-bottom: 16px;
}
dl dl {
margin-left: 24px;
}
dd {
margin-bottom: 8px;
margin-left: 0;
}
dl dl dl dd {
margin-bottom: 0;
}
```
#### Bootstrap 4
```css
dl {
margin-top: 0;
margin-bottom: 1rem;
}
dl dl {
margin-left: 1.5rem;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
dl dl dl dd {
margin-bottom: 0;
}
```
## Disclaimer
This project does not constitute legal advice and is not to be relied upon or acted on as such. Any material presented here is for general information purposes only and may be out of date, incomplete or not suitable for your jurisdiction. You should seek independent legal advice from a qualified professional to guide your decisions around a valid and complete privacy policy.
## Contributing
All contributions are welcome! If you wish to contribute, please create an issue first so that your feature, problem or question can be discussed.
## License
This project is licensed under the terms of the [MIT License](https://opensource.org/licenses/MIT).
================================================
FILE: Sorting.md
================================================
# Sorting
## Blocks of text
### Single-line blocks
```bash
$ cat unsorted.txt | sed 's/^[ \t]*//' | LC_ALL=C sort -f > sorted.txt
```
## Constants
### Single-line constants with preceding single-line documentation comments
```bash
$ cat unsorted.txt | sed 's/^[ \t]*//' | awk '{getline x;print x;}1' | paste -d "\t" - - | LC_ALL=C sort -f | tr '\t' '\n' | awk '{getline x;print x;}1' > sorted.txt
```
## Cases in switch statements
### Keywords `case` and `return` on two separate single lines
```bash
$ cat unsorted.txt | sed 's/^[ \t]*//' | paste -d "\t" - - | LC_ALL=C sort -f | tr '\t' '\n' > sorted.txt
```
### Keywords `case` and `return` on same single line
```bash
$ cat unsorted.txt | sed 's/^[ \t]*//' | LC_ALL=C sort -f > sorted.txt
```
================================================
FILE: composer.json
================================================
{
"name": "delight-im/privacy-policy",
"description": "Programmatically composable privacy policies for humans and machines",
"require": {
"php": ">=5.6.0",
"ext-intl": "*"
},
"type": "library",
"keywords": [ "privacy-policy", "privacy", "policy", "legal", "data-protection", "user-data" ],
"homepage": "https://github.com/delight-im/PHP-PrivacyPolicy",
"license": "MIT",
"autoload": {
"psr-4": {
"Delight\\PrivacyPolicy\\": "src/"
}
}
}
================================================
FILE: src/Data/DataBasis.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Data;
use Delight\PrivacyPolicy\Throwable\UnexpectedDataBasisError;
/** Lawful bases for data processing */
final class DataBasis {
/** @var string the lawful basis of consent */
const CONSENT = 'consent';
/** @var string the lawful basis of a contract */
const CONTRACT = 'contract';
/** @var string the lawful basis of a legal obligation */
const LEGAL_OBLIGATION = 'legalObligation';
/** @var string the lawful basis of legitimate interests */
const LEGITIMATE_INTERESTS = 'legitimateInterests';
/** @var string the lawful basis of public interest */
const PUBLIC_INTEREST = 'publicInterest';
/** @var string the lawful basis of vital interests */
const VITAL_INTERESTS = 'vitalInterests';
/**
* Converts an identifier to a human-readable description in natural language
*
* @param string $identifier one of the constants from this class
* @return string the description in natural language
* @throws UnexpectedDataBasisError
*/
public static function toNaturalLanguage($identifier) {
switch ($identifier) {
case self::CONSENT:
return 'consent';
case self::CONTRACT:
return 'contract';
case self::LEGAL_OBLIGATION:
return 'legal obligation';
case self::LEGITIMATE_INTERESTS:
return 'legitimate interests';
case self::PUBLIC_INTEREST:
return 'public interest';
case self::VITAL_INTERESTS:
return 'vital interests';
default:
throw new UnexpectedDataBasisError($identifier);
}
}
/**
* Converts an identifier to a legal reference in natural language
*
* @param string $identifier one of the constants from this class
* @return string the legal reference in natural language
* @throws UnexpectedDataBasisError
*/
public static function toLegalReference($identifier) {
switch ($identifier) {
case self::CONSENT:
return 'You have given consent to the processing of your personal data for one or more specific purposes (EU, General Data Protection Regulation (GDPR), Article 6(1)(a)).';
case self::CONTRACT:
return 'Processing is necessary for the performance of a contract to which you are party or in order to take steps at your request prior to entering into a contract (EU, General Data Protection Regulation (GDPR), Article 6(1)(b)).';
case self::LEGAL_OBLIGATION:
return 'Processing is necessary for compliance with a legal obligation to which we are subject (EU, General Data Protection Regulation (GDPR), Article 6(1)(c)).';
case self::LEGITIMATE_INTERESTS:
return 'Processing is necessary for the purposes of legitimate interests pursued by us or by a third party (EU, General Data Protection Regulation (GDPR), Article 6(1)(f)).';
case self::PUBLIC_INTEREST:
return 'Processing is necessary for the performance of a task carried out in the public interest or in the exercise of official authority vested in us (EU, General Data Protection Regulation (GDPR), Article 6(1)(e)).';
case self::VITAL_INTERESTS:
return 'Processing is necessary in order to protect your vital interests or those of another natural person (EU, General Data Protection Regulation (GDPR), Article 6(1)(d)).';
default:
throw new UnexpectedDataBasisError($identifier);
}
}
}
================================================
FILE: src/Data/DataElement.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Data;
/** Individual data element that is collected from the user */
final class DataElement {
/** @var string one of the constants from the {@see DataType} class */
private $type;
/** @var string one of the constants from the {@see DataRequirement} class */
private $requirement;
/** @var int|null the maximum retention time of the information in hours */
private $maxRetention;
/**
* Returns one of the constants from the {@see DataType} class
*
* @return string
*/
public function getType() {
return $this->type;
}
/**
* Returns one of the constants from the {@see DataRequirement} class
*
* @return string
*/
public function getRequirement() {
return $this->requirement;
}
/**
* Returns whether a maximum retention time of the information has been defined
*
* @return bool
*/
public function hasMaxRetention() {
return $this->maxRetention !== null;
}
/**
* Returns the maximum retention time of the information in hours
*
* @return int|null
*/
public function getMaxRetention() {
return $this->maxRetention;
}
/**
* Creates a new individual data element
*
* @param string $type one of the constants from the {@see DataType} class
* @param string|null $requirement (optional) one of the constants from the {@see DataRequirement} class
* @param int|null $maxRetention (optional) the maximum retention time of the information in hours
*/
public function __construct($type, $requirement = null, $maxRetention = null) {
$this->type = (string) $type;
$this->requirement = $requirement !== null ? ((string) $requirement) : DataRequirement::ALWAYS;
$this->maxRetention = $maxRetention !== null ? ((int) $maxRetention) : null;
}
}
================================================
FILE: src/Data/DataGroup.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Data;
/** Group of data elements that are collected from the user */
final class DataGroup {
/** @var string the title of the group in natural language */
private $title;
/** @var string|null the description of the group and of the circumstances of collection in natural language */
private $description;
/** @var string[] any number of constants from the {@see DataBasis} class */
private $bases;
/** @var string[] any number of constants from the {@see DataSpecialCondition} class */
private $specialConditions;
/** @var string[] any number of constants from the {@see DataPurpose} class */
private $purposes;
/** @var string one of the constants from the {@see DataRequirement} class */
private $requirement;
/** @var DataElement[] any number of {@see DataElement} instances */
private $dataElements;
/**
* Returns the title of the group in natural language
*
* @return string
*/
public function getTitle() {
return $this->title;
}
/**
* Returns whether a description of the group and of the circumstances of collection in natural language has been defined
*
* @return bool
*/
public function hasDescription() {
return $this->description !== null;
}
/**
* Returns the description of the group and of the circumstances of collection in natural language
*
* @return string|null
*/
public function getDescription() {
return $this->description;
}
/**
* Returns whether any constants from the {@see DataBasis} class have been added
*
* @return bool
*/
public function hasBases() {
return !empty($this->bases);
}
/**
* Returns any number of constants from the {@see DataBasis} class
*
* @return string[]
*/
public function getBases() {
return $this->bases;
}
/**
* Returns whether any constants from the {@see DataSpecialCondition} class have been added
*
* @return bool
*/
public function hasSpecialConditions() {
return !empty($this->specialConditions);
}
/**
* Returns any number of constants from the {@see DataSpecialCondition} class
*
* @return string[]
*/
public function getSpecialConditions() {
return $this->specialConditions;
}
/**
* Returns whether any constants from the {@see DataPurpose} class have been added
*
* @return bool
*/
public function hasPurposes() {
return !empty($this->purposes);
}
/**
* Returns any number of constants from the {@see DataPurpose} class
*
* @return string[]
*/
public function getPurposes() {
return $this->purposes;
}
/**
* Returns one of the constants from the {@see DataRequirement} class
*
* @return string
*/
public function getRequirement() {
return $this->requirement;
}
/**
* Returns whether any {@see DataElement} instances have been added
*
* @return bool
*/
public function hasElements() {
return !empty($this->dataElements);
}
/**
* Returns any number of {@see DataElement} instances
*
* @return DataElement[]
*/
public function getElements() {
return $this->dataElements;
}
/**
* Adds a new data element to the group
*
* @param string $type one of the constants from the {@see DataType} class
* @param string|null $requirement (optional) one of the constants from the {@see DataRequirement} class
* @param int|null $maxRetention (optional) the maximum retention time of the information in hours
*/
public function addElement($type, $requirement = null, $maxRetention = null) {
$this->dataElements[] = new DataElement($type, $requirement, $maxRetention);
}
/**
* Creates a new group of data elements
*
* @param string $title the title of the group in natural language, e.g. `Registration data` or `Access logs`
* @param string|null $description (optional) the description of the group and of the circumstances of collection in natural language
* @param string[]|null $bases (optional) any number of constants from the {@see DataBasis} class
* @param string[]|null $specialConditions (optional) any number of constants from the {@see DataSpecialCondition} class
* @param string[]|null $purposes (optional) any number of constants from the {@see DataPurpose} class
* @param string|null $requirement (optional) one of the constants from the {@see DataRequirement} class
* @param callable|null $init (optional) a callback that receives the new instance and may initialize it
*/
public function __construct($title, $description = null, array $bases = null, array $specialConditions = null, array $purposes = null, $requirement = null, callable $init = null) {
$this->title = (string) $title;
$this->description = ($description !== null) ? ((string) $description) : null;
$this->bases = ($bases !== null) ? ((array) $bases) : [];
$this->specialConditions = ($specialConditions !== null) ? ((array) $specialConditions) : [];
$this->purposes = ($purposes !== null) ? ((array) $purposes) : [];
$this->requirement = ($requirement !== null) ? ((string) $requirement) : DataRequirement::ALWAYS;
$this->dataElements = [];
if (\is_callable($init)) {
$init($this);
}
}
}
================================================
FILE: src/Data/DataPurpose.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Data;
use Delight\PrivacyPolicy\Throwable\UnexpectedDataPurposeError;
/** Purposes of data collection */
final class DataPurpose {
/**
* Information is collected for the technical administration, maintenance and support of the provided
* services and the overall information system
*
* Communication with the user via external channels outside of the provided services (e.g. via
* email, text message or phone call) is only covered if such communication is essential for the
* administration and security of the service
*
* Examples: authentication, logging, password reset email, two-factor authentication
*
* @var string
*/
const ADMINISTRATION = 'administration';
/**
* Information is collected to provide or enhance advertising that is displayed, rendered, played
* back or otherwise conveyed within the services
*
* Examples: Google AdSense, Facebook Ads, AdMob
*
* @var string
*/
const ADVERTISING = 'advertising';
/**
* Information is collected for the provision of customer service via direct replies to inquiries or
* questions by the user or via transactional information given to the user in connection with a
* specific order, request or other activity
*
* Examples: Contact form, order confirmation, email response
*
* @var string
*/
const CUSTOMER_SUPPORT = 'customer_support';
/**
* Information is collected for the fulfillment and support of the tasks or activities explicitly
* requested by the user, which may either be one-time procedures, recurring tasks or ongoing activities
*
* The user should have been informed in a clear and concise way about the nature and duration of the task
*
* Once the task has been completed, the data should be deleted by the service provider, unless other
* purposes have been claimed and explained to the user as such
*
* Examples: Shopping cart, order placement, product search, private messaging, public posts
*
* @var string
*/
const FULFILLMENT = 'fulfillment';
/**
* Information is collected to contact users for marketing or promotional purposes
*
* Examples: newsletters, notifications about new features or site updates, information about related products
*
* @var string
*/
const MARKETING = 'marketing';
/**
* Information is collected in order to personalize or tailor the content or the design of services
* to the (perceived) preferences of the user
*
* Personalization of advertising, especially when data is transmitted to third parties, is not covered
*
* Examples: selection of topics, related products, adjustments to user interface
*
* @var string
*/
const PERSONALIZATION = 'personalization';
/**
* Information is collected for research and analysis aimed at making general improvements to the services
* for all users through evaluations and reviews based on average results or average usage statistics
*
* Tracking, targeting or profiling individual users is not covered and should be regarded as marketing
* or personalization instead, whichever applies
*
* Examples: A/B testing, heat maps, traffic sources, analysis of demographics, bounce rates
*
* @var string
*/
const RESEARCH = 'research';
/**
* Converts an identifier to a human-readable description in natural language
*
* @param string $identifier one of the constants from this class
* @return string the description in natural language
* @throws UnexpectedDataPurposeError
*/
public static function toNaturalLanguage($identifier) {
switch ($identifier) {
case self::ADMINISTRATION:
return 'We use this information for the provision, maintenance and administration of our services and to monitor and protect the security of our services.';
case self::ADVERTISING:
return 'We use this information to provide meaningful and unobtrusive advertising to you.';
case self::CUSTOMER_SUPPORT:
return 'We use this information to provide customer service to you, to answer your questions and to communicate with you about your use of our services.';
case self::FULFILLMENT:
return 'We use this information to provide and fulfill the specific services that you explicitly request.';
case self::MARKETING:
return 'We use this information for marketing and promotional purposes.';
case self::PERSONALIZATION:
return 'We use this information to personalize our services for you and to adjust them to your preferences.';
case self::RESEARCH:
return 'We use this information to improve our services through research and analysis and to better understand how our services are used.';
default:
throw new UnexpectedDataPurposeError($identifier);
}
}
}
================================================
FILE: src/Data/DataRequirement.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Data;
use Delight\PrivacyPolicy\Throwable\UnexpectedDataRequirementError;
/** Specification of whether information is required and whether consent is needed */
final class DataRequirement {
/**
* Specifies that a service cannot be used without the collection of certain information
*
* @var string
*/
const ALWAYS = 'always';
/**
* Specifies that a service may be used without the collection of certain information
*
* The user must explicitly consent to the collection of the information in advance
*
* @var string
*/
const OPT_IN = 'optIn';
/**
* Specifies that a service may be used without the collection of certain information
*
* The user may withdraw their consent to the collection of the information retroactively
*
* @var string
*/
const OPT_OUT = 'optOut';
/**
* Converts an identifier to a boolean value indicating whether there is a requirement
*
* @param string $identifier one of the constants from this class
* @return bool
* @throws UnexpectedDataRequirementError
*/
public static function toBool($identifier) {
switch ($identifier) {
case self::ALWAYS:
return true;
case self::OPT_IN:
return false;
case self::OPT_OUT:
return false;
default:
throw new UnexpectedDataRequirementError($identifier);
}
}
/**
* Converts an identifier to a human-readable description in natural language
*
* @param string $identifier one of the constants from this class
* @return string the description in natural language
* @throws UnexpectedDataRequirementError
*/
public static function toNaturalLanguage($identifier) {
switch ($identifier) {
case self::ALWAYS:
return 'This information is required for the operation of our services and its collection is therefore a condition for your use of our services.';
case self::OPT_IN:
return 'This information is not required and you can use parts of our services without this information. You have to give your consent before we collect this data, but some features may not be available without.';
case self::OPT_OUT:
return 'This information is not required and you can use parts of our services without this information. You may withdraw your consent for our collection of this data, but some features may not be available without.';
default:
throw new UnexpectedDataRequirementError($identifier);
}
}
}
================================================
FILE: src/Data/DataSpecialCondition.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Data;
use Delight\PrivacyPolicy\Throwable\UnexpectedDataSpecialConditionError;
/** Conditions for the processing of special categories of personal data */
final class DataSpecialCondition {
/** @var string the special condition of archiving or research */
const ARCHIVING_OR_RESEARCH = 'archivingOrResearch';
/** @var string the special condition of employment and social security */
const EMPLOYMENT_AND_SOCIAL_SECURITY = 'employmentAndSocialSecurity';
/** @var string the special condition of explicit consent */
const EXPLICIT_CONSENT = 'explicitConsent';
/** @var string the special condition of a foundation, association or non-profit */
const FOUNDATION_ASSOCIATION_OR_NON_PROFIT = 'foundationAssociationOrNonProfit';
/** @var string the special condition of health and social care */
const HEALTH_AND_SOCIAL_CARE = 'healthAndSocialCare';
/** @var string the special condition of legal claims or judicial capacity */
const LEGAL_CLAIMS_OR_JUDICIAL_CAPACITY = 'legalClaimsOrJudicialCapacity';
/** @var string the special condition of public data */
const PUBLIC_DATA = 'publicData';
/** @var string the special condition of public health */
const PUBLIC_HEALTH = 'publicHealth';
/** @var string the special condition of substantial public interest */
const SUBSTANTIAL_PUBLIC_INTEREST = 'substantialPublicInterest';
/** @var string the special condition of vital interests */
const VITAL_INTERESTS = 'vitalInterests';
/**
* Converts an identifier to a human-readable description in natural language
*
* @param string $identifier one of the constants from this class
* @return string the description in natural language
* @throws UnexpectedDataSpecialConditionError
*/
public static function toNaturalLanguage($identifier) {
switch ($identifier) {
case self::ARCHIVING_OR_RESEARCH:
return 'archiving or research';
case self::EMPLOYMENT_AND_SOCIAL_SECURITY:
return 'employment and social security';
case self::EXPLICIT_CONSENT:
return 'explicit consent';
case self::FOUNDATION_ASSOCIATION_OR_NON_PROFIT:
return 'foundation, association or non-profit';
case self::HEALTH_AND_SOCIAL_CARE:
return 'health and social care';
case self::LEGAL_CLAIMS_OR_JUDICIAL_CAPACITY:
return 'legal claims or judicial capacity';
case self::PUBLIC_DATA:
return 'public data';
case self::PUBLIC_HEALTH:
return 'public health';
case self::SUBSTANTIAL_PUBLIC_INTEREST:
return 'substantial public interest';
case self::VITAL_INTERESTS:
return 'vital interests';
default:
throw new UnexpectedDataSpecialConditionError($identifier);
}
}
/**
* Converts an identifier to a legal reference in natural language
*
* @param string $identifier one of the constants from this class
* @return string the legal reference in natural language
* @throws UnexpectedDataSpecialConditionError
*/
public static function toLegalReference($identifier) {
switch ($identifier) {
case self::ARCHIVING_OR_RESEARCH:
return 'Processing is necessary for archiving purposes in the public interest, scientific or historical research purposes or statistical purposes (EU, General Data Protection Regulation (GDPR), Article 9(2)(j)).';
case self::EMPLOYMENT_AND_SOCIAL_SECURITY:
return 'Processing is necessary for the purposes of carrying out obligations and exercising specific rights in the field of employment and social security and social protection law (EU, General Data Protection Regulation (GDPR), Article 9(2)(b)).';
case self::EXPLICIT_CONSENT:
return 'You have given explicit consent to the processing of your personal data for one or more specified purposes (EU, General Data Protection Regulation (GDPR), Article 9(2)(a)).';
case self::FOUNDATION_ASSOCIATION_OR_NON_PROFIT:
return 'Processing is carried out by a foundation, association or any other not-for-profit body with a political, philosophical, religious or trade union aim and on condition that the processing relates solely to the members or to former members of the body or to persons who have regular contact with it (EU, General Data Protection Regulation (GDPR), Article 9(2)(d)).';
case self::HEALTH_AND_SOCIAL_CARE:
return 'Processing is necessary for the purposes of preventive or occupational medicine, for the assessment of the working capacity of the employee, medical diagnosis, the provision of health or social care or treatment or the management of health or social care systems and services (EU, General Data Protection Regulation (GDPR), Article 9(2)(h)).';
case self::LEGAL_CLAIMS_OR_JUDICIAL_CAPACITY:
return 'Processing is necessary for the establishment, exercise or defence of legal claims or for a court acting in its judicial capacity (EU, General Data Protection Regulation (GDPR), Article 9(2)(f)).';
case self::PUBLIC_DATA:
return 'Processing relates to personal data that you manifestly make public (EU, General Data Protection Regulation (GDPR), Article 9(2)(e)).';
case self::PUBLIC_HEALTH:
return 'Processing is necessary for reasons of public interest in the area of public health, such as protecting against serious cross-border threats to health or ensuring high standards of quality and safety of health care and of medicinal products or medical devices (EU, General Data Protection Regulation (GDPR), Article 9(2)(i)).';
case self::SUBSTANTIAL_PUBLIC_INTEREST:
return 'Processing is necessary for reasons of substantial public interest (EU, General Data Protection Regulation (GDPR), Article 9(2)(g)).';
case self::VITAL_INTERESTS:
return 'Processing is necessary to protect your vital interests or those of another natural person where you are physically or legally incapable of giving consent (EU, General Data Protection Regulation (GDPR), Article 9(2)(c)).';
default:
throw new UnexpectedDataSpecialConditionError($identifier);
}
}
}
================================================
FILE: src/Data/DataType.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Data;
use Delight\PrivacyPolicy\Throwable\UnexpectedDataTypeError;
/** Types of individual data elements collected from the user */
final class DataType {
/** @var string the version of the application that has been used by the user for their access */
const ACCESS_APP_VERSION = 'access.app.version';
/** @var string the date and time of each individual access by the user (e.g. as stored in the access logs) */
const ACCESS_DATETIME = 'access.datetime';
/** @var string the date of each individual access by the user (e.g. as stored in the access logs) */
const ACCESS_DATETIME_DATE = 'access.datetime.date';
/** @var string the time of each individual access by the user (e.g. as stored in the access logs) */
const ACCESS_DATETIME_TIME = 'access.datetime.time';
/** @var string whether the device used for the access supports file uploads */
const ACCESS_DEVICE_FEATURES_FILE_UPLOAD = 'access.device.features.file_upload';
/** @var string the date and/or time of the first individual access by the user */
const ACCESS_FIRST_TIME = 'access.first.time';
/** @var string the HTTP request method of each individual access by the user (e.g. as stored in the access logs) */
const ACCESS_HTTP_METHOD = 'access.http.method';
/** @var string the HTTP status code of each individual access by the user (e.g. as stored in the access logs) */
const ACCESS_HTTP_STATUS = 'access.http.status';
/** @var string the Internet Protocol (IP) address of the user for each individual access (e.g. as stored in the access logs) */
const ACCESS_IP_ADDRESS = 'access.ip.address';
/** @var string the Internet Protocol (IP) address of the user for each individual access with its precision reduced to 25% (e.g. as stored in the access logs) */
const ACCESS_IP_ADDRESS_25_PERCENT = 'access.ip.address.25_percent';
/** @var string the Internet Protocol (IP) address of the user for each individual access with its precision reduced to 50% (e.g. as stored in the access logs) */
const ACCESS_IP_ADDRESS_50_PERCENT = 'access.ip.address.50_percent';
/** @var string the Internet Protocol (IP) address of the user for each individual access with its precision reduced to 75% (e.g. as stored in the access logs) */
const ACCESS_IP_ADDRESS_75_PERCENT = 'access.ip.address.75_percent';
/** @var string the referring site (or individual page) of the user for each individual access (e.g. as stored in the access logs) */
const ACCESS_REFERER = 'access.referer';
/** @var string the amount of data transferred (usually the number of bytes sent or received) for each individual access by the user (e.g. as stored in the access logs) */
const ACCESS_SIZE = 'access.size';
/** @var string the requested URL for each individual access by the user (e.g. as stored in the access logs) */
const ACCESS_URL = 'access.url';
/** @var string the user-agent string of the user for each individual access (e.g. as stored in the access logs) */
const ACCESS_USERAGENT_STRING = 'access.useragent.string';
/** @var string the date and/or time when billing has been cancelled */
const BILLING_CANCELLATION_TIME = 'billing.cancellation.time';
/** @var string the date and/or time when billing has ended or will end */
const BILLING_END_TIME = 'billing.end.time';
/** @var string whether a free trial is currently active */
const BILLING_FREE_TRIAL = 'billing.free_trial';
/** @var string an identification number with an external payment service provider */
const BILLING_ID_PAYMENT_SERVICE_PROVIDER = 'billing.id.payment_service_provider';
/** @var string the date and/or time when billing options have most recently been modified */
const BILLING_MODIFICATION_TIME = 'billing.modification.time';
/** @var string the date and/or time of the next (scheduled) payment */
const BILLING_NEXT_PAYMENT_TIME = 'billing.next_payment.time';
/** @var string whether there are payments past due at the moment */
const BILLING_PAST_DUE = 'billing.past_due';
/** @var string the plan or package that has been chosen and is used for billing */
const BILLING_PLAN = 'billing.plan';
/** @var string the date and/or time when billing has started */
const BILLING_START_TIME = 'billing.start.time';
/** @var string the date and time of an event in the calendar of the user */
const CALENDAR_EVENT_DATETIME = 'calendar.event.datetime';
/** @var string the date of an event in the calendar of the user */
const CALENDAR_EVENT_DATETIME_DATE = 'calendar.event.datetime.date';
/** @var string the time of an event in the calendar of the user */
const CALENDAR_EVENT_DATETIME_TIME = 'calendar.event.datetime.time';
/** @var string the title of an event in the calendar of the user */
const CALENDAR_EVENT_TITLE = 'calendar.event.title';
/** @var string the type of an event in the calendar of the user */
const CALENDAR_EVENT_TYPE = 'calendar.event.type';
/** @var string diagnostics data relating to the client application of the user */
const CLIENT_DIAGNOSTICS = 'client.diagnostics';
/** @var string the energy usage in the client application of the user */
const CLIENT_DIAGNOSTICS_ENERGY_USAGE = 'client.diagnostics.energy_usage';
/** @var string data on errors in the client application of the user */
const CLIENT_DIAGNOSTICS_ERRORS = 'client.diagnostics.errors';
/** @var string error logs from the client application of the user */
const CLIENT_DIAGNOSTICS_ERRORS_LOGS = 'client.diagnostics.errors.logs';
/** @var string the error rate in the client application of the user */
const CLIENT_DIAGNOSTICS_ERRORS_RATE = 'client.diagnostics.errors.rate';
/** @var string the frame rate in the client application of the user */
const CLIENT_DIAGNOSTICS_FRAME_RATE = 'client.diagnostics.frame_rate';
/** @var string timing data from the client application of the user */
const CLIENT_DIAGNOSTICS_TIMING = 'client.diagnostics.timing';
/** @var string data on the user's activity within the client application */
const CLIENT_INTERACTIONS = 'client.interactions';
/** @var string data on the user's clicks or taps within the client application */
const CLIENT_INTERACTIONS_CLICKS_OR_TAPS = 'client.interactions.clicks_or_taps';
/** @var string the number of sessions by the user within the client application */
const CLIENT_INTERACTIONS_SESSIONS = 'client.interactions.sessions';
/** @var string the number of views by the user within the client application */
const CLIENT_INTERACTIONS_VIEWS = 'client.interactions.views';
/** @var string the number of visits by the user within the client application */
const CLIENT_INTERACTIONS_VISITS = 'client.interactions.visits';
/** @var string the physical address of one of the user's contacts */
const CONTACT_ADDRESS = 'contact.address';
/** @var string the country as part of the physical address of one of the user's contacts */
const CONTACT_ADDRESS_COUNTRY = 'contact.address.country';
/** @var string the locality (usually the city) as part of the physical address of one of the user's contacts */
const CONTACT_ADDRESS_LOCALITY = 'contact.address.locality';
/** @var string the location of a building or apartment (usually including the street, the street or house number, and potentially the apartment number) within a locality as part of the physical address of one of the user's contacts */
const CONTACT_ADDRESS_PLACE = 'contact.address.place';
/** @var string the postal code as part of the physical address of one of the user's contacts */
const CONTACT_ADDRESS_POSTAL_CODE = 'contact.address.postal_code';
/** @var string the region (often the state or province) as part of the physical address of one of the user's contacts */
const CONTACT_ADDRESS_REGION = 'contact.address.region';
/** @var string the complete date of birth of one of the user's contacts */
const CONTACT_BIRTH_DATE = 'contact.birth.date';
/** @var string the month and day of the date of birth of one of the user's contacts */
const CONTACT_BIRTH_DATE_MONTH_DAY = 'contact.birth.date.md';
/** @var string the year of the date of birth of one of the user's contacts */
const CONTACT_BIRTH_DATE_YEAR = 'contact.birth.date.y';
/** @var string the year and month of the date of birth of one of the user's contacts */
const CONTACT_BIRTH_DATE_YEAR_MONTH = 'contact.birth.date.ym';
/** @var string the department of one of the user's contacts within their company */
const CONTACT_COMPANY_DEPARTMENT = 'contact.company.department';
/** @var string the name of the company of one of the user's contacts */
const CONTACT_COMPANY_NAME = 'contact.company.name';
/** @var string the date and/or time the contact has been created */
const CONTACT_CREATION_TIME = 'contact.creation.time';
/** @var string the email address of one of the user's contacts */
const CONTACT_EMAIL = 'contact.email';
/** @var string the fax number of one of the user's contacts */
const CONTACT_FAX = 'contact.fax';
/** @var string the identifying number or ID (e.g. IBAN) of the bank account of one of the user's contacts */
const CONTACT_FINANCIAL_BANK_ACCOUNT_ID = 'contact.financial.bank.account.id';
/** @var string the identifying number or ID (e.g. BIC) of the bank or financial institute of one of the user's contacts */
const CONTACT_FINANCIAL_BANK_ID = 'contact.financial.bank.id';
/** @var string the name of the bank or financial institute of one of the user's contacts */
const CONTACT_FINANCIAL_BANK_NAME = 'contact.financial.bank.name';
/** @var string the gender of one of the user's contacts */
const CONTACT_GENDER = 'contact.gender';
/** @var string the value-added tax (VAT) identification number (IN) (VATIN) of a contact in the European Union */
const CONTACT_IDENTIFIERS_EU_VAT_IN = 'contact.identifiers.eu.vat.in';
/** @var string the date and/or time the contact has most recently been modified */
const CONTACT_MODIFICATION_TIME = 'contact.modification.time';
/** @var string the name of one of the user's contacts */
const CONTACT_NAME = 'contact.name';
/** @var string the alias, nickname or username of one of the user's contacts */
const CONTACT_NAME_ALIAS = 'contact.name.alias';
/** @var string the family name of one of the user's contacts */
const CONTACT_NAME_FAMILY = 'contact.name.family';
/** @var string the given name of one of the user's contacts */
const CONTACT_NAME_GIVEN = 'contact.name.given';
/** @var string the date and/or time of the contact's original message */
const CONTACT_ORIGINAL_MESSAGE_TIME = 'contact.original_message.time';
/** @var string the phone number of one of the user's contacts */
const CONTACT_PHONE = 'contact.phone';
/** @var string the landline phone number of one of the user's contacts */
const CONTACT_PHONE_HOME = 'contact.phone.home';
/** @var string the mobile phone number of one of the user's contacts */
const CONTACT_PHONE_MOBILE = 'contact.phone.mobile';
/** @var string the contact's reference as a number or as text */
const CONTACT_REFERENCE = 'contact.reference';
/** @var string the URL of the website of one of the user's contacts */
const CONTACT_WEBSITE_URL = 'contact.website.url';
/** @var string the price, cost or other monetary amount of one of the user's contracts per billing cycle */
const CONTRACT_BILLING_AMOUNT = 'contract.billing.amount';
/** @var string the billing cycle of one of the user's contracts */
const CONTRACT_BILLING_CYCLE = 'contract.billing.cycle';
/** @var string the cancellation period of one of the user's contracts */
const CONTRACT_CANCELLATION_PERIOD = 'contract.cancellation.period';
/** @var string the date and/or time the contract has been cancelled */
const CONTRACT_CANCELLATION_TIME = 'contract.cancellation.time';
/** @var string the date and/or time the contract has been created */
const CONTRACT_CREATION_TIME = 'contract.creation.time';
/** @var string the date and/or time the contract has most recently been modified */
const CONTRACT_MODIFICATION_TIME = 'contract.modification.time';
/** @var string any custom notes pertaining to one of the user's contracts */
const CONTRACT_NOTES = 'contract.notes';
/** @var string the contractual partner or (second) contracting party of one of the user's contracts */
const CONTRACT_PARTNER = 'contract.partner';
/** @var string the end date of a period of one of the user's contracts */
const CONTRACT_PERIOD_END = 'contract.period.end';
/** @var string the term of extension on (automatic) renewal of one of the user's contracts */
const CONTRACT_PERIOD_EXTENSION = 'contract.period.extension';
/** @var string the start date of a period of one of the user's contracts */
const CONTRACT_PERIOD_START = 'contract.period.start';
/** @var string the customer number */
const CUSTOMER_NUMBER = 'customer.number';
/** @var string the brand and version of the web browser on one of the user's devices */
const DEVICE_BROWSER = 'device.browser';
/** @var string the brand of the web browser on one of the user's devices */
const DEVICE_BROWSER_BRAND = 'device.browser.brand';
/** @var string the version of the web browser on one of the user's devices */
const DEVICE_BROWSER_VERSION = 'device.browser.version';
/** @var string the primary time zone that one of the user's devices is configured for */
const DEVICE_DATETIME_TIME_ZONE = 'device.datetime.time_zone';
/** @var string diagnostics data relating to the device of the user */
const DEVICE_DIAGNOSTICS = 'device.diagnostics';
/** @var string data on energy relating to the device of the user */
const DEVICE_DIAGNOSTICS_ENERGY = 'device.diagnostics.energy';
/** @var string the energy level of the device of the user */
const DEVICE_DIAGNOSTICS_ENERGY_LEVEL = 'device.diagnostics.energy.level';
/** @var string the energy source for the device of the user */
const DEVICE_DIAGNOSTICS_ENERGY_SOURCE = 'device.diagnostics.energy.source';
/** @var string a unique identifier of the user's device */
const DEVICE_ID = 'device.id';
/** @var string the International Mobile Equipment Identity (IMEI) of the user's device */
const DEVICE_ID_IMEI = 'device.id.imei';
/** @var string the MAC address of the user's device */
const DEVICE_ID_MAC_ADDRESS = 'device.id.mac_address';
/** @var string a unique identifier of one of the user's devices that remains constant for the lifetime of the device (e.g. "Android ID") */
const DEVICE_ID_PERMANENT = 'device.id.permanent';
/** @var string a unique identifier of one of the user's devices that can be reset by the user at any time (e.g. "Android Advertising ID" or "Apple Advertising Identifier") */
const DEVICE_ID_RESETTABLE = 'device.id.resettable';
/** @var string the preferred language that one of the user's devices is configured for */
const DEVICE_LANGUAGE = 'device.language';
/** @var string the approximate location of the user's device (e.g. city-level, IP-based) */
const DEVICE_LOCATION_APPROXIMATE = 'device.location.approximate';
/** @var string the precise location of the user's device (e.g. GPS-based) */
const DEVICE_LOCATION_PRECISE = 'device.location.precise';
/** @var string the manufacturer of one of the user's devices */
const DEVICE_MANUFACTURER = 'device.manufacturer';
/** @var string the model name of one of the user's devices */
const DEVICE_MODEL = 'device.model';
/** @var string the brand and version of the operating system (OS) on one of the user's devices */
const DEVICE_OS = 'device.os';
/** @var string the brand of the operating system (OS) on one of the user's devices */
const DEVICE_OS_BRAND = 'device.os.brand';
/** @var string the version of the operating system (OS) on one of the user's devices */
const DEVICE_OS_VERSION = 'device.os.version';
/** @var string the hidden list of additional (concealed) recipients of an email other than the primary recipient(s) */
const EMAIL_BCC = 'email.bcc';
/** @var string the message body or actual text of an email */
const EMAIL_BODY = 'email.body';
/** @var string the list of additional recipients of an email other than the primary recipient(s) */
const EMAIL_CC = 'email.cc';
/** @var string the date and time (written) of an email */
const EMAIL_DATETIME = 'email.datetime';
/** @var string the date (written) of an email */
const EMAIL_DATETIME_DATE = 'email.datetime.date';
/** @var string the time (written) of an email */
const EMAIL_DATETIME_TIME = 'email.datetime.time';
/** @var string the email address of the sender of an email */
const EMAIL_FROM = 'email.from';
/** @var string the email address of the sender of an email designated to receive replies */
const EMAIL_REPLY_TO = 'email.reply_to';
/** @var string the email address of the sender of an email designated to receive undeliverable messages */
const EMAIL_RETURN_PATH = 'email.return_path';
/** @var string the subject of an email */
const EMAIL_SUBJECT = 'email.subject';
/** @var string the email address of the recipient(s) of an email */
const EMAIL_TO = 'email.to';
/** @var string the contents of a document or file */
const FILE_CONTENTS = 'file.contents';
/** @var string the (original) filename of a document or file as found on the user's device */
const FILE_NAME = 'file.name';
/** @var string the size of a document or file */
const FILE_SIZE = 'file.size';
/** @var string the (total) gross amount on one of the user's invoices */
const INVOICE_AMOUNT_GROSS = 'invoice.amount.gross';
/** @var string the (total) net amount on one of the user's invoices */
const INVOICE_AMOUNT_NET = 'invoice.amount.net';
/** @var string the date and/or time the invoice has been created */
const INVOICE_CREATION_TIME = 'invoice.creation.time';
/** @var string the customer number for one of the user's invoices */
const INVOICE_CUSTOMER_NUMBER = 'invoice.customer.number';
/** @var string the written date of one of the user's invoices */
const INVOICE_DATETIME_DATE = 'invoice.datetime.date';
/** @var string the discount applied on one of the user's invoices */
const INVOICE_DISCOUNT = 'invoice.discount';
/** @var string the fulfillment period relating to one of the user's invoices */
const INVOICE_FULFILLMENT_PERIOD = 'invoice.fulfillment.period';
/** @var string the description of an item on one of the user's invoices */
const INVOICE_ITEM_DESCRIPTION = 'invoice.item.description';
/** @var string the discount applied on an item on one of the user's invoices */
const INVOICE_ITEM_DISCOUNT = 'invoice.item.discount';
/** @var string the (individual) gross price of an item on one of the user's invoices */
const INVOICE_ITEM_PRICE_GROSS = 'invoice.item.price.gross';
/** @var string the (individual) net price of an item on one of the user's invoices */
const INVOICE_ITEM_PRICE_NET = 'invoice.item.price.net';
/** @var string the quantity of an item on one of the user's invoices */
const INVOICE_ITEM_QUANTITY = 'invoice.item.quantity';
/** @var string the type, rate and amount of taxes on an item on one of the user's invoices */
const INVOICE_ITEM_TAXES = 'invoice.item.taxes';
/** @var string the message on one of the user's invoices */
const INVOICE_MESSAGE = 'invoice.message';
/** @var string the date and/or time the invoice has most recently been modified */
const INVOICE_MODIFICATION_TIME = 'invoice.modification.time';
/** @var string any custom notes pertaining to one of the user's invoices */
const INVOICE_NOTES = 'invoice.notes';
/** @var string the invoice number of one of the user's invoices */
const INVOICE_NUMBER = 'invoice.number';
/** @var string the date and time when the invoice has been paid */
const INVOICE_PAYMENT_DATETIME = 'invoice.payment.datetime';
/** @var string the terms for the payment of one of the user's invoices */
const INVOICE_PAYMENT_TERMS = 'invoice.payment.terms';
/** @var string the recipient of one of the user's invoices */
const INVOICE_RECIPIENT = 'invoice.recipient';
/** @var string the date and time when the invoice has been refunded */
const INVOICE_REFUND_DATETIME = 'invoice.refund.datetime';
/** @var string the date and time when a reminder was sent for the invoice */
const INVOICE_REMINDER_DATETIME = 'invoice.reminder.datetime';
/** @var string the type, rate and amount of taxes on one of the user's invoices */
const INVOICE_TAXES = 'invoice.taxes';
/** @var string the message body or actual text of a letter */
const LETTER_BODY = 'letter.body';
/** @var string the note about additional recipients of a letter */
const LETTER_CC = 'letter.cc';
/** @var string the date and/or time the letter has been created */
const LETTER_CREATION_TIME = 'letter.creation.time';
/** @var string the date and time (written) of a letter */
const LETTER_DATETIME = 'letter.datetime';
/** @var string the date (written) of a letter */
const LETTER_DATETIME_DATE = 'letter.datetime.date';
/** @var string the time (written) of a letter */
const LETTER_DATETIME_TIME = 'letter.datetime.time';
/** @var string the list of enclosures of a letter */
const LETTER_ENCLOSURES = 'letter.enclosures';
/** @var string the headline or title of a letter */
const LETTER_HEADLINE = 'letter.headline';
/** @var string whether the letter has been the first one */
const LETTER_IS_FIRST = 'letter.is_first';
/** @var string whether the letter is for personal matters or for business matters */
const LETTER_MATTER_PERSONAL_OR_BUSINESS = 'letter.matter.personal_or_business';
/** @var string the date and/or time the letter has most recently been modified */
const LETTER_MODIFICATION_TIME = 'letter.modification.time';
/** @var string the postscript ("PS") to a letter */
const LETTER_PS = 'letter.ps';
/** @var string the salutation of the letter */
const LETTER_SALUTATION = 'letter.salutation';
/** @var string the subject of a letter */
const LETTER_SUBJECT = 'letter.subject';
/** @var string the valediction of the letter */
const LETTER_VALEDICTION = 'letter.valediction';
/** @var string the access privileges granted to the user */
const USER_ACCESS_PRIVILEGES = 'user.access.privileges';
/** @var string the physical address of the user */
const USER_ADDRESS = 'user.address';
/** @var string the country as part of the physical address of the user */
const USER_ADDRESS_COUNTRY = 'user.address.country';
/** @var string the locality (usually the city) as part of the physical address of the user */
const USER_ADDRESS_LOCALITY = 'user.address.locality';
/** @var string the location of a building or apartment (usually including the street, the street or house number, and potentially the apartment number) within a locality as part of the physical address of the user */
const USER_ADDRESS_PLACE = 'user.address.place';
/** @var string the postal code as part of the physical address of the user */
const USER_ADDRESS_POSTAL_CODE = 'user.address.postal_code';
/** @var string the region (often the state or province) as part of the physical address of the user */
const USER_ADDRESS_REGION = 'user.address.region';
/** @var string the complete date of birth of the user */
const USER_BIRTH_DATE = 'user.birth.date';
/** @var string the month and day of the date of birth of the user */
const USER_BIRTH_DATE_MONTH_DAY = 'user.birth.date.md';
/** @var string the year of the date of birth of the user */
const USER_BIRTH_DATE_YEAR = 'user.birth.date.y';
/** @var string the year and month of the date of birth of the user */
const USER_BIRTH_DATE_YEAR_MONTH = 'user.birth.date.ym';
/** @var string the place of birth of the user */
const USER_BIRTH_PLACE = 'user.birth.place';
/** @var string the blood group or blood type of the user */
const USER_BLOOD_GROUP = 'user.blood.group';
/** @var string the entry of the user's company in the commercial register */
const USER_COMPANY_COMMERCIAL_REGISTER_ENTRY = 'user.company.commercial_register.entry';
/** @var string the department of the user within their company */
const USER_COMPANY_DEPARTMENT = 'user.company.department';
/** @var string the members of the executive board of the user's company */
const USER_COMPANY_EXECUTIVE_BOARD_MEMBERS = 'user.company.executive_board.members';
/** @var string the logo of the company of the user */
const USER_COMPANY_LOGO = 'user.company.logo';
/** @var string the date and/or time the logo of the user's company has been created */
const USER_COMPANY_LOGO_CREATION_TIME = 'user.company.logo.creation.time';
/** @var string the label for the logo of the user's company */
const USER_COMPANY_LOGO_LABEL = 'user.company.logo.label';
/** @var string the date and/or time the logo of the user's company has most recently been modified */
const USER_COMPANY_LOGO_MODIFICATION_TIME = 'user.company.logo.modification.time';
/** @var string the members of the management of the user's company */
const USER_COMPANY_MANAGEMENT_MEMBERS = 'user.company.management.members';
/** @var string the name of the company of the user */
const USER_COMPANY_NAME = 'user.company.name';
/** @var string the members of the supervisory board of the user's company */
const USER_COMPANY_SUPERVISORY_BOARD_MEMBERS = 'user.company.supervisory_board.members';
/** @var string the user's country */
const USER_COUNTRY = 'user.country';
/** @var string the email address of the user */
const USER_EMAIL = 'user.email';
/** @var string whether the user's email address has been verified */
const USER_EMAIL_VERIFIED = 'user.email.verified';
/** @var string the fax number of the user */
const USER_FAX = 'user.fax';
/** @var string the identifying number or ID (e.g. IBAN) of the bank account of the user */
const USER_FINANCIAL_BANK_ACCOUNT_ID = 'user.financial.bank.account.id';
/** @var string the identifying number or ID (e.g. BIC) of the bank or financial institute of the user */
const USER_FINANCIAL_BANK_ID = 'user.financial.bank.id';
/** @var string the name of the bank or financial institute of the user */
const USER_FINANCIAL_BANK_NAME = 'user.financial.bank.name';
/** @var string the brand name (e.g. MasterCard or VISA) of a credit card of the user */
const USER_FINANCIAL_CREDIT_CARD_BRAND = 'user.financial.credit_card.brand';
/** @var string the verification code (CVC), verification value (CVV), security code (CSC) or other verification number of a credit card of the user */
const USER_FINANCIAL_CREDIT_CARD_CVC = 'user.financial.credit_card.cvc';
/** @var string the expiration date of a credit card of the user */
const USER_FINANCIAL_CREDIT_CARD_EXPIRATION = 'user.financial.credit_card.expiration';
/** @var string the number of a credit card of the user */
const USER_FINANCIAL_CREDIT_CARD_NUMBER = 'user.financial.credit_card.number';
/** @var string the history of purchases made by the user */
const USER_FINANCIAL_PURCHASE_HISTORY = 'user.financial.purchase_history';
/** @var string the gender of the user */
const USER_GENDER = 'user.gender';
/** @var string the geographical coordinates of the user */
const USER_GEO_COORDINATES = 'user.geo.coordinates';
/** @var string the height of the user */
const USER_HEIGHT = 'user.height';
/** @var string the ID of one of the user's (online or offline) accounts */
const USER_IDENTIFIERS_ACCOUNT_ID = 'user.identifiers.account.id';
/** @var string the name of one of the user's (online or offline) accounts */
const USER_IDENTIFIERS_ACCOUNT_NAME = 'user.identifiers.account.name';
/** @var string the type of one of the user's (online or offline) accounts */
const USER_IDENTIFIERS_ACCOUNT_TYPE = 'user.identifiers.account.type';
/** @var string the "steuerliche Identifikationsnummer" ("Steuer-IdNr.") of the user in Germany */
const USER_IDENTIFIERS_DEU_ST_IDNR = 'user.identifiers.deu.st_idnr';
/** @var string the "Steuernummer" or "Steuer-Identnummer" ("St.-Nr.") of the user in Germany */
const USER_IDENTIFIERS_DEU_ST_NR = 'user.identifiers.deu.st_nr';
/** @var string the value-added tax (VAT) identification number (IN) (VATIN) of the user in the European Union */
const USER_IDENTIFIERS_EU_VAT_IN = 'user.identifiers.eu.vat.in';
/** @var string the "Social Security number" (SSN) of the user in the United States of America */
const USER_IDENTIFIERS_USA_SSN = 'user.identifiers.usa.ssn';
/** @var string the Internet Protocol (IP) address of the user */
const USER_IP_ADDRESS = 'user.ip.address';
/** @var string the Internet Protocol (IP) address of the user with its precision reduced to 25% */
const USER_IP_ADDRESS_25_PERCENT = 'user.ip.address.25_percent';
/** @var string the Internet Protocol (IP) address of the user with its precision reduced to 50% */
const USER_IP_ADDRESS_50_PERCENT = 'user.ip.address.50_percent';
/** @var string the Internet Protocol (IP) address of the user with its precision reduced to 75% */
const USER_IP_ADDRESS_75_PERCENT = 'user.ip.address.75_percent';
/** @var string the date and time of the (last) login of the user */
const USER_LOGIN_DATETIME = 'user.login.datetime';
/** @var string the date of the (last) login of the user */
const USER_LOGIN_DATETIME_DATE = 'user.login.datetime.date';
/** @var string the time of the (last) login of the user */
const USER_LOGIN_DATETIME_TIME = 'user.login.datetime.time';
/** @var string the name of the user */
const USER_NAME = 'user.name';
/** @var string the alias, nickname or username of the user */
const USER_NAME_ALIAS = 'user.name.alias';
/** @var string the family name of the user */
const USER_NAME_FAMILY = 'user.name.family';
/** @var string the given name of the user */
const USER_NAME_GIVEN = 'user.name.given';
/** @var string any custom notes saved by the user */
const USER_NOTES = 'user.notes';
/** @var string the occupation of the user */
const USER_OCCUPATION = 'user.occupation';
/** @var string the current occupation of the user */
const USER_OCCUPATION_CURRENT = 'user.occupation.current';
/** @var string the preferred occupation of the user */
const USER_OCCUPATION_PREFERRED = 'user.occupation.preferred';
/** @var string the password of the user as cleartext */
const USER_PASSWORD_CLEARTEXT = 'user.password.cleartext';
/** @var string the password of the user hashed using a well-known hashing algorithm that is accepted as such in the industry */
const USER_PASSWORD_HASHED = 'user.password.hashed';
/** @var string the password of the user hashed using an algorithm and configuration (cf. number of rounds) currently regarded as strong in the industry (e.g. Argon2, bcrypt, scrypt) */
const USER_PASSWORD_HASHED_STRONG = 'user.password.hashed.strong';
/** @var string whether password resets are permitted for the user */
const USER_PASSWORD_RESETTABLE = 'user.password.resettable';
/** @var string the phone number of the user */
const USER_PHONE = 'user.phone';
/** @var string the landline phone number of the user */
const USER_PHONE_HOME = 'user.phone.home';
/** @var string the mobile phone number of the user */
const USER_PHONE_MOBILE = 'user.phone.mobile';
/** @var string the primary picture of the user (e.g. portrait or profile picture) */
const USER_PICTURE = 'user.picture';
/** @var string the user's reference as a number or as text */
const USER_REFERENCE = 'user.reference';
/** @var string the date and time of the registration of the user */
const USER_REGISTRATION_DATETIME = 'user.registration.datetime';
/** @var string the date of the registration of the user */
const USER_REGISTRATION_DATETIME_DATE = 'user.registration.datetime.date';
/** @var string the time of the registration of the user */
const USER_REGISTRATION_DATETIME_TIME = 'user.registration.datetime.time';
/** @var string the signature of the user */
const USER_SIGNATURE = 'user.signature';
/** @var string the date and/or time the user's signature has been created */
const USER_SIGNATURE_CREATION_TIME = 'user.signature.creation.time';
/** @var string the signature of the user digitally drawn on their device */
const USER_SIGNATURE_DRAWN = 'user.signature.drawn';
/** @var string the handwritten signature of the user */
const USER_SIGNATURE_HANDWRITTEN = 'user.signature.handwritten';
/** @var string the label for the user's signature */
const USER_SIGNATURE_LABEL = 'user.signature.label';
/** @var string the date and/or time the user's signature has most recently been modified */
const USER_SIGNATURE_MODIFICATION_TIME = 'user.signature.modification.time';
/** @var string the URL of the website of the user */
const USER_WEBSITE_URL = 'user.website.url';
/** @var string the weight of the user */
const USER_WEIGHT = 'user.weight';
/** @var string the color of one of the user's vehicles */
const VEHICLE_COLOR = 'vehicle.color';
/** @var string the place of construction of one of the user's vehicles */
const VEHICLE_CONSTRUCTION_PLACE = 'vehicle.construction.place';
/** @var string the year of construction of one of the user's vehicles */
const VEHICLE_CONSTRUCTION_YEAR = 'vehicle.construction.date.y';
/** @var string the make of one of the user's vehicles */
const VEHICLE_MAKE = 'vehicle.make';
/** @var string the model name of one of the user's vehicles */
const VEHICLE_MODEL = 'vehicle.model';
/** @var string any custom notes pertaining to one of the user's vehicles */
const VEHICLE_NOTES = 'vehicle.notes';
/** @var string the registration plate number of one of the user's vehicles */
const VEHICLE_REGISTRATION_PLATE_NUMBER = 'vehicle.registration.plate.number';
/**
* Converts an identifier to a human-readable title in natural language
*
* @param string $identifier one of the constants from this class
* @return string the title in natural language
* @throws UnexpectedDataTypeError
*/
public static function toNaturalLanguage($identifier) {
switch ($identifier) {
case self::ACCESS_APP_VERSION: return 'Version of application used for access';
case self::ACCESS_DATETIME: return 'Date and time for each access';
case self::ACCESS_DATETIME_DATE: return 'Date for each access';
case self::ACCESS_DATETIME_TIME: return 'Time for each access';
case self::ACCESS_DEVICE_FEATURES_FILE_UPLOAD: return 'Availability of file uploads';
case self::ACCESS_FIRST_TIME: return 'Time of first access';
case self::ACCESS_HTTP_METHOD: return 'HTTP request method for each access';
case self::ACCESS_HTTP_STATUS: return 'HTTP status code for each access';
case self::ACCESS_IP_ADDRESS: return 'Internet Protocol (IP) address for each access';
case self::ACCESS_IP_ADDRESS_25_PERCENT: return 'Internet Protocol (IP) address for each access (reduced to 25%% precision)';
case self::ACCESS_IP_ADDRESS_50_PERCENT: return 'Internet Protocol (IP) address for each access (reduced to 50%% precision)';
case self::ACCESS_IP_ADDRESS_75_PERCENT: return 'Internet Protocol (IP) address for each access (reduced to 75%% precision)';
case self::ACCESS_REFERER: return 'Referring site (URL) for each access';
case self::ACCESS_SIZE: return 'Amount of data transferred for each access';
case self::ACCESS_URL: return 'Requested page (URL) for each access';
case self::ACCESS_USERAGENT_STRING: return 'User-agent string for each access';
case self::BILLING_CANCELLATION_TIME: return 'Time of cancellation';
case self::BILLING_END_TIME: return 'End of billing';
case self::BILLING_FREE_TRIAL: return 'Usage of free trial';
case self::BILLING_ID_PAYMENT_SERVICE_PROVIDER: return 'Identification number with external payment service provider';
case self::BILLING_MODIFICATION_TIME: return 'Time of last modification to billing options';
case self::BILLING_NEXT_PAYMENT_TIME: return 'Time of next payment';
case self::BILLING_PAST_DUE: return 'Payments past due';
case self::BILLING_PLAN: return 'Plan or package for billing';
case self::BILLING_START_TIME: return 'Start of billing';
case self::CALENDAR_EVENT_DATETIME: return 'Date and time of event in calendar';
case self::CALENDAR_EVENT_DATETIME_DATE: return 'Date of event in calendar';
case self::CALENDAR_EVENT_DATETIME_TIME: return 'Time of event in calendar';
case self::CALENDAR_EVENT_TITLE: return 'Title of event in calendar';
case self::CALENDAR_EVENT_TYPE: return 'Type of event in calendar';
case self::CLIENT_DIAGNOSTICS: return 'Diagnostics data for application';
case self::CLIENT_DIAGNOSTICS_ENERGY_USAGE: return 'Energy usage of application';
case self::CLIENT_DIAGNOSTICS_ERRORS: return 'Occurrences of errors in application';
case self::CLIENT_DIAGNOSTICS_ERRORS_LOGS: return 'Error logs from application';
case self::CLIENT_DIAGNOSTICS_ERRORS_RATE: return 'Error rate in application';
case self::CLIENT_DIAGNOSTICS_FRAME_RATE: return 'Frame rate in application';
case self::CLIENT_DIAGNOSTICS_TIMING: return 'Timing and performance of application';
case self::CLIENT_INTERACTIONS: return 'Interactions with application';
case self::CLIENT_INTERACTIONS_CLICKS_OR_TAPS: return 'Clicks or taps within application';
case self::CLIENT_INTERACTIONS_SESSIONS: return 'Sessions within application';
case self::CLIENT_INTERACTIONS_VIEWS: return 'Views within application';
case self::CLIENT_INTERACTIONS_VISITS: return 'Visits within application';
case self::CONTACT_ADDRESS: return 'Address of contact';
case self::CONTACT_ADDRESS_COUNTRY: return 'Country of contact';
case self::CONTACT_ADDRESS_LOCALITY: return 'City of contact';
case self::CONTACT_ADDRESS_PLACE: return 'Street name and house number of contact';
case self::CONTACT_ADDRESS_POSTAL_CODE: return 'Postal code of contact';
case self::CONTACT_ADDRESS_REGION: return 'State of contact';
case self::CONTACT_BIRTH_DATE: return 'Date of birth of contact';
case self::CONTACT_BIRTH_DATE_MONTH_DAY: return 'Month and day of birth of contact';
case self::CONTACT_BIRTH_DATE_YEAR: return 'Year of birth of contact';
case self::CONTACT_BIRTH_DATE_YEAR_MONTH: return 'Year and month of birth of contact';
case self::CONTACT_COMPANY_DEPARTMENT: return 'Department of contact within company';
case self::CONTACT_COMPANY_NAME: return 'Company name of contact';
case self::CONTACT_CREATION_TIME: return 'Time of creation of contact';
case self::CONTACT_EMAIL: return 'Email address of contact';
case self::CONTACT_FAX: return 'Fax number of contact';
case self::CONTACT_FINANCIAL_BANK_ACCOUNT_ID: return 'Bank account number of contact';
case self::CONTACT_FINANCIAL_BANK_ID: return 'Bank identifier of contact';
case self::CONTACT_FINANCIAL_BANK_NAME: return 'Bank name of contact';
case self::CONTACT_GENDER: return 'Gender of contact';
case self::CONTACT_IDENTIFIERS_EU_VAT_IN: return 'VAT ID (European Union) of contact';
case self::CONTACT_MODIFICATION_TIME: return 'Time of last modification to contact';
case self::CONTACT_NAME: return 'Name of contact';
case self::CONTACT_NAME_ALIAS: return 'Alias or username of contact';
case self::CONTACT_NAME_FAMILY: return 'Family name of contact';
case self::CONTACT_NAME_GIVEN: return 'Given name of contact';
case self::CONTACT_ORIGINAL_MESSAGE_TIME: return 'Time of original message of contact';
case self::CONTACT_PHONE: return 'Phone number of contact';
case self::CONTACT_PHONE_HOME: return 'Residential phone number of contact';
case self::CONTACT_PHONE_MOBILE: return 'Mobile phone number of contact';
case self::CONTACT_REFERENCE: return 'Reference of contact';
case self::CONTACT_WEBSITE_URL: return 'Website (URL) of contact';
case self::CONTRACT_BILLING_AMOUNT: return 'Billing amount of contract';
case self::CONTRACT_BILLING_CYCLE: return 'Billing cycle of contract';
case self::CONTRACT_CANCELLATION_PERIOD: return 'Cancellation period of contract';
case self::CONTRACT_CANCELLATION_TIME: return 'Time of cancellation of contract';
case self::CONTRACT_CREATION_TIME: return 'Time of creation of contract';
case self::CONTRACT_MODIFICATION_TIME: return 'Time of last modification to contract';
case self::CONTRACT_NOTES: return 'Custom notes on contract';
case self::CONTRACT_PARTNER: return 'Contractual partner';
case self::CONTRACT_PERIOD_END: return 'End of contract';
case self::CONTRACT_PERIOD_EXTENSION: return 'Contract duration after renewal';
case self::CONTRACT_PERIOD_START: return 'Start of contract';
case self::CUSTOMER_NUMBER: return 'Customer number';
case self::DEVICE_BROWSER: return 'Brand and version of web browser on device';
case self::DEVICE_BROWSER_BRAND: return 'Brand of web browser on device';
case self::DEVICE_BROWSER_VERSION: return 'Version of web browser on device';
case self::DEVICE_DATETIME_TIME_ZONE: return 'Time zone of device';
case self::DEVICE_DIAGNOSTICS: return 'Diagnostics data for device';
case self::DEVICE_DIAGNOSTICS_ENERGY: return 'Information relating to energy of device';
case self::DEVICE_DIAGNOSTICS_ENERGY_LEVEL: return 'Energy level on device';
case self::DEVICE_DIAGNOSTICS_ENERGY_SOURCE: return 'Energy source for device';
case self::DEVICE_ID: return 'Identifier of device';
case self::DEVICE_ID_IMEI: return 'IMEI of device';
case self::DEVICE_ID_MAC_ADDRESS: return 'MAC address of device';
case self::DEVICE_ID_PERMANENT: return 'Permanent identifier of device';
case self::DEVICE_ID_RESETTABLE: return 'Resettable identifier of device';
case self::DEVICE_LANGUAGE: return 'Language of device';
case self::DEVICE_LOCATION_APPROXIMATE: return 'Approximate location of device';
case self::DEVICE_LOCATION_PRECISE: return 'Precise location of device';
case self::DEVICE_MANUFACTURER: return 'Manufacturer of device';
case self::DEVICE_MODEL: return 'Model name of device';
case self::DEVICE_OS: return 'Brand and version of operating system on device';
case self::DEVICE_OS_BRAND: return 'Brand of operating system on device';
case self::DEVICE_OS_VERSION: return 'Version of operating system on device';
case self::EMAIL_BCC: return 'Email addresses in BCC line of email';
case self::EMAIL_BODY: return 'Message text of email';
case self::EMAIL_CC: return 'Email addresses in CC line of email';
case self::EMAIL_DATETIME: return 'Date and time of email';
case self::EMAIL_DATETIME_DATE: return 'Date of email';
case self::EMAIL_DATETIME_TIME: return 'Time of email';
case self::EMAIL_FROM: return 'Email address of sender of email';
case self::EMAIL_REPLY_TO: return 'Email address of designated receiver of replies to email';
case self::EMAIL_RETURN_PATH: return 'Email address of designated receiver of information on undeliverable email';
case self::EMAIL_SUBJECT: return 'Subject of email';
case self::EMAIL_TO: return 'Email addresses of recipients of email';
case self::FILE_CONTENTS: return 'File contents';
case self::FILE_NAME: return 'Filename';
case self::FILE_SIZE: return 'File size';
case self::INVOICE_AMOUNT_GROSS: return 'Invoice amount (gross)';
case self::INVOICE_AMOUNT_NET: return 'Invoice amount (net)';
case self::INVOICE_CREATION_TIME: return 'Time of creation of invoice';
case self::INVOICE_CUSTOMER_NUMBER: return 'Customer number on invoice';
case self::INVOICE_DATETIME_DATE: return 'Invoice date';
case self::INVOICE_DISCOUNT: return 'Discount on invoice';
case self::INVOICE_FULFILLMENT_PERIOD: return 'Fulfillment period on invoice';
case self::INVOICE_ITEM_DESCRIPTION: return 'Description of item on invoice';
case self::INVOICE_ITEM_DISCOUNT: return 'Discount on item on invoice';
case self::INVOICE_ITEM_PRICE_GROSS: return 'Price (gross) of item on invoice';
case self::INVOICE_ITEM_PRICE_NET: return 'Price (net) of item on invoice';
case self::INVOICE_ITEM_QUANTITY: return 'Quantity of item on invoice';
case self::INVOICE_ITEM_TAXES: return 'Taxes on item on invoice';
case self::INVOICE_MESSAGE: return 'Message on invoice';
case self::INVOICE_MODIFICATION_TIME: return 'Time of last modification to invoice';
case self::INVOICE_NOTES: return 'Custom notes relating to invoice';
case self::INVOICE_NUMBER: return 'Invoice number';
case self::INVOICE_PAYMENT_DATETIME: return 'Date and time when invoice has been paid';
case self::INVOICE_PAYMENT_TERMS: return 'Payment terms for invoice';
case self::INVOICE_RECIPIENT: return 'Recipient of invoice';
case self::INVOICE_REFUND_DATETIME: return 'Date and time when invoice has been refunded';
case self::INVOICE_REMINDER_DATETIME: return 'Date and time when reminder has been sent for invoice';
case self::INVOICE_TAXES: return 'Taxes on invoice';
case self::LETTER_BODY: return 'Message text of letter';
case self::LETTER_CC: return 'Notes on additional recipients of letter';
case self::LETTER_CREATION_TIME: return 'Time of creation of letter';
case self::LETTER_DATETIME: return 'Date and time of letter';
case self::LETTER_DATETIME_DATE: return 'Date of letter';
case self::LETTER_DATETIME_TIME: return 'Time of letter';
case self::LETTER_ENCLOSURES: return 'List of enclosures to letter';
case self::LETTER_HEADLINE: return 'Headline of letter';
case self::LETTER_IS_FIRST: return 'Classification of letter as first letter';
case self::LETTER_MATTER_PERSONAL_OR_BUSINESS: return 'Classification of letter as personal or as relating to business';
case self::LETTER_MODIFICATION_TIME: return 'Time of last modification to letter';
case self::LETTER_PS: return 'Postscript of letter';
case self::LETTER_SALUTATION: return 'Salutation of letter';
case self::LETTER_SUBJECT: return 'Subject of letter';
case self::LETTER_VALEDICTION: return 'Valediction of letter';
case self::USER_ACCESS_PRIVILEGES: return 'Access privileges';
case self::USER_ADDRESS: return 'Address';
case self::USER_ADDRESS_COUNTRY: return 'Country';
case self::USER_ADDRESS_LOCALITY: return 'City';
case self::USER_ADDRESS_PLACE: return 'Street name and house number';
case self::USER_ADDRESS_POSTAL_CODE: return 'Postal code';
case self::USER_ADDRESS_REGION: return 'State';
case self::USER_BIRTH_DATE: return 'Date of birth';
case self::USER_BIRTH_DATE_MONTH_DAY: return 'Month and day of birth';
case self::USER_BIRTH_DATE_YEAR: return 'Year of birth';
case self::USER_BIRTH_DATE_YEAR_MONTH: return 'Year and month of birth';
case self::USER_BIRTH_PLACE: return 'Place of birth';
case self::USER_BLOOD_GROUP: return 'Blood group';
case self::USER_COMPANY_COMMERCIAL_REGISTER_ENTRY: return 'Entry of company in commercial register';
case self::USER_COMPANY_DEPARTMENT: return 'Department within company';
case self::USER_COMPANY_EXECUTIVE_BOARD_MEMBERS: return 'Members of executive board of company';
case self::USER_COMPANY_LOGO: return 'Logo of company';
case self::USER_COMPANY_LOGO_CREATION_TIME: return 'Time of creation of logo of company';
case self::USER_COMPANY_LOGO_LABEL: return 'Label for logo of company';
case self::USER_COMPANY_LOGO_MODIFICATION_TIME: return 'Time of last modification to logo of company';
case self::USER_COMPANY_MANAGEMENT_MEMBERS: return 'Members of management of company';
case self::USER_COMPANY_NAME: return 'Company name';
case self::USER_COMPANY_SUPERVISORY_BOARD_MEMBERS: return 'Members of supervisory board of company';
case self::USER_COUNTRY: return 'Country';
case self::USER_EMAIL: return 'Email address';
case self::USER_EMAIL_VERIFIED: return 'Verification status of email address';
case self::USER_FAX: return 'Fax number';
case self::USER_FINANCIAL_BANK_ACCOUNT_ID: return 'Bank account number';
case self::USER_FINANCIAL_BANK_ID: return 'Bank identifier';
case self::USER_FINANCIAL_BANK_NAME: return 'Bank name';
case self::USER_FINANCIAL_CREDIT_CARD_BRAND: return 'Brand name of credit card';
case self::USER_FINANCIAL_CREDIT_CARD_CVC: return 'Verification code (e.g. CVC, CVV, CSC) of credit card';
case self::USER_FINANCIAL_CREDIT_CARD_EXPIRATION: return 'Expiration date of credit card';
case self::USER_FINANCIAL_CREDIT_CARD_NUMBER: return 'Card number of credit card';
case self::USER_FINANCIAL_PURCHASE_HISTORY: return 'Purchase history';
case self::USER_GENDER: return 'Gender';
case self::USER_GEO_COORDINATES: return 'Geographical coordinates';
case self::USER_HEIGHT: return 'Height';
case self::USER_IDENTIFIERS_ACCOUNT_ID: return 'Account ID';
case self::USER_IDENTIFIERS_ACCOUNT_NAME: return 'Account name';
case self::USER_IDENTIFIERS_ACCOUNT_TYPE: return 'Account type';
case self::USER_IDENTIFIERS_DEU_ST_IDNR: return 'Steuerliche Identifikationsnummer (Steuer-IdNr.) (Germany)';
case self::USER_IDENTIFIERS_DEU_ST_NR: return 'Steuernummer (St.-Nr) (Germany)';
case self::USER_IDENTIFIERS_EU_VAT_IN: return 'VAT ID (European Union)';
case self::USER_IDENTIFIERS_USA_SSN: return 'Social Security number (SSN) (United States of America)';
case self::USER_IP_ADDRESS: return 'Internet Protocol (IP) address';
case self::USER_IP_ADDRESS_25_PERCENT: return 'Internet Protocol (IP) address (reduced to 25%% precision)';
case self::USER_IP_ADDRESS_50_PERCENT: return 'Internet Protocol (IP) address (reduced to 50%% precision)';
case self::USER_IP_ADDRESS_75_PERCENT: return 'Internet Protocol (IP) address (reduced to 75%% precision)';
case self::USER_LOGIN_DATETIME: return 'Date and time of login';
case self::USER_LOGIN_DATETIME_DATE: return 'Date of login';
case self::USER_LOGIN_DATETIME_TIME: return 'Time of login';
case self::USER_NAME: return 'Name';
case self::USER_NAME_ALIAS: return 'Alias or username';
case self::USER_NAME_FAMILY: return 'Family name';
case self::USER_NAME_GIVEN: return 'Given name';
case self::USER_NOTES: return 'Custom notes';
case self::USER_OCCUPATION: return 'Occupation';
case self::USER_OCCUPATION_CURRENT: return 'Current occupation';
case self::USER_OCCUPATION_PREFERRED: return 'Preferred occupation';
case self::USER_PASSWORD_CLEARTEXT: return 'Password (cleartext)';
case self::USER_PASSWORD_HASHED: return 'Password (hash)';
case self::USER_PASSWORD_HASHED_STRONG: return 'Password (strong hash)';
case self::USER_PASSWORD_RESETTABLE: return 'Availability of password reset';
case self::USER_PHONE: return 'Phone number';
case self::USER_PHONE_HOME: return 'Residential phone number';
case self::USER_PHONE_MOBILE: return 'Mobile phone number';
case self::USER_PICTURE: return 'Picture';
case self::USER_REFERENCE: return 'Reference';
case self::USER_REGISTRATION_DATETIME: return 'Date and time of registration';
case self::USER_REGISTRATION_DATETIME_DATE: return 'Date of registration';
case self::USER_REGISTRATION_DATETIME_TIME: return 'Time of registration';
case self::USER_SIGNATURE: return 'Signature';
case self::USER_SIGNATURE_CREATION_TIME: return 'Time of creation of signature';
case self::USER_SIGNATURE_DRAWN: return 'Digitally drawn signature';
case self::USER_SIGNATURE_HANDWRITTEN: return 'Handwritten signature';
case self::USER_SIGNATURE_LABEL: return 'Label for signature';
case self::USER_SIGNATURE_MODIFICATION_TIME: return 'Time of last modification to signature';
case self::USER_WEBSITE_URL: return 'Website (URL)';
case self::USER_WEIGHT: return 'Body weight';
case self::VEHICLE_COLOR: return 'Color of vehicle';
case self::VEHICLE_CONSTRUCTION_PLACE: return 'Place of construction of vehicle';
case self::VEHICLE_CONSTRUCTION_YEAR: return 'Year of construction of vehicle';
case self::VEHICLE_MAKE: return 'Make of vehicle';
case self::VEHICLE_MODEL: return 'Model name of vehicle';
case self::VEHICLE_NOTES: return 'Custom notes on vehicle';
case self::VEHICLE_REGISTRATION_PLATE_NUMBER: return 'Registration plate number of vehicle';
default: throw new UnexpectedDataTypeError($identifier);
}
}
}
================================================
FILE: src/HumanPrivacyPolicy.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy;
use Delight\PrivacyPolicy\Data\DataBasis;
use Delight\PrivacyPolicy\Data\DataPurpose;
use Delight\PrivacyPolicy\Data\DataRequirement;
use Delight\PrivacyPolicy\Data\DataSpecialCondition;
use Delight\PrivacyPolicy\Data\DataType;
use Delight\PrivacyPolicy\Markup\AbbreviationMarkup;
use Delight\PrivacyPolicy\Markup\ConcatenationMarkup;
use Delight\PrivacyPolicy\Markup\DefinitionList\DefinitionGroup;
use Delight\PrivacyPolicy\Markup\DefinitionList\DefinitionList;
use Delight\PrivacyPolicy\Markup\ImageMarkup;
use Delight\PrivacyPolicy\Markup\LinkMarkup;
use Delight\PrivacyPolicy\Markup\Markup;
use Delight\PrivacyPolicy\Markup\TextMarkup;
use Delight\PrivacyPolicy\Scope\AppStoreIosAppScope;
use Delight\PrivacyPolicy\Scope\PlayStoreAndroidAppScope;
use Delight\PrivacyPolicy\Scope\WebsiteScope;
use Delight\PrivacyPolicy\Throwable\InvalidFormatArgumentsError;
use Delight\PrivacyPolicy\Throwable\TranslationNotFoundError;
use Delight\PrivacyPolicy\Throwable\UnexpectedScopeError;
/** Privacy policy in natural language that can be read by humans */
abstract class HumanPrivacyPolicy extends PrivacyPolicy {
/**
* Whether missing translations should cause an error
*
* This setting can be used to find untranslated strings during development
*
* @var bool
*/
const FAIL_ON_MISSING_TRANSLATIONS = false;
/**
* Returns the short title of the policy
*
* @return string
*/
abstract public function getShortTitle();
/**
* Returns the long title of the policy
*
* @return string
*/
abstract public function getLongTitle();
/**
* Returns the policy as HTML
*
* @return string
*/
public function toHtml() {
return $this->toMarkup()->toHtml(0);
}
/**
* Returns the policy as plain text
*
* @return string
*/
public function toPlainText() {
return $this->toMarkup()->toPlainText(0);
}
/**
* Returns the policy as Markdown
*
* @return string
*/
public function toMarkdown() {
return $this->toMarkup()->toMarkdown(0);
}
/**
* Returns a translation of the supplied text
*
* This method should only ever be called by the {@see lang} method
*
* @param string $text the English text to translate
* @return string the translated text
* @throws TranslationNotFoundError
*/
abstract protected function translateUnformatted($text);
/**
* Formats the specified UNIX timestamp as a date
*
* @param int $unixTimestamp the UNIX timestamp in seconds to format
* @return string the formatted date
*/
abstract protected function formatDate($unixTimestamp);
/**
* Formats the specified number of hours
*
* @param int $n
* @return string the formatted number as a string
*/
abstract protected function formatHours($n);
/**
* Formats the specified number of days
*
* @param int $n
* @return string the formatted number as a string
*/
abstract protected function formatDays($n);
/**
* Formats the specified number of weeks
*
* @param int $n
* @return string the formatted number as a string
*/
abstract protected function formatWeeks($n);
/**
* Formats the specified number of months
*
* @param int $n
* @return string the formatted number as a string
*/
abstract protected function formatMonths($n);
/**
* Formats the specified number of years
*
* @param int $n
* @return string the formatted number as a string
*/
abstract protected function formatYears($n);
/**
* Returns the policy as generic markup
*
* @return Markup
*/
private function toMarkup() {
return new DefinitionList(function (DefinitionList $list) {
if ($this->publishedAt !== null) {
$list->addDefinitionGroup($this->lang('Date of publication'), function (DefinitionGroup $group) {
$group->addDefinition($this->formatDate($this->publishedAt));
});
}
if ($this->takesEffectAt !== null) {
$list->addDefinitionGroup($this->lang('Effective date'), function (DefinitionGroup $group) {
$group->addDefinition($this->formatDate($this->takesEffectAt));
});
}
if ($this->expiresAt !== null) {
$list->addDefinitionGroup($this->lang('Date of expiration'), function (DefinitionGroup $group) {
$group->addDefinition($this->formatDate($this->expiresAt));
});
}
if ($this->hasVersionName()) {
$list->addDefinitionGroup($this->lang('Version'), function (DefinitionGroup $group) {
$group->addDefinition($this->versionName);
});
}
if ($this->hasCanonicalUrl()) {
$list->addDefinitionGroup($this->lang('Latest version'), function (DefinitionGroup $group) {
$group->addDefinition(new LinkMarkup($this->canonicalUrl));
});
}
$list->addDefinitionGroup($this->lang('General'), function (DefinitionGroup $group) {
$group->addDefinition(
$this->lang('Protecting your privacy and keeping your personal information safe is our highest priority.')
.
Markup::SPACE
.
$this->lang('This privacy statement (“privacy policy” or “policy”) is designed to help you better understand how and to what extent we collect, use, disclose, transfer and store your information.')
);
$group->addDefinitionInteractively(function () {
$definition = $this->lang('The policy applies to our websites, mobile apps, software applications, products and services, collectively referred to as “services”.');
if ($this->hasScopes()) {
$definition .= Markup::SPACE;
$definition .= $this->lang('These services include:');
}
return $definition;
});
if ($this->hasScopes()) {
$group->addDefinition(new DefinitionList(function (DefinitionList $list) {
foreach ($this->scopes as $scope) {
$list->addDefinitionGroup($scope, function (DefinitionGroup $group) use ($scope) {
if ($scope instanceof WebsiteScope) {
$group->addDefinition($this->lang('Website'));
}
elseif ($scope instanceof PlayStoreAndroidAppScope) {
$group->addDefinition($this->lang('Android app (available from “Google Play”, a digital distribution platform operated by Google Inc.)'));
}
elseif ($scope instanceof AppStoreIosAppScope) {
$group->addDefinition($this->lang('iOS app (available from the “App Store”, a digital distribution platform operated by Apple Inc.)'));
}
else {
throw new UnexpectedScopeError();
}
});
}
}));
}
$group->addDefinition($this->lang('This privacy policy governs your use of our services regardless of the domain names, operating systems, platforms or devices that are used to access the services, and regardless of whether such access is in connection with an account or not.'));
$group->addDefinition($this->lang('As a condition for your use of our services as a customer, user or visitor (collectively referred to as a “user” or as your “use”), you consent to the terms of this policy and you agree that your personal information will be handled as outlined below.'));
});
$list->addDefinitionGroup($this->lang('Our principles'), function (DefinitionGroup $group) {
if (!$this->isUserDataTraded()) {
$group->addDefinition($this->lang('We never sell, rent out or trade any of our user’s personal information with third parties for commercial purposes.'));
}
if ($this->hasDataMinimizationGoal()) {
$group->addDefinition($this->lang('We always collect only the minimum amount of personal information necessary to provide our services to you, unless you choose to provide more such information voluntarily.'));
}
$group->addDefinition(
$this->lang('We encourage you to give us, and, more generally, any provider of digital services, only the amount of data you are comfortable sharing.')
.
Markup::SPACE
.
$this->lang('If in doubt, rather do not share sensitive information.')
);
if ($this->rightOfAccess && $this->rightToRectification && $this->rightToErasure) {
$group->addDefinition($this->lang('We offer you simple ways to view, update or delete the data we have collected about you.'));
}
});
if ($this->hasChildrenMinimumAge()) {
$list->addDefinitionGroup($this->lang('Children’s Online Privacy Protection'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('None of our services are designed for, intended to attract, or directed towards children under the age of %d.', $this->childrenMinimumAge));
$group->addDefinition(
$this->lang('We never knowingly collect any information from children under %d.', $this->childrenMinimumAge)
.
Markup::SPACE
.
$this->lang('If you are a child below that age, you may not use any of our services.', $this->childrenMinimumAge)
);
$group->addDefinition($this->lang('If we have any plausible reason to believe that you are a user who is under the age of %d, we will have to prohibit you from continuing your use of our services.', $this->childrenMinimumAge));
$group->addDefinitionInteractively(function () {
$definition = $this->lang('Should you believe that we might have any personal information of a child under the age of %d, in particular a child of your own, please contact us so that the data in question can be deleted, if appropriate.', $this->childrenMinimumAge);
if ($this->hasContactInformation()) {
$definition .= Markup::SPACE;
$definition .= $this->lang('For our contact information, please see further below.');
}
return $definition;
});
});
}
if ($this->hasPromotionalEmailOptOut()) {
$list->addDefinitionGroup($this->lang('Email communication'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You may opt out of receiving any newsletters or promotional messages from us at any time.'));
$group->addDefinition($this->lang('This is possible either by using the “Unsubscribe” feature at the bottom of such emails that we may send, or by adjusting the settings in your account within our services, where applicable.'));
$group->addDefinition($this->lang('You will continue to receive essential, non-promotional messages regarding your account, such as technical notices, order confirmations, or other service-related messages, which are required for us to be able to provide our services to you.'));
});
}
if ($this->hasCookies()) {
$list->addDefinitionGroup($this->lang('Cookies'), function (DefinitionGroup $group) {
if ($this->hasFirstPartyCookies()) {
$group->addDefinition(
$this->lang('Cookies are minimal text files that contain small amounts of data.')
.
Markup::SPACE
.
$this->lang('They are transferred from our servers to your device through your web browser or app.')
.
Markup::SPACE
.
$this->lang('Your web browser or app then sends these small text files back to us whenever you access our services.')
);
$group->addDefinition(
$this->lang('These cookies do not necessarily contain any personal or identifying information.')
.
Markup::SPACE
.
$this->lang('They are, however, commonly used to store a unique identifier for every individual user, so that our servers do not lose information on who you are while you are moving through the individual parts of our services.')
);
$group->addDefinition(
$this->lang('We may use cookies and similar technologies, such as “Web Storage” (specifically “localStorage”) and “Internal Storage”, to make interactions with our services more convenient, efficient and secure.')
.
Markup::SPACE
.
$this->lang('For example, we may use these technologies to keep you signed in and to remember your preferences with regard to our services.')
);
$group->addDefinition(
$this->lang('As such, cookies and the related technologies are essential for the operation of our services.')
.
Markup::SPACE
.
$this->lang('You therefore consent to our use of cookies and related technologies when using our services.')
.
Markup::SPACE
.
$this->lang('Without these technologies, use of our services would not be reasonably possible.')
);
$group->addDefinition(
$this->lang('Your web browser or operating system usually provides means to delete such data currently stored on your device.')
.
Markup::SPACE
.
$this->lang('They may even provide methods to disable the use of such technologies completely.')
.
Markup::SPACE
.
$this->lang('You are welcome to make use of these settings and features of your web browser or operating system, but that may prevent our services from working correctly for you.')
.
Markup::SPACE
.
$this->lang('For more information on how to delete such data currently stored on your device, please refer to the manual or help section of your web browser or operating system.')
);
}
if ($this->hasThirdPartyCookies()) {
$group->addDefinition(new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup($this->lang('Third-party cookies'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('Some contents of our services are provided by third parties that are not directly affiliated with us.'));
$group->addDefinition($this->lang('These external contents, which are displayed, rendered, played back or otherwise conveyed directly within our services, may include advertising, analytics and components from social media.'));
$group->addDefinition($this->lang('The third parties that provide these contents may store cookies on your device for their own purposes and interests, which we cannot control.'));
$group->addDefinition($this->lang('The settings and features of your web browser or operating system may allow you to control how third parties can store cookies on your device.'));
});
}));
}
});
}
if ($this->hasDataGroups()) {
$list->addDefinitionGroup($this->lang('Information we collect and why we collect it'), function (DefinitionGroup $group) {
foreach ($this->dataGroups as $dataGroup) {
$group->addDefinition(new DefinitionList(function (DefinitionList $list) use ($dataGroup) {
$list->addDefinitionGroup($dataGroup->getTitle(), function (DefinitionGroup $group) use ($dataGroup) {
$group->addDefinition($dataGroup->getDescription());
$group->addDefinition(
new ConcatenationMarkup(
new TextMarkup(
$this->lang('Required:')
),
new AbbreviationMarkup(
DataRequirement::toBool($dataGroup->getRequirement()) ? $this->lang('yes') : $this->lang('no'),
$this->lang(
DataRequirement::toNaturalLanguage($dataGroup->getRequirement())
)
)
)
);
if ($dataGroup->hasBases()) {
$basesMarkup = [];
$basesMarkup[] = new TextMarkup(
$this->lang('Lawful basis:')
);
foreach ($dataGroup->getBases() as $base) {
$basesMarkup[] = new AbbreviationMarkup(
$this->lang(
DataBasis::toNaturalLanguage($base)
),
$this->lang(
DataBasis::toLegalReference($base)
)
);
$basesMarkup[] = new TextMarkup(Markup::MIDDLE_DOT);
}
\array_pop($basesMarkup);
$group->addDefinition(
new ConcatenationMarkup(...$basesMarkup)
);
}
if ($dataGroup->hasSpecialConditions()) {
$specialConditionsMarkup = [];
$specialConditionsMarkup[] = new TextMarkup(
$this->lang('Condition for the processing of special categories of personal data:')
);
foreach ($dataGroup->getSpecialConditions() as $specialCondition) {
$specialConditionsMarkup[] = new AbbreviationMarkup(
$this->lang(
DataSpecialCondition::toNaturalLanguage($specialCondition)
),
$this->lang(
DataSpecialCondition::toLegalReference($specialCondition)
)
);
$specialConditionsMarkup[] = new TextMarkup(Markup::MIDDLE_DOT);
}
\array_pop($specialConditionsMarkup);
$group->addDefinition(
new ConcatenationMarkup(...$specialConditionsMarkup)
);
}
if ($dataGroup->hasPurposes()) {
foreach ($dataGroup->getPurposes() as $purpose) {
$group->addDefinition($this->lang(
DataPurpose::toNaturalLanguage($purpose)
));
}
}
if ($dataGroup->hasElements()) {
foreach ($dataGroup->getElements() as $dataElement) {
$group->addDefinition(new DefinitionList(function (DefinitionList $list) use ($dataElement) {
$dataTypeName = DataType::toNaturalLanguage($dataElement->getType());
$list->addDefinitionGroup($this->lang($dataTypeName), function (DefinitionGroup $group) use ($dataElement) {
$group->addDefinition(
new ConcatenationMarkup(
new TextMarkup(
$this->lang('Required:')
),
new AbbreviationMarkup(
DataRequirement::toBool($dataElement->getRequirement()) ? $this->lang('yes') : $this->lang('no'),
$this->lang(
DataRequirement::toNaturalLanguage($dataElement->getRequirement())
)
)
)
);
if ($dataElement->hasMaxRetention()) {
if ($dataElement->getMaxRetention() <= 72) {
// format number of 0 to 72 hours
$group->addDefinition($this->lang(
'Maximum retention time: %s',
$this->formatHours($dataElement->getMaxRetention())
));
}
elseif ($dataElement->getMaxRetention() <= 504) {
// format number of 4 to 21 days
$group->addDefinition($this->lang(
'Maximum retention time: %s',
$this->formatDays(\ceil($dataElement->getMaxRetention() / 24))
));
}
elseif ($dataElement->getMaxRetention() <= 1008) {
// format number of 4 to 6 weeks
$group->addDefinition($this->lang(
'Maximum retention time: %s',
$this->formatWeeks(\ceil($dataElement->getMaxRetention() / 24 / 7))
));
}
elseif ($dataElement->getMaxRetention() <= 13148) {
// format number of 2 to 18 months
$group->addDefinition($this->lang(
'Maximum retention time: %s',
$this->formatMonths(\ceil($dataElement->getMaxRetention() / 24 / 30.436875))
));
}
else {
// format number of 2 or more years
$group->addDefinition($this->lang(
'Maximum retention time: %s',
$this->formatYears(\ceil($dataElement->getMaxRetention() / 24 / 365.2425))
));
}
}
});
}));
}
}
});
}));
}
});
}
$list->addDefinitionGroup($this->lang('Mandatory disclosure'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('Laws in the jurisdictions that we operate in may obligate us to disclose certain personal information or other information that we collect about our users to local law enforcement authorities.'));
$group->addDefinition($this->lang('We may be compelled to such disclosure in response to a court order, a warrant or a similar request by a judicial body or a government agency, or when we believe in good faith that the disclosure is reasonably necessary to protect our rights or property, that of any third party, or the safety of the general public.'));
$group->addDefinition($this->lang('In any case, we will provide data only to the extent necessary to satisfy the request, and, whenever possible and legally permitted, we will make a reasonable effort to notify affected users of any such disclosure.'));
});
$list->addDefinitionGroup($this->lang('Retention and deletion of data'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('We will retain certain pieces of personal information for as long as you use our services, as long as your account exists, or as long as needed for us to be able to provide our services to you.'));
if ($this->isAccountDeletable()) {
$group->addDefinitionInteractively(function () {
$definition = $this->lang('If you would like to cancel your use of our services, delete your account, or delete your personal information, you may do so in the respective sections of our services.');
$definition .= Markup::SPACE;
$definition .= $this->lang('If you need help, please contact us.');
if ($this->hasContactInformation()) {
$definition .= Markup::SPACE;
$definition .= $this->lang('See further below for our contact information.');
}
return $definition;
});
}
if ($this->hasPreservationInBackups()) {
$group->addDefinition(
$this->lang('In order to prevent loss of data due to human errors or system failures, we keep additional backup copies of data, as most companies and service providers do, which may include some of your personal information.')
.
Markup::SPACE
.
$this->lang('This means that parts of your personal information may temporarily remain on our servers even after deletion or termination of your use of our services.')
);
}
$group->addDefinition($this->lang('We may retain and use your personal information and data as necessary to comply with our legal obligations, to resolve disputes, and to enforce our rights and agreements.'));
});
if ($this->hasThirdPartyServiceProviders()) {
$list->addDefinitionGroup($this->lang('Service providers, contractors and agents'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('From time to time, we may share some information we have collected from you, including personal information, with a limited number of third-party vendors, service providers, contractors, resellers, agents or business partners, solely for the purpose of performing certain functions on our behalf.'));
$group->addDefinition(
$this->lang('Such third parties help us provide and improve our services.')
.
Markup::SPACE
.
$this->lang('Functions performed by them on our behalf may include payment processing, network data transmission, fraud prevention, customer support management and similar services.')
);
$group->addDefinition($this->lang('These third parties do not have any right to use the information that we share about you beyond what is necessary to assist us with the specific task at hand.'));
});
}
if ($this->hasInternationalTransfers()) {
$list->addDefinitionGroup($this->lang('International data transfers'), function (DefinitionGroup $group) {
$group->addDefinition(
$this->lang('Some of our external service providers and recipients of personal data are based outside your country and outside our country.')
.
Markup::SPACE
.
$this->lang('This means that the processing of your personal data by those third parties involves an international transfer of your data to a third country.')
.
Markup::SPACE
.
$this->lang('Such third countries may have data protection rules that are different from those in your or our country.')
);
$group->addDefinition($this->lang('Thus, for any international transfer of data, we ensure that appropriate technical, organizational and contractual measures are in place to guarantee that a similar degree of protection is afforded to your data internationally and that your personal data remains protected to the standards described in this policy.'));
$group->addDefinition(new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup($this->lang('We verify that at least one of the following safeguards is implemented:'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('The country of the recipient has been deemed to provide an adequate level of protection for personal data by the European Commission.'));
$group->addDefinition($this->lang('The recipient is certified as part of the EU-US and Swiss-US Privacy Shield Frameworks.'));
$group->addDefinition($this->lang('Standard Contractual Clauses, as adopted by or approved by the European Commission, are in place.'));
$group->addDefinition($this->lang('The recipient has Binding Corporate Rules that guarantee the protection of personal data.'));
});
}));
$group->addDefinition($this->lang('Please contact us if you want further information on the specific mechanisms used by us when transferring your personal data internationally.'));
});
}
if ($this->hasTransferUponMergerOrAcquisition()) {
$list->addDefinitionGroup($this->lang('Mergers and acquisitions'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('If we are involved in a merger, an acquisition by another company, or a sale of all or a portion of our business or assets, your information will likely be among the assets transferred.'));
$group->addDefinition($this->lang('If any such change of ownership happens, the organization receiving your personal information will have to respect the promises that we have made in any pre-existing privacy policy such as this one.'));
$group->addDefinition(
$this->lang('You will be notified via a prominent notice within our services or by email to the primary email address specified in your account at least %d days before any such transfer of your personal information.', $this->getNotificationPeriod())
.
Markup::SPACE
.
$this->lang('This notification will include help on choices you may have regarding the transfer and treatment of your personal information.')
);
});
}
$list->addDefinitionGroup($this->lang('How we secure your information'), function (DefinitionGroup $group) {
$group->addDefinition(
$this->lang('We take the trust that you place in us very seriously.')
.
Markup::SPACE
.
$this->lang('We have therefore implemented all measures reasonably necessary to protect the personal information of our users from unauthorized access, modification, deletion, disclosure or other misuse.')
);
$group->addDefinition($this->lang('We follow generally accepted industry standards to protect the data submitted to us, both during transmission and after we have received it, and continue to expand our protections as becomes necessary with changing technology.'));
if ($this->hasTlsEverywhere()) {
$group->addDefinition($this->lang('In particular, all connections to and from our services are encrypted using Secure Sockets Layer (SSL) and Transport Layer Security (TLS) technologies.'));
}
$group->addDefinition(
$this->lang('However, please be aware that, despite our best efforts, no method of electronic transmission or storage is perfectly secure and no measures can guarantee absolute security.')
.
Markup::SPACE
.
$this->lang('Hardware or software failure as well as other factors may compromise the security of user information, as is the case with all other providers of digital services.')
);
$group->addDefinition(
$this->lang('Apart from that, please recognize that protecting your personal information is, in other parts, also your own responsibility.')
.
Markup::SPACE
.
$this->lang('Especially, you are responsible for safeguarding any passwords and other authentication information that you use to access our services, as well as limiting physical access to the devices used.')
);
$group->addDefinition($this->lang('You should never disclose your authentication information to any third party and you should notify us immediately of any unauthorized use of your account.'));
});
$list->addDefinitionGroup($this->lang('Links to external websites, applications and products'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('Some parts and sections of our services may contain external links to websites, applications or products owned by and operated by third parties.'));
$group->addDefinition(
$this->lang('We advise you to verify the privacy practices of those third parties individually.')
.
Markup::SPACE
.
$this->lang('We have no knowledge about and are not responsible for the way that those third parties handle any personal information which you provide to them yourself.')
);
$group->addDefinition($this->lang('We encourage you not to provide any personal information to those third parties before assuring yourself of proper privacy practices on their part.'));
});
if ($this->rightOfAccess || $this->rightToRectification || $this->rightToErasure || $this->rightToRestrictProcessing || $this->rightToDataPortability || $this->rightToObject || $this->rightsRelatedToAutomatedDecisions) {
$list->addDefinitionGroup($this->lang('Your rights'), function (DefinitionGroup $group) {
$group->addDefinition($this->lang('Except as limited under applicable law, you have the following rights with regard to your personal data:'));
if ($this->rightOfAccess) {
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Access your personal data'),
$this->lang('Right of access (EU, General Data Protection Regulation (GDPR), Article 15)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right to be informed of and request access to the personal data we process about you.'));
}
);
})
);
}
if ($this->rightToRectification) {
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Update your personal data'),
$this->lang('Right to rectification (EU, General Data Protection Regulation (GDPR), Article 16)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right to request that we amend or update your personal data where it is inaccurate or incomplete.'));
}
);
})
);
}
if ($this->rightToErasure) {
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Erase your personal data'),
$this->lang('Right to erasure (EU, General Data Protection Regulation (GDPR), Article 17)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right to request that we delete your personal data.'));
}
);
})
);
}
if ($this->rightToRestrictProcessing) {
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Restrict the use of your personal data'),
$this->lang('Right to restriction of processing (EU, General Data Protection Regulation (GDPR), Article 18)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right to request that we temporarily or permanently stop processing your personal data.'));
}
);
})
);
}
if ($this->rightToDataPortability) {
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Export your personal data'),
$this->lang('Right to data portability (EU, General Data Protection Regulation (GDPR), Article 20)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right to request a copy of your personal data in electronic and machine-readable form, and the right to transmit that personal data to another service provider.'));
}
);
})
);
}
if ($this->rightToObject) {
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Object to direct marketing'),
$this->lang('Right to object (EU, General Data Protection Regulation (GDPR), Article 21)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right to object to your personal data being processed for direct marketing purposes.'));
}
);
})
);
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Object to the use of your personal data'),
$this->lang('Right to object (EU, General Data Protection Regulation (GDPR), Article 21)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right to object to us processing your personal data on grounds relating to your particular situation where we no longer have a legitimate reason or legal need to process it.'));
}
);
})
);
}
if ($this->rightsRelatedToAutomatedDecisions) {
$group->addDefinition(
new DefinitionList(function (DefinitionList $list) {
$list->addDefinitionGroup(
new AbbreviationMarkup(
$this->lang('Object to automated decision-making'),
$this->lang('Rights related to automated individual decision-making, including profiling (EU, General Data Protection Regulation (GDPR), Article 22)')
),
function (DefinitionGroup $group) {
$group->addDefinition($this->lang('You have the right not to be subject to a decision based solely on automated decision-making, including profiling, where the decision would have a legal effect on you or produce a similarly significant effect.'));
}
);
})
);
}
$group->addDefinitionInteractively(function () {
$definition = $this->lang('If you have any questions regarding the protection of your data, your rights, or how to exercise them, please contact us.');
if ($this->hasContactInformation()) {
$definition .= Markup::SPACE;
$definition .= $this->lang('For our contact information, please see further below.');
}
$definition .= Markup::SPACE;
$definition .= $this->lang('Upon verification of your identity, we will respond to your request within a reasonable period of time.');
return $definition;
});
$group->addDefinitionInteractively(function () {
$definition = $this->lang('If you are unsatisfied with our response or with the way we are processing your personal data, you may contact your local data protection authority.');
if ($this->competentSupervisoryAuthorityName !== null || $this->competentSupervisoryAuthorityUrl !== null) {
$definition .= Markup::SPACE;
$definition .= $this->lang('You may also contact the data protection authority that is responsible for us:');
}
return $definition;
});
if ($this->competentSupervisoryAuthorityName !== null || $this->competentSupervisoryAuthorityUrl !== null) {
if ($this->competentSupervisoryAuthorityUrl !== null) {
$group->addDefinition(
new LinkMarkup($this->competentSupervisoryAuthorityUrl, $this->competentSupervisoryAuthorityName)
);
}
else {
$group->addDefinition($this->competentSupervisoryAuthorityName);
}
}
$group->addDefinition($this->lang('You are free to file a complaint with the data protection authority.'));
});
}
$list->addDefinitionGroup($this->lang('Changes to this privacy policy'), function (DefinitionGroup $group) {
$group->addDefinition(
$this->lang('We may change this privacy policy from time to time.')
.
Markup::SPACE
.
$this->lang('Most changes will presumably be minor only and will therefore not affect your rights.')
);
$group->addDefinition(
$this->lang('Should there be any substantial changes to this policy with material effects on any of your rights or choices, you will be notified via a prominent notice within our services or by email to the primary email address specified in your account at least %d days prior to such changes taking effect.', $this->getNotificationPeriod())
.
Markup::SPACE
.
$this->lang('This notification will include help on choices you may have regarding the treatment of your personal information.')
);
$group->addDefinition($this->lang('For any less significant changes to this privacy policy that do not affect your rights or choices in a material way, we encourage all users to check this policy for updated versions periodically.'));
$group->addDefinition($this->lang('In general, the applicable version of this policy is the one that is current at the time of your access of our services.'));
});
if ($this->hasContactInformation()) {
$list->addDefinitionGroup($this->lang('Contact information of the controller'), function (DefinitionGroup $group) {
$group->addDefinition(
$this->lang('If you have any questions or concerns regarding this policy, our privacy practices or certain aspects of our services, please contact us at any time.')
.
Markup::SPACE
.
$this->lang('We want to help and will be happy to address your concerns.')
.
Markup::SPACE
.
$this->lang('We are responsible for the processing of personal data under this policy.')
);
if ($this->hasContactEmail()) {
$group->addDefinition($this->lang('You can reach us via email at:'));
$group->addDefinition(
new LinkMarkup('mailto:' . $this->contactEmail, $this->contactEmail)
);
}
if ($this->hasContactUrl() && !$this->hasContactImage()) {
$group->addDefinition($this->lang('Our full contact information can be found at:'));
$group->addDefinition(
new LinkMarkup($this->contactUrl)
);
}
if ($this->hasContactImage()) {
$imageMarkup = new ImageMarkup(
$this->contactImage[0],
$this->contactImage[1],
$this->contactImage[2],
$this->contactImage[3]
);
if ($this->hasContactUrl()) {
$group->addDefinition(
new LinkMarkup($this->contactUrl, $imageMarkup, $this->contactImage[1])
);
}
else {
$group->addDefinition($imageMarkup);
}
}
});
}
});
}
/**
* Returns a translation of the supplied text, optionally inserting any specified format arguments
*
* This uses the {@see translateUnformatted} method implemented by subclasses
*
* @param string $text the English text to translate
* @param array ...$arguments (optional) the format arguments to insert
* @return string the translated text with format arguments inserted as needed
* @throws InvalidFormatArgumentsError
* @throws TranslationNotFoundError
*/
private function lang($text, ...$arguments) {
try {
$translated = $this->translateUnformatted($text);
}
catch (TranslationNotFoundError $e) {
if (self::FAIL_ON_MISSING_TRANSLATIONS) {
throw new TranslationNotFoundError($text);
}
else {
$translated = $text;
}
}
$formatted = @\sprintf($translated, ...$arguments);
if ($formatted === false) {
throw new InvalidFormatArgumentsError();
}
return $formatted;
}
}
================================================
FILE: src/Language/EnglishPrivacyPolicy.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Language;
use Delight\PrivacyPolicy\HumanPrivacyPolicy;
/** Privacy policy for humans in English */
class EnglishPrivacyPolicy extends HumanPrivacyPolicy {
public function getShortTitle() {
return 'Privacy';
}
public function getLongTitle() {
return 'Privacy Policy';
}
protected function translateUnformatted($text) {
return $text;
}
protected function formatDate($unixTimestamp) {
return \IntlDateFormatter::create('en_US', \IntlDateFormatter::LONG, \IntlDateFormatter::NONE)->format($unixTimestamp);
}
protected function formatHours($n) {
return \sprintf(($n === 1 ? '%d hour' : '%d hours'), $n);
}
protected function formatDays($n) {
return \sprintf(($n === 1 ? '%d day' : '%d days'), $n);
}
protected function formatWeeks($n) {
return \sprintf(($n === 1 ? '%d week' : '%d weeks'), $n);
}
protected function formatMonths($n) {
return \sprintf(($n === 1 ? '%d month' : '%d months'), $n);
}
protected function formatYears($n) {
return \sprintf(($n === 1 ? '%d year' : '%d years'), $n);
}
}
================================================
FILE: src/Language/GermanFormalPrivacyPolicy.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Language;
/** Privacy policy for humans in formal German ("Sie") */
class GermanFormalPrivacyPolicy extends GermanPrivacyPolicy {
protected function translateUnformatted($text) {
switch ($text) {
case 'Access your personal data':
return 'Erhalten Sie Zugriff auf Ihre persönlichen Daten';
case 'Apart from that, please recognize that protecting your personal information is, in other parts, also your own responsibility.':
return 'Bitte denken Sie im Übrigen daran, dass der Schutz Ihrer persönlichen Informationen in anderen Teilen ebenso Ihrer eigenen Verantwortung unterliegt.';
case 'As a condition for your use of our services as a customer, user or visitor (collectively referred to as a “user” or as your “use”), you consent to the terms of this policy and you agree that your personal information will be handled as outlined below.':
return 'Als Bedingung für Ihre Nutzung unserer Dienste als Kunde, Nutzer oder Besucher (zusammen als „Nutzer“ oder als Ihre „Nutzung“ bezeichnet) stimmen Sie den Bedingungen dieser Erklärung zu und Sie erklären sich damit einverstanden, dass Ihre persönlichen Informationen wie im Folgenden beschrieben verarbeitet werden.';
case 'Erase your personal data':
return 'Löschen Sie Ihre persönlichen Daten';
case 'Especially, you are responsible for safeguarding any passwords and other authentication information that you use to access our services, as well as limiting physical access to the devices used.':
return 'Insbesondere sind Sie dafür verantwortlich, jegliche Passwörter und andere Informationen zur Authentifizierung zu schützen, die Sie nutzen, um auf unsere Dienste zuzugreifen, sowie dafür, den Zugang zu den genutzten Geräten einzuschränken.';
case 'Except as limited under applicable law, you have the following rights with regard to your personal data:':
return 'Soweit nicht durch anwendbares Recht eingeschränkt, haben Sie im Hinblick auf Ihre persönlichen Daten die folgenden Rechte:';
case 'Export your personal data':
return 'Exportieren Sie Ihre persönlichen Daten';
case 'For any less significant changes to this privacy policy that do not affect your rights or choices in a material way, we encourage all users to check this policy for updated versions periodically.':
return 'Für jegliche Änderungen an dieser Datenschutzerklärung, die von geringerer Bedeutung sind und Ihre Rechte oder Wahlmöglichkeiten nicht in wichtiger Weise betreffen, empfehlen wir allen Nutzern, diese Erklärung regelmäßig hinsichtlich aktualisierter Versionen zu überprüfen.';
case 'For example, we may use these technologies to keep you signed in and to remember your preferences with regard to our services.':
return 'Wir können diese Technologien zum Beispiel verwenden, um Sie eingeloggt bleiben zu lassen und um Ihre Einstellungen im Hinblick auf unsere Dienste beizubehalten.';
case 'For more information on how to delete such data currently stored on your device, please refer to the manual or help section of your web browser or operating system.':
return 'Weitere Informationen darüber, wie Sie solche Daten, die zurzeit auf Ihrem Gerät gespeichert sind, löschen können, finden Sie im Handbuch oder Hilfebereich Ihres Webbrowsers oder Betriebssystems.';
case 'For our contact information, please see further below.':
return 'Unsere Kontaktdaten finden Sie weiter unten.';
case 'From time to time, we may share some information we have collected from you, including personal information, with a limited number of third-party vendors, service providers, contractors, resellers, agents or business partners, solely for the purpose of performing certain functions on our behalf.':
return 'Gelegentlich geben wir möglicherweise einen Teil der Informationen, die wir über Sie erfasst haben, einschließlich persönlicher Informationen, an eine begrenzte Zahl von Drittunternehmen weiter, darunter Lieferanten, Dienstleister, Auftragnehmer, Vertriebspartner und Vertreter. Dies geschieht ausschließlich zur Ausführung bestimmter Funktionen für uns und in unserem Auftrag.';
case 'However, please be aware that, despite our best efforts, no method of electronic transmission or storage is perfectly secure and no measures can guarantee absolute security.':
return 'Beachten Sie jedoch bitte, dass trotz unserer größten Bemühungen keine Methode der elektronischen Datenübertragung oder Datenspeicherung vollkommen sicher ist und keine Maßnahmen eine absolute Sicherheit garantieren können.';
case 'How we secure your information':
return 'Wie wir Ihre Informationen sichern';
case 'If any such change of ownership happens, the organization receiving your personal information will have to respect the promises that we have made in any pre-existing privacy policy such as this one.':
return 'Falls ein solcher Wechsel des Eigentümers stattfinden sollte, wird die Gesellschaft, die Ihre persönlichen Informationen erhält, die Zusagen, die wir in einer zuvor existierenden Datenschutzerklärung wie dieser gemacht haben, anerkennen und achten müssen.';
case 'If in doubt, rather do not share sensitive information.':
return 'Geben Sie sensible Informationen im Zweifelsfall eher nicht preis.';
case 'If we are involved in a merger, an acquisition by another company, or a sale of all or a portion of our business or assets, your information will likely be among the assets transferred.':
return 'Wenn wir in eine Fusion, eine Übernahme durch ein anderes Unternehmen oder einen Verkauf unseres gesamten Unternehmens, unserer gesamten Vermögenswerte oder Teilen davon involviert sind, werden Ihre Informationen wahrscheinlich Bestandteil der zu übertragenden Vermögensgüter sein.';
case 'If we have any plausible reason to believe that you are a user who is under the age of %d, we will have to prohibit you from continuing your use of our services.':
return 'Wenn wir einen glaubwürdigen Grund haben, anzunehmen, dass Sie ein Nutzer im Alter unter %d sind, müssen wir Ihnen die weitere Nutzung unserer Dienste untersagen.';
case 'If you are a child below that age, you may not use any of our services.':
return 'Wenn Sie ein Kind unterhalb dieses Alters sind, dürfen Sie keinen unserer Dienste nutzen.';
case 'If you are unsatisfied with our response or with the way we are processing your personal data, you may contact your local data protection authority.':
return 'Falls Sie mit unserer Antwort oder mit der Art und Weise, wie wir Ihre persönlichen Daten verarbeiten, unzufrieden sind, können Sie Ihre örtliche Datenschutzbehörde kontaktieren.';
case 'If you have any questions or concerns regarding this policy, our privacy practices or certain aspects of our services, please contact us at any time.':
return 'Sollten Sie irgendwelche Fragen oder Bedenken bezüglich dieser Erklärung, unserer Datenschutzpraktiken oder bestimmter Aspekte unserer Dienste haben, nehmen Sie bitte jederzeit Kontakt mit uns auf.';
case 'If you have any questions regarding the protection of your data, your rights, or how to exercise them, please contact us.':
return 'Wenn Sie irgendwelche Fragen im Hinblick auf den Schutz Ihrer Daten, Ihre Rechte oder deren Ausübung haben, kontaktieren Sie uns bitte.';
case 'If you need help, please contact us.':
return 'Wenn Sie Hilfe benötigen, kontaktieren Sie uns bitte.';
case 'If you would like to cancel your use of our services, delete your account, or delete your personal information, you may do so in the respective sections of our services.':
return 'Wenn Sie Ihre Nutzung unserer Dienste beenden möchten, Ihr Benutzerkonto löschen möchten oder Ihre persönlichen Informationen entfernen möchten, können Sie dies in den jeweiligen Bereichen unserer Dienste tun.';
case 'In general, the applicable version of this policy is the one that is current at the time of your access of our services.':
return 'Im Allgemeinen ist die gültige Version dieser Erklärung diejenige, die zum Zeitpunkt Ihres Zugriffs auf unsere Dienste aktuell ist.';
case 'In order to prevent loss of data due to human errors or system failures, we keep additional backup copies of data, as most companies and service providers do, which may include some of your personal information.':
return 'Um Datenverlust durch menschliche Fehler oder durch Systemfehler zu verhindern, bewahren wir, wie es die meisten Unternehmen und Dienstleister tun, zusätzliche Sicherheitskopien auf, die Teile Ihrer persönlichen Informationen enthalten können.';
case 'Most changes will presumably be minor only and will therefore not affect your rights.':
return 'Die meisten Änderungen werden in Umfang und Bedeutung wahrscheinlich nur gering sein und deshalb Ihre Rechte nicht betreffen.';
case 'Object to automated decision-making':
return 'Widersprechen Sie automatisierten Entscheidungen';
case 'Object to direct marketing':
return 'Widersprechen Sie der Direktwerbung';
case 'Object to the use of your personal data':
return 'Widersprechen Sie der Verwendung Ihrer persönlichen Daten';
case 'Please contact us if you want further information on the specific mechanisms used by us when transferring your personal data internationally.':
return 'Bitte kontaktieren Sie uns, wenn Sie weitere Informationen zu den jeweiligen Maßnahmen erhalten möchten, die wir bei der internationalen Übermittlung Ihrer persönlichen Daten verwenden.';
case 'Processing is necessary for the performance of a contract to which you are party or in order to take steps at your request prior to entering into a contract (EU, General Data Protection Regulation (GDPR), Article 6(1)(b)).':
return 'Die Verarbeitung ist für die Erfüllung eines Vertrags, dessen Vertragspartei Sie sind, oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, die auf Ihre Anfrage erfolgen (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 6(1)(b)).';
case 'Processing is necessary in order to protect your vital interests or those of another natural person (EU, General Data Protection Regulation (GDPR), Article 6(1)(d)).':
return 'Die Verarbeitung ist erforderlich, um Ihre lebenswichtigen Interessen oder die einer anderen natürlichen Person zu schützen (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 6(1)(d)).';
case 'Processing is necessary to protect your vital interests or those of another natural person where you are physically or legally incapable of giving consent (EU, General Data Protection Regulation (GDPR), Article 9(2)(c)).':
return 'Die Verarbeitung ist zum Schutz Ihrer lebenswichtigen Interessen oder derer einer anderen natürlichen Person erforderlich und Sie sind aus körperlichen oder rechtlichen Gründen außerstande, Ihre Einwilligung zu geben (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 9(2)(c)).';
case 'Processing relates to personal data that you manifestly make public (EU, General Data Protection Regulation (GDPR), Article 9(2)(e)).':
return 'Die Verarbeitung bezieht sich auf persönliche Daten, die Sie offensichtlich öffentlich gemacht haben (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 9(2)(e)).';
case 'Protecting your privacy and keeping your personal information safe is our highest priority.':
return 'Die Sicherung Ihrer Privatsphäre und der Schutz Ihrer persönlichen Informationen haben für uns höchste Priorität.';
case 'Restrict the use of your personal data':
return 'Schränken Sie die Verwendung Ihrer persönlichen Daten ein';
case 'See further below for our contact information.':
return 'Unsere Kontaktdaten finden Sie weiter unten.';
case 'Should there be any substantial changes to this policy with material effects on any of your rights or choices, you will be notified via a prominent notice within our services or by email to the primary email address specified in your account at least %d days prior to such changes taking effect.':
return 'Sollte es wesentliche Änderungen an dieser Erklärung mit wichtigen Auswirkungen auf Ihre Rechte oder Wahlmöglichkeiten geben, werden Sie durch eine auffällige Ankündigung innerhalb unserer Dienste oder per E-Mail an die primäre E-Mail-Adresse, die in Ihrem Benutzerkonto hinterlegt ist, mindestens %d Tage vor dem Inkrafttreten solcher Änderungen benachrichtigt.';
case 'Should you believe that we might have any personal information of a child under the age of %d, in particular a child of your own, please contact us so that the data in question can be deleted, if appropriate.':
return 'Sollten Sie glauben, dass wir persönliche Informationen von einem Kind unter %d gespeichert haben könnten, insbesondere von einem Ihrer Kinder, kontaktieren Sie uns bitte umgehend, sodass die betroffenen Daten, falls zutreffend, gelöscht werden können.';
case 'Some of our external service providers and recipients of personal data are based outside your country and outside our country.':
return 'Manche unserer externen Dienstleister und Empfänger von persönlichen Daten haben ihren Sitz außerhalb Ihres Landes und außerhalb unseres Landes.';
case 'Such third countries may have data protection rules that are different from those in your or our country.':
return 'Solche Drittländer können Datenschutzregeln haben, die sich von denen in Ihrem oder unserem Land unterscheiden.';
case 'These third parties do not have any right to use the information that we share about you beyond what is necessary to assist us with the specific task at hand.':
return 'Diese Drittunternehmen sind nicht berechtigt, die Informationen, die wir über Sie weitergeben, über das Maß hinaus zu nutzen, das notwendig ist, um uns bei der konkreten Aufgabenstellung zu unterstützen.';
case 'The settings and features of your web browser or operating system may allow you to control how third parties can store cookies on your device.':
return 'Die Einstellungen und Funktionen Ihres Webbrowsers oder Betriebssystems können Ihnen erlauben, zu kontrollieren, wie Drittanbieter Cookies auf Ihrem Gerät speichern können.';
case 'The third parties that provide these contents may store cookies on your device for their own purposes and interests, which we cannot control.':
return 'Die Drittanbieter, die diese Inhalte bereitstellen, können Cookies für ihre eigenen Zwecke und Interessen auf Ihrem Gerät speichern, was wir nicht kontrollieren können.';
case 'They are, however, commonly used to store a unique identifier for every individual user, so that our servers do not lose information on who you are while you are moving through the individual parts of our services.':
return 'Sie werden jedoch häufig dazu verwendet, eine eindeutige Kennung für jeden einzelnen Nutzer zu speichern, damit unsere Server nicht die Information darüber verlieren, wer Sie sind, während Sie sich durch die einzelnen Bereiche unserer Dienste bewegen.';
case 'They are transferred from our servers to your device through your web browser or app.':
return 'Sie werden von unseren Servern über Ihren Webbrowser oder Ihre App auf Ihr Gerät übertragen.';
case 'This information is not required and you can use parts of our services without this information. You have to give your consent before we collect this data, but some features may not be available without.':
return 'Diese Information wird nicht zwingend benötigt und Sie können Teile unserer Dienste ohne diese Angabe nutzen. Sie müssen Ihre Genehmigung erteilen, bevor wir diese Daten erfassen, aber manche Funktionen sind ohne diese Daten möglicherweise nicht verfügbar.';
case 'This information is not required and you can use parts of our services without this information. You may withdraw your consent for our collection of this data, but some features may not be available without.':
return 'Diese Information wird nicht zwingend benötigt und Sie können Teile unserer Dienste ohne diese Angabe nutzen. Sie können Ihre Einwilligung zu unserer Erfassung dieser Daten widerrufen, aber manche Funktionen sind ohne diese Daten möglicherweise nicht verfügbar.';
case 'This information is required for the operation of our services and its collection is therefore a condition for your use of our services.':
return 'Diese Information wird für den Betrieb unserer Dienste benötigt und ihre Erhebung ist deshalb eine Bedingung für Ihre Nutzung unserer Dienste.';
case 'This is possible either by using the “Unsubscribe” feature at the bottom of such emails that we may send, or by adjusting the settings in your account within our services, where applicable.':
return 'Dies ist möglich, indem Sie entweder die „Abmelden“-Funktion am unteren Ende von solchen E-Mails benutzen, die wir senden könnten, oder durch das Ändern der Einstellungen in Ihrem Benutzerkonto innerhalb unserer Dienste, wo zutreffend.';
case 'This means that parts of your personal information may temporarily remain on our servers even after deletion or termination of your use of our services.':
return 'Dies bedeutet, dass Teile Ihrer persönlichen Informationen selbst nach Löschung oder nach Beendigung Ihrer Nutzung unserer Dienste vorübergehend auf unseren Servern bestehen bleiben können.';
case 'This means that the processing of your personal data by those third parties involves an international transfer of your data to a third country.':
return 'Dies bedeutet, dass die Verarbeitung Ihrer persönlichen Daten durch diese Drittanbieter eine internationale Übermittlung Ihrer Daten an ein Drittland umfasst.';
case 'This notification will include help on choices you may have regarding the transfer and treatment of your personal information.':
return 'Diese Benachrichtigung wird Hilfe zu den Wahlmöglichkeiten beinhalten, die Sie möglicherweise im Hinblick auf die Übertragung und Behandlung Ihrer persönlichen Informationen haben.';
case 'This notification will include help on choices you may have regarding the treatment of your personal information.':
return 'Diese Benachrichtigung wird Hilfe zu den Wahlmöglichkeiten beinhalten, die Sie möglicherweise im Hinblick auf die Behandlung Ihrer persönlichen Informationen haben.';
case 'This privacy policy governs your use of our services regardless of the domain names, operating systems, platforms or devices that are used to access the services, and regardless of whether such access is in connection with an account or not.':
return 'Diese Datenschutzerklärung regelt Ihre Nutzung unserer Dienste, unabhängig von den Domain-Namen, Betriebssystemen, Plattformen oder Geräten, die für den Zugriff auf die Dienste genutzt werden, und unabhängig davon, ob solcher Zugriff in Verbindung mit einem Benutzerkonto geschieht oder nicht.';
case 'This privacy statement (“privacy policy” or “policy”) is designed to help you better understand how and to what extent we collect, use, disclose, transfer and store your information.':
return 'Diese Datenschutzrichtlinie („Datenschutzerklärung“ oder „Erklärung“) soll Ihnen helfen, besser zu verstehen, wie und in welchem Umfang wir Ihre Informationen erfassen, verwenden, offenlegen, übertragen und speichern.';
case 'Thus, for any international transfer of data, we ensure that appropriate technical, organizational and contractual measures are in place to guarantee that a similar degree of protection is afforded to your data internationally and that your personal data remains protected to the standards described in this policy.':
return 'Deshalb stellen wir für jede internationale Übermittlung von Daten sicher, dass angemessene technische, organisatorische und vertragliche Maßnahmen getroffen werden, um zu gewährleisten, dass Ihren Daten international ein ähnlicher Schutz geboten wird und dass Ihre persönlichen Daten gemäß den Standards geschützt bleiben, die in dieser Erklärung beschrieben sind.';
case 'Update your personal data':
return 'Aktualisieren Sie Ihre persönlichen Daten';
case 'Upon verification of your identity, we will respond to your request within a reasonable period of time.':
return 'Nach Überprüfung Ihrer Identität werden wir innerhalb eines angemessenen Zeitraumes auf Ihre Anfrage antworten.';
case 'We advise you to verify the privacy practices of those third parties individually.':
return 'Wir raten Ihnen, die Datenschutzpraktiken dieser Drittunternehmen individuell zu überprüfen.';
case 'We always collect only the minimum amount of personal information necessary to provide our services to you, unless you choose to provide more such information voluntarily.':
return 'Wir erheben immer nur die kleinstmögliche Menge an persönliche Informationen, die nötig ist, um unsere Dienste für Sie bereitstellen zu können, es sei denn, Sie entschließen sich freiwillig dazu, mehr solcher Informationen zu übertragen.';
case 'We encourage you not to provide any personal information to those third parties before assuring yourself of proper privacy practices on their part.':
return 'Wir empfehlen Ihnen, diesen Drittunternehmen keine persönlichen Informationen bereitzustellen, bevor Sie sich von angemessenen Datenschutzpraktiken seitens dieser Unternehmen überzeugt haben.';
case 'We encourage you to give us, and, more generally, any provider of digital services, only the amount of data you are comfortable sharing.':
return 'Wir ermutigen Sie dazu, uns, und allgemeiner jedem Anbieter von digitalen Dienstleistungen, nur die Menge an Daten bereitzustellen, mit der Sie sich wohlfühlen.';
case 'We have no knowledge about and are not responsible for the way that those third parties handle any personal information which you provide to them yourself.':
return 'Wir haben keine Kenntnis von und sind nicht verantwortlich für die Art und Weise, wie diese Drittunternehmen persönliche Informationen behandeln, die Sie ihnen selbst bereitstellen.';
case 'We may retain and use your personal information and data as necessary to comply with our legal obligations, to resolve disputes, and to enforce our rights and agreements.':
return 'Wir bewahren Ihre persönlichen Informationen und Daten möglicherweise so lange auf und nutzen diese, wie es erforderlich ist, um unsere gesetzlichen Verpflichtungen einzuhalten, Streitfälle beizulegen und unsere Rechte und Vereinbarungen durchzusetzen.';
case 'We offer you simple ways to view, update or delete the data we have collected about you.':
return 'Wir bieten Ihnen einfache Möglichkeiten, die Informationen, die wir über Sie erfasst haben, anzusehen, zu aktualisieren und zu löschen.';
case 'We take the trust that you place in us very seriously.':
return 'Wir nehmen das Vertrauen, das Sie uns entgegenbringen, sehr ernst.';
case 'We use this information to personalize our services for you and to adjust them to your preferences.':
return 'Wir nutzen diese Informationen, um unsere Dienste für Sie zu personalisieren und sie an Ihre Präferenzen anzupassen.';
case 'We use this information to provide and fulfill the specific services that you explicitly request.':
return 'Wir nutzen diese Informationen, um die konkreten Dienstleistungen, die Sie ausdrücklich anfordern, bereitstellen und erfüllen zu können.';
case 'We use this information to provide customer service to you, to answer your questions and to communicate with you about your use of our services.':
return 'Wir nutzen diese Informationen, um Ihnen Kundendienst anzubieten, Ihre Fragen zu beantworten und mit Ihnen über Ihre Nutzung unserer Dienste zu kommunizieren.';
case 'We use this information to provide meaningful and unobtrusive advertising to you.':
return 'Wir nutzen diese Informationen, um Ihnen aussagekräftige und unaufdringliche Werbung zeigen zu können.';
case 'We want to help and will be happy to address your concerns.':
return 'Wir möchten helfen und kümmern uns gerne um Ihr Anliegen.';
case 'We will retain certain pieces of personal information for as long as you use our services, as long as your account exists, or as long as needed for us to be able to provide our services to you.':
return 'Wir werden gewisse persönliche Informationen so lange aufbewahren, wie Sie unsere Dienste nutzen, wie Ihr Benutzerkonto besteht oder wie es nötig ist, um unsere Dienste für Sie bereitstellen zu können.';
case 'You are free to file a complaint with the data protection authority.':
return 'Es steht Ihnen frei, bei der Datenschutzbehörde eine Beschwerde einzulegen.';
case 'You are welcome to make use of these settings and features of your web browser or operating system, but that may prevent our services from working correctly for you.':
return 'Sie können gerne von diesen Einstellungen und Funktionen in Ihrem Webbrowser oder Betriebssystem Gebrauch machen, aber dies kann unsere Dienste daran hindern, korrekt für Sie zu funktionieren.';
case 'You can reach us via email at:':
return 'Sie erreichen uns per E-Mail unter:';
case 'You have given consent to the processing of your personal data for one or more specific purposes (EU, General Data Protection Regulation (GDPR), Article 6(1)(a)).':
return 'Sie haben Ihre Einwilligung zur Verarbeitung der Sie betreffenden persönlichen Daten für einen oder mehrere bestimmte Zwecke gegeben (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 6(1)(a)).';
case 'You have given explicit consent to the processing of your personal data for one or more specified purposes (EU, General Data Protection Regulation (GDPR), Article 9(2)(a)).':
return 'Sie haben in die Verarbeitung der genannten persönlichen Daten für einen oder mehrere festgelegte Zwecke ausdrücklich eingewilligt (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 9(2)(a)).';
case 'You have the right not to be subject to a decision based solely on automated decision-making, including profiling, where the decision would have a legal effect on you or produce a similarly significant effect.':
return 'Sie haben das Recht, keiner Entscheidung unterworfen zu sein, die allein auf einer automatisierten Entscheidungsfindung basiert, einschließlich der Profilerstellung, wenn eine solche Entscheidung Ihnen gegenüber rechtliche Auswirkungen hätte oder eine ähnlich erhebliche Beeinträchtigung hervorrufen würde.';
case 'You have the right to be informed of and request access to the personal data we process about you.':
return 'Sie haben das Recht, über die persönlichen Daten, die wir von Ihnen erheben, informiert zu werden und Zugriff darauf zu erhalten.';
case 'You have the right to object to us processing your personal data on grounds relating to your particular situation where we no longer have a legitimate reason or legal need to process it.':
return 'Sie haben das Recht, der Verarbeitung Ihrer persönlichen Daten durch uns aus Gründen zu widersprechen, die sich aus Ihrer speziellen Situation ergeben, wenn wir keinen legitimen Grund oder keine rechtliche Verpflichtung mehr zu deren Verarbeitung haben.';
case 'You have the right to object to your personal data being processed for direct marketing purposes.':
return 'Sie haben das Recht, der Verarbeitung Ihrer persönlichen Daten für Zwecke der Direktwerbung zu widersprechen.';
case 'You have the right to request a copy of your personal data in electronic and machine-readable form, and the right to transmit that personal data to another service provider.':
return 'Sie haben das Recht, eine Kopie Ihrer persönlichen Daten in elektronischer und maschinenlesbarer Form anzufordern, und das Recht, diese persönlichen Daten an einen anderen Diensteanbieter zu übertragen.';
case 'You have the right to request that we amend or update your personal data where it is inaccurate or incomplete.':
return 'Sie haben das Recht, von uns die Änderung oder Aktualisierung Ihrer persönlichen Daten zu fordern, wo diese fehlerhaft oder unvollständig sind.';
case 'You have the right to request that we delete your personal data.':
return 'Sie haben das Recht, von uns die Löschung Ihrer persönlichen Daten zu verlangen.';
case 'You have the right to request that we temporarily or permanently stop processing your personal data.':
return 'Sie haben das Recht, uns aufzufordern, die Verarbeitung Ihrer persönlichen Daten vorübergehend oder dauerhaft einzustellen.';
case 'You may also contact the data protection authority that is responsible for us:':
return 'Sie können auch die Datenschutzbehörde kontaktieren, die für uns zuständig ist:';
case 'You may opt out of receiving any newsletters or promotional messages from us at any time.':
return 'Sie können dem Empfang jeglicher Newsletter oder Werbenachrichten von uns jederzeit widersprechen.';
case 'Your rights':
return 'Ihre Rechte';
case 'Your web browser or app then sends these small text files back to us whenever you access our services.':
return 'Ihr Webbrowser oder Ihre App sendet diese kleinen Textdateien dann jedes Mal an uns zurück, wenn Sie auf unsere Dienste zugreifen.';
case 'Your web browser or operating system usually provides means to delete such data currently stored on your device.':
return 'Ihr Webbrowser oder Betriebssystem bietet üblicherweise Möglichkeiten an, solche Daten, die zurzeit auf Ihrem Gerät gespeichert sind, zu löschen.';
case 'You should never disclose your authentication information to any third party and you should notify us immediately of any unauthorized use of your account.':
return 'Sie sollten Ihre Informationen zur Authentifizierung niemals Dritten preisgeben und Sie sollten uns unverzüglich über jegliche unberechtigte Nutzung Ihres Benutzerkontos benachrichtigen.';
case 'You therefore consent to our use of cookies and related technologies when using our services.':
return 'Sie erklären sich deshalb mit unserer Nutzung von Cookies und ähnlichen Technologien einverstanden, wenn Sie unsere Dienste nutzen.';
case 'You will be notified via a prominent notice within our services or by email to the primary email address specified in your account at least %d days before any such transfer of your personal information.':
return 'Sie werden durch eine auffällige Ankündigung innerhalb unserer Dienste oder per E-Mail an die primäre E-Mail-Adresse, die in Ihrem Benutzerkonto hinterlegt ist, mindestens %d Tage vor einer solchen Übertragung Ihrer persönlichen Informationen benachrichtigt.';
case 'You will continue to receive essential, non-promotional messages regarding your account, such as technical notices, order confirmations, or other service-related messages, which are required for us to be able to provide our services to you.':
return 'Sie werden weiterhin grundlegende Nachrichten bezüglich Ihres Benutzerkontos erhalten, die nicht der Werbung dienen, wie etwa technische Mitteilungen, Auftragsbestätigungen oder andere dienstbezogene Nachrichten, die nötig sind, damit wir Ihnen unsere Dienste bereitstellen können.';
default:
return parent::translateUnformatted($text);
}
}
}
================================================
FILE: src/Language/GermanInformalPrivacyPolicy.php
================================================
<?php
/*
* PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)
* Copyright (c) delight.im (https://www.delight.im/)
* Licensed under the MIT License (https://opensource.org/licenses/MIT)
*/
namespace Delight\PrivacyPolicy\Language;
/** Privacy policy for humans in informal German ("du") */
class GermanInformalPrivacyPolicy extends GermanPrivacyPolicy {
protected function translateUnformatted($text) {
switch ($text) {
case 'Access your personal data':
return 'Erhalte Zugriff auf deine persönlichen Daten';
case 'Apart from that, please recognize that protecting your personal information is, in other parts, also your own responsibility.':
return 'Bitte denke im Übrigen daran, dass der Schutz deiner persönlichen Informationen in anderen Teilen ebenso deiner eigenen Verantwortung unterliegt.';
case 'As a condition for your use of our services as a customer, user or visitor (collectively referred to as a “user” or as your “use”), you consent to the terms of this policy and you agree that your personal information will be handled as outlined below.':
return 'Als Bedingung für deine Nutzung unserer Dienste als Kunde, Nutzer oder Besucher (zusammen als „Nutzer“ oder als deine „Nutzung“ bezeichnet) stimmst du den Bedingungen dieser Erklärung zu und du erklärst dich damit einverstanden, dass deine persönlichen Informationen wie im Folgenden beschrieben verarbeitet werden.';
case 'Erase your personal data':
return 'Lösche deine persönlichen Daten';
case 'Especially, you are responsible for safeguarding any passwords and other authentication information that you use to access our services, as well as limiting physical access to the devices used.':
return 'Insbesondere bist du dafür verantwortlich, jegliche Passwörter und andere Informationen zur Authentifizierung zu schützen, die du nutzt, um auf unsere Dienste zuzugreifen, sowie dafür, den Zugang zu den genutzten Geräten einzuschränken.';
case 'Except as limited under applicable law, you have the following rights with regard to your personal data:':
return 'Soweit nicht durch anwendbares Recht eingeschränkt, hast du im Hinblick auf deine persönlichen Daten die folgenden Rechte:';
case 'Export your personal data':
return 'Exportiere deine persönlichen Daten';
case 'For any less significant changes to this privacy policy that do not affect your rights or choices in a material way, we encourage all users to check this policy for updated versions periodically.':
return 'Für jegliche Änderungen an dieser Datenschutzerklärung, die von geringerer Bedeutung sind und deine Rechte oder Wahlmöglichkeiten nicht in wichtiger Weise betreffen, empfehlen wir allen Nutzern, diese Erklärung regelmäßig hinsichtlich aktualisierter Versionen zu überprüfen.';
case 'For example, we may use these technologies to keep you signed in and to remember your preferences with regard to our services.':
return 'Wir können diese Technologien zum Beispiel verwenden, um dich eingeloggt bleiben zu lassen und um deine Einstellungen im Hinblick auf unsere Dienste beizubehalten.';
case 'For more information on how to delete such data currently stored on your device, please refer to the manual or help section of your web browser or operating system.':
return 'Weitere Informationen darüber, wie du solche Daten, die zurzeit auf deinem Gerät gespeichert sind, löschen kannst, findest du im Handbuch oder Hilfebereich deines Webbrowsers oder Betriebssystems.';
case 'For our contact information, please see further below.':
return 'Unsere Kontaktdaten findest du weiter unten.';
case 'From time to time, we may share some information we have collected from you, including personal information, with a limited number of third-party vendors, service providers, contractors, resellers, agents or business partners, solely for the purpose of performing certain functions on our behalf.':
return 'Gelegentlich geben wir möglicherweise einen Teil der Informationen, die wir über dich erfasst haben, einschließlich persönlicher Informationen, an eine begrenzte Zahl von Drittunternehmen weiter, darunter Lieferanten, Dienstleister, Auftragnehmer, Vertriebspartner und Vertreter. Dies geschieht ausschließlich zur Ausführung bestimmter Funktionen für uns und in unserem Auftrag.';
case 'However, please be aware that, despite our best efforts, no method of electronic transmission or storage is perfectly secure and no measures can guarantee absolute security.':
return 'Beachte jedoch bitte, dass trotz unserer größten Bemühungen keine Methode der elektronischen Datenübertragung oder Datenspeicherung vollkommen sicher ist und keine Maßnahmen eine absolute Sicherheit garantieren können.';
case 'How we secure your information':
return 'Wie wir deine Informationen sichern';
case 'If any such change of ownership happens, the organization receiving your personal information will have to respect the promises that we have made in any pre-existing privacy policy such as this one.':
return 'Falls ein solcher Wechsel des Eigentümers stattfinden sollte, wird die Gesellschaft, die deine persönlichen Informationen erhält, die Zusagen, die wir in einer zuvor existierenden Datenschutzerklärung wie dieser gemacht haben, anerkennen und achten müssen.';
case 'If in doubt, rather do not share sensitive information.':
return 'Gib sensible Informationen im Zweifelsfall eher nicht preis.';
case 'If we are involved in a merger, an acquisition by another company, or a sale of all or a portion of our business or assets, your information will likely be among the assets transferred.':
return 'Wenn wir in eine Fusion, eine Übernahme durch ein anderes Unternehmen oder einen Verkauf unseres gesamten Unternehmens, unserer gesamten Vermögenswerte oder Teilen davon involviert sind, werden deine Informationen wahrscheinlich Bestandteil der zu übertragenden Vermögensgüter sein.';
case 'If we have any plausible reason to believe that you are a user who is under the age of %d, we will have to prohibit you from continuing your use of our services.':
return 'Wenn wir einen glaubwürdigen Grund haben, anzunehmen, dass du ein Nutzer im Alter unter %d bist, müssen wir dir die weitere Nutzung unserer Dienste untersagen.';
case 'If you are a child below that age, you may not use any of our services.':
return 'Wenn du ein Kind unterhalb dieses Alters bist, darfst du keinen unserer Dienste nutzen.';
case 'If you are unsatisfied with our response or with the way we are processing your personal data, you may contact your local data protection authority.':
return 'Falls du mit unserer Antwort oder mit der Art und Weise, wie wir deine persönlichen Daten verarbeiten, unzufrieden bist, kannst du deine örtliche Datenschutzbehörde kontaktieren.';
case 'If you have any questions or concerns regarding this policy, our privacy practices or certain aspects of our services, please contact us at any time.':
return 'Solltest du irgendwelche Fragen oder Bedenken bezüglich dieser Erklärung, unserer Datenschutzpraktiken oder bestimmter Aspekte unserer Dienste haben, nimm bitte jederzeit Kontakt mit uns auf.';
case 'If you have any questions regarding the protection of your data, your rights, or how to exercise them, please contact us.':
return 'Wenn du irgendwelche Fragen im Hinblick auf den Schutz deiner Daten, deine Rechte oder deren Ausübung hast, kontaktiere uns bitte.';
case 'If you need help, please contact us.':
return 'Wenn du Hilfe benötigst, kontaktiere uns bitte.';
case 'If you would like to cancel your use of our services, delete your account, or delete your personal information, you may do so in the respective sections of our services.':
return 'Wenn du deine Nutzung unserer Dienste beenden möchtest, dein Benutzerkonto löschen möchtest oder deine persönlichen Informationen entfernen möchtest, kannst du dies in den jeweiligen Bereichen unserer Dienste tun.';
case 'In general, the applicable version of this policy is the one that is current at the time of your access of our services.':
return 'Im Allgemeinen ist die gültige Version dieser Erklärung diejenige, die zum Zeitpunkt deines Zugriffs auf unsere Dienste aktuell ist.';
case 'In order to prevent loss of data due to human errors or system failures, we keep additional backup copies of data, as most companies and service providers do, which may include some of your personal information.':
return 'Um Datenverlust durch menschliche Fehler oder durch Systemfehler zu verhindern, bewahren wir, wie es die meisten Unternehmen und Dienstleister tun, zusätzliche Sicherheitskopien auf, die Teile deiner persönlichen Informationen enthalten können.';
case 'Most changes will presumably be minor only and will therefore not affect your rights.':
return 'Die meisten Änderungen werden in Umfang und Bedeutung wahrscheinlich nur gering sein und deshalb deine Rechte nicht betreffen.';
case 'Object to automated decision-making':
return 'Widerspreche automatisierten Entscheidungen';
case 'Object to direct marketing':
return 'Widerspreche der Direktwerbung';
case 'Object to the use of your personal data':
return 'Widerspreche der Verwendung deiner persönlichen Daten';
case 'Please contact us if you want further information on the specific mechanisms used by us when transferring your personal data internationally.':
return 'Bitte kontaktiere uns, wenn du weitere Informationen zu den jeweiligen Maßnahmen erhalten möchtest, die wir bei der internationalen Übermittlung deiner persönlichen Daten verwenden.';
case 'Processing is necessary for the performance of a contract to which you are party or in order to take steps at your request prior to entering into a contract (EU, General Data Protection Regulation (GDPR), Article 6(1)(b)).':
return 'Die Verarbeitung ist für die Erfüllung eines Vertrags, dessen Vertragspartei du bist, oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, die auf deine Anfrage erfolgen (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 6(1)(b)).';
case 'Processing is necessary in order to protect your vital interests or those of another natural person (EU, General Data Protection Regulation (GDPR), Article 6(1)(d)).':
return 'Die Verarbeitung ist erforderlich, um deine lebenswichtigen Interessen oder die einer anderen natürlichen Person zu schützen (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 6(1)(d)).';
case 'Processing is necessary to protect your vital interests or those of another natural person where you are physically or legally incapable of giving consent (EU, General Data Protection Regulation (GDPR), Article 9(2)(c)).':
return 'Die Verarbeitung ist zum Schutz deiner lebenswichtigen Interessen oder derer einer anderen natürlichen Person erforderlich und du bist aus körperlichen oder rechtlichen Gründen außerstande, deine Einwilligung zu geben (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 9(2)(c)).';
case 'Processing relates to personal data that you manifestly make public (EU, General Data Protection Regulation (GDPR), Article 9(2)(e)).':
return 'Die Verarbeitung bezieht sich auf persönliche Daten, die du offensichtlich öffentlich gemacht hast (EU, Datenschutz-Grundverordnung (DSGVO), Artikel 9(2)(e)).';
case 'Protecting your privacy and keeping your personal information safe is our highest priority.':
return 'Die Sicherung deiner Privatsphäre und der Schutz deiner persönlichen Informationen haben für uns höchste Priorität.';
case 'Restrict the use of your personal data':
return 'Schränke die Verwendung deiner persönlichen Daten ein';
case 'See further below for our contact information.':
return 'Unsere Kontaktdaten findest du weiter unten.';
case 'Should there be any substantial changes to this policy with material effects on any of your rights or choices, you will be notified via a prominent notice within our services or by email to the primary email address specified in your account at least %d days prior to such changes taking effect.':
return 'Sollte es wesentliche Änderungen an dieser Erklärung mit wichtigen Auswirkungen auf deine Rechte oder Wahlmöglichkeiten geben, wirst du durch eine auffällige Ankündigung innerhalb unserer Dienste oder per E-Mail an die primäre E-Mail-Adresse, die in deinem Benutzerkonto hinterlegt ist, mindestens %d Tage vor dem Inkrafttreten solcher Änderungen benachrichtigt.';
case 'Should you believe that we might have any personal information of a child under the age of %d, in particular a child of your own, please contact us so that the data in question can be deleted, if appropriate.':
return 'Solltest du glauben, dass wir persönliche Informationen von einem Kind unter %d gespeichert haben könnten, insbesondere von einem deiner Kinder, kontaktiere uns bitte umgehend, sodass die betroffenen Daten, falls zutreffend, gelöscht werden können.';
case 'Some of our external service providers and recipients of personal data are based outside your country and outside our country.':
return 'Manche unserer externen Dienstleister und Empfänger von persönlichen Daten haben ihren Sitz außerhalb deines Landes und außerhalb unseres Landes.';
case 'Such third countries may have data protection rules that are different from those in your or our country.':
return 'Solche Drittländer können Datenschutzregeln haben, die sich von denen in deinem oder unserem Land unterscheiden.';
case 'These third parties do not have any right to use the information that we share about you beyond what is necessary to assist us with the specific task at hand.':
return 'Diese Drittunternehmen sind nicht berechtigt, die Informationen, die wir über dich weitergeben, über das Maß hinaus zu nutzen, das notwendig ist, um uns bei der konkreten Aufgabenstellung zu unterstützen.';
case 'The settings and features of your web browser or operating system may allow you to control how third parties can store cookies on your device.':
return 'Die Einstellungen und Funktionen deines Webbrowsers oder Betriebssystems können dir erlauben, zu kontrollieren, wie Drittanbieter Cookies auf deinem Gerät speichern können.';
case 'The third parties that provide these contents may store cookies on your device for their own purposes and interests, which we cannot control.':
return 'Die Drittanbieter, die diese Inhalte bereitstellen, können Cookies für ihre eigenen Zwecke und Interessen auf deinem Gerät speichern, was wir nicht kontrollieren können.';
case 'They are, however, commonly used to store a unique identifier for every individual user, so that our servers do not lose information on who you are while you are moving through the individual parts of our services.':
return 'Sie werden jedoch häufig dazu verwendet, eine eindeutige Kennung für jeden einzelnen Nutzer zu speichern, damit unsere Server nicht die Information darüber verlieren, wer du bist, während du dich durch die einzelnen Bereiche unserer Dienste bewegst.';
case 'They are transferred from our servers to your device through your web browser or app.':
return 'Sie werden von unseren Servern über deinen Webbrowser oder deine App auf dein Gerät übertragen.';
case 'This information is not required and you can use parts of our services without this information. You have to give your consent before we collect this data, but some features may not be available without.':
return 'Diese Information wird nicht zwingend benötigt und du kannst Teile unserer Dienste ohne diese Angabe nutzen. Du musst deine Genehmigung erteilen, bevor wir diese Daten erfassen, aber manche Funktionen sind ohne diese Daten möglicherweise nicht verfügbar.';
case 'This information is not required and you can use parts of our services without this information. You may withdraw your consent for our collection of this data, but some features may not be available without.':
return 'Diese Information wird nicht zwingend benötigt und du kannst Teile unserer Dienste ohne diese Angabe nutzen. Du kannst deine Einwilligung zu unserer Erfassung dieser Daten widerrufen, aber manche Funktionen sind ohne diese Daten möglicherweise nicht verfügbar.';
case 'This information is required for the operation of our services and its collection is therefore a condition for your use of our services.':
return 'Diese Information wird für den Betrieb unserer Dienste benötigt und ihre Erhebung ist deshalb eine Bedingung für deine Nutzung unserer Dienste.';
case 'This is possible either by using the “Unsubscribe” feature at the bottom of such emails that we may send, or by adjusting the settings in your account within our services, where applicable.':
return 'Dies ist möglich, indem du entweder die „Abmelden“-Funktion am unteren Ende von solchen E-Mails benutzt, die wir senden könnten, oder durch das Ändern der Einstellungen in deinem Benutzerkonto innerhalb unserer Dienste, wo zutreffend.';
case 'This means that parts of your personal information may temporarily remain on our servers even after deletion or termination of your use of our services.':
return 'Dies bedeutet, dass Teile deiner persönlichen Informationen selbst nach Löschung oder nach Beendigung deiner Nutzung unserer Dienste vorübergehend auf unseren Servern bestehen bleiben können.';
case 'This means that the processing of your personal data by those third parties involves an international transfer of your data to a third country.':
return 'Dies bedeutet, dass die Verarbeitung deiner persönlichen Daten durch diese Drittanbieter eine internationale Übermittlung deiner Daten an ein Drittland umfasst.';
case 'This notification will include help on choices you may have regarding the transfer and treatment of your personal information.':
return 'Diese Benachrichtigung wird Hilfe zu den Wahlmöglichkeiten beinhalten, die du möglicherweise im Hinblick auf die Übertragung und Behandlung deiner persönlichen Informationen hast.';
case 'This notification will include help on choices you may have regarding the treatment of your personal information.':
return 'Diese Benachrichtigung wird Hilfe zu den Wahlmöglichke
gitextract_ui_n7_0g/
├── .editorconfig
├── .gitignore
├── LICENSE
├── Migration.md
├── README.md
├── Sorting.md
├── composer.json
├── src/
│ ├── Data/
│ │ ├── DataBasis.php
│ │ ├── DataElement.php
│ │ ├── DataGroup.php
│ │ ├── DataPurpose.php
│ │ ├── DataRequirement.php
│ │ ├── DataSpecialCondition.php
│ │ └── DataType.php
│ ├── HumanPrivacyPolicy.php
│ ├── Language/
│ │ ├── EnglishPrivacyPolicy.php
│ │ ├── GermanFormalPrivacyPolicy.php
│ │ ├── GermanInformalPrivacyPolicy.php
│ │ ├── GermanPrivacyPolicy.php
│ │ └── JsonPrivacyPolicy.php
│ ├── MachinePrivacyPolicy.php
│ ├── Markup/
│ │ ├── AbbreviationMarkup.php
│ │ ├── ConcatenationMarkup.php
│ │ ├── DefinitionList/
│ │ │ ├── DefinitionGroup.php
│ │ │ └── DefinitionList.php
│ │ ├── ImageMarkup.php
│ │ ├── LinkMarkup.php
│ │ ├── Markup.php
│ │ ├── SimpleMarkup.php
│ │ └── TextMarkup.php
│ ├── PrivacyPolicy.php
│ ├── Scope/
│ │ ├── AndroidAppScope.php
│ │ ├── AppStoreIosAppScope.php
│ │ ├── IosAppScope.php
│ │ ├── MobileAppScope.php
│ │ ├── PlayStoreAndroidAppScope.php
│ │ ├── Scope.php
│ │ └── WebsiteScope.php
│ └── Throwable/
│ ├── Error.php
│ ├── Exception.php
│ ├── InvalidFormatArgumentsError.php
│ ├── TranslationNotFoundError.php
│ ├── UnexpectedDataBasisError.php
│ ├── UnexpectedDataPurposeError.php
│ ├── UnexpectedDataRequirementError.php
│ ├── UnexpectedDataSpecialConditionError.php
│ ├── UnexpectedDataTypeError.php
│ └── UnexpectedScopeError.php
└── tests/
└── index.php
SYMBOL INDEX (225 symbols across 41 files)
FILE: src/Data/DataBasis.php
class DataBasis (line 14) | final class DataBasis {
method toNaturalLanguage (line 36) | public static function toNaturalLanguage($identifier) {
method toLegalReference (line 62) | public static function toLegalReference($identifier) {
FILE: src/Data/DataElement.php
class DataElement (line 12) | final class DataElement {
method getType (line 26) | public function getType() {
method getRequirement (line 35) | public function getRequirement() {
method hasMaxRetention (line 44) | public function hasMaxRetention() {
method getMaxRetention (line 53) | public function getMaxRetention() {
method __construct (line 64) | public function __construct($type, $requirement = null, $maxRetention ...
FILE: src/Data/DataGroup.php
class DataGroup (line 12) | final class DataGroup {
method getTitle (line 34) | public function getTitle() {
method hasDescription (line 43) | public function hasDescription() {
method getDescription (line 52) | public function getDescription() {
method hasBases (line 61) | public function hasBases() {
method getBases (line 70) | public function getBases() {
method hasSpecialConditions (line 79) | public function hasSpecialConditions() {
method getSpecialConditions (line 88) | public function getSpecialConditions() {
method hasPurposes (line 97) | public function hasPurposes() {
method getPurposes (line 106) | public function getPurposes() {
method getRequirement (line 115) | public function getRequirement() {
method hasElements (line 124) | public function hasElements() {
method getElements (line 133) | public function getElements() {
method addElement (line 144) | public function addElement($type, $requirement = null, $maxRetention =...
method __construct (line 159) | public function __construct($title, $description = null, array $bases ...
FILE: src/Data/DataPurpose.php
class DataPurpose (line 14) | final class DataPurpose {
method toNaturalLanguage (line 107) | public static function toNaturalLanguage($identifier) {
FILE: src/Data/DataRequirement.php
class DataRequirement (line 14) | final class DataRequirement {
method toBool (line 48) | public static function toBool($identifier) {
method toNaturalLanguage (line 68) | public static function toNaturalLanguage($identifier) {
FILE: src/Data/DataSpecialCondition.php
class DataSpecialCondition (line 14) | final class DataSpecialCondition {
method toNaturalLanguage (line 44) | public static function toNaturalLanguage($identifier) {
method toLegalReference (line 78) | public static function toLegalReference($identifier) {
FILE: src/Data/DataType.php
class DataType (line 14) | final class DataType {
method toNaturalLanguage (line 514) | public static function toNaturalLanguage($identifier) {
FILE: src/HumanPrivacyPolicy.php
class HumanPrivacyPolicy (line 32) | abstract class HumanPrivacyPolicy extends PrivacyPolicy {
method getShortTitle (line 48) | abstract public function getShortTitle();
method getLongTitle (line 55) | abstract public function getLongTitle();
method toHtml (line 62) | public function toHtml() {
method toPlainText (line 71) | public function toPlainText() {
method toMarkdown (line 80) | public function toMarkdown() {
method translateUnformatted (line 93) | abstract protected function translateUnformatted($text);
method formatDate (line 101) | abstract protected function formatDate($unixTimestamp);
method formatHours (line 109) | abstract protected function formatHours($n);
method formatDays (line 117) | abstract protected function formatDays($n);
method formatWeeks (line 125) | abstract protected function formatWeeks($n);
method formatMonths (line 133) | abstract protected function formatMonths($n);
method formatYears (line 141) | abstract protected function formatYears($n);
method toMarkup (line 148) | private function toMarkup() {
method lang (line 895) | private function lang($text, ...$arguments) {
FILE: src/Language/EnglishPrivacyPolicy.php
class EnglishPrivacyPolicy (line 14) | class EnglishPrivacyPolicy extends HumanPrivacyPolicy {
method getShortTitle (line 16) | public function getShortTitle() {
method getLongTitle (line 20) | public function getLongTitle() {
method translateUnformatted (line 24) | protected function translateUnformatted($text) {
method formatDate (line 28) | protected function formatDate($unixTimestamp) {
method formatHours (line 32) | protected function formatHours($n) {
method formatDays (line 36) | protected function formatDays($n) {
method formatWeeks (line 40) | protected function formatWeeks($n) {
method formatMonths (line 44) | protected function formatMonths($n) {
method formatYears (line 48) | protected function formatYears($n) {
FILE: src/Language/GermanFormalPrivacyPolicy.php
class GermanFormalPrivacyPolicy (line 12) | class GermanFormalPrivacyPolicy extends GermanPrivacyPolicy {
method translateUnformatted (line 14) | protected function translateUnformatted($text) {
FILE: src/Language/GermanInformalPrivacyPolicy.php
class GermanInformalPrivacyPolicy (line 12) | class GermanInformalPrivacyPolicy extends GermanPrivacyPolicy {
method translateUnformatted (line 14) | protected function translateUnformatted($text) {
FILE: src/Language/GermanPrivacyPolicy.php
class GermanPrivacyPolicy (line 15) | abstract class GermanPrivacyPolicy extends HumanPrivacyPolicy {
method getShortTitle (line 17) | public function getShortTitle() {
method getLongTitle (line 21) | public function getLongTitle() {
method translateUnformatted (line 25) | protected function translateUnformatted($text) {
method formatDate (line 710) | protected function formatDate($unixTimestamp) {
method formatHours (line 714) | protected function formatHours($n) {
method formatDays (line 718) | protected function formatDays($n) {
method formatWeeks (line 722) | protected function formatWeeks($n) {
method formatMonths (line 726) | protected function formatMonths($n) {
method formatYears (line 730) | protected function formatYears($n) {
FILE: src/Language/JsonPrivacyPolicy.php
class JsonPrivacyPolicy (line 18) | final class JsonPrivacyPolicy extends MachinePrivacyPolicy {
method toJson (line 35) | public function toJson() {
method encodeAsJson (line 248) | private function encodeAsJson(array $data) {
FILE: src/MachinePrivacyPolicy.php
class MachinePrivacyPolicy (line 12) | abstract class MachinePrivacyPolicy extends PrivacyPolicy {
method isMinified (line 22) | public function isMinified() {
method setMinified (line 31) | public function setMinified($minified) {
method __construct (line 35) | public function __construct() {
FILE: src/Markup/AbbreviationMarkup.php
class AbbreviationMarkup (line 12) | final class AbbreviationMarkup extends Markup {
method __construct (line 23) | public function __construct($abridgement, $expansion = null) {
method toHtmlWithIndentation (line 28) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 50) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 64) | public function toMarkdownWithIndentation($indentation) {
FILE: src/Markup/ConcatenationMarkup.php
class ConcatenationMarkup (line 12) | final class ConcatenationMarkup extends Markup {
method __construct (line 20) | public function __construct(...$elements) {
method toHtmlWithIndentation (line 24) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 34) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 44) | public function toMarkdownWithIndentation($indentation) {
FILE: src/Markup/DefinitionList/DefinitionGroup.php
class DefinitionGroup (line 15) | final class DefinitionGroup extends Markup {
method addDefinition (line 27) | public function addDefinition($definition) {
method addDefinitionInteractively (line 42) | public function addDefinitionInteractively(callable $build) {
method toHtmlWithIndentation (line 46) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 82) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 93) | public function toMarkdownWithIndentation($indentation) {
method __construct (line 123) | public function __construct($term, callable $init = null) {
FILE: src/Markup/DefinitionList/DefinitionList.php
class DefinitionList (line 14) | final class DefinitionList extends Markup {
method addDefinitionGroup (line 27) | public function addDefinitionGroup($term, callable $init = null) {
method toHtmlWithIndentation (line 31) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 47) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 61) | public function toMarkdownWithIndentation($indentation) {
method __construct (line 82) | public function __construct(callable $init = null) {
FILE: src/Markup/ImageMarkup.php
class ImageMarkup (line 12) | final class ImageMarkup extends Markup {
method __construct (line 29) | public function __construct($source, $alternativeText = null, $width =...
method toHtmlWithIndentation (line 36) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 67) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 81) | public function toMarkdownWithIndentation($indentation) {
FILE: src/Markup/LinkMarkup.php
class LinkMarkup (line 12) | final class LinkMarkup extends Markup {
method __construct (line 26) | public function __construct($target, $label = null, $description = nul...
method toHtmlWithIndentation (line 41) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 69) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 91) | public function toMarkdownWithIndentation($indentation) {
FILE: src/Markup/Markup.php
class Markup (line 12) | abstract class Markup {
method toHtml (line 77) | public function toHtml($indentation = null) {
method toHtmlWithIndentation (line 89) | abstract public function toHtmlWithIndentation($indentation);
method toPlainText (line 97) | public function toPlainText($indentation = null) {
method toPlainTextWithIndentation (line 109) | abstract public function toPlainTextWithIndentation($indentation);
method toMarkdown (line 117) | public function toMarkdown($indentation = null) {
method toMarkdownWithIndentation (line 129) | abstract public function toMarkdownWithIndentation($indentation);
method createHtmlIndentation (line 137) | protected static function createHtmlIndentation($indentation) {
method createPlainTextIndentation (line 147) | protected static function createPlainTextIndentation($indentation) {
method createMarkdownIndentation (line 157) | protected static function createMarkdownIndentation($indentation) {
method escapeForHtml (line 167) | protected static function escapeForHtml($text) {
FILE: src/Markup/SimpleMarkup.php
class SimpleMarkup (line 12) | abstract class SimpleMarkup extends Markup {
method toHtmlWithIndentation (line 14) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 18) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 22) | public function toMarkdownWithIndentation($indentation) {
method toMarkup (line 33) | abstract protected function toMarkup();
FILE: src/Markup/TextMarkup.php
class TextMarkup (line 12) | final class TextMarkup extends Markup {
method __construct (line 18) | public function __construct($text) {
method toHtmlWithIndentation (line 22) | public function toHtmlWithIndentation($indentation) {
method toPlainTextWithIndentation (line 29) | public function toPlainTextWithIndentation($indentation) {
method toMarkdownWithIndentation (line 36) | public function toMarkdownWithIndentation($indentation) {
method __toString (line 43) | public function __toString() {
FILE: src/PrivacyPolicy.php
class PrivacyPolicy (line 15) | abstract class PrivacyPolicy {
method setPublishedAt (line 103) | public function setPublishedAt($publishedAt) {
method setTakesEffectAt (line 112) | public function setTakesEffectAt($takesEffectAt) {
method setExpiresAt (line 121) | public function setExpiresAt($expiresAt) {
method hasVersionName (line 130) | public function hasVersionName() {
method setVersionName (line 139) | public function setVersionName($versionName) {
method hasCanonicalUrl (line 148) | public function hasCanonicalUrl() {
method setCanonicalUrl (line 157) | public function setCanonicalUrl($canonicalUrl) {
method hasScopes (line 166) | public function hasScopes() {
method addScope (line 175) | public function addScope(Scope $scope) {
method hasDataGroups (line 184) | public function hasDataGroups() {
method addDataGroup (line 199) | public function addDataGroup($title, $description = null, array $bases...
method isUserDataTraded (line 208) | public function isUserDataTraded() {
method setUserDataTraded (line 217) | public function setUserDataTraded($userDataTraded) {
method hasDataMinimizationGoal (line 229) | public function hasDataMinimizationGoal() {
method setDataMinimizationGoal (line 241) | public function setDataMinimizationGoal($dataMinimizationGoal) {
method hasChildrenMinimumAge (line 252) | public function hasChildrenMinimumAge() {
method setChildrenMinimumAge (line 263) | public function setChildrenMinimumAge($childrenMinimumAge) {
method hasPromotionalEmailOptOut (line 274) | public function hasPromotionalEmailOptOut() {
method setPromotionalEmailOptOut (line 285) | public function setPromotionalEmailOptOut($promotionalEmailOptOut) {
method hasCookies (line 294) | public function hasCookies() {
method hasFirstPartyCookies (line 303) | public function hasFirstPartyCookies() {
method setFirstPartyCookies (line 312) | public function setFirstPartyCookies($firstPartyCookies) {
method hasThirdPartyCookies (line 321) | public function hasThirdPartyCookies() {
method setThirdPartyCookies (line 330) | public function setThirdPartyCookies($thirdPartyCookies) {
method isAccountDeletable (line 339) | public function isAccountDeletable() {
method setAccountDeletable (line 348) | public function setAccountDeletable($accountDeletable) {
method hasPreservationInBackups (line 357) | public function hasPreservationInBackups() {
method setPreservationInBackups (line 366) | public function setPreservationInBackups($preservationInBackups) {
method hasThirdPartyServiceProviders (line 375) | public function hasThirdPartyServiceProviders() {
method setThirdPartyServiceProviders (line 384) | public function setThirdPartyServiceProviders($thirdPartyServiceProvid...
method hasInternationalTransfers (line 393) | public function hasInternationalTransfers() {
method setInternationalTransfers (line 402) | public function setInternationalTransfers($internationalTransfers) {
method hasTransferUponMergerOrAcquisition (line 412) | public function hasTransferUponMergerOrAcquisition() {
method setTransferUponMergerOrAcquisition (line 422) | public function setTransferUponMergerOrAcquisition($transferUponMerger...
method hasTlsEverywhere (line 431) | public function hasTlsEverywhere() {
method setTlsEverywhere (line 440) | public function setTlsEverywhere($tlsEverywhere) {
method getCompetentSupervisoryAuthorityName (line 449) | public function getCompetentSupervisoryAuthorityName() {
method getCompetentSupervisoryAuthorityUrl (line 458) | public function getCompetentSupervisoryAuthorityUrl() {
method setCompetentSupervisoryAuthority (line 468) | public function setCompetentSupervisoryAuthority($name = null, $url = ...
method getNotificationPeriod (line 478) | public function getNotificationPeriod() {
method setNotificationPeriod (line 487) | public function setNotificationPeriod($notificationPeriod) {
method hasRightOfAccess (line 496) | public function hasRightOfAccess() {
method setRightOfAccess (line 505) | public function setRightOfAccess($rightOfAccess) {
method hasRightToRectification (line 514) | public function hasRightToRectification() {
method setRightToRectification (line 523) | public function setRightToRectification($rightToRectification) {
method hasRightToErasure (line 532) | public function hasRightToErasure() {
method setRightToErasure (line 541) | public function setRightToErasure($rightToErasure) {
method hasRightToRestrictProcessing (line 550) | public function hasRightToRestrictProcessing() {
method setRightToRestrictProcessing (line 559) | public function setRightToRestrictProcessing($rightToRestrictProcessin...
method hasRightToDataPortability (line 568) | public function hasRightToDataPortability() {
method setRightToDataPortability (line 577) | public function setRightToDataPortability($rightToDataPortability) {
method hasRightToObject (line 586) | public function hasRightToObject() {
method setRightToObject (line 595) | public function setRightToObject($rightToObject) {
method hasRightsRelatedToAutomatedDecisions (line 604) | public function hasRightsRelatedToAutomatedDecisions() {
method setRightsRelatedToAutomatedDecisions (line 613) | public function setRightsRelatedToAutomatedDecisions($rightsRelatedToA...
method hasContactInformation (line 622) | public function hasContactInformation() {
method hasContactEmail (line 631) | public function hasContactEmail() {
method setContactEmail (line 640) | public function setContactEmail($contactEmail) {
method hasContactUrl (line 649) | public function hasContactUrl() {
method setContactUrl (line 658) | public function setContactUrl($contactUrl) {
method hasContactImage (line 667) | public function hasContactImage() {
method setContactImage (line 679) | public function setContactImage($source, $alternativeText = null, $wid...
method __construct (line 688) | public function __construct() {
FILE: src/Scope/AndroidAppScope.php
class AndroidAppScope (line 12) | abstract class AndroidAppScope extends MobileAppScope {}
FILE: src/Scope/AppStoreIosAppScope.php
class AppStoreIosAppScope (line 14) | final class AppStoreIosAppScope extends IosAppScope {
method getTrackId (line 35) | public function getTrackId() {
method __construct (line 43) | public function __construct($trackId, $name) {
method toMarkup (line 48) | protected function toMarkup() {
FILE: src/Scope/IosAppScope.php
class IosAppScope (line 12) | abstract class IosAppScope extends MobileAppScope {}
FILE: src/Scope/MobileAppScope.php
class MobileAppScope (line 12) | abstract class MobileAppScope extends Scope {}
FILE: src/Scope/PlayStoreAndroidAppScope.php
class PlayStoreAndroidAppScope (line 14) | final class PlayStoreAndroidAppScope extends AndroidAppScope {
method getPackageName (line 35) | public function getPackageName() {
method __construct (line 43) | public function __construct($packageName, $name) {
method toMarkup (line 48) | protected function toMarkup() {
FILE: src/Scope/Scope.php
class Scope (line 14) | abstract class Scope extends SimpleMarkup {}
FILE: src/Scope/WebsiteScope.php
class WebsiteScope (line 14) | final class WebsiteScope extends Scope {
method getUrl (line 26) | public function getUrl() {
method __construct (line 34) | public function __construct($url, $name) {
method toMarkup (line 39) | protected function toMarkup() {
FILE: src/Throwable/Error.php
class Error (line 12) | abstract class Error extends \Exception {}
FILE: src/Throwable/Exception.php
class Exception (line 12) | abstract class Exception extends \Exception {}
FILE: src/Throwable/InvalidFormatArgumentsError.php
class InvalidFormatArgumentsError (line 12) | class InvalidFormatArgumentsError extends Error {}
FILE: src/Throwable/TranslationNotFoundError.php
class TranslationNotFoundError (line 12) | class TranslationNotFoundError extends Error {}
FILE: src/Throwable/UnexpectedDataBasisError.php
class UnexpectedDataBasisError (line 12) | class UnexpectedDataBasisError extends Error {}
FILE: src/Throwable/UnexpectedDataPurposeError.php
class UnexpectedDataPurposeError (line 12) | class UnexpectedDataPurposeError extends Error {}
FILE: src/Throwable/UnexpectedDataRequirementError.php
class UnexpectedDataRequirementError (line 12) | class UnexpectedDataRequirementError extends Error {}
FILE: src/Throwable/UnexpectedDataSpecialConditionError.php
class UnexpectedDataSpecialConditionError (line 12) | class UnexpectedDataSpecialConditionError extends Error {}
FILE: src/Throwable/UnexpectedDataTypeError.php
class UnexpectedDataTypeError (line 12) | class UnexpectedDataTypeError extends Error {}
FILE: src/Throwable/UnexpectedScopeError.php
class UnexpectedScopeError (line 12) | class UnexpectedScopeError extends Error {}
Condensed preview — 49 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (346K chars).
[
{
"path": ".editorconfig",
"chars": 193,
"preview": "# editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = tab\ntrim_trailing_whitespace = true\nend_of_line = lf\n"
},
{
"path": ".gitignore",
"chars": 52,
"preview": "# IntelliJ\n.idea/\n\n# Composer\nvendor/\ncomposer.phar\n"
},
{
"path": "LICENSE",
"chars": 1098,
"preview": "The MIT License (MIT)\n\nCopyright (c) delight.im (https://www.delight.im/)\n\nPermission is hereby granted, free of charge,"
},
{
"path": "Migration.md",
"chars": 2691,
"preview": "# Migration\n\n * [General](#general)\n * [From `v1.x.x` to `v2.x.x`](#from-v1xx-to-v2xx)\n\n## General\n\nUpdate your version "
},
{
"path": "README.md",
"chars": 24450,
"preview": "# PHP-PrivacyPolicy\n\nProgrammatically composable privacy policies for [humans](../../tree/examples/Humans) and [machines"
},
{
"path": "Sorting.md",
"chars": 758,
"preview": "# Sorting\n\n## Blocks of text\n\n### Single-line blocks\n\n```bash\n$ cat unsorted.txt | sed 's/^[ \\t]*//' | LC_ALL=C sort -f "
},
{
"path": "composer.json",
"chars": 459,
"preview": "{\n\t\"name\": \"delight-im/privacy-policy\",\n\t\"description\": \"Programmatically composable privacy policies for humans and mac"
},
{
"path": "src/Data/DataBasis.php",
"chars": 3449,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Data/DataElement.php",
"chars": 1957,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Data/DataGroup.php",
"chars": 5304,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Data/DataPurpose.php",
"chars": 4938,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Data/DataRequirement.php",
"chars": 2634,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Data/DataSpecialCondition.php",
"chars": 6157,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Data/DataType.php",
"chars": 51931,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/HumanPrivacyPolicy.php",
"chars": 40722,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Language/EnglishPrivacyPolicy.php",
"chars": 1284,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Language/GermanFormalPrivacyPolicy.php",
"chars": 31330,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Language/GermanInformalPrivacyPolicy.php",
"chars": 31248,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Language/GermanPrivacyPolicy.php",
"chars": 41938,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Language/JsonPrivacyPolicy.php",
"chars": 7435,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/MachinePrivacyPolicy.php",
"chars": 862,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/AbbreviationMarkup.php",
"chars": 1918,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/ConcatenationMarkup.php",
"chars": 1326,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/DefinitionList/DefinitionGroup.php",
"chars": 3557,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/DefinitionList/DefinitionList.php",
"chars": 2206,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/ImageMarkup.php",
"chars": 2572,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/LinkMarkup.php",
"chars": 2549,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/Markup.php",
"chars": 3854,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/SimpleMarkup.php",
"chars": 905,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Markup/TextMarkup.php",
"chars": 1038,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/PrivacyPolicy.php",
"chars": 22799,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Scope/AndroidAppScope.php",
"chars": 362,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Scope/AppStoreIosAppScope.php",
"chars": 1278,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Scope/IosAppScope.php",
"chars": 354,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Scope/MobileAppScope.php",
"chars": 340,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Scope/PlayStoreAndroidAppScope.php",
"chars": 1373,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Scope/Scope.php",
"chars": 402,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Scope/WebsiteScope.php",
"chars": 980,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/Error.php",
"chars": 344,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/Exception.php",
"chars": 350,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/InvalidFormatArgumentsError.php",
"chars": 413,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/TranslationNotFoundError.php",
"chars": 387,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/UnexpectedDataBasisError.php",
"chars": 385,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/UnexpectedDataPurposeError.php",
"chars": 387,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/UnexpectedDataRequirementError.php",
"chars": 395,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/UnexpectedDataSpecialConditionError.php",
"chars": 416,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/UnexpectedDataTypeError.php",
"chars": 381,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "src/Throwable/UnexpectedScopeError.php",
"chars": 374,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
},
{
"path": "tests/index.php",
"chars": 8072,
"preview": "<?php\n\n/*\n * PHP-PrivacyPolicy (https://github.com/delight-im/PHP-PrivacyPolicy)\n * Copyright (c) delight.im (https://ww"
}
]
About this extraction
This page contains the full source code of the delight-im/PHP-PrivacyPolicy GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 49 files (313.1 KB), approximately 75.5k tokens, and a symbol index with 225 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.