Commit 66ccfcd1 authored by Georgi Mateev's avatar Georgi Mateev
Browse files

Merge branch 'feature_79_disable_powered_by_via_checkbox'

parents 8178c102 12df40fe
......@@ -218,7 +218,7 @@ class GenerateFilesAfterTcaSave {
];
$this->createCSSFile($fullData, $folderName, $cssData, $minifyFiles);
$languages = $this->getLanguages();
$languages = $this->getLanguages($siteRoot);
foreach ($languages as $language) {
$languageUid = (int) $language['uid'];
if ($languageUid < 0) {
......@@ -459,19 +459,17 @@ class GenerateFilesAfterTcaSave {
*
* @return array
*/
protected function getLanguages() {
protected function getLanguages($siteRootUid) {
if (VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version) <= 9000000) {
/** @var DatabaseConnection $database */
$database = $GLOBALS['TYPO3_DB'];
$rows = $database->exec_SELECTgetRows('uid', 'sys_language', '');
} else {
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
$queryBuilder = $connectionPool->getQueryBuilderForTable('sys_language');
$queryBuilder->getRestrictions()
->removeAll()
->add(GeneralUtility::makeInstance(DeletedRestriction::class));
$queryBuilder->select('uid')->from('sys_language');
$rows = $queryBuilder->execute()->fetchAll();
$site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId($siteRootUid);
$rows = [];
foreach ($site->getAllLanguages() as $siteLanguage) {
$rows[] = ['uid' => $siteLanguage->getLanguageId()];
}
}
if (is_array($rows)) {
......@@ -588,6 +586,7 @@ class GenerateFilesAfterTcaSave {
$folder, array $data, array $translatedData, array $cssData, $minifyFiles, $languageUid = 0
) {
$essentialCookieData = [];
$iframeCookieData = [];
$pseudoElements = 0;
$groupIndex = 0;
foreach ($translatedData['essential_cookies'] as $index => $cookieData) {
......@@ -694,12 +693,39 @@ class GenerateFilesAfterTcaSave {
];
}
$pseudoElements = 0;
$groupIndex = 0;
foreach ($translatedData['iframe_cookies'] as $index => $cookieData) {
$iframeCookieData[] = [
'Name' => $cookieData['name'],
'Provider' => $cookieData['provider'],
'Purpose' => $cookieData['purpose'],
'Lifetime' => $cookieData['lifetime'],
'index' => $groupIndex,
'pseudo' => FALSE,
];
++$groupIndex;
$pseudoElements = $groupIndex % 3;
}
for ($index = 1; $index < $pseudoElements; ++$index) {
$iframeCookieData[] = [
'Name' => '',
'Provider' => '',
'Purpose' => '',
'Lifetime' => '',
'index' => $groupIndex,
'pseudo' => TRUE,
];
++$groupIndex;
}
$iFrameGroup = [
'groupName' => 'iframes',
'label' => $translatedData['iframe_title'],
'description' => $translatedData['iframe_description'],
'required' => FALSE,
'cookieData' => [],
'cookieData' => $iframeCookieData,
];
if ((boolean) $translatedData['iframe_enabled']) {
$cookieGroups[] = $iFrameGroup;
......@@ -719,14 +745,14 @@ class GenerateFilesAfterTcaSave {
$uid = $pageData['uid'];
if ($currentVersion >= 9000000) {
$site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId($uid);
$url = (string) $site->getRouter()->generateUri(
$url = $this->removeCHashFromUrl((string) $site->getRouter()->generateUri(
$uid, ['disableOptIn' => 1, '_language' => $languageUid]
);
));
$title = $pageData['title'];
$name = strlen($title) > 35 ? substr($title, 0, 35) . '...' : $title;
} else {
try {
$url = $contentObject->getTypoLink_URL($uid, '&disableOptIn=1&L=' . $languageUid);
$url = $this->removeCHashFromUrl($contentObject->getTypoLink_URL($uid, '&disableOptIn=1&L=' . $languageUid));
$name = $contentObject->crop($pageData['title'], 35 . '|...|0');
} catch (\Exception $exception) {
// Occurs on the first creation of the translation.
......@@ -758,6 +784,8 @@ class GenerateFilesAfterTcaSave {
'minify_generated_data' => (boolean) $translatedData['minify_generated_data'],
'show_button_close' => (boolean) $translatedData['show_button_close'],
'activate_testing_mode' => (boolean) $translatedData['activate_testing_mode'],
'disable_powered_by' => (boolean) $translatedData['disable_powered_by'],
'set_cookie_for_domain' => (string) $translatedData['set_cookie_for_domain'],
];
$textEntries = [
......@@ -831,6 +859,16 @@ class GenerateFilesAfterTcaSave {
$jsonDataArray
),
],
'iframeWhitelist' => [
'iframe_whitelist_regex' => $translatedData['iframe_whitelist_regex'],
'iframe_whitelist_overwritten' => $translatedData['iframe_whitelist_overwritten'],
'iframe_whitelist_selection' => $translatedData['iframe_whitelist_selection'],
'markup' => $this->getRenderedMustacheTemplate(
$translatedData['iframe_whitelist_overwritten'], $translatedData['iframe_whitelist_regex'],
$translatedData['iframe_whitelist_selection'], TemplateService::TYPE_IFRAME_WHITELIST,
$jsonDataArray
),
],
];
$sitePath = defined('PATH_site') ? PATH_site : Environment::getPublicPath() . '/';
......@@ -910,4 +948,14 @@ class GenerateFilesAfterTcaSave {
return $records;
}
/**
* Remove the cHash parameter from URL
*
* @param string $url
* @return string|string[]|null
*/
protected function removeCHashFromUrl($url) {
return preg_replace('/([?&])' . 'cHash' . '=[^&^#]+(&|#|$)/','$2',$url);
}
}
......@@ -97,6 +97,14 @@ class HandleTemplateAfterTcaSave {
);
}
if ((boolean) $data['iframe_whitelist_overwritten']) {
$iframeWhitelistTemplate = $data['iframe_whitelist_regex'];
} else {
$iframeWhitelistTemplate = $templateService->getMustacheContent(
TemplateService::TYPE_IFRAME_WHITELIST, (int) $data['iframe_whitelist_selection']
);
}
if (VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version) <= 9000000) {
/** @var DatabaseConnection $database */
$database = $GLOBALS['TYPO3_DB'];
......@@ -105,6 +113,7 @@ class HandleTemplateAfterTcaSave {
'banner_html' => $bannerTemplate,
'iframe_html' => $iframeTemplate,
'iframe_replacement_html' => $iframeReplacementTemplate,
'iframe_whitelist_regex' => $iframeWhitelistTemplate,
]);
} else {
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
......@@ -115,6 +124,7 @@ class HandleTemplateAfterTcaSave {
->set('banner_html', $bannerTemplate)
->set('iframe_html', $iframeTemplate)
->set('iframe_replacement_html', $iframeReplacementTemplate)
->set('iframe_whitelist_regex', $iframeWhitelistTemplate)
->where(
$queryBuilder->expr()->eq(
'uid',
......
......@@ -39,15 +39,15 @@ class TemplateService implements SingletonInterface {
const TYPE_BANNER = 1;
const TYPE_IFRAME = 2;
const TYPE_IFRAME_REPLACEMENT = 3;
const TYPE_IFRAME_WHITELIST = 4;
const TEMPLATE_ID_DEFAULT = 0;
const TEMPLATE_ID_NEW = 1;
const BANNER_TEMPLATE_ID_DEFAULT = 0;
const IFRAME_TEMPLATE_ID_DEFAULT = 0;
const IFRAME_REPLACEMENT_TEMPLATE_ID_DEFAULT = 0;
const IFRAME_WHITELIST_TEMPLATE_ID_DEFAULT = 0;
protected static $templateIdToNameMap = [
self::TYPE_TEMPLATE => [
......@@ -63,6 +63,9 @@ class TemplateService implements SingletonInterface {
self::TYPE_IFRAME_REPLACEMENT => [
self::IFRAME_REPLACEMENT_TEMPLATE_ID_DEFAULT => 'Default',
],
self::TYPE_IFRAME_WHITELIST => [
self::IFRAME_WHITELIST_TEMPLATE_ID_DEFAULT => 'Default',
],
];
protected static $templateIdToFolderMap = [
......@@ -70,6 +73,7 @@ class TemplateService implements SingletonInterface {
self::TYPE_BANNER => 'Banner',
self::TYPE_IFRAME => 'Iframe',
self::TYPE_IFRAME_REPLACEMENT => 'IframeReplacement',
self::TYPE_IFRAME_WHITELIST => 'IframeWhitelist',
];
/**
......
......@@ -32,7 +32,7 @@ use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Context\LanguageAspect;
use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\SingletonInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\VersionNumberUtility;
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
/**
......@@ -80,8 +80,9 @@ class AddCookieOptinJsAndCss implements SingletonInterface {
return '';
}
}
return '<script id="cookieOptinData" type="application/json">' . file_get_contents($sitePath . $jsonFile) .
// we decode and encode again to remove the PRETTY_PRINT when rendering
// see https://gitlab.sgalinski.de/typo3/sg_cookie_optin/-/issues/118
return '<script id="cookieOptinData" type="application/json">' . json_encode(json_decode(file_get_contents($sitePath . $jsonFile))) .
'</script><script src="/' . $file . '" type="text/javascript" data-ignore="1"></script>';
} {
// Old including from version 2.X.X @todo remove in version 4.X.X
......@@ -174,15 +175,17 @@ class AddCookieOptinJsAndCss implements SingletonInterface {
* @return int
*/
protected function getLanguage() {
if (\TYPO3\CMS\Core\Utility\VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version) >= 10000000) {
/** @var LanguageAspect $languageAspect */
$languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language');
$sysLanguageUid = $languageAspect->getId();
$versionNumber = VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version);
if ($versionNumber >= 9005000) {
$languageAspect = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
\TYPO3\CMS\Core\Context\Context::class
)->getAspect('language');
// no object check, because if the object is not set we don't know which language that is anyway
return $languageAspect->getId();
} else {
/** @var TypoScriptFrontendController $typoScriptFrontendController */
$typoScriptFrontendController = $GLOBALS['TSFE'];
$sysLanguageUid = $typoScriptFrontendController->sys_language_uid;
return $typoScriptFrontendController->sys_language_uid;
}
return $sysLanguageUid;
}
}
......@@ -35,8 +35,8 @@ $configuration = [
'searchFields' => 'header, description, accept_all_text, accept_specific_text, accept_essential_text,
essential_title, essential_description, extend_box_link_text, extend_box_link_text_close,
extend_table_link_text, extend_table_link_text_close, cookie_name_text, cookie_provider_text,
cookie_purpose_text, cookie_lifetime_text, iframe_title, iframe_description, iframe_button_allow_all_text,
iframe_button_allow_one_text, iframe_button_load_one_text, iframe_open_settings_text, template_html,
cookie_purpose_text, cookie_lifetime_text, iframe_title, iframe_description, iframe_cookies, iframe_button_allow_all_text,
iframe_button_allow_one_text, iframe_button_load_one_text, iframe_open_settings_text, iframe_whitelist_regex, template_html,
banner_html, banner_button_accept_text, banner_button_settings_text, banner_description,
save_confirmation_text',
'delete' => 'deleted',
......@@ -59,8 +59,9 @@ $configuration = [
--palette--;;color_checkbox, --palette--;;color_button, --palette--;;color_list,
--palette--;;color_table,
--div--;LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.tab.iframes,
iframe_enabled, iframe_title, iframe_description, --palette--;;iframe_texts,
iframe_enabled, iframe_title, iframe_description, iframe_cookies, --palette--;;iframe_texts,
--palette--;;iframe_colors, --palette--;;iframe_template, --palette--;;iframe_replacement_template,
--palette--;;iframe_whitelist,
--div--;LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.tab.banner,
--palette--;;banner_general, --palette--;;banner_general_colors,
--palette--;;banner_settings_button, --palette--;;banner_accept_button,
......@@ -70,7 +71,7 @@ $configuration = [
--div--;LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.tab.group,
groups,
--div--;LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.tab.settings,
--palette--;;cookie_lifetime_settings, minify_generated_data, activate_testing_mode',
--palette--;;cookie_lifetime_settings, minify_generated_data, activate_testing_mode, disable_powered_by, set_cookie_for_domain',
],
],
'palettes' => [
......@@ -138,6 +139,11 @@ $configuration = [
'showitem' => 'iframe_selection, iframe_overwritten, --linebreak--,
iframe_html'
],
'iframe_whitelist' => [
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_whitelist',
'showitem' => 'iframe_whitelist_selection, iframe_whitelist_overwritten, --linebreak--,
iframe_whitelist_regex'
],
'iframe_replacement_template' => [
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_replacement_template',
'showitem' => 'iframe_replacement_selection, iframe_replacement_overwritten, --linebreak--,
......@@ -790,6 +796,22 @@ $configuration = [
'eval' => 'trim'
],
],
'iframe_cookies' => [
'exclude' => TRUE,
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_cookies',
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_sgcookieoptin_domain_model_cookie',
'foreign_field' => 'parent_iframe',
'foreign_sortby' => 'sorting',
'appearance' => [
'showPossibleLocalizationRecords' => TRUE,
'showRemovedLocalizationRecords' => FALSE,
'showAllLocalizationLink' => TRUE,
],
'maxitems' => 99999,
],
],
'iframe_button_allow_all_text' => [
'exclude' => TRUE,
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_button_allow_all_text',
......@@ -1031,6 +1053,26 @@ $configuration = [
],
],
],
'disable_powered_by' => [
'exclude' => TRUE,
'l10n_mode' => 'exclude',
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.disable_powered_by',
'config' => [
'type' => 'check',
'default' => '0',
],
],
'set_cookie_for_domain' => [
'exclude' => TRUE,
'l10n_mode' => 'exclude',
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.set_cookie_for_domain',
'description' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.set_cookie_for_domain.bad_idea',
'config' => [
'type' => 'input',
'default' => '',
'eval' => 'trim'
],
],
'banner_enable' => [
'exclude' => TRUE,
'l10n_mode' => 'exclude',
......@@ -1338,6 +1380,38 @@ $configuration = [
'eval' => 'trim, required'
],
],
'iframe_whitelist_overwritten' => [
'exclude' => TRUE,
'l10n_mode' => 'exclude',
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_overwritten',
'config' => [
'type' => 'check',
'default' => '0',
],
],
'iframe_whitelist_selection' => [
'exclude' => TRUE,
'l10n_mode' => 'exclude',
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_whitelist_selection',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'minitems' => 1,
'items' => [
['LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_whitelist_selection.0', 0],
],
],
],
'iframe_whitelist_regex' => [
'exclude' => TRUE,
'l10n_mode' => 'exclude',
'label' => 'LLL:EXT:sg_cookie_optin/Resources/Private/Language/locallang_db.xlf:tx_sgcookieoptin_domain_model_optin.iframe_whitelist_regex',
'config' => [
'type' => 'text',
'renderType' => 't3editor',
'eval' => 'trim',
],
],
],
];
......@@ -1403,7 +1477,7 @@ if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo
. 'color_button_all_hover, color_button_specific_hover, color_button_essential_hover, color_table,'
. 'color_table_header_text, color_Table_data_text, color_button_close, color_button_close_hover,'
. 'color_button_close_text, cookie_name_text, cookie_provider_text, cookie_purpose_text, cookie_lifetime_text,'
. 'iframe_enabled, iframe_title, iframe_description, iframe_button_allow_all_text,'
. 'iframe_enabled, iframe_title, iframe_description, iframe_cookies, iframe_button_allow_all_text,'
. 'iframe_button_allow_one_text, iframe_button_load_one_text, iframe_open_settings_text,'
. 'iframe_color_consent_box_background, iframe_color_button_load_one, iframe_color_button_load_one_hover,'
. 'iframe_color_button_load_one_text, iframe_color_open_settings, iframe_html, iframe_overwritten,'
......@@ -1415,7 +1489,7 @@ if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo
. 'banner_button_accept_text, banner_button_settings_text, banner_description, show_button_close,'
. 'activate_testing_mode, color_full_box, color_full_headline, color_full_text, color_full_button_close,'
. 'color_full_button_close_hover, color_full_button_close_text, color_table_header, save_confirmation_text,'
. 'color_confirmation_background, color_confirmation_text, session_only_essential_cookies';
. 'color_confirmation_background, color_confirmation_text, session_only_essential_cookies, iframe_whitelist, iframe_whitelist_overwritten, iframe_whitelist_selection, iframe_whitelist_regex, set_cookie_for_domain, disable_powered_by';
}
return $configuration;
TCEFORM.tt_content.frame_class {
addItems.external-content-protection = External Content
addItems.external-content-no-protection = Unprotected External Content
}
tt_content.stdWrap.innerWrap.cObject = CASE
tt_content.stdWrap.innerWrap.cObject {
key.field = frame_class
external-content-protection = TEXT
external-content-protection.value = <div class="external-content-protection">|</div>
external-content-protection = TEXT
external-content-no-protection.value = <div class="external-content-no-protection">|</div>
}
......@@ -4,8 +4,11 @@
1. Install this extension with the Extension Manager, or with composer.
2. Add the static TypoScript named "Cookie Optin" to your instance with the "Template" backend module.
2. Go to the extension configuration and set your license key and output folder. You must set this folder accordingly in
case your TYPO3 installation is in a subdirectory relative to the web server document root.
3. Add the static TypoScript named "Cookie Optin" to your instance with the "Template" backend module.
- Open up the "Template" module in the backend of TYPO3.
- Go to your root site page within the page tree.
- Choose "Info/Modify" at the select on the top.
......@@ -14,7 +17,7 @@
- Choose the template "Cookie Optin (sg_cookie_optin)" on the multi select box with the name "Include static (from extensions)"
- Save
3. Go into the "Cookie Opt In" backend module, configure it and save it once.
4. Go into the "Cookie Opt In" backend module, configure it and save it once.
## How to add scripts / How to rewrite the script HTML?
......@@ -51,22 +54,22 @@ gtag('config', 'GA_MEASUREMENT_ID');
## How is the structure of our cookie?
In order for us to know which cookie groups the user has accepted, we must also store an essential cookie.
In order for us to know which cookie groups the user has accepted, we must also store an essential cookie.
The structure is as follows:
**Name**: cookie_optin
**Example data**: essential:1|analytics:0|performance:1
**Name**: cookie_optin
**Example data**: essential:1|analytics:0|performance:1
**Explanation**: The user has accepted the essential and performance groups, but not the analytics one.
## Additional Features
### Open a page without showing the cookie opt in
Just add the parameter "?disableOptIn=1" to your URL, so the necessary JavaScript and Css, which shows the dialog, isn't
Just add the parameter "?disableOptIn=1" to your URL, so the necessary JavaScript and Css, which shows the dialog, isn't
loaded anymore. Here is an example:
```
https://www.sgalinski.de/?disableOptIn=1
```
https://www.sgalinski.de/?disableOptIn=1
```
### Show the cookie opt in, after accepting it
......@@ -74,11 +77,11 @@ https://www.sgalinski.de/?disableOptIn=1
Just add the parameter "?showOptIn=1" to your URL, so the dialog shows up again and the accepted cookies can be modified.
Here is an example:
```
https://www.sgalinski.de/?showOptIn=1
```
https://www.sgalinski.de/?showOptIn=1
```
### IFrames
### External content
#### Add an additional description for a iframe on the opt in
......@@ -88,10 +91,42 @@ Just add the data attribute "data-consent-description" to an iframe HTML tag, li
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/XYZ" data-consent-description="An additional description about this video!"></iframe>
```
#### Whitelist an iframe for the external content opt in logic
#### Whitelist an element for the external content opt in logic
Just add the data attribute "data-iframe-allow-always" to an iframe HTML tag, like in the example below:
There are three ways to do this and all of them will result in having this element and all of it's children whitelisted
for the external content protection:
1. Just add the data attribute "data-iframe-allow-always" or "data-external-content-no-protection" to an iframe HTML tag, like in the example below:
```html
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/XYZ" data-iframe-allow-always="1"></iframe>
```
2. Add the class "frame-external-content-no-protection" to the HTML tag.
```html
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/XYZ" class="frame-external-content-no-protection"></iframe>
```
3. From the TYPO3 Backend Page module edit the element's appearance and set the Frame Class "Unprotected External Content"
#### Protect any kind of DOM element with the external content protection (force opt-in)
There are three ways to do this and all of them will result in replacing this element and all of its contents with the
opt-in dialog:
1. Add the data attribute "data-external-content-protection" to the HTML tag.
```html
<div class="test-content-protection" data-external-content-protection="1">
Content comes here
</div>
```
2. Add the class "frame-external-content-protection" to the HTML tag.
```html
<div class="test-content-protection frame-external-content-protection">
Content comes here
</div>
```
3. From the TYPO3 Backend Page module edit the element's appearance and set the Frame Class "External Content"
......@@ -54,8 +54,8 @@
<target><![CDATA[Beschreibung (erklärt die Verwendung dieser Skripte & Cookies)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_group.group_name" approved="yes">
<source><![CDATA[Group Key for Google Tag Manager (Do not change while on live mode!)]]></source>
<target><![CDATA[Gruppen-Key für Google Tag Manager (Nicht im Live-Betrieb ändern!)]]></target>
<source><![CDATA[Group ID (Unique name, do not change while on live mode!)]]></source>
<target><![CDATA[Gruppen-ID (Eindeutiger Name, Nicht im Live-Betrieb ändern!)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_group.hidden" approved="yes">
<source><![CDATA[Deactivate]]></source>
......@@ -297,6 +297,10 @@
<source><![CDATA[Text Color - Row Title]]></source>
<target><![CDATA[Textfarbe - Zeilentitel]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.color_Table_data_text" approved="yes">
<source><![CDATA[Text Color - Data]]></source>
<target><![CDATA[Textfarbe - Daten]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.color_text" approved="yes">
<source><![CDATA[Text]]></source>
<target><![CDATA[Text]]></target>
......@@ -425,6 +429,10 @@
<source><![CDATA[Description (Shown in the opt in)]]></source>
<target><![CDATA[Beschreibung (Dargestellt im Opt-In)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_cookies">
<source><![CDATA[Cookies]]></source>
<target><![CDATA[Cookies]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_enabled" approved="yes">
<source><![CDATA[Activate opt in for external content (iframe)]]></source>
<target><![CDATA[Aktiviere den Opt-In für externe Inhalte (iframe)]]></target>
......@@ -441,6 +449,10 @@
<source><![CDATA[Overwrite Settings Window Template (Allows to change the template code below. If this is selected, changes in future updates are not automatically applied. Unset this option to reset the template below.)]]></source>
<target><![CDATA[Template des Einstellungsfensters überschreiben (Erlaubt die Änderung des untenstehenden Template-Codes. Änderungen in zukünftigen Updates werden dann nicht mehr automatisch übernommen. Deaktiviere diese Option, um das untenstehende Template zurückzusetzen.)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_whitelist_overwritten" approved="yes">
<source><![CDATA[Overwrite Whitelist Template (Allows to change the template code below. If this is selected, changes in future updates are not automatically applied. Unset this option to reset the template below.)]]></source>
<target><![CDATA[Template des Einstellungsfensters überschreiben (Erlaubt die Änderung des untenstehenden Template-Codes. Änderungen in zukünftigen Updates werden dann nicht mehr automatisch übernommen. Deaktiviere diese Option, um das untenstehende Template zurückzusetzen.)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_replacement_html" approved="yes">
<source><![CDATA[iFrame Replacement Template Code (HTML, variables and logic are processed with Mustache, see http://mustache.github.io/mustache.5.html)]]></source>
<target><![CDATA[iFrame-Ersatz Template-Code (HTML, Variablen und Logik werden mit Mustache verarbeitet, siehe http://mustache.github.io/mustache.5.html)]]></target>
......@@ -465,10 +477,18 @@
<source><![CDATA[Select a Base Design for the Settings Window Template (This form will be saved and reloaded when this setting changes.)]]></source>
<target><![CDATA[Basis-Designvorlage für das Einstellungsfenster auswählen (Dieses Formular wird bei Änderung gespeichert und neu geladen.)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_whitelist_selection" approved="yes">
<source><![CDATA[Select a base template for your whitelist (This form will be saved and reloaded when this setting changes.)]]></source>
<target><![CDATA[Basis-Vorlage für Ihre Whiteliste auswählen (Dieses Formular wird bei Änderung gespeichert und neu geladen.)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_selection.0" approved="yes">
<source><![CDATA[Default]]></source>
<target><![CDATA[Standard]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_whitelist_selection.0" approved="yes">
<source><![CDATA[Default]]></source>
<target><![CDATA[Standard]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_template" approved="yes">
<source><![CDATA[External Content Settings Window Design Template]]></source>
<target><![CDATA[Designvorlage für das Fenster mit Einstellungen zu externen Inhalten]]></target>
......@@ -529,6 +549,14 @@
<source><![CDATA[Activate the close button in the template]]></source>
<target><![CDATA[Aktiviere den Schließen-Button im Template]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.activate_testing_mode" approved="yes">
<source><![CDATA[Activate the testing mode (The parameter "?showOptIn=1" must be added to the url)]]></source>
<target><![CDATA[Aktiviere den Test-Modus (Der Parameter "?showOptIn=1" muss an die URL angefügt werden)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.tab.textAndMenu" approved="yes">
<source><![CDATA[Labels & Menu]]></source>
<target><![CDATA[Texte & Menü]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.tab.banner" approved="yes">
<source><![CDATA[Banner]]></source>
<target><![CDATA[Banner]]></target>
......@@ -565,6 +593,14 @@
<source><![CDATA[Template Code (HTML, variables and logic are processed with Mustache, see http://mustache.github.io/mustache.5.html)]]></source>
<target><![CDATA[Template-Code (HTML, Variablen und Logik werden mit Mustache verarbeitet, siehe http://mustache.github.io/mustache.5.html)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_whitelist_regex" approved="yes">
<source><![CDATA[Whitelist external content. Every new line is interpreted as a new regular expression]]></source>
<target><![CDATA[Externe Inhalte whitelisten. Jede neue Zeile wird als einen neuen regulären Ausdruck interpretiert.]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.iframe_whitelist" approved="yes">
<source><![CDATA[External content whitelist. (Object sources matching these regular expressions will not be replaced.)]]></source>
<target><![CDATA[Externe Inhalte whitelisten. (Objekte, deren Quelle diese reguläre Ausdrücke entspricht, werden nicht ersetzt)]]></target>
</trans-unit>
<trans-unit id="tx_sgcookieoptin_domain_model_optin.template_overwritten" approved="yes">
<source><![CDATA[Overwrite Template (Allows to change the template code below. If this is selected, changes in future updates are not automatically applied. Unset this option to reset the template below.)]]></source>
<target><![CDATA[Vorlage überschreiben (Erlaubt die Änderung des untenstehenden Template-Codes. Änderungen in zukünftigen Updates werden dann nicht mehr automatisch übernommen. Deaktiviere diese Option, um das untenstehende Template zurückzusetzen.)]]></target>
......@@ -609,6 +645,30 @@
<source><![CDATA[Script Name]]></source>
<target><![CDATA[Skript-Name]]></target>