diff --git a/Build/phpstan/Core12/phpstan-baseline.neon b/Build/phpstan/Core12/phpstan-baseline.neon index c65db8c2..5e2a265a 100644 --- a/Build/phpstan/Core12/phpstan-baseline.neon +++ b/Build/phpstan/Core12/phpstan-baseline.neon @@ -60,11 +60,6 @@ parameters: count: 1 path: ../../../Classes/Hooks/ButtonBarHook.php - - - message: "#^There is no aspect \"frontend\\.preview\" configured so we can't figure out the exact type to return when calling TYPO3\\\\CMS\\\\Core\\\\Context\\\\Context\\:\\:getPropertyFromAspect$#" - count: 1 - path: ../../../Classes/Hooks/DeeplPreviewFlagGeneratePageHook.php - - message: "#^Parameter \\#1 \\$uid of method WebVision\\\\Deepltranslate\\\\Core\\\\Domain\\\\Repository\\\\GlossaryEntryRepository\\:\\:findEntryByUid\\(\\) expects int, int\\|string given\\.$#" count: 1 diff --git a/Build/phpstan/Core12/phpstan.neon b/Build/phpstan/Core12/phpstan.neon index 316d163a..85b91ad8 100644 --- a/Build/phpstan/Core12/phpstan.neon +++ b/Build/phpstan/Core12/phpstan.neon @@ -16,3 +16,7 @@ parameters: - ../../../.Build/* - ../../../Tests/Functional/Updates/Fixtures/Extension/test_extension/ext_emconf.php - ../../../Tests/Functional/Fixtures/Extensions/test_services_override/ext_emconf.php + + typo3: + contextApiGetAspectMapping: + 'frontend.preview': TYPO3\CMS\Frontend\Aspect\PreviewAspect diff --git a/Classes/Event/Listener/RenderTranslatedFlagInFrontendPreviewMode.php b/Classes/Event/Listener/RenderTranslatedFlagInFrontendPreviewMode.php new file mode 100644 index 00000000..eaffb0b0 --- /dev/null +++ b/Classes/Event/Listener/RenderTranslatedFlagInFrontendPreviewMode.php @@ -0,0 +1,77 @@ +getTypoScriptFrontendController($event); + $context = $controller->getContext(); + if ( + !$this->isInPreviewMode($context) + || $this->processWorkspacePreview($context) + || ($controller->config['config']['disablePreviewNotification'] ?? false) + || ( + isset($controller->page['tx_wvdeepltranslate_translated_time']) + && $controller->page['tx_wvdeepltranslate_translated_time'] === 0 + ) + ) { + // Preview flag must not be inserted. Return early. + return; + } + + $messagePreviewLabel = ($controller->config['config']['deepl_message_preview'] ?? '') + ?: 'Translated with DeepL'; + + $styles = []; + $styles[] = 'position: fixed'; + $styles[] = 'top: 65px'; + $styles[] = 'right: 15px'; + $styles[] = 'padding: 8px 18px'; + $styles[] = 'background: #006494'; + $styles[] = 'border: 1px solid #006494'; + $styles[] = 'font-family: sans-serif'; + $styles[] = 'font-size: 14px'; + $styles[] = 'font-weight: bold'; + $styles[] = 'color: #fff'; + $styles[] = 'z-index: 20000'; + $styles[] = 'user-select: none'; + $styles[] = 'pointer-events: none'; + $styles[] = 'text-align: center'; + $styles[] = 'border-radius: 2px'; + $message = '
' . htmlspecialchars($messagePreviewLabel) . '
'; + + $controller->content = str_ireplace('', $message . '', $controller->content); + } + + private function isInPreviewMode(Context $context): bool + { + return $context->hasAspect('frontend.preview') + && $context->getPropertyFromAspect('frontend.preview', 'isPreview', false); + } + + private function processWorkspacePreview(Context $context): bool + { + return $context->hasAspect('workspace') + && $context->getPropertyFromAspect('workspace', 'isOffline', false); + } + + private function getTypoScriptFrontendController(AfterCacheableContentIsGeneratedEvent $event): TypoScriptFrontendController + { + return $event->getController(); + } +} diff --git a/Configuration/Services.php b/Configuration/Services.php index 84366ade..d122d354 100644 --- a/Configuration/Services.php +++ b/Configuration/Services.php @@ -19,6 +19,7 @@ use WebVision\Deepltranslate\Core\Controller\Backend\AjaxController; use WebVision\Deepltranslate\Core\Controller\GlossarySyncController; use WebVision\Deepltranslate\Core\Event\Listener\GlossarySyncButtonProvider; +use WebVision\Deepltranslate\Core\Event\Listener\RenderTranslatedFlagInFrontendPreviewMode; use WebVision\Deepltranslate\Core\Event\Listener\UsageToolBarEventListener; use WebVision\Deepltranslate\Core\Form\Item\SiteConfigSupportedLanguageItemsProcFunc; use WebVision\Deepltranslate\Core\Form\User\HasFormalitySupport; @@ -161,6 +162,18 @@ ] ); + if ((new Typo3Version())->getMajorVersion() >= 12) { + // @todo Unnest this in next major when TYPO3 v11 support has been removed. + $services + ->set(RenderTranslatedFlagInFrontendPreviewMode::class) + ->tag( + 'event.listener', + [ + 'identifier' => 'deepltranslate-core/render-translated-flag-in-frontend-preview-mode', + ] + ); + } + /** * Check if WidgetRegistry is defined, which means that EXT:dashboard is available. * Registration directly in Services.yaml will break without EXT:dashboard installed! diff --git a/ext_localconf.php b/ext_localconf.php index 0ffb892b..76dff73f 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -3,6 +3,8 @@ defined('TYPO3') or die(); (static function (): void { + $typo3version = new \TYPO3\CMS\Core\Information\Typo3Version(); + //allowLanguageSynchronizationHook manipulates l10n_state $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = \WebVision\Deepltranslate\Core\Hooks\AllowLanguageSynchronizationHook::class; @@ -24,8 +26,11 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['checkModifyAccessList']['deepl'] = \WebVision\Deepltranslate\Core\Hooks\TCEmainHook::class; - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all']['deepl-1675946132'] = - \WebVision\Deepltranslate\Core\Hooks\DeeplPreviewFlagGeneratePageHook::class . '->renderDeeplPreviewFlag'; + if ($typo3version->getMajorVersion() < 12) { + // @todo Remove when TYPO3 v11 support is removed. + $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['contentPostProc-all']['deepl-1675946132'] = + \WebVision\WvDeepltranslate\Hooks\DeeplPreviewFlagGeneratePageHook::class . '->renderDeeplPreviewFlag'; + } //xclass localizationcontroller for localizeRecords() and process() action $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Backend\Controller\Page\LocalizationController::class] = [